package ca.intelliware.ihtsdo.mlds.service; import java.util.Set; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import ca.intelliware.ihtsdo.mlds.domain.Affiliate; import ca.intelliware.ihtsdo.mlds.domain.Application; import ca.intelliware.ihtsdo.mlds.domain.ApprovalState; import ca.intelliware.ihtsdo.mlds.domain.ExtensionApplication; import ca.intelliware.ihtsdo.mlds.domain.Member; import ca.intelliware.ihtsdo.mlds.domain.PrimaryApplication; import ca.intelliware.ihtsdo.mlds.repository.MemberRepository; @RunWith(MockitoJUnitRunner.class) public class AffiliateMembershipCalculatorTest { @Mock private MemberRepository memberRespository; Member ihtsdo; Member sweden; Member france; Affiliate affiliate; private AffiliateMembershipCalculator affiliateMembershipCalculator; @Before public void setup() { affiliateMembershipCalculator = new AffiliateMembershipCalculator(); affiliateMembershipCalculator.memberRepository = memberRespository; sweden = new Member("SE", 1); france = new Member("FR", 2); ihtsdo = new Member("IHTSDO", 3); affiliate = new Affiliate(); Mockito.when(memberRespository.findOneByKey("IHTSDO")).thenReturn(ihtsdo); } @Test public void acceptedMembershipsShouldReturnEmptyForNewAffiliate() { Set<Member> result = affiliateMembershipCalculator.acceptedMemberships(affiliate); Assert.assertThat(result, Matchers.emptyCollectionOf(Member.class)); } @Test public void acceptedMembershipsShouldReturnOnlyAcceptedMemberships() { withExtensionApplication(sweden, ApprovalState.NOT_SUBMITTED); withExtensionApplication(france, ApprovalState.APPROVED); Set<Member> result = affiliateMembershipCalculator.acceptedMemberships(affiliate); Assert.assertThat(result, Matchers.contains(france)); } @Test public void acceptedMembershipsShouldSupportMultipleMemberships() { withExtensionApplication(sweden, ApprovalState.APPROVED); withExtensionApplication(france, ApprovalState.APPROVED); Set<Member> result = affiliateMembershipCalculator.acceptedMemberships(affiliate); Assert.assertThat(result, Matchers.containsInAnyOrder(france, sweden)); } @Test public void acceptedMembershipsShouldSupportManyApplicationsForSameMember() { withExtensionApplication(sweden, ApprovalState.REJECTED); withExtensionApplication(sweden, ApprovalState.APPROVED); Set<Member> result = affiliateMembershipCalculator.acceptedMemberships(affiliate); Assert.assertThat(result, Matchers.contains(sweden)); } @Test public void acceptedMembershipsShouldIncludeIhtsdoForPrimary() { withPrimaryApplication(france, ApprovalState.APPROVED); Set<Member> result = affiliateMembershipCalculator.acceptedMemberships(affiliate); Assert.assertThat(result, Matchers.containsInAnyOrder(ihtsdo, france)); } private Application withPrimaryApplication(Member member, ApprovalState approvalState) { Application application = new PrimaryApplication(affiliate.getApplications().size() + 1); return withApplication(application, member, approvalState); } private Application withExtensionApplication(Member member, ApprovalState approvalState) { Application application = new ExtensionApplication(affiliate.getApplications().size() + 1); return withApplication(application, member, approvalState); } private Application withApplication(Application application, Member member, ApprovalState approvalState) { application.setMember(member); application.setApprovalState(approvalState); affiliate.addApplication(application); return application; } }