View Javadoc
1   package fr.ifremer.dali.dao.data.measurement;
2   
3   /*
4    * #%L
5    * Dali :: Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.ImmutableList;
27  import com.google.common.collect.Lists;
28  import fr.ifremer.dali.dao.DaliDatabaseResource;
29  import fr.ifremer.dali.dao.referential.pmfm.DaliPmfmDao;
30  import fr.ifremer.dali.dao.referential.pmfm.DaliQualitativeValueDao;
31  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonGroupDao;
32  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonNameDao;
33  import fr.ifremer.dali.dto.DaliBeanFactory;
34  import fr.ifremer.dali.dto.DaliBeans;
35  import fr.ifremer.dali.dto.data.measurement.MeasurementDTO;
36  import fr.ifremer.dali.dto.referential.TaxonDTO;
37  import fr.ifremer.dali.dto.referential.TaxonGroupDTO;
38  import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
39  import fr.ifremer.dali.dto.referential.pmfm.QualitativeValueDTO;
40  import fr.ifremer.dali.service.DaliServiceLocator;
41  import fr.ifremer.quadrige3.core.test.AbstractDaoTest;
42  import org.apache.commons.collections4.ListUtils;
43  import org.junit.Before;
44  import org.junit.ClassRule;
45  import org.junit.FixMethodOrder;
46  import org.junit.Test;
47  import org.junit.runners.MethodSorters;
48  
49  import java.math.BigDecimal;
50  import java.time.LocalDate;
51  import java.util.List;
52  import java.util.Map;
53  import java.util.function.Predicate;
54  
55  import static org.junit.Assert.*;
56  
57  @FixMethodOrder(MethodSorters.NAME_ASCENDING)
58  public class MeasurementDaoWriteTest extends AbstractDaoTest {
59  
60      @ClassRule
61      public static final DaliDatabaseResource dbResource = DaliDatabaseResource.writeDb();
62  
63      private DaliPmfmDao pmfmDao;
64      private DaliMeasurementDao measurementDao;
65      private DaliTaxonGroupDao taxonGroupDao;
66      private DaliTaxonNameDao taxonNameDao;
67      private DaliQualitativeValueDao qualitativeValueDao;
68  
69      private static final int SURVEY_ID = 101;
70  
71      @Before
72      @Override
73      public void setUp() throws Exception {
74          super.setUp();
75          pmfmDao = DaliServiceLocator.instance().getService("daliPmfmDao", DaliPmfmDao.class);
76          measurementDao = DaliServiceLocator.instance().getService("daliMeasurementDao", DaliMeasurementDao.class);
77          taxonGroupDao = DaliServiceLocator.instance().getService("daliTaxonGroupDao", DaliTaxonGroupDao.class);
78          taxonNameDao = DaliServiceLocator.instance().getService("daliTaxonNameDao", DaliTaxonNameDao.class);
79          qualitativeValueDao = DaliServiceLocator.instance().getService("daliQualitativeValueDao", DaliQualitativeValueDao.class);
80          setCommitOnTearDown(true);
81      }
82  
83      @Test
84      public void createUpdateSurveyMeasurement() {
85  
86          // load taxons caches first to avoid exception on taxon_name 17 who is an obsolete referent
87          taxonGroupDao.getAllTaxonGroups();
88  
89          List<MeasurementDTO> measurements = Lists.newArrayList();
90  
91          // non individual pmfm with numerical value
92          PmfmDTO pmfm1 = pmfmDao.getPmfmById(11);
93          assertNotNull(pmfm1);
94          MeasurementDTO m1 = DaliBeanFactory.newMeasurementDTO();
95          m1.setNumericalValue(BigDecimal.valueOf(2.5));
96          m1.setPrecision(2);
97          m1.setDigitNb(1);
98          m1.setComment("(m1) numeric measurement on pmfm 151");
99          MeasurementDTO m2 = DaliBeanFactory.newMeasurementDTO();
100         m2.setNumericalValue(BigDecimal.valueOf(1.28));
101         m2.setPrecision(3);
102         m2.setDigitNb(2);
103         m2.setComment("(m2) numeric measurement 2 on pmfm 151");
104         m1.setPmfm(pmfm1);
105         m2.setPmfm(pmfm1);
106         measurements.add(m1);
107         measurements.add(m2);
108 
109         // non individual pmfm with qualitative value
110         PmfmDTO pmfm2 = pmfmDao.getPmfmById(4);
111         assertNotNull(pmfm2);
112         MeasurementDTO m3 = DaliBeanFactory.newMeasurementDTO();
113         assertEquals(1, pmfm2.sizeQualitativeValues());
114         QualitativeValueDTO qualVal1 = pmfm2.getQualitativeValues(0);
115         assertNotNull(qualVal1);
116         m3.setQualitativeValue(qualVal1);
117         m3.setComment("(m3) qualitative measurement on pmfm 144");
118         m3.setPmfm(pmfm2);
119         measurements.add(m3);
120 
121         // individual pmfm with numerical value
122         PmfmDTO pmfm3 = pmfmDao.getPmfmById(23);
123         assertNotNull(pmfm3);
124         MeasurementDTO m4 = DaliBeanFactory.newMeasurementDTO();
125         m4.setNumericalValue(BigDecimal.valueOf(17.35)); // Value from mantis #37438
126         m4.setPrecision(4);
127         m4.setDigitNb(2);
128         m4.setComment("(m4) numeric measurement on individual pmfm 157");
129         TaxonGroupDTO taxonGroup1 = taxonGroupDao.getTaxonGroupById(3);
130         assertNotNull(taxonGroup1);
131         m4.setTaxonGroup(taxonGroup1);
132         m4.setPmfm(pmfm3);
133         m4.setIndividualId(4);
134         measurements.add(m4);
135 
136         // individual pmfm with qualitative value
137         PmfmDTO pmfm4 = pmfmDao.getPmfmById(24);
138         assertNotNull(pmfm4);
139         assertEquals(2, pmfm4.sizeQualitativeValues());
140         QualitativeValueDTO qualVal2 = pmfm4.getQualitativeValues(0);
141         assertNotNull(qualVal2);
142         MeasurementDTO m5 = DaliBeanFactory.newMeasurementDTO();
143         m5.setQualitativeValue(qualVal2);
144         m5.setComment("(m5) qualitative measurement 1 on pmfm 158");
145         TaxonDTO taxon1 = taxonNameDao.getTaxonNameByReferenceId(7);
146         assertNotNull(taxon1);
147         m5.setTaxon(taxon1);
148         m5.setPmfm(pmfm4);
149         m5.setIndividualId(6);
150         measurements.add(m5);
151 
152         MeasurementDTO m6 = DaliBeanFactory.newMeasurementDTO();
153         QualitativeValueDTO qualVal3 = pmfm4.getQualitativeValues(1);
154         assertNotNull(qualVal3);
155         m6.setQualitativeValue(qualVal3);
156         m6.setComment("(m6) qualitative measurement 2 on pmfm 158");
157         TaxonGroupDTO taxonGroup2 = taxonGroupDao.getTaxonGroupById(9);
158         assertNotNull(taxonGroup2);
159         m6.setTaxonGroup(taxonGroup2);
160         List<TaxonDTO> taxons = (List<TaxonDTO>) taxonNameDao.getAllTaxonNamesMapByTaxonGroupId(LocalDate.now()).get(taxonGroup2.getId());
161         assertNotNull(taxons);
162         assertTrue(taxons.size() > 0);
163         TaxonDTO taxon2 = taxons.get(0);
164         m6.setTaxon(taxon2);
165         m6.setPmfm(pmfm4);
166         m6.setIndividualId(7);
167         measurements.add(m6);
168 
169         // save all
170         measurementDao.saveMeasurementsBySurveyId(SURVEY_ID, measurements);
171 
172         // read all
173         List<MeasurementDTO> reloadedMeasurements = measurementDao.getMeasurementsBySurveyId(SURVEY_ID);
174         assertNotNull(reloadedMeasurements);
175 
176         // compare
177         assertMeasurementsEquals(measurements, reloadedMeasurements);
178 
179         // update some values
180         m1.setNumericalValue(BigDecimal.valueOf(12.3));
181         m1.setDigitNb(null);
182         m2.setPrecision(null);
183         m2.setNumericalValue(null);
184         m3.setQualitativeValue(qualitativeValueDao.getQualitativeValuesByParameterCode(pmfm2.getParameter().getCode()).get(1)); // set a qualitative value not in pmfm
185         m3.setComment(null);
186         m4.setComment("(m4) new comment");
187         m4.setTaxonGroup(taxonGroupDao.getTaxonGroupById(4));
188         m5.setQualitativeValue(qualitativeValueDao.getQualitativeValuesByParameterCode(pmfm4.getParameter().getCode()).get(1)); // set a qualitative value not in pmfm
189         m5.setTaxonGroup(null);
190         m6.setTaxon(null);
191         m6.setQualitativeValue(null);
192 
193         // save all again
194         measurementDao.saveMeasurementsBySurveyId(SURVEY_ID, measurements);
195 
196         // read all again
197         reloadedMeasurements = measurementDao.getMeasurementsBySurveyId(SURVEY_ID);
198         assertNotNull(reloadedMeasurements);
199 
200         // compare measurements size (m2 & m6 should be deleted)
201         assertEquals(measurements.size() - 2 /* == 4 */, reloadedMeasurements.size());
202 
203         // remove m3 and m4
204         // use remove by index because remove by object use the dto hashCode (m1.id=m4.id, m2.id=m5.id, m3.id=m6.id)
205         measurements.remove(2);
206         // save all again
207         measurementDao.saveMeasurementsBySurveyId(SURVEY_ID, measurements);
208         // read all again
209         reloadedMeasurements = measurementDao.getMeasurementsBySurveyId(SURVEY_ID);
210         assertNotNull(reloadedMeasurements);
211         assertEquals(measurements.size() - 2 /* == 3 */, reloadedMeasurements.size());
212 
213         // delete some measurements
214         measurementDao.removeMeasurementsByIds(ImmutableList.of(m1.getId()));
215         measurementDao.removeTaxonMeasurementsByIds(ImmutableList.of(m5.getId()));
216 
217         // read all again
218         reloadedMeasurements = measurementDao.getMeasurementsBySurveyId(SURVEY_ID);
219         assertNotNull(reloadedMeasurements);
220         assertEquals(1, reloadedMeasurements.size());
221 
222     }
223 
224     private void assertMeasurementsEquals(List<MeasurementDTO> expectedMeasurements, List<MeasurementDTO> measurementsToTest) {
225 
226         assertEquals(expectedMeasurements.size(), measurementsToTest.size());
227 
228         // split into 2 lists : individual and non-individual measurements
229         Predicate<MeasurementDTO> individualPredicate = input -> input.getIndividualId() != null;
230         List<MeasurementDTO> expectedIndividualMeasurements = DaliBeans.filterCollection(expectedMeasurements, individualPredicate);
231         List<MeasurementDTO> expectedNonIndividualMeasurements = ListUtils.removeAll(expectedMeasurements, expectedIndividualMeasurements);
232         List<MeasurementDTO> individualMeasurementsToTest = DaliBeans.filterCollection(measurementsToTest, individualPredicate);
233         List<MeasurementDTO> nonIndividualMeasurementsToTest = ListUtils.removeAll(measurementsToTest, individualMeasurementsToTest);
234 
235         assertEquals(expectedIndividualMeasurements.size(), individualMeasurementsToTest.size());
236         assertEquals(expectedNonIndividualMeasurements.size(), nonIndividualMeasurementsToTest.size());
237 
238         // individual
239         Map<Integer, MeasurementDTO> measurementToTestMap = DaliBeans.mapById(individualMeasurementsToTest);
240         for (MeasurementDTO expectedMeasurement : expectedIndividualMeasurements) {
241             assertNotNull(expectedMeasurement.getId());
242             MeasurementDTO measurementToTest = measurementToTestMap.get(expectedMeasurement.getId());
243             assertNotNull(measurementToTest);
244             assertMeasurementEquals(expectedMeasurement, measurementToTest);
245         }
246 
247         // non-individual
248         measurementToTestMap = DaliBeans.mapById(nonIndividualMeasurementsToTest);
249         for (MeasurementDTO expectedMeasurement : expectedNonIndividualMeasurements) {
250             assertNotNull(expectedMeasurement.getId());
251             MeasurementDTO measurementToTest = measurementToTestMap.get(expectedMeasurement.getId());
252             assertNotNull(measurementToTest);
253             assertMeasurementEquals(expectedMeasurement, measurementToTest);
254         }
255 
256     }
257 
258     private void assertMeasurementEquals(MeasurementDTO expectedMeasurement, MeasurementDTO measurementToTest) {
259         assertTrue(expectedMeasurement != measurementToTest);
260         assertEquals(expectedMeasurement.getPmfm(), measurementToTest.getPmfm());
261         assertEquals(expectedMeasurement.getId(), measurementToTest.getId());
262         assertEquals(expectedMeasurement.getNumericalValue(), measurementToTest.getNumericalValue());
263         assertEquals(expectedMeasurement.getPrecision(), measurementToTest.getPrecision());
264         assertEquals(expectedMeasurement.getDigitNb(), measurementToTest.getDigitNb());
265         assertEquals(expectedMeasurement.getControlDate(), measurementToTest.getControlDate());
266         assertEquals(expectedMeasurement.getValidationDate(), measurementToTest.getValidationDate());
267         assertEquals(expectedMeasurement.getQualificationDate(), measurementToTest.getQualificationDate());
268         assertEquals(expectedMeasurement.getQualificationComment(), measurementToTest.getQualificationComment());
269         assertEquals(expectedMeasurement.getTaxonGroup(), measurementToTest.getTaxonGroup());
270         assertEquals(expectedMeasurement.getTaxon(), measurementToTest.getTaxon());
271         assertEquals(expectedMeasurement.getComment(), measurementToTest.getComment());
272         assertEquals(expectedMeasurement.getQualitativeValue(), measurementToTest.getQualitativeValue());
273         assertEquals(expectedMeasurement.getIndividualId(), measurementToTest.getIndividualId());
274     }
275 
276     @Test
277     public void deleteAllMeasurements() {
278         measurementDao.removeAllMeasurementsBySurveyId(SURVEY_ID);
279     }
280 
281 }