package jnpf.elnService.impl; import jnpf.elnEntity.runtime.ElnRecordEntity; import jnpf.elnService.ElnTestRequestIdentityLookup; import jnpf.elnService.ElnRecordSourceCandidateStore; import jnpf.elnService.ElnRecordSourceResolver; import jnpf.exception.DataException; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ElnRecordSourceResolverImplTest { @Test public void resolvesTheOnlySourceRecordUnderTheSameTenantRequestAndTemplateCode() { ElnRecordEntity source = record("source-1", "tenant-a", "item-source", "SOURCE-TEMPLATE"); ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Collections.singletonList(source), (tenantId, testWorkItemIds) -> identities("item-source", "request-1")); ElnRecordEntity actual = resolver.resolve("tenant-a", "request-1", "SOURCE-TEMPLATE"); assertEquals("source-1", actual.getId()); } @Test public void rejectsWhenNoSourceRecordMatchesTheRequestIdentity() { ElnRecordEntity source = record("source-1", "tenant-a", "item-source", "SOURCE-TEMPLATE"); ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Collections.singletonList(source), (tenantId, testWorkItemIds) -> identities("item-source", "another-request")); assertFailure(resolver, "SOURCE_RECORD_NOT_FOUND"); } @Test public void rejectsWhenMoreThanOneSourceRecordMatchesTheRequestIdentity() { ElnRecordEntity first = record("source-1", "tenant-a", "item-source-1", "SOURCE-TEMPLATE"); ElnRecordEntity second = record("source-2", "tenant-a", "item-source-2", "SOURCE-TEMPLATE"); ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Arrays.asList(first, second), (tenantId, testWorkItemIds) -> identities( "item-source-1", "request-1", "item-source-2", "request-1")); assertFailure(resolver, "SOURCE_RECORD_AMBIGUOUS"); } @Test public void excludesCandidatesFromAnotherTenantEvenWhenTheStoreLeaksThem() { ElnRecordEntity local = record("source-local", "tenant-a", "item-local", "SOURCE-TEMPLATE"); ElnRecordEntity foreign = record("source-foreign", "tenant-b", "item-foreign", "SOURCE-TEMPLATE"); ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Arrays.asList(local, foreign), (tenantId, testWorkItemIds) -> { assertEquals("tenant-a", tenantId); return identities("item-local", "request-1", "item-foreign", "request-1"); }); ElnRecordEntity actual = resolver.resolve("tenant-a", "request-1", "SOURCE-TEMPLATE"); assertEquals("source-local", actual.getId()); } @Test public void rejectsMatchingSourceRecordsThatHaveNotBeenSubmitted() { ElnRecordEntity source = record("source-1", "tenant-a", "item-source", "SOURCE-TEMPLATE"); ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Collections.singletonList(source), (tenantId, testWorkItemIds) -> identitiesWithStatus( "item-source", "request-1", "pending_test")); assertFailure(resolver, "SOURCE_RECORD_STATE_NOT_ALLOWED"); } @Test public void acceptsBothSubmittedStatusesWithoutChangingSourceIdentity() { ElnRecordEntity source = record("source-1", "tenant-a", "item-source", "SOURCE-TEMPLATE"); for (String status : Arrays.asList("pending_audit", "audited")) { ElnRecordSourceResolver resolver = resolver( (tenantId, templateCode) -> Collections.singletonList(source), (tenantId, testWorkItemIds) -> identitiesWithStatus( "item-source", "request-1", status)); assertEquals("source-1", resolver.resolve("tenant-a", "request-1", "SOURCE-TEMPLATE").getId()); } } private static ElnRecordSourceResolver resolver(ElnRecordSourceCandidateStore candidates, ElnTestRequestIdentityLookup identities) { return new ElnRecordSourceResolverImpl(candidates, identities); } private static ElnRecordEntity record(String id, String tenantId, String testWorkItemId, String templateCode) { ElnRecordEntity result = new ElnRecordEntity(); result.setId(id); result.setFTenantId(tenantId); result.setJianyanXiangId(testWorkItemId); result.setMubanBianhao(templateCode); return result; } private static Map identities( String... pairs) { Map result = new HashMap<>(); for (int index = 0; index < pairs.length; index += 2) { result.put(pairs[index], new ElnTestRequestIdentityLookup.Identity( pairs[index + 1], "pending_audit")); } return result; } private static Map identitiesWithStatus( String itemId, String requestId, String status) { Map result = new HashMap<>(); result.put(itemId, new ElnTestRequestIdentityLookup.Identity(requestId, status)); return result; } private static void assertFailure(ElnRecordSourceResolver resolver, String expectedCode) { try { resolver.resolve("tenant-a", "request-1", "SOURCE-TEMPLATE"); fail("expected DataException"); } catch (DataException e) { assertTrue(e.getMessage().contains(expectedCode)); } } }