View Javadoc

1   package liquibase.statementexecute;
2   
3   import liquibase.database.*;
4   import liquibase.database.core.*;
5   import liquibase.database.typeconversion.TypeConverterFactory;
6   import liquibase.test.DatabaseTestContext;
7   import liquibase.statement.SqlStatement;
8   import liquibase.statement.core.CreateTableStatement;
9   import liquibase.statement.NotNullConstraint;
10  import liquibase.statement.core.AddUniqueConstraintStatement;
11  
12  import java.util.List;
13  import java.util.ArrayList;
14  
15  import org.junit.Test;
16  
17  public class AddUniqueConstraintExecutorTest extends AbstractExecuteTest {
18  
19      protected static final String TABLE_NAME = "AddUQTest";
20      protected static final String COLUMN_NAME = "colToMakeUQ";
21      protected static final String CONSTRAINT_NAME = "UQ_TEST";
22      protected static final String TABLESPACE_NAME = "LB_TABLESPACE";
23  
24      @Override
25      protected List<? extends SqlStatement> setupStatements(Database database) {
26          List<CreateTableStatement> statements = new ArrayList<CreateTableStatement>();
27          CreateTableStatement table = new CreateTableStatement(null, TABLE_NAME);
28          table
29                  .addColumn("id", TypeConverterFactory.getInstance().findTypeConverter(database).getDataType("int", false), null, new NotNullConstraint())
30                  .addColumn(COLUMN_NAME, TypeConverterFactory.getInstance().findTypeConverter(database).getDataType("int", false), null, new NotNullConstraint());
31          statements.add(table);
32  
33          if (database.supportsSchemas()) {
34              table = new CreateTableStatement(DatabaseTestContext.ALT_SCHEMA, TABLE_NAME);
35              table
36                      .addColumn("id", TypeConverterFactory.getInstance().findTypeConverter(database).getDataType("int", false), null, new NotNullConstraint())
37                      .addColumn(COLUMN_NAME, TypeConverterFactory.getInstance().findTypeConverter(database).getDataType("int", false), null, new NotNullConstraint());
38              statements.add(table);
39          }
40          return statements;
41      }
42  
43      //    @Test
44  //    public void execute_noSchema() throws Exception {
45  //        new DatabaseTestTemplate().testOnAvailableDatabases(
46  //                new SqlStatementDatabaseTest(null, new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, "uq_adduqtest")) {
47  //
48  //                    protected void preExecuteAssert(DatabaseSnapshotGenerator snapshot) {
49  //                        assertFalse(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
50  //                    }
51  //
52  //                    protected void postExecuteAssert(DatabaseSnapshotGenerator snapshot) {
53  //                        //todo: enable snapshot and assertion when snapshot can check for unique constraints
54  //                        //snapshot = new DatabaseSnapshotGenerator(snapshot);
55  //                    	assertTrue(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
56  //                    }
57  //                });
58  //    }
59  //
60  //    @Test
61  //    public void execute_withSchema() throws Exception {
62  //        new DatabaseTestTemplate().testOnAvailableDatabases(
63  //                new SqlStatementDatabaseTest(TestContext.ALT_SCHEMA, new AddUniqueConstraintStatement(TestContext.ALT_SCHEMA, TABLE_NAME, COLUMN_NAME, "uq_adduqtest")) {
64  //                    protected void preExecuteAssert(DatabaseSnapshotGenerator snapshot) {
65  //                        assertFalse(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
66  //                    }
67  //
68  //                    protected void postExecuteAssert(DatabaseSnapshotGenerator snapshot) {
69  //                        //todo: enable snapshot and assertion when snapshot can check for unique constraints
70  //                snapshot = new DatabaseSnapshotGenerator(database, TestContext.ALT_SCHEMA);
71  //                assertTrue(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
72  //                    }
73  //
74  //                });
75  //    }
76  //
77  //    @Test
78  //    public void execute_withTablespace() throws Exception {
79  //        new DatabaseTestTemplate().testOnAvailableDatabases(
80  //                new SqlStatementDatabaseTest(null, new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, "uq_adduqtest").setTablespace(TestContext.ALT_TABLESPACE)) {
81  //                    protected void preExecuteAssert(DatabaseSnapshotGenerator snapshot) {
82  //                        assertFalse(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
83  //                    }
84  //
85  //                    protected void postExecuteAssert(DatabaseSnapshotGenerator snapshot) {
86  //                        //todo: enable snapshot and assertion when snapshot can check for unique constraints
87  //                        // snapshot = new DatabaseSnapshotGenerator(database);
88  ////                assertTrue(snapshot.getTable(TABLE_NAME).getColumn(COLUMN_NAME).isUnique());
89  //                    }
90  //                });
91  //    }
92  
93      @SuppressWarnings("unchecked")
94      @Test
95      public void execute_noSchema() throws Exception {
96          this.statementUnderTest = new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME);
97          assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseDatabase.class);
98          assertCorrect("alter table [dbo].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])", MSSQLDatabase.class);
99          assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseASADatabase.class);
100         assertCorrect("alter table `adduqtest` add constraint `uq_test` unique (`coltomakeuq`)", MySQLDatabase.class);
101         assertCorrect("alter table adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
102         assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", OracleDatabase.class);
103         assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class);
104         assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class);
105         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])");
106     }
107 
108     @SuppressWarnings("unchecked")
109     @Test
110     public void execute_noConstraintName() throws Exception {
111         this.statementUnderTest = new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, null);
112 		assertCorrect("alter table `adduqtest` add unique (`coltomakeuq`)", MySQLDatabase.class);
113 		assertCorrect("alter table adduqtest add constraint unique (coltomakeuq)", InformixDatabase.class);
114 		assertCorrect("alter table adduqtest add unique (coltomakeuq)", OracleDatabase.class);
115 		assertCorrect("alter table \"adduqtest\" add unique (\"coltomakeuq\")", PostgresDatabase.class);
116 		assertCorrect("alter table adduqtest add unique (coltomakeuq)", DerbyDatabase.class);
117         assertCorrect("alter table [adduqtest] add unique ([coltomakeuq])", SybaseASADatabase.class, SybaseDatabase.class);
118         assertCorrect("alter table [dbo].[adduqtest] add unique ([coltomakeuq])", MSSQLDatabase.class);
119 
120 		assertCorrect("alter table [adduqtest] add unique ([coltomakeuq])");
121     }
122 
123     @SuppressWarnings("unchecked")
124     @Test
125     public void execute_withSchema() throws Exception {
126         statementUnderTest = new AddUniqueConstraintStatement(DatabaseTestContext.ALT_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME);
127 
128         // FIXME Syntax for mysql is correct, but exception "Table 'liquibaseb.adduqtest' doesn't exist" is thrown
129 // 		assertCorrect("alter table `liquibaseb`.`adduqtest` add constraint `uq_test` unique (`coltomakeuq`)", MySQLDatabase.class);
130         assertCorrect("alter table liquibaseb.adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
131         assertCorrect("alter table liquibaseb.adduqtest add constraint uq_test unique (coltomakeuq)", OracleDatabase.class);
132         assertCorrect("alter table liquibaseb.\"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class);
133         assertCorrect("alter table liquibaseb.adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class);
134         assertCorrect("alter table [liquibaseb].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseASADatabase.class, SybaseDatabase.class, MSSQLDatabase.class);
135         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", FirebirdDatabase.class);
136 
137         assertCorrectOnRest("alter table [liquibaseb].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])");
138 
139     }
140 
141     @SuppressWarnings("unchecked")
142 	@Test
143 	public void execute_withTablespace() throws Exception {
144 		statementUnderTest = new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME).setTablespace(TABLESPACE_NAME);
145         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseASADatabase.class, SybaseDatabase.class);
146         assertCorrect("alter table [dbo].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])", MSSQLDatabase.class);
147         assertCorrect("alter table adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
148         assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\") USING INDEX TABLESPACE " + TABLESPACE_NAME, PostgresDatabase.class);
149         assertCorrect("alter table `adduqtest` add constraint `uq_test` unique (`coltomakeuq`)", MySQLDatabase.class);
150         assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class, HsqlDatabase.class, DB2Database.class, H2Database.class, CacheDatabase.class, FirebirdDatabase.class, MaxDBDatabase.class);
151 		assertCorrectOnRest("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq]) USING INDEX TABLESPACE " + TABLESPACE_NAME);
152 	}
153 
154     @SuppressWarnings("unchecked")
155 	@Test
156 	public void execute_withDefferedAndDisabled() throws Exception {
157 		statementUnderTest = new AddUniqueConstraintStatement(null, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME).setDeferrable(true).setInitiallyDeferred(true).setDisabled(true);
158         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseDatabase.class);
159         assertCorrect("alter table [dbo].[adduqtest] add constraint [uq_test] unique ([coltomakeuq])", MSSQLDatabase.class);
160         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])", SybaseASADatabase.class);
161         assertCorrect("alter table `adduqtest` add constraint `uq_test` unique (`coltomakeuq`)", MySQLDatabase.class);
162         assertCorrect("alter table adduqtest add constraint unique (coltomakeuq) constraint uq_test", InformixDatabase.class);
163         assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq) DEFERRABLE INITIALLY DEFERRED DISABLE", OracleDatabase.class);
164         assertCorrect("alter table \"adduqtest\" add constraint uq_test unique (\"coltomakeuq\")", PostgresDatabase.class);
165         assertCorrect("alter table adduqtest add constraint uq_test unique (coltomakeuq)", DerbyDatabase.class);
166         assertCorrect("alter table [adduqtest] add constraint [uq_test] unique ([coltomakeuq])");
167 	}
168 }