1 package com.atlassian.activeobjects;
2
3 import com.atlassian.activeobjects.external.IgnoreReservedKeyword;
4 import net.java.ao.ActiveObjectsException;
5 import net.java.ao.Polymorphic;
6 import net.java.ao.RawEntity;
7 import net.java.ao.schema.FieldNameConverter;
8 import net.java.ao.schema.Ignore;
9 import net.java.ao.schema.TableNameConverter;
10 import org.junit.Before;
11 import org.junit.Test;
12 import org.junit.runner.RunWith;
13 import org.mockito.Mock;
14 import org.mockito.junit.MockitoJUnitRunner;
15
16 import java.lang.reflect.Method;
17
18 import static com.atlassian.activeobjects.NamesLengthAndOracleReservedWordsEntitiesValidator.RESERVED_WORDS;
19 import static org.junit.Assert.fail;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.verifyZeroInteractions;
22 import static org.mockito.Mockito.when;
23
24 @RunWith(MockitoJUnitRunner.class)
25 public final class NamesLengthAndOracleReservedWordsEntitiesValidatorTest {
26 private static final Method GET_FIELD_METHOD = method(TestEntity.class, "getField");
27 private static final Method IGNORE_METHOD = method(TestEntity.class, "getIgnoreMethod");
28 private static final Method IGNORE_RESERVED_KEYWORD_METHOD = method(TestEntity.class, "getIgnoreReservedKeywordMethod");
29 private static final Method RANDOM_METHOD = method(TestEntity.class, "randomMethod");
30 private static final Method GET_ENTITY_METHOD = method(TestEntity.class, "getEntity");
31
32 private NamesLengthAndOracleReservedWordsEntitiesValidator validator;
33
34 @Mock
35 private TableNameConverter tableNameConverter;
36
37 @Mock
38 private FieldNameConverter fieldNameConverter;
39
40 @Before
41 public final void setUp() {
42 validator = new NamesLengthAndOracleReservedWordsEntitiesValidator();
43 }
44
45 @Test
46 public void testCheckTableNameWithNoIssue() {
47 final Class<TestEntity> entityClass = TestEntity.class;
48 validator.checkTableName(entityClass, tableNameConverter);
49 verify(tableNameConverter).getName(entityClass);
50 }
51
52 @Test(expected = ActiveObjectsException.class)
53 public void testCheckTableNameWithException() {
54 when(tableNameConverter.getName(TestEntity.class)).thenThrow(new ActiveObjectsException());
55 validator.checkTableName(TestEntity.class, tableNameConverter);
56 }
57
58 @Test
59 public void testCheckColumnNameWithNoIssue() {
60 validator.checkColumnName(GET_FIELD_METHOD, fieldNameConverter);
61 verify(fieldNameConverter).getName(GET_FIELD_METHOD);
62 }
63
64 @Test
65 public void testCheckColumnNameWithRandomMethod() {
66 validator.checkColumnName(RANDOM_METHOD, fieldNameConverter);
67 verifyZeroInteractions(fieldNameConverter);
68 }
69
70 @Test(expected = ActiveObjectsException.class)
71 public void testCheckColumnNameWithException() {
72 when(fieldNameConverter.getName(GET_FIELD_METHOD)).thenThrow(new ActiveObjectsException());
73 validator.checkColumnName(GET_FIELD_METHOD, fieldNameConverter);
74 }
75
76 @Test
77 public void testCheckPolymorphicColumnNameNoIssue() {
78 validator.checkPolymorphicColumnName(GET_ENTITY_METHOD, fieldNameConverter);
79 verify(fieldNameConverter).getPolyTypeName(GET_ENTITY_METHOD);
80 }
81
82 @Test(expected = ActiveObjectsException.class)
83 public void testCheckPolymorphicColumnNameWithException() {
84 when(fieldNameConverter.getPolyTypeName(GET_ENTITY_METHOD)).thenThrow(new ActiveObjectsException());
85 validator.checkPolymorphicColumnName(GET_ENTITY_METHOD, fieldNameConverter);
86 }
87
88 @Test
89 public void testCheckPolymorphicColumnNameNonPolymorphic() {
90 validator.checkPolymorphicColumnName(GET_FIELD_METHOD, fieldNameConverter);
91 verifyZeroInteractions(fieldNameConverter);
92 }
93
94 @Test
95 public void testCheckTableNameIsOracleKeyword() {
96 for (String oracleReservedWord : RESERVED_WORDS) {
97 when(tableNameConverter.getName(TestEntity.class)).thenReturn(oracleReservedWord);
98 try {
99 validator.checkTableName(TestEntity.class, tableNameConverter);
100 fail("The validator should have thrown an exception for table named '" + oracleReservedWord + "' which is an Oracle key word.");
101 } catch (ActiveObjectsException e) {
102
103 }
104 }
105 }
106
107 @Test
108 public void testCheckFieldNameIsOracleKeyword() {
109 for (String oracleReservedWord : RESERVED_WORDS) {
110 when(fieldNameConverter.getName(GET_FIELD_METHOD)).thenReturn(oracleReservedWord);
111 try {
112 validator.checkColumnName(GET_FIELD_METHOD, fieldNameConverter);
113 fail("The validator should have thrown an exception for field/column named '" + oracleReservedWord + "' which is an Oracle key word.");
114 } catch (ActiveObjectsException e) {
115
116 }
117 }
118 }
119
120 @Test
121 public void testCheckFieldNameIsOracleKeywordAndMethodIsAnnotatedIgnore() {
122 for (String oracleReservedWord : RESERVED_WORDS) {
123 when(fieldNameConverter.getName(IGNORE_METHOD)).thenReturn(oracleReservedWord);
124 try {
125 validator.checkColumnName(IGNORE_METHOD, fieldNameConverter);
126 } catch (ActiveObjectsException e) {
127 fail("The validator should NOT have thrown an exception for field/column named '" + oracleReservedWord + "' which is an Oracle key word.");
128 }
129 }
130 }
131
132 @Test
133 public void testCheckFieldNameIsOracleKeywordAndMethodIsAnnotatedIgnoreReservedKeyword() {
134 for (String oracleReservedWord : RESERVED_WORDS) {
135 when(fieldNameConverter.getName(IGNORE_RESERVED_KEYWORD_METHOD)).thenReturn(oracleReservedWord);
136 try {
137 validator.checkColumnName(IGNORE_RESERVED_KEYWORD_METHOD, fieldNameConverter);
138 } catch (ActiveObjectsException e) {
139 fail("The validator should NOT have thrown an exception for field/column named '" + oracleReservedWord + "' which is an Oracle key word.");
140 }
141 }
142 }
143
144 private static Method method(Class<?> type, String name) {
145 try {
146 return type.getMethod(name);
147 } catch (NoSuchMethodException e) {
148 throw new IllegalStateException(e);
149 }
150 }
151
152 private interface TestEntity extends RawEntity<Object> {
153 int getField();
154
155 void randomMethod();
156
157 PolymorphicEntity getEntity();
158
159 @Ignore
160 String getIgnoreMethod();
161
162 @IgnoreReservedKeyword
163 String getIgnoreReservedKeywordMethod();
164 }
165
166 @Polymorphic
167 private interface PolymorphicEntity extends RawEntity<Object> {
168 }
169 }