/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.informer.xml; import org.drools.informer.Answer; import org.drools.informer.InvalidAnswer; import org.drools.informer.Question; import org.drools.informer.xml.event.ObjectInsertedEventMock; import org.drools.informer.xml.event.ObjectRetractedEventMock; import org.drools.informer.xml.event.ObjectUpdatedEventMock; import org.drools.runtime.rule.FactHandle; import org.junit.Before; import org.junit.Test; import java.util.*; import java.util.Map.Entry; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; /** * @author Damon Horrell * * Note: these tests use different object instances for */ public class ChangeCollectorTest { private Question question1; private Question question2; private Question question3; private Question question4; private Question question5; private Answer answer5Old; private Answer answer5New; private InvalidAnswer invalidAnswer1; private Dummy dummy; private ChangeCollector c; private Iterator<Entry<Object, FactHandle>> createIterator; private Entry<Object, FactHandle> createEntry; private Iterator<Object> updateIterator; private Iterator<Object> deleteIterator; @Before public void setup() { question1 = new Question("question1"); question1.setAnswerType(Question.QuestionType.TYPE_TEXT); question1.setPreLabel("What is answer 1?"); question1.setAnswer("answer1"); question1.setActive(true); question2 = new Question("question2"); question2.setAnswerType(Question.QuestionType.TYPE_TEXT); question2.setPreLabel("What is answer 2?"); question2.setAnswer("answer2"); question2.setActive(true); question3 = new Question("question3"); question3.setAnswerType(Question.QuestionType.TYPE_TEXT); question3.setPreLabel("What is answer 3?"); question3.setAnswer("answer3"); question3.setActive(true); // question 4 is used for testing inactive being treated the same as deleted question4 = new Question("question4"); question4.setAnswerType(Question.QuestionType.TYPE_TEXT); question4.setPreLabel("What is answer 4?"); question4.setAnswer("answer4"); question4.setActive(true); // question 5 is used for testing no update sent if the only change is the answer question5 = new Question("question5"); question5.setAnswerType(Question.QuestionType.TYPE_TEXT); question5.setPreLabel("What is answer 5?"); question5.setAnswer("answer5"); question5.setActive(true); answer5Old = new Answer(question5.getId(), "answer5Old"); answer5New = new Answer(question5.getId(), "answer5New"); invalidAnswer1 = new InvalidAnswer(question1.getId(), "invalid answer 1"); invalidAnswer1.setActive(true); dummy = new Dummy(); } @Test public void testCreate() { c = new ChangeCollector(); c.initialise(Collections.emptySet()); c.objectInserted(new ObjectInsertedEventMock("1", question1)); c.objectInserted(new ObjectInsertedEventMock("2", question2)); c.objectInserted(new ObjectInsertedEventMock("dummy", dummy)); c.objectInserted(new ObjectInsertedEventMock("ia1", invalidAnswer1)); assertEquals(3, c.getCreate().size()); createIterator = c.getCreate().entrySet().iterator(); createEntry = createIterator.next(); assertEquals("1", createEntry.getValue().toExternalForm()); assertEquals("answer1", ((Question) createEntry.getKey()).getAnswer()); createEntry = createIterator.next(); assertEquals("2", createEntry.getValue().toExternalForm()); assertEquals("answer2", ((Question) createEntry.getKey()).getAnswer()); createEntry = createIterator.next(); assertEquals("ia1", createEntry.getValue().toExternalForm()); assertEquals("invalid answer 1", ((InvalidAnswer) createEntry.getKey()).getReason()); assertNull(c.getUpdate()); assertNull(c.getDelete()); } @Test public void testUpdate() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1, question2, dummy })); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); question2.setPreLabel("What is answer 2a?"); question2.setAnswer("answer2a"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); c.objectUpdated(new ObjectUpdatedEventMock("2", question2, question2)); c.objectUpdated(new ObjectUpdatedEventMock("dummy", dummy, dummy)); assertNull(c.getCreate()); assertEquals(2, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer1a", ((Question) updateIterator.next()).getAnswer()); assertEquals("answer2a", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } @Test public void testDelete() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1, question2, invalidAnswer1, dummy })); c.objectRetracted(new ObjectRetractedEventMock("1", question1)); c.objectRetracted(new ObjectRetractedEventMock("ia1", invalidAnswer1)); c.objectRetracted(new ObjectRetractedEventMock("2", question2)); c.objectRetracted(new ObjectRetractedEventMock("dummy", dummy)); assertNull(c.getCreate()); assertNull(c.getUpdate()); assertEquals(3, c.getDelete().size()); deleteIterator = c.getDelete().iterator(); assertEquals(question1.getId(), ((ItemId)deleteIterator.next()).getId()); assertEquals(question1.getId(), ((InvalidAnswer)deleteIterator.next()).getQuestionId()); assertEquals(question2.getId(), ((ItemId)deleteIterator.next()).getId()); } @Test public void testCreateThenUpdate() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question3 })); c.objectInserted(new ObjectInsertedEventMock("1", question1)); c.objectInserted(new ObjectInsertedEventMock("2", question2)); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); question3.setPreLabel("What is answer 3a?"); question3.setAnswer("answer3a"); c.objectUpdated(new ObjectUpdatedEventMock("3", question3, question3)); assertEquals(2, c.getCreate().size()); createIterator = c.getCreate().entrySet().iterator(); createEntry = createIterator.next(); assertEquals("2", createEntry.getValue().toExternalForm()); assertEquals("answer2", ((Question) createEntry.getKey()).getAnswer()); createEntry = createIterator.next(); assertEquals("1", createEntry.getValue().toExternalForm()); assertEquals("answer1a", ((Question) createEntry.getKey()).getAnswer()); assertEquals(1, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer3a", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } @Test public void testCreateThenDelete() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question3 })); c.objectInserted(new ObjectInsertedEventMock("2", question2)); c.objectInserted(new ObjectInsertedEventMock("1", question1)); c.objectRetracted(new ObjectRetractedEventMock("3", question3)); c.objectRetracted(new ObjectRetractedEventMock("2", question2)); assertEquals(1, c.getCreate().size()); createIterator = c.getCreate().entrySet().iterator(); createEntry = createIterator.next(); assertEquals("1", createEntry.getValue().toExternalForm()); assertEquals("answer1", ((Question) createEntry.getKey()).getAnswer()); assertNull(c.getUpdate()); assertEquals(1, c.getDelete().size()); deleteIterator = c.getDelete().iterator(); assertEquals(question3.getId(), ((ItemId)deleteIterator.next()).getId()); } @Test public void testUpdateThenDelete() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1, question2, question3 })); question3.setPreLabel("What is answer 3a?"); question3.setAnswer("answer3a"); c.objectUpdated(new ObjectUpdatedEventMock("3", question3, question3)); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); c.objectRetracted(new ObjectRetractedEventMock("2", question2)); c.objectRetracted(new ObjectRetractedEventMock("3", question3)); assertNull(c.getCreate()); assertEquals(1, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer1a", ((Question) updateIterator.next()).getAnswer()); assertEquals(2, c.getDelete().size()); deleteIterator = c.getDelete().iterator(); assertEquals(question2.getId(), ((ItemId)deleteIterator.next()).getId()); assertEquals(question3.getId(), ((ItemId)deleteIterator.next()).getId()); } @Test public void testDeleteThenRecreate() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1 })); c.objectRetracted(new ObjectRetractedEventMock("1", question1)); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); c.objectInserted(new ObjectInsertedEventMock("1", question1)); assertNull(c.getCreate()); assertEquals(1, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer1a", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } @Test public void testUpdateTwice() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1, question2 })); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); question2.setPreLabel("What is answer 2a?"); question2.setAnswer("answer2a"); c.objectUpdated(new ObjectUpdatedEventMock("2", question2, question2)); question1.setPreLabel("What is answer 1b?"); question1.setAnswer("answer1b"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); assertNull(c.getCreate()); assertEquals(2, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer2a", ((Question) updateIterator.next()).getAnswer()); assertEquals("answer1b", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } @Test public void testUpdateTwiceNoChange() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question1, question2 })); question1.setPreLabel("What is answer 1a?"); question1.setAnswer("answer1a"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); question2.setPreLabel("What is answer 2a?"); question2.setAnswer("answer2a"); c.objectUpdated(new ObjectUpdatedEventMock("2", question2, question2)); question1.setPreLabel("What is answer 1?"); question1.setAnswer("answer1"); c.objectUpdated(new ObjectUpdatedEventMock("1", question1, question1)); assertNull(c.getCreate()); assertEquals(1, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer2a", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } @Test public void testCreateInactive() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] {})); question4.setActive(false); c.objectInserted(new ObjectInsertedEventMock("4", question4)); assertNull(c.getCreate()); assertNull(c.getUpdate()); assertNull(c.getDelete()); } @Test public void testDeleteInactive() { c = new ChangeCollector(); question4.setActive(false); c.initialise(Arrays.asList(new Object[] { question4 })); c.objectRetracted(new ObjectRetractedEventMock("4", question4)); assertNull(c.getCreate()); assertNull(c.getUpdate()); assertNull(c.getDelete()); } @Test public void testUpdateActiveToInactive() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question4})); question4.setActive(false); c.objectUpdated(new ObjectUpdatedEventMock("4", question4, question4)); assertNull(c.getCreate()); assertNull(c.getUpdate()); assertEquals(1, c.getDelete().size()); deleteIterator = c.getDelete().iterator(); assertEquals(question4.getId(), ((ItemId)deleteIterator.next()).getId()); } @Test public void testUpdateInactiveToActive() { c = new ChangeCollector(); question4.setActive(false); c.initialise(Arrays.asList(new Object[] { question4})); question4.setActive(true); question4.setAnswer("answer4Active"); c.objectUpdated(new ObjectUpdatedEventMock("4", question4, question4)); assertEquals(1, c.getCreate().size()); createIterator = c.getCreate().entrySet().iterator(); createEntry = createIterator.next(); assertEquals("4", createEntry.getValue().toExternalForm()); assertEquals("answer4Active", ((Question) createEntry.getKey()).getAnswer()); assertNull(c.getUpdate()); assertNull(c.getDelete()); } @Test public void testUpdateOnlyChangedAnswerAndIsSame() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question5, answer5New })); question5.setAnswer("answer5New"); c.objectUpdated(new ObjectUpdatedEventMock("5", question5, question5)); // c.objectRetracted(new ObjectRetractedEventMock("a", answer5New)); assertNull(c.getCreate()); assertNull(c.getUpdate()); // assertNull(c.getDelete()); } @Test public void testUpdateOnlyChangedAnswerAndIsDifferent() { c = new ChangeCollector(); c.initialise(Arrays.asList(new Object[] { question5,answer5Old })); question5.setAnswer("answer5New"); c.objectUpdated(new ObjectUpdatedEventMock("5", question5, question5)); c.objectRetracted(new ObjectRetractedEventMock("a", answer5Old)); assertNull(c.getCreate()); assertEquals(1, c.getUpdate().size()); updateIterator = c.getUpdate().iterator(); assertEquals("answer5New", ((Question) updateIterator.next()).getAnswer()); assertNull(c.getDelete()); } private class Dummy { } }