/* * Copyright (c) 2010-2016. Axon Framework * * 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.axonframework.test.aggregate; import org.axonframework.commandhandling.model.AggregateNotFoundException; import org.axonframework.test.AxonAssertionError; import org.hamcrest.core.IsNull; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.UUID; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * @author Allard Buijze * @since 0.7 */ public class FixtureTest_RegularParams { private FixtureConfiguration<StandardAggregate> fixture; @Before public void setUp() { fixture = new AggregateTestFixture<>(StandardAggregate.class); fixture.registerAggregateFactory(new StandardAggregate.Factory()); } @Test public void testFixture_NoEventsInStore() { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given() .when(new TestCommand(UUID.randomUUID())) .expectException(AggregateNotFoundException.class); } @Test public void testFirstFixture() { ResultValidator validator = fixture .registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(new MyEvent("aggregateId", 1)) .when(new TestCommand("aggregateId")); validator.expectReturnValue(null); validator.expectEvents(new MyEvent("aggregateId", 2)); } @Test public void testExpectEventsIgnoresFilteredField() { ResultValidator validator = fixture .registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .registerFieldFilter(field -> !field.getName().equals("someBytes")) .given(new MyEvent("aggregateId", 1)) .when(new TestCommand("aggregateId")); validator.expectReturnValue(null); validator.expectEvents(new MyEvent("aggregateId", 2, "ignored".getBytes())); } @Test public void testFixture_SetterInjection() { MyCommandHandler commandHandler = new MyCommandHandler(); commandHandler.setRepository(fixture.getRepository()); fixture.registerAnnotatedCommandHandler(commandHandler) .given(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2)) .when(new TestCommand("aggregateId")) .expectReturnValueMatching(IsNull.nullValue()) .expectEvents(new MyEvent("aggregateId", 3)); } @Test public void testFixture_GivenAList() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); fixture .registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectEvents(new MyEvent("aggregateId", 4)) .expectSuccessfulHandlerExecution(); } @Test public void testFixtureDetectsStateChangeOutsideOfHandler_ExplicitValue() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); try { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(givenEvents) .when(new IllegalStateChangeCommand("aggregateId", 5)); fail("Expected AssertionError"); } catch (AssertionError e) { assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains(".lastNumber\"")); assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains("<5>")); assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains("<4>")); } } @Test public void testFixtureIgnoredStateChangeInFilteredField() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); fixture.registerFieldFilter(field -> !field.getName().equals("lastNumber")); fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(givenEvents) .when(new IllegalStateChangeCommand("aggregateId", 5)); } @Test public void testFixtureDetectsStateChangeOutsideOfHandler_NullValue() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); try { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(givenEvents) .when(new IllegalStateChangeCommand("aggregateId", null)); fail("Expected AssertionError"); } catch (AssertionError e) { assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains(".lastNumber\"")); assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains("<null>")); assertTrue("Wrong message: " + e.getMessage(), e.getMessage().contains("<4>")); } } @Test public void testFixtureDetectsStateChangeOutsideOfHandler_Ignored() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); fixture.setReportIllegalStateChange(false); fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(givenEvents) .when(new IllegalStateChangeCommand("aggregateId", null)); } @Test public void testFixtureDetectsStateChangeOutsideOfHandler_AggregateGeneratesIdentifier() { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given() .when(new CreateAggregateCommand(null)); } @Test public void testFixtureDetectsStateChangeOutsideOfHandler_AggregateDeleted() { TestExecutor exec = fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(new MyEvent("aggregateId", 5)); try { exec.when(new DeleteCommand("aggregateId", true)); fail("Fixture should have failed"); } catch (AssertionError error) { assertTrue("Wrong message: " + error.getMessage(), error.getMessage().contains("considered deleted")); } } @Test public void testFixture_AggregateDeleted() { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .given(new MyEvent("aggregateId", 5)) .when(new DeleteCommand("aggregateId", false)) .expectEvents(new MyAggregateDeletedEvent(false)); } @Test public void testFixtureGivenCommands() { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())) .givenCommands(new CreateAggregateCommand("aggregateId"), new TestCommand("aggregateId"), new TestCommand("aggregateId"), new TestCommand("aggregateId")) .when(new TestCommand("aggregateId")) .expectEvents(new MyEvent("aggregateId", 4)); } @Test public void testFixture_CommandHandlerDispatchesNonDomainEvents() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); // the domain events are part of the transaction, but the command handler directly dispatches an application // event to the event bus. This event dispatched anyway. The fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new PublishEventCommand("aggregateId")) .expectEvents(new MyApplicationEvent()); } @Test public void testFixture_ReportWrongNumberOfEvents() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture.registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectEvents(new MyEvent("aggregateId", 4), new MyEvent("aggregateId", 5)); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains("org.axonframework.test.aggregate.MyEvent <|> ")); } } @Test public void testFixture_ReportWrongEvents() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectEvents(new MyOtherEvent()); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains("org.axonframework.test.aggregate.MyOtherEvent <|>" + " org.axonframework.test.aggregate.MyEvent")); } } @Test public void testFixture_UnexpectedException() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new StrangeCommand("aggregateId")) .expectSuccessfulHandlerExecution(); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains("but got <exception of type [StrangeCommandReceivedException]>")); } } @Test public void testFixture_UnexpectedReturnValue() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectException(RuntimeException.class); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains("The command handler returned normally, but an exception was expected")); assertTrue(e.getMessage().contains( "<an instance of java.lang.RuntimeException> but returned with <null>")); } } @Test public void testFixture_WrongReturnValue() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture.registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectReturnValue("some"); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage(), e.getMessage().contains("<\"some\"> but got <null>")); } } @Test public void testFixture_WrongExceptionType() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture.registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new StrangeCommand("aggregateId")) .expectException(IOException.class); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains( "<an instance of java.io.IOException> but got <exception of type [StrangeCommandReceivedException]>")); } } @Test public void testFixture_WrongEventContents() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectEvents(new MyEvent("aggregateId", 5)) // should be 4 .expectSuccessfulHandlerExecution(); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains( "In an event of type [MyEvent], the property [someValue] was not as expected.")); assertTrue(e.getMessage().contains("Expected <5> but got <4>")); } } @Test public void testFixture_WrongEventContents_WithNullValues() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new TestCommand("aggregateId")) .expectEvents(new MyEvent("aggregateId", null)) // should be 4 .expectSuccessfulHandlerExecution(); fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains( "In an event of type [MyEvent], the property [someValue] was not as expected.")); assertTrue(e.getMessage().contains("Expected <<null>> but got <4>")); } } @Test public void testFixture_ExpectedPublishedSameAsStored() { List<?> givenEvents = Arrays.asList(new MyEvent("aggregateId", 1), new MyEvent("aggregateId", 2), new MyEvent("aggregateId", 3)); MyCommandHandler commandHandler = new MyCommandHandler(fixture.getRepository(), fixture.getEventBus()); try { fixture .registerAnnotatedCommandHandler(commandHandler) .given(givenEvents) .when(new StrangeCommand("aggregateId")) .expectException(StrangeCommandReceivedException.class) .expectEvents(new MyEvent("aggregateId", 4)); // should be 4 fail("Expected an AxonAssertionError"); } catch (AxonAssertionError e) { assertTrue(e.getMessage().contains("The published events do not match the expected events")); assertTrue(e.getMessage().contains("org.axonframework.test.aggregate.MyEvent <|> ")); assertTrue(e.getMessage().contains("probable cause")); } } }