PageRenderTime 42ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-tests-parent/jira-tests-unit/src/test/java/com/atlassian/jira/jql/validator/TestValidatorVisitor.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 274 lines | 204 code | 67 blank | 3 comment | 3 complexity | 16ad38c3905136901c22ed92e25fd6cd MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.jql.validator;
  2. import com.atlassian.jira.jql.operand.JqlOperandResolver;
  3. import com.atlassian.jira.user.ApplicationUser;
  4. import com.atlassian.jira.user.MockApplicationUser;
  5. import com.atlassian.jira.util.MessageSet;
  6. import com.atlassian.jira.util.MessageSetImpl;
  7. import com.atlassian.jira.util.NoopI18nHelper;
  8. import com.atlassian.query.clause.AndClause;
  9. import com.atlassian.query.clause.NotClause;
  10. import com.atlassian.query.clause.OrClause;
  11. import com.atlassian.query.clause.TerminalClause;
  12. import com.atlassian.query.clause.TerminalClauseImpl;
  13. import com.atlassian.query.operator.Operator;
  14. import org.junit.Before;
  15. import org.junit.Test;
  16. import org.junit.runner.RunWith;
  17. import org.mockito.Mock;
  18. import org.mockito.Mockito;
  19. import org.mockito.runners.MockitoJUnitRunner;
  20. import java.util.Collections;
  21. import java.util.Iterator;
  22. import java.util.Set;
  23. import static java.util.Arrays.asList;
  24. import static java.util.Collections.singletonList;
  25. import static org.junit.Assert.assertEquals;
  26. import static org.mockito.Mockito.verify;
  27. import static org.mockito.Mockito.when;
  28. /**
  29. * @since v4.0
  30. */
  31. @RunWith(MockitoJUnitRunner.class)
  32. public class TestValidatorVisitor {
  33. @Mock
  34. private ValidatorRegistry validatorRegistry;
  35. @Mock
  36. private OperatorUsageValidator usageValidator;
  37. @Mock
  38. private ClauseValidator clauseValidator;
  39. private JqlOperandResolver jqlOperandResolver = MockJqlOperandResolver.createSimpleSupport();
  40. private final ApplicationUser user = new MockApplicationUser("admin");
  41. private ValidatorVisitor validatorVisitor;
  42. @Before
  43. public void setup() {
  44. validatorVisitor = new MockValidatorVisitor(validatorRegistry, jqlOperandResolver, usageValidator, user, null);
  45. }
  46. @Test
  47. public void testVisitAndClauseHappyPath() throws Exception {
  48. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  49. TerminalClause clause2 = new TerminalClauseImpl("clause2", Operator.EQUALS, 2);
  50. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  51. when(validatorRegistry.getClauseValidator(user, clause2)).thenReturn(singletonList(clauseValidator));
  52. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  53. when(clauseValidator.validate(user, clause2)).thenReturn(getErrorMessageSet("Error 2"));
  54. final MessageSet messageSet = validatorVisitor.visit(new AndClause(clause1, clause2));
  55. assertMessageSetErrors(messageSet, "Error 1", "Error 2");
  56. assertMessageSetWarnings(messageSet);
  57. }
  58. @Test
  59. public void testVisitAndClauseOneNullQuery() throws Exception {
  60. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  61. TerminalClause clause2 = new TerminalClauseImpl("clause2", Operator.EQUALS, 2);
  62. final ClauseValidator clauseValidator = Mockito.mock(ClauseValidator.class);
  63. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  64. when(validatorRegistry.getClauseValidator(user, clause2)).thenReturn(singletonList(clauseValidator));
  65. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  66. final MessageSet messageSet = validatorVisitor.visit(new AndClause(clause1, clause2));
  67. assertMessageSetErrors(messageSet, "Error 1");
  68. assertMessageSetWarnings(messageSet);
  69. }
  70. @Test
  71. public void testVisitOrClauseHappyPath() throws Exception {
  72. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  73. TerminalClause clause2 = new TerminalClauseImpl("clause2", Operator.EQUALS, 2);
  74. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  75. when(validatorRegistry.getClauseValidator(user, clause2)).thenReturn(singletonList(clauseValidator));
  76. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  77. when(clauseValidator.validate(user, clause2)).thenReturn(getErrorMessageSet("Error 2"));
  78. final MessageSet messageSet = validatorVisitor.visit(new OrClause(clause1, clause2));
  79. assertMessageSetErrors(messageSet, "Error 1", "Error 2");
  80. assertMessageSetWarnings(messageSet);
  81. }
  82. @Test
  83. public void testVisitOrClauseOneNullQuery() throws Exception {
  84. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  85. TerminalClause clause2 = new TerminalClauseImpl("clause2", Operator.EQUALS, 2);
  86. final ClauseValidator clauseValidator = Mockito.mock(ClauseValidator.class);
  87. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  88. when(validatorRegistry.getClauseValidator(user, clause2)).thenReturn(singletonList(clauseValidator));
  89. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  90. final MessageSet messageSet = validatorVisitor.visit(new OrClause(clause1, clause2));
  91. assertMessageSetErrors(messageSet, "Error 1");
  92. assertMessageSetWarnings(messageSet);
  93. }
  94. @Test
  95. public void testVisitNotClauseHappyPath() throws Exception {
  96. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  97. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  98. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  99. final MessageSet messageSet = validatorVisitor.visit(new NotClause(clause1));
  100. assertMessageSetErrors(messageSet, "Error 1");
  101. assertMessageSetWarnings(messageSet);
  102. }
  103. @Test
  104. public void testVisitTerminalClauseOperatorValidationFailure() throws Exception {
  105. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  106. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  107. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  108. when(usageValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 2"));
  109. final MessageSet messageSet = validatorVisitor.visit(clause1);
  110. assertMessageSetErrors(messageSet, "Error 2");
  111. assertMessageSetWarnings(messageSet);
  112. }
  113. @Test
  114. public void testVisitTerminalClauseHappyPathWithOperatorWarning() throws Exception {
  115. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  116. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  117. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  118. when(usageValidator.validate(user, clause1)).thenReturn(getWarningMessageSet("Warning 1"));
  119. final MessageSet messageSet = validatorVisitor.visit(clause1);
  120. assertMessageSetErrors(messageSet, "Error 1");
  121. assertMessageSetWarnings(messageSet, "Warning 1");
  122. }
  123. @Test
  124. public void testVisitTerminalClauseHappyPathWithMultipleValidators() throws Exception {
  125. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  126. final ClauseValidator clauseValidator2 = Mockito.mock(ClauseValidator.class);
  127. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(asList(clauseValidator, clauseValidator2));
  128. when(clauseValidator.validate(user, clause1)).thenReturn(getErrorMessageSet("Error 1"));
  129. when(clauseValidator2.validate(user, clause1)).thenReturn(getWarningMessageSet("Warning 1"));
  130. final MessageSet messageSet = validatorVisitor.visit(clause1);
  131. assertMessageSetErrors(messageSet, "Error 1");
  132. assertMessageSetWarnings(messageSet, "Warning 1");
  133. }
  134. @Test
  135. public void testVisitTerminalClauseErrorInOperandHandler() throws Exception {
  136. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  137. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(singletonList(clauseValidator));
  138. jqlOperandResolver = Mockito.mock(JqlOperandResolver.class);
  139. when(jqlOperandResolver.validate(user, clause1.getOperand(), clause1)).thenReturn(getErrorMessageSet("Error 1"));
  140. validatorVisitor = new ValidatorVisitor(validatorRegistry, jqlOperandResolver, usageValidator, user, null, clause1);
  141. final MessageSet messageSet = validatorVisitor.visit(clause1);
  142. assertMessageSetErrors(messageSet, "Error 1");
  143. assertMessageSetWarnings(messageSet);
  144. }
  145. @Test
  146. public void testVisitTerminalClauseSavedFilter() {
  147. final long filterId = 101188L;
  148. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  149. final SavedFilterClauseValidator savedFilterClauseValidator = Mockito.mock(SavedFilterClauseValidator.class);
  150. when(validatorRegistry.getClauseValidator(user, clause1)).thenReturn(Collections.<ClauseValidator>singletonList(savedFilterClauseValidator));
  151. when(savedFilterClauseValidator.validate(user, clause1, filterId)).thenReturn(getErrorMessageSet("Error 1"));
  152. validatorVisitor = new ValidatorVisitor(validatorRegistry, jqlOperandResolver, usageValidator, user, filterId, clause1);
  153. final MessageSet messageSet = validatorVisitor.visit(clause1);
  154. assertMessageSetErrors(messageSet, "Error 1");
  155. assertMessageSetWarnings(messageSet);
  156. verify(savedFilterClauseValidator).validate(user, clause1, filterId);
  157. }
  158. @Test
  159. public void testVisitTerminalClauseNoValidator() throws Exception {
  160. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  161. final MessageSet messageSet = validatorVisitor.visit(clause1);
  162. assertMessageSetErrors(messageSet, NoopI18nHelper.makeTranslation("jira.jql.validation.no.such.field", clause1.getName()));
  163. }
  164. @Test
  165. public void testVisitTerminalClauseNoValidatorAnonymous() throws Exception {
  166. validatorVisitor = new MockValidatorVisitor(validatorRegistry, jqlOperandResolver, usageValidator, null, null);
  167. TerminalClause clause1 = new TerminalClauseImpl("clause1", Operator.EQUALS, 1);
  168. final MessageSet messageSet = validatorVisitor.visit(clause1);
  169. assertMessageSetErrors(messageSet, NoopI18nHelper.makeTranslation("jira.jql.validation.no.such.field.anonymous", clause1.getName()));
  170. }
  171. private static MessageSet getErrorMessageSet(String... args) {
  172. final MessageSetImpl set1 = new MessageSetImpl();
  173. for (String arg : args) {
  174. set1.addErrorMessage(arg);
  175. }
  176. return set1;
  177. }
  178. private static MessageSet getWarningMessageSet(String... args) {
  179. final MessageSetImpl set1 = new MessageSetImpl();
  180. for (String arg : args) {
  181. set1.addWarningMessage(arg);
  182. }
  183. return set1;
  184. }
  185. private void assertMessageSetErrors(MessageSet set, String... errors) {
  186. assertSet(set.getErrorMessages(), errors);
  187. }
  188. private void assertMessageSetWarnings(MessageSet set, String... warnings) {
  189. assertSet(set.getWarningMessages(), warnings);
  190. }
  191. private <T> void assertSet(Set<T> actualValues, T... expectedValues) {
  192. assertEquals(actualValues.size(), expectedValues.length);
  193. final Iterator<T> actualIter = actualValues.iterator();
  194. for (T expected : expectedValues) {
  195. assertEquals(expected, actualIter.next());
  196. }
  197. }
  198. private static class MockValidatorVisitor extends ValidatorVisitor {
  199. private MockValidatorVisitor(final ValidatorRegistry validatorRegistry, final JqlOperandResolver operandResolver, final OperatorUsageValidator operatorUsageValidator, final ApplicationUser searcher, final Long filterId) {
  200. super(validatorRegistry, operandResolver, operatorUsageValidator, searcher, filterId, null);
  201. }
  202. @Override
  203. NoopI18nHelper getI18n() {
  204. return new NoopI18nHelper();
  205. }
  206. }
  207. }