/*************************************************************************
* *
* This file is part of the 20n/act project. *
* 20n/act enables DNA prediction for synthetic biology/bioengineering. *
* Copyright (C) 2017 20n Labs, Inc. *
* *
* Please direct all queries to act@20n.com. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*************************************************************************/
package com.act.biointerpretation.l2expansion;
import act.server.MongoDB;
import act.shared.Chemical;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import static org.junit.Assert.assertEquals;
public class ChemicalsTransformerTest {
final String VALID_SUBSTRATE = "substrate";
final String VALID_PRODUCT = "product";
final String INVALID_INCHI = "not_in_db";
final Long SUBSTRATE_ID = new Long(1);
final Long PRODUCT_ID = new Long(2);
final String SUBSTRATE_NAME = "this_substrate_name";
final String PRODUCT_NAME = "this_product_name";
final Integer PREDICTION_ID = new Integer(3);
final String GROUP_NAME = "MarkDaly";
MongoDB mockMongo;
@Before
public void setup() {
// Set up mock chemicals
Chemical productChemical = Mockito.mock(Chemical.class);
Mockito.when(productChemical.getUuid()).thenReturn(PRODUCT_ID);
Mockito.when(productChemical.getFirstName()).thenReturn(PRODUCT_NAME);
Chemical substrateChemical = Mockito.mock(Chemical.class);
Mockito.when(substrateChemical.getUuid()).thenReturn(SUBSTRATE_ID);
Mockito.when(substrateChemical.getFirstName()).thenReturn(SUBSTRATE_NAME);
//Set up mock mongo db
mockMongo = Mockito.mock(MongoDB.class);
Mockito.when(mockMongo.getChemicalFromInChI(VALID_SUBSTRATE)).thenReturn(substrateChemical);
Mockito.when(mockMongo.getChemicalFromInChI(VALID_PRODUCT)).thenReturn(productChemical);
Mockito.when(mockMongo.getChemicalFromInChI(INVALID_INCHI)).thenReturn(null);
}
@Test
public void testChemicalsInDB() {
// Arrange
List<L2PredictionChemical> testSubstrates =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(VALID_SUBSTRATE));
List<L2PredictionChemical> testProducts =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(VALID_PRODUCT));
L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, testSubstrates, GROUP_NAME, testProducts);
Function<L2Prediction, L2Prediction> filter = new ChemicalsTransformer(mockMongo);
// Act
L2Prediction result = filter.apply(testPrediction);
// Assert
assertEquals("Should contain one substrate ID.", 1, result.getSubstrateIds().size());
assertEquals("Should contain one product ID.", 1, result.getProductIds().size());
assertEquals("Should contain correct substrate ID.",
SUBSTRATE_ID, result.getSubstrateIds().get(0));
assertEquals("Should contain correct substrate name.",
SUBSTRATE_NAME, result.getSubstrateNames().get(0));
assertEquals("Should contain correct product inchi.",
PRODUCT_ID, result.getProductIds().get(0));
assertEquals("Should contain correct product name.",
PRODUCT_NAME, result.getProductNames().get(0));
}
@Test
public void testSubstrateNotInDB() {
// Arrange
List<L2PredictionChemical> testSubstrates =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(INVALID_INCHI));
List<L2PredictionChemical> testProducts =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(VALID_PRODUCT));
L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, testSubstrates, GROUP_NAME, testProducts);
Function<L2Prediction, L2Prediction> filter = new ChemicalsTransformer(mockMongo);
// Act
L2Prediction result = filter.apply(testPrediction);
// Assert
assertEquals("Should contain no substrate ID.", 0, result.getSubstrateIds().size());
assertEquals("Should contain no substrate name.", 0, result.getSubstrateNames().size());
assertEquals("Should contain one product ID.", 1, result.getProductIds().size());
assertEquals("Should contain one product name.", 1, result.getProductNames().size());
}
@Test
public void testProductNotInDB() {
// Arrange
List<L2PredictionChemical> testSubstrates =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(VALID_SUBSTRATE));
List<L2PredictionChemical> testProducts =
L2PredictionChemical.getPredictionChemicals(Arrays.asList(INVALID_INCHI));
L2Prediction testPrediction = new L2Prediction(PREDICTION_ID, testSubstrates, GROUP_NAME, testProducts);
Function<L2Prediction, L2Prediction> filter = new ChemicalsTransformer(mockMongo);
// Act
L2Prediction result = filter.apply(testPrediction);
// Assert
assertEquals("Should contain one substrate ID.", 1, result.getSubstrateIds().size());
assertEquals("Should contain one substrate name.", 1, result.getSubstrateNames().size());
assertEquals("Should contain no product ID.", 0, result.getProductIds().size());
assertEquals("Should contain no product name.", 0, result.getProductNames().size());
}
}