/* Copyright 2014 Danish Maritime Authority. * * 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 net.maritimecloud.serviceregistry.command.organization; import net.maritimecloud.serviceregistry.command.api.OrganizationNameAndSummaryChanged; import net.maritimecloud.serviceregistry.command.api.OrganizationCreated; import net.maritimecloud.serviceregistry.command.api.CreateOrganization; import net.maritimecloud.common.infrastructure.axon.CommonFixture; import static net.maritimecloud.common.infrastructure.axon.CommonFixture.AN_ALIAS; import static net.maritimecloud.common.infrastructure.axon.CommonFixture.A_NAME; import static net.maritimecloud.common.infrastructure.axon.CommonFixture.A_SUMMARY; import static net.maritimecloud.common.infrastructure.axon.CommonFixture.A_URL; import static net.maritimecloud.common.infrastructure.axon.CommonFixture.anOrganizationId; import net.maritimecloud.common.spring.ApplicationContextProvider; import net.maritimecloud.serviceregistry.command.api.AddOrganizationAlias; import net.maritimecloud.serviceregistry.command.api.AddServiceInstanceAlias; import net.maritimecloud.serviceregistry.command.api.ChangeOrganizationNameAndSummary; import net.maritimecloud.serviceregistry.command.api.ChangeOrganizationWebsiteUrl; import net.maritimecloud.serviceregistry.command.api.OrganizationAliasAdded; import net.maritimecloud.serviceregistry.command.api.OrganizationPrimaryAliasAdded; import net.maritimecloud.serviceregistry.command.api.OrganizationWebsiteUrlChanged; import net.maritimecloud.serviceregistry.command.api.RemoveServiceInstanceAlias; import net.maritimecloud.serviceregistry.command.api.ServiceInstanceAliasAdded; import net.maritimecloud.serviceregistry.command.api.ServiceInstanceAliasRegistrationDenied; import net.maritimecloud.serviceregistry.command.api.ServiceInstanceAliasRemoved; import net.maritimecloud.serviceregistry.command.api.ServiceInstancePrimaryAliasAdded; import net.maritimecloud.serviceregistry.domain.service.AliasGroups; import net.maritimecloud.serviceregistry.domain.service.AliasService; import org.axonframework.test.FixtureConfiguration; import org.axonframework.test.Fixtures; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import static org.mockito.Mockito.when; import org.springframework.context.ApplicationContext; /** * * @author Christoffer Børrild */ public class OrganizationTest extends CommonFixture { private FixtureConfiguration<Organization> fixture; private AliasService mockedAliasService; @Before public void setUp() throws Exception { fixture = Fixtures.newGivenWhenThenFixture(Organization.class); // just some ugly mocking for the organization alias test : ( ApplicationContext applicationContext = Mockito.mock(ApplicationContext.class); mockedAliasService = Mockito.mock(AliasService.class); new ApplicationContextProvider().setApplicationContext(applicationContext); when(applicationContext.getBean("aliasService")).thenReturn(mockedAliasService); } @Test public void createOrganization() throws Exception { fixture.givenNoPriorActivity() .when(new CreateOrganization(anOrganizationId, AN_ALIAS, A_NAME, A_SUMMARY, A_URL)) .expectEvents(new OrganizationCreated(anOrganizationId, AN_ALIAS, A_NAME, A_SUMMARY, A_URL)); } @Test public void changeOrganizationNameAndSummary() throws Exception { fixture.given(new OrganizationCreated(anOrganizationId, AN_ALIAS, A_NAME, A_SUMMARY, A_URL)) .when(new ChangeOrganizationNameAndSummary(anOrganizationId, A_NAME, A_SUMMARY)) .expectEvents(new OrganizationNameAndSummaryChanged(anOrganizationId, A_NAME, A_SUMMARY)); } @Test public void changeOrganizationWebsiteUrl() throws Exception { fixture.given(new OrganizationCreated(anOrganizationId, AN_ALIAS, A_NAME, A_SUMMARY, A_URL)) .when(new ChangeOrganizationWebsiteUrl(anOrganizationId, A_URL)) .expectEvents(new OrganizationWebsiteUrlChanged(anOrganizationId, A_URL)); } @Test public void firstAddOrganizationAlias() { // Given no existing aliases on target when(mockedAliasService.isDefined(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS)).thenReturn(false); when(mockedAliasService.hasTarget(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ORG_ID)).thenReturn(false); fixture.given( organizationCreatedEvent() ) .when(new AddOrganizationAlias(anOrganizationId, AN_ALIAS)) .expectEvents(new OrganizationPrimaryAliasAdded(anOrganizationId, AN_ALIAS)); } @Test public void secondAddOrganizationAlias() { // Given existing aliases on target when(mockedAliasService.isDefined(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS)).thenReturn(false); when(mockedAliasService.hasTarget(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ORG_ID)).thenReturn(true); fixture.given( organizationCreatedEvent() ) .when(new AddOrganizationAlias(anOrganizationId, AN_ALIAS)) .expectEvents(new OrganizationAliasAdded(anOrganizationId, AN_ALIAS)); } @Test public void addOrganizationAliasIsIdempotent() { // Given alias already defined on same target when(mockedAliasService.isDefined(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS)).thenReturn(true); when(mockedAliasService.isIdentical(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS, AN_ORG_ID)).thenReturn(true); fixture.given( organizationCreatedEvent() ) .when(new AddOrganizationAlias(anOrganizationId, AN_ALIAS)) .expectEvents(); } @Test public void addOrganizationAliasAlreadyUsedShouldBeDenied() { // Given alias already defined on other target when(mockedAliasService.isDefined(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS)).thenReturn(true); when(mockedAliasService.isIdentical(AliasGroups.USERS_AND_ORGANIZATIONS.name(), AN_ALIAS, AN_ORG_ID)).thenReturn(false); fixture.given( organizationCreatedEvent() ) .when(new AddOrganizationAlias(anOrganizationId, AN_ALIAS)) .expectEvents(/*new OrganizationAliasRegistrationDenied(anOrganizationId, AN_ALIAS)*/); } @Test public void firstAddServiceInstanceAlias() { fixture.given( organizationCreatedEvent(), serviceSpecificationCreatedEvent(), serviceInstanceCreatedEvent() ) .when(new AddServiceInstanceAlias(anOrganizationId, aServiceInstanceId, AN_ALIAS)) .expectEvents(new ServiceInstancePrimaryAliasAdded(anOrganizationId, aServiceInstanceId, AN_ALIAS)); } @Test public void subsequentAddServiceInstanceAlias() { fixture.given( organizationCreatedEvent(), serviceSpecificationCreatedEvent(), serviceInstanceCreatedEvent(), new ServiceInstancePrimaryAliasAdded(anOrganizationId, aServiceInstanceId, AN_ALIAS) ) .when(new AddServiceInstanceAlias(anOrganizationId, aServiceInstanceId, ANOTHER_ALIAS)) .expectEvents(new ServiceInstanceAliasAdded(anOrganizationId, aServiceInstanceId, ANOTHER_ALIAS)); } @Test public void removeServiceInstanceAlias() { fixture.given( organizationCreatedEvent(), serviceSpecificationCreatedEvent(), serviceInstanceCreatedEvent(), new ServiceInstancePrimaryAliasAdded(anOrganizationId, aServiceInstanceId, AN_ALIAS), new ServiceInstanceAliasAdded(anOrganizationId, aServiceInstanceId, ANOTHER_ALIAS) ) .when(new RemoveServiceInstanceAlias(anOrganizationId, aServiceInstanceId, ANOTHER_ALIAS)) .expectEvents(new ServiceInstanceAliasRemoved(anOrganizationId, ANOTHER_ALIAS)); } @Test public void duplicateAddServiceInstanceAliasShouldBeDenied() { fixture.given( organizationCreatedEvent(), serviceSpecificationCreatedEvent(), serviceInstanceCreatedEvent(), new ServiceInstanceAliasAdded(anOrganizationId, aServiceInstanceId, AN_ALIAS) ) .when(new AddServiceInstanceAlias(anOrganizationId, anotherServiceInstanceId, AN_ALIAS)) .expectEvents(new ServiceInstanceAliasRegistrationDenied(anOrganizationId, anotherServiceInstanceId, AN_ALIAS)); } @Test public void ResubmittedAddDuplicateServiceInstanceAliasShouldBeIgnored() { fixture.given( organizationCreatedEvent(), serviceSpecificationCreatedEvent(), serviceInstanceCreatedEvent(), new ServiceInstanceAliasAdded(anOrganizationId, aServiceInstanceId, AN_ALIAS) ) .when(new AddServiceInstanceAlias(anOrganizationId, aServiceInstanceId, AN_ALIAS)) .expectEvents(); } }