package org.nextprot.api.core.service; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.nextprot.api.annotation.builder.statement.service.StatementService; import org.dbunit.dataset.DataSetException; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.nextprot.api.commons.service.MasterIdentifierService; import org.nextprot.api.core.dao.AnnotationDAO; import org.nextprot.api.core.dao.BioPhyChemPropsDao; import org.nextprot.api.core.dao.DbXrefDao; import org.nextprot.api.core.dao.IsoformDAO; import org.nextprot.api.core.domain.annotation.Annotation; import org.nextprot.api.core.domain.annotation.AnnotationIsoformSpecificity; import org.nextprot.api.core.service.impl.AnnotationServiceImpl; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; /** * @author dteixeira * @author fnikitin */ public class AnnotationMockServiceTest { private FlatXmlDataSetExtractor flatXmlDataSetExtractor; @InjectMocks private AnnotationService annotationService = new AnnotationServiceImpl(); @Mock private MasterIdentifierService masterIdentifierService; @Mock private AnnotationDAO annotationDAO; @Mock private DbXrefDao dbXrefDao; @Mock private DbXrefService dbXrefService; @Mock private IsoformService isoformService; @Mock private InteractionService interactionService; @Mock private PeptideMappingService peptideMappingService; @Mock private IsoformDAO isoformDAO; @Mock private BioPhyChemPropsDao bioPhyChemPropsDao; @Mock private AntibodyMappingService antibodyMappingService; @Mock private StatementService statementService; @Mock private ExperimentalContextDictionaryService experimentalContextDictionaryService; @Before public void init() throws FileNotFoundException, DataSetException { flatXmlDataSetExtractor = new FlatXmlDataSetExtractor(AnnotationMockServiceTest.class.getResource("AnnotationMVCTest.xml").getFile()); //System.out.println(flatXmlDataSetExtractor.toString()); MockitoAnnotations.initMocks(this); when(masterIdentifierService.findUniqueNames()).thenReturn(Sets.newHashSet("NX_P12345, NX_P10000")); } @Test public void verifyAnnotationService() throws DataSetException { stubAnnotationDAO("NX_P12345", flatXmlDataSetExtractor, annotationDAO); annotationService.findAnnotations("NX_P12345"); Mockito.verify(annotationDAO).findAnnotationsByEntryName("NX_P12345"); Mockito.verify(interactionService).findInteractionsAsAnnotationsByEntry("NX_P12345"); Mockito.verify(dbXrefService).findDbXrefsAsAnnotationsByEntry("NX_P12345"); } @Test public void shouldGetTheListOfAnnotationsFromService() throws DataSetException { stubAnnotationDAO("NX_P12345", flatXmlDataSetExtractor, annotationDAO); List<Annotation> annotations = annotationService.findAnnotations("NX_P12345"); assertEquals(5, annotations.size()); } private static void stubAnnotationDAO(String isoformId, FlatXmlDataSetExtractor flatXmlDataSetExtractor, AnnotationDAO annotationDAO) throws DataSetException { List<Annotation> annotations = extractAnnotations(flatXmlDataSetExtractor); List<AnnotationIsoformSpecificity> specs = extractIsoformSpecificity(flatXmlDataSetExtractor); when(annotationDAO.findAnnotationsByEntryName(isoformId)).thenReturn(annotations); when(annotationDAO.findAnnotationIsoformsByAnnotationIds(Mockito.anyListOf(Long.class))).thenReturn(Lists.newArrayList(specs)); } private static List<Annotation> extractAnnotations(FlatXmlDataSetExtractor extractor) throws DataSetException { FlatXmlDataSetExtractor.Factory<Annotation> factory = new FlatXmlDataSetExtractor.Factory<Annotation>() { @Override public Annotation create() { return new Annotation(); } @Override public void setField(Annotation annotation, String key, String value) { switch (key) { case "annotation_id": annotation.setAnnotationId(Long.valueOf(value)); break; case "unique_name": annotation.setUniqueName(value); break; case "description": annotation.setDescription(value); break; case "cv_quality_qualifier_id": annotation.setQualityQualifier(value); break; } } }; return extractor.extractDataList("annotations", factory, "annotation_id", "unique_name", "description", "cv_quality_qualifier_id"); } private static List<AnnotationIsoformSpecificity> extractIsoformSpecificity(FlatXmlDataSetExtractor extractor) throws DataSetException { FlatXmlDataSetExtractor.Factory<AnnotationIsoformSpecificity> factory = new FlatXmlDataSetExtractor.Factory<AnnotationIsoformSpecificity>() { @Override public AnnotationIsoformSpecificity create() { return new AnnotationIsoformSpecificity(); } @Override public void setField(AnnotationIsoformSpecificity spec, String key, String value) { switch (key) { case "annotation_protein_id": spec.setAnnotationId(Long.valueOf(value)); break; case "first_pos": spec.setFirstPosition(Integer.valueOf(value)); break; case "last_pos": spec.setLastPosition(Integer.valueOf(value)); } } }; List<AnnotationIsoformSpecificity> specs = extractor.extractDataList("protein_feature_positions", factory, "annotation_protein_id", "first_pos", "last_pos"); Map<Long, String> ids = extractSequenceIdentifiers(extractor); for (AnnotationIsoformSpecificity spec : specs) { spec.setIsoformAccession(ids.get(spec.getAnnotationId())); } return specs; } private static class LongString { private long key; private String value; public long getKey() { return key; } public void setKey(long key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } private static Map<Long, String> extractSequenceIdentifiers(FlatXmlDataSetExtractor extractor) throws DataSetException { FlatXmlDataSetExtractor.Factory<LongString> factory = new FlatXmlDataSetExtractor.Factory<LongString>() { @Override public LongString create() { return new LongString(); } @Override public void setField(LongString keyvalue, String key, String value) { switch (key) { case "identifier_id": keyvalue.setKey(Long.valueOf(value)); break; case "unique_name": keyvalue.setValue(value); } } }; Map<Long, String> map = new HashMap<>(); for (LongString keyvalue : extractor.extractDataList("sequence_identifiers", factory, "identifier_id", "unique_name")) { map.put(keyvalue.getKey(), keyvalue.getValue()); } return map; } }