View Javadoc
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                 // expected
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                 // expected
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 }