1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.data.platform;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.junit.After;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.kuali.rice.core.api.config.property.Config;
24 import org.kuali.rice.core.api.config.property.ConfigContext;
25 import org.kuali.rice.core.framework.config.property.SimpleConfig;
26 import org.mockito.Mock;
27 import org.mockito.runners.MockitoJUnitRunner;
28 import org.springframework.dao.DataAccessException;
29 import org.springframework.jdbc.support.incrementer.AbstractColumnMaxValueIncrementer;
30 import org.springframework.jdbc.support.incrementer.AbstractDataFieldMaxValueIncrementer;
31 import org.springframework.jdbc.support.incrementer.AbstractSequenceMaxValueIncrementer;
32 import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
33 import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer;
34
35 import javax.sql.DataSource;
36 import java.io.IOException;
37 import java.sql.Connection;
38 import java.sql.DatabaseMetaData;
39 import java.sql.SQLException;
40 import java.util.Map;
41 import java.util.Properties;
42
43 import static org.junit.Assert.*;
44 import static org.mockito.Mockito.mock;
45 import static org.mockito.Mockito.when;
46
47
48
49
50
51
52 @RunWith(MockitoJUnitRunner.class)
53 public class MaxValueIncrementerFactoryTest {
54
55 @Mock private DataSource mysql;
56 @Mock private DataSource oracle;
57 @Mock private DataSource bad;
58
59 @Before
60 public void setUp() throws Exception {
61 setUpMetaData(mysql, DatabasePlatforms.MYSQL, 5);
62 setUpMetaData(oracle, DatabasePlatforms.ORACLE, 11);
63 setUpMetaData(bad, "BAD!!!!!", 1);
64 }
65
66 private void setUpMetaData(DataSource dataSource, String platformName, int version) throws SQLException {
67 DatabaseMetaData metaData = mock(DatabaseMetaData.class);
68 when(metaData.getDatabaseProductName()).thenReturn(platformName);
69 when(metaData.getDatabaseMajorVersion()).thenReturn(version);
70 Connection connection = mock(Connection.class);
71 when(connection.getMetaData()).thenReturn(metaData);
72 when(dataSource.getConnection()).thenReturn(connection);
73 }
74
75
76 @Test
77 public void testGetIncrementer_Oracle() throws Exception {
78 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(oracle, "MY_SEQUENCE");
79 assertTrue(incrementer instanceof OracleSequenceMaxValueIncrementer);
80 OracleSequenceMaxValueIncrementer oracleIncrementer = (OracleSequenceMaxValueIncrementer)incrementer;
81 assertEquals("MY_SEQUENCE", oracleIncrementer.getIncrementerName());
82
83
84 assertSame(incrementer, MaxValueIncrementerFactory.getIncrementer(oracle, "MY_SEQUENCE"));
85
86 assertNotSame(incrementer, MaxValueIncrementerFactory.getIncrementer(oracle, "MY_SEQUENCE_2"));
87
88 }
89
90 @Test
91 public void testGetIncrementer_MySQL() throws Exception {
92 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(mysql, "MY_SEQUENCE");
93 assertTrue(incrementer instanceof MaxValueIncrementerFactory.EnhancedMySQLMaxValueIncrementer);
94 MaxValueIncrementerFactory.EnhancedMySQLMaxValueIncrementer mysqlIncrementer =
95 (MaxValueIncrementerFactory.EnhancedMySQLMaxValueIncrementer)incrementer;
96 assertEquals("MY_SEQUENCE", mysqlIncrementer.getIncrementerName());
97 assertEquals("ID", mysqlIncrementer.getColumnName());
98
99
100 assertSame(incrementer, MaxValueIncrementerFactory.getIncrementer(mysql, "MY_SEQUENCE"));
101
102 assertNotSame(incrementer, MaxValueIncrementerFactory.getIncrementer(mysql, "MY_SEQUENCE_2"));
103
104 }
105
106 @Test(expected = UnsupportedDatabasePlatformException.class)
107 public void testGetIncrementer_Bad() throws Exception {
108 MaxValueIncrementerFactory.getIncrementer(bad, "MY_SEQUENCE");
109 }
110
111 @Test
112 public void testGetIncrementer_CaseInsensitive() throws Exception {
113 DataFieldMaxValueIncrementer incrementer1 = MaxValueIncrementerFactory.getIncrementer(mysql, "MY_SEQUENCE");
114 DataFieldMaxValueIncrementer incrementer2 = MaxValueIncrementerFactory.getIncrementer(mysql, "MY_sequence");
115 DataFieldMaxValueIncrementer incrementer3 = MaxValueIncrementerFactory.getIncrementer(mysql, "my_sequence");
116 assertSame(incrementer1, incrementer2);
117 assertSame(incrementer2, incrementer3);
118 }
119
120 @Test
121 public void testGetIncrementer_CacheByDataSource() throws Exception {
122 DataFieldMaxValueIncrementer incrementer1 = MaxValueIncrementerFactory.getIncrementer(mysql, "MY_SEQUENCE");
123 DataFieldMaxValueIncrementer incrementer2 = MaxValueIncrementerFactory.getIncrementer(oracle, "MY_SEQUENCE");
124 assertNotSame(incrementer1, incrementer2);
125 }
126
127 @Test(expected = IllegalArgumentException.class)
128 public void testGetIncrementer_NullDataSource() throws Exception {
129 MaxValueIncrementerFactory.getIncrementer(null, "MY_SEQUENCE");
130 }
131
132 @Test(expected = IllegalArgumentException.class)
133 public void testGetIncrementer_NullIncrementerName() throws Exception {
134 MaxValueIncrementerFactory.getIncrementer(mysql, null);
135 }
136
137 @Test(expected = IllegalArgumentException.class)
138 public void testGetIncrementer_BlankIncrementerName() throws Exception {
139 MaxValueIncrementerFactory.getIncrementer(mysql, "");
140 }
141
142 @Test
143 public void testCustomIncrementerDatasourceVersion() throws Exception {
144 SimpleConfig config = new SimpleConfig();
145 config.putProperty("rice.krad.data.platform.incrementer.mysql.5",
146 "org.kuali.rice.krad.data.platform.testincrementers.CustomIncrementerMySQLVersion5");
147 config.putProperty("rice.krad.data.platform.incrementer.oracle.11",
148 "org.kuali.rice.krad.data.platform.testincrementers.CustomIncrementerOracleVersion11");
149 ConfigContext.init(config);
150
151 DataFieldMaxValueIncrementer mySQLMaxVal = MaxValueIncrementerFactory.getIncrementer(mysql,"test_mySQL");
152 assertTrue("Found MySQL custom incrementer",mySQLMaxVal != null);
153 assertTrue("Custom incrementer for MySQL should be mySQL5 for String val",
154 StringUtils.equals(mySQLMaxVal.nextStringValue(),"mySQL5"));
155
156 DataFieldMaxValueIncrementer oracleMaxVal = MaxValueIncrementerFactory.getIncrementer(oracle,"test_oracle");
157 assertTrue("Found Oracle custom incrementer", oracleMaxVal != null);
158 }
159
160 @Test
161 public void testCustomIncrementerDatasourceNoVersion() throws Exception {
162 SimpleConfig config = new SimpleConfig();
163 config.putProperty("rice.krad.data.platform.incrementer.mysql",
164 "org.kuali.rice.krad.data.platform.testincrementers.CustomIncrementerMySQLVersion5");
165 config.putProperty("rice.krad.data.platform.incrementer.oracle",
166 "org.kuali.rice.krad.data.platform.testincrementers.CustomIncrementerOracleVersion11");
167 ConfigContext.init(config);
168
169 DataFieldMaxValueIncrementer mySQLMaxVal = MaxValueIncrementerFactory.getIncrementer(mysql,"test_mySQL");
170 assertTrue("Found MySQL custom incrementer",mySQLMaxVal != null);
171 assertTrue("Custom incrementer for MySQL should be mySQL5 for String val",
172 StringUtils.equals(mySQLMaxVal.nextStringValue(),"mySQL5"));
173
174 DataFieldMaxValueIncrementer oracleMaxVal = MaxValueIncrementerFactory.getIncrementer(oracle,"test_oracle");
175 assertTrue("Found Oracle custom incrementer", oracleMaxVal != null);
176 }
177
178 @Test(expected = InstantiationError.class)
179 public void testCustomIncrementerDatasourceInvalidClass() throws Exception {
180 SimpleConfig config = new SimpleConfig();
181 config.putProperty("rice.krad.data.platform.incrementer.mysql",
182 "org.kuali.rice.krad.data.platform.testincrementers.NonExistent");
183 ConfigContext.init(config);
184
185 DataFieldMaxValueIncrementer mySQLMaxVal = MaxValueIncrementerFactory.getIncrementer(mysql,"test_mySQL");
186 assertTrue("Cannot create incrementer", mySQLMaxVal == null);
187 }
188
189 @After
190 public void clearContext(){
191 ConfigContext.destroy();
192 }
193 }