/* Copyright 2004-2014 Jim Voris
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qumasoft.server;
import com.qumasoft.TestHelper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.AfterClass;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test derby trigger creation.
* @author Jim Voris
*/
public class DerbyTriggerSequenceTest {
private static final String DERBY_TEST_DIRECTORY_SUFFIX = "derbyTriggerTest";
/*
* ============================================ CREATE SCHEMA ===========================================================
*/
private static final String CREATE_SCHEMA = "CREATE SCHEMA TEST";
/*
* =========================================== CREATE SEQUENCE =========================================================
*/
private static final String CREATE_TEST_SEQUENCE = "CREATE SEQUENCE TEST.TEST_SEQ_ID AS INT START WITH 1 INCREMENT BY 1";
/*
* =========================================== CREATE TABLES ============================================================
*/
private static final String CREATE_TEST_TABLE_SQL = "CREATE TABLE TEST.TEST ("
+ "TEST_ID INT NOT NULL,"
+ "TEST1_ID INT NOT NULL,"
+ "INSERT_DATE TIMESTAMP NOT NULL,"
+ "UPDATE_DATE TIMESTAMP,"
+ "CONSTRAINT TEST_PK PRIMARY KEY (TEST_ID, TEST1_ID))";
private static final String CREATE_TEST_HISTORY_TABLE_SQL = "CREATE TABLE TEST.TEST_HISTORY ("
+ "ID BIGINT GENERATED ALWAYS AS IDENTITY CONSTRAINT TEST_HISTORY_PK PRIMARY KEY,"
+ "TEST_ID INT NOT NULL,"
+ "TEST1_ID INT NOT NULL,"
+ "INSERT_DATE TIMESTAMP NOT NULL,"
+ "UPDATE_DATE TIMESTAMP)";
/*
* ================================================== CREATE TRIGGER ====================================================
*/
private static final String TEST_TRIGGER =
"CREATE TRIGGER TEST.TEST_TRIGGER1 AFTER UPDATE ON TEST.TEST REFERENCING OLD AS OLD "
+ "FOR EACH ROW INSERT INTO TEST.TEST_HISTORY(TEST_ID, TEST1_ID, INSERT_DATE, UPDATE_DATE) "
+ "VALUES (OLD.TEST_ID, OLD.TEST1_ID, OLD.INSERT_DATE, OLD.UPDATE_DATE)";
/*
* ================================================== INSERT DATA ====================================================
*/
private static final String INSERT_TEST =
"INSERT INTO TEST.TEST (TEST_ID, TEST1_ID, INSERT_DATE) VALUES (1, 1, CURRENT_TIMESTAMP)";
/*
* ================================================== UPDATE DATA ====================================================
*/
private static final String UPDATE_TEST1 =
"UPDATE TEST.TEST SET TEST1_ID = 2, UPDATE_DATE = CURRENT_TIMESTAMP WHERE TEST_ID = 1";
private static final String UPDATE_TEST2 =
"UPDATE TEST.TEST SET TEST1_ID = 3, UPDATE_DATE = CURRENT_TIMESTAMP WHERE TEST_ID = 1";
/**
* Execute this stuff once when the class is loaded.
*
* @throws Exception if we have a problem with initialization.
*/
@BeforeClass
public static void setUpClass() throws Exception {
TestHelper.emptyDerbyTestDirectory(TestHelper.buildTestDirectoryName(DERBY_TEST_DIRECTORY_SUFFIX));
System.getProperties().setProperty("derby.system.home", TestHelper.buildTestDirectoryName(DERBY_TEST_DIRECTORY_SUFFIX));
System.getProperties().setProperty("derby.language.logQueryPlan", "true");
System.getProperties().setProperty("derby.infolog.append", "true");
System.getProperties().setProperty("derby.language.logStatementText", "true");
System.getProperties().setProperty("derby.database.sqlAuthorization", "false");
DriverManager.getConnection("jdbc:derby:testdb;create=true");
}
/**
* Execute this just once after we complete all the tests defined in this class.
*
* @throws Exception if we have a problem tearing things down.
*/
@AfterClass
public static void tearDownClass() throws Exception {
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (SQLException e) {
assertTrue("Not expected sql exception", e.getErrorCode() == 50000);
}
}
/**
* Test trigger creation.
*/
@Test
public void testTriggerCreation() {
Connection connection = null;
Statement statement;
try {
connection = DriverManager.getConnection("jdbc:derby:testdb");
statement = connection.createStatement();
statement.execute(CREATE_SCHEMA);
statement.execute(CREATE_TEST_SEQUENCE);
statement.execute(CREATE_TEST_TABLE_SQL);
statement.execute(CREATE_TEST_HISTORY_TABLE_SQL);
statement.execute(TEST_TRIGGER);
statement.execute(INSERT_TEST);
statement.execute(UPDATE_TEST1);
statement.execute(UPDATE_TEST2);
} catch (SQLException e) {
fail("Unexpected SQL Exception: " + e.getLocalizedMessage());
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
fail("Caught unexpected sql exception" + e.getLocalizedMessage());
}
}
}
}