View Javadoc
1   package fr.ifremer.dali.service.administration.program;
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.Lists;
27  import fr.ifremer.dali.dao.DaliDatabaseResource;
28  import fr.ifremer.dali.dao.referential.DaliReferentialDao;
29  import fr.ifremer.dali.dto.DaliBeanFactory;
30  import fr.ifremer.dali.dto.DaliBeans;
31  import fr.ifremer.dali.dto.configuration.programStrategy.AppliedStrategyDTO;
32  import fr.ifremer.dali.dto.configuration.programStrategy.PmfmStrategyDTO;
33  import fr.ifremer.dali.dto.configuration.programStrategy.ProgramDTO;
34  import fr.ifremer.dali.dto.configuration.programStrategy.StrategyDTO;
35  import fr.ifremer.dali.dto.referential.DepartmentDTO;
36  import fr.ifremer.dali.dto.referential.LocationDTO;
37  import fr.ifremer.dali.dto.referential.pmfm.PmfmDTO;
38  import fr.ifremer.dali.service.DaliServiceLocator;
39  import fr.ifremer.dali.service.StatusFilter;
40  import fr.ifremer.dali.service.referential.ReferentialService;
41  import fr.ifremer.quadrige3.core.dao.referential.StatusCode;
42  import fr.ifremer.quadrige3.ui.core.dto.QuadrigeBeanFactory;
43  import fr.ifremer.quadrige3.ui.core.dto.referential.StatusDTO;
44  import org.apache.commons.lang3.RandomUtils;
45  import org.apache.commons.logging.Log;
46  import org.apache.commons.logging.LogFactory;
47  import org.junit.*;
48  
49  import java.time.LocalDate;
50  import java.util.ArrayList;
51  import java.util.Collection;
52  import java.util.List;
53  import java.util.Map;
54  
55  import static org.junit.Assert.*;
56  
57  /**
58   * @author Ludovic
59   */
60  public class ProgramStrategyServiceWriteTest {
61  
62      @ClassRule
63      public static final DaliDatabaseResource dbResource = DaliDatabaseResource.writeDb();
64      private static final Log log = LogFactory.getLog(ProgramStrategyServiceWriteTest.class);
65      private static final String PROGRAM_CODE = "TEST";
66      private ProgramStrategyService service;
67      private ReferentialService referentialService;
68      private DaliReferentialDao referentialDao;
69  
70      @Before
71      public void setUp() throws Exception {
72          service = DaliServiceLocator.instance().getProgramStrategyService();
73          referentialService = DaliServiceLocator.instance().getReferentialService();
74          referentialDao = DaliServiceLocator.instance().getService("daliReferentialDao", DaliReferentialDao.class);
75      }
76  
77      /**
78       * Test ignored because Q3-Déchets can't handle local programs
79       */
80      @Ignore
81      @Test
82      public void createProgramAndStrategies() {
83  
84          if (log.isDebugEnabled()) {
85              log.debug("createProgramAndStrategies start");
86          }
87  
88          ProgramDTO program = DaliBeanFactory.newProgramDTO();
89          List<ProgramDTO> programs = Lists.newArrayList(program);
90          program.setCode(PROGRAM_CODE);
91          program.setName("program test");
92          program.setComment("comment");
93          program.setStatus(referentialDao.getStatusByCode(StatusCode.LOCAL_ENABLE.getValue()));
94  
95          // add locations
96          program.setLocations(referentialService.getLocations(StatusFilter.ACTIVE));
97  
98          program.setDirty(true);
99          service.savePrograms(programs);
100 
101         // create a strategy
102         StrategyDTO strategy1 = DaliBeanFactory.newStrategyDTO();
103         strategy1.setName("strategy 1 test");
104         strategy1.setComment("comment");
105         for (LocationDTO location : program.getLocations()) {
106             AppliedStrategyDTO as = DaliBeanFactory.newAppliedStrategyDTO();
107             as.setId(location.getId());
108             as.setLabel(location.getLabel());
109             as.setName(location.getName());
110             as.setComment(location.getComment());
111             strategy1.addAppliedStrategies(as);
112         }
113         program.addStrategies(strategy1);
114 
115         if (log.isDebugEnabled()) {
116             log.debug("save a program");
117         }
118         program.setDirty(true);
119         service.savePrograms(programs);
120 
121         // reload and compare
122         ProgramDTO reloadedProgram = loadFullProgram(PROGRAM_CODE);
123 
124         // deep compare
125         assertProgramEquals(program, reloadedProgram);
126 
127 
128         // Add a strategy with another location list , add applied periods and pmfmStrategy
129         StrategyDTO strategy2 = DaliBeanFactory.newStrategyDTO();
130         strategy2.setName("strategy 2 test");
131         strategy2.setComment("with pmfm strategies");
132         for (LocationDTO location : program.getLocations()) {
133             AppliedStrategyDTO as = DaliBeanFactory.newAppliedStrategyDTO();
134             as.setId(location.getId());
135             as.setLabel(location.getLabel());
136             as.setName(location.getName());
137             as.setComment(location.getComment());
138             strategy2.addAppliedStrategies(as);
139         }
140         // remove a location
141         strategy2.getAppliedStrategies().remove(0);
142         
143         // add applied period
144         List<DepartmentDTO> allDepartments = referentialService.getDepartments(StatusFilter.ALL);
145         for (AppliedStrategyDTO location : strategy2.getAppliedStrategies()) {
146             LocalDate startDate = LocalDate.of(2014,RandomUtils.nextInt(1, 13),RandomUtils.nextInt(1, 31));
147             location.setStartDate(startDate);
148             location.setEndDate(startDate.plusDays(40));
149             location.setSamplingDepartment(allDepartments.get(RandomUtils.nextInt(0, allDepartments.size())));
150             location.setAnalysisDepartment(allDepartments.get(RandomUtils.nextInt(0, allDepartments.size())));
151         }
152         program.addStrategies(strategy2);
153 
154         // add 10 Pmfm
155         List<PmfmDTO> allPmfms = new ArrayList<>(referentialService.getPmfms(StatusFilter.ACTIVE));
156         for (int i = 0; i < 10; i++) {
157             PmfmStrategyDTO psfmProgStrat = DaliBeanFactory.newPmfmStrategyDTO();
158             psfmProgStrat.setPmfm(allPmfms.remove(RandomUtils.nextInt(0, allPmfms.size())));
159             psfmProgStrat.setSurvey(RandomUtils.nextInt(0, 2) == 1);
160             psfmProgStrat.setSampling(RandomUtils.nextInt(0, 2) == 1);
161             psfmProgStrat.setGrouping(RandomUtils.nextInt(0, 2) == 1);
162             psfmProgStrat.setUnique(RandomUtils.nextInt(0, 2) == 1);
163 
164             strategy2.addPmfmStrategies(psfmProgStrat);
165         }
166         strategy2.setPmfmStrategiesLoaded(true);
167 
168         // change program property
169         program.setComment("with a second strategy with 10 pmfm strategies");
170 
171         if (log.isDebugEnabled()) {
172             log.debug("update program with pmfm strategies");
173         }
174         // save
175         program.setDirty(true);
176         service.savePrograms(programs);
177 
178         // reload and compare
179         reloadedProgram = loadFullProgram(PROGRAM_CODE);
180 
181         // deep compare
182         assertProgramEquals(program, reloadedProgram);
183 
184 
185         // update/remove some properties
186         strategy1.getAppliedStrategies().remove(2);
187         strategy1.setComment("1 location removed");
188         strategy2.getPmfmStrategies().remove(0);
189         strategy2.getPmfmStrategies().remove(2);
190         strategy2.getPmfmStrategies().remove(6);
191         strategy2.getPmfmStrategies(0).setSampling(true);
192         strategy2.getPmfmStrategies(0).setSurvey(true);
193         strategy2.getPmfmStrategies(0).setUnique(true);
194         strategy2.getPmfmStrategies(0).setGrouping(true);
195         strategy2.getPmfmStrategies(1).setSampling(false);
196         strategy2.getPmfmStrategies(1).setSurvey(false);
197         strategy2.getPmfmStrategies(1).setUnique(false);
198         strategy2.getPmfmStrategies(1).setGrouping(false);
199         strategy2.getPmfmStrategies(2).setPmfm(allPmfms.remove(0));
200         strategy2.getAppliedStrategies(0).setStartDate(null);
201         strategy2.getAppliedStrategies(0).setEndDate(null);
202         strategy2.getAppliedStrategies(1).setSamplingDepartment(null);
203         strategy2.getAppliedStrategies(2).setStartDate(strategy2.getAppliedStrategies(2).getStartDate().plusDays(2));
204 
205         if (log.isDebugEnabled()) {
206             log.debug("update program with updated strategies, applied strategies & pmfm strategies");
207         }
208         // save
209         program.setDirty(true);
210         service.savePrograms(programs);
211 
212         // reload and compare
213         reloadedProgram = loadFullProgram(PROGRAM_CODE);
214 
215         // deep compare
216         assertProgramEquals(program, reloadedProgram);
217 
218 
219         // remove a monLocProg
220         program.getLocations().remove(0);
221 
222         if (log.isDebugEnabled()) {
223             log.debug("update program with removing 1 location on program");
224         }
225 
226         // save
227         program.setDirty(true);
228         service.savePrograms(programs);
229 
230         // reload and compare
231         reloadedProgram = loadFullProgram(PROGRAM_CODE);
232 
233         // deep compare
234         assertProgramEquals(program, reloadedProgram);
235 
236         assertEquals(reloadedProgram.sizeLocations(), reloadedProgram.getStrategies(0).sizeAppliedStrategies());
237         assertEquals(reloadedProgram.sizeLocations(), reloadedProgram.getStrategies(1).sizeAppliedStrategies());
238 
239         if (log.isDebugEnabled()) {
240             log.debug("createProgramAndStrategies end");
241         }
242 
243     }
244 
245     /**
246      * Test ignored because Q3-Déchets can't handle local programs
247      */
248     @Ignore
249     @Test
250     public void savePrograms() {
251         ProgramDTO programDTO = loadFullProgram(dbResource.getFixtures().getProgramCode());
252         Assume.assumeTrue(programDTO.getStrategies().size() > 1);
253 
254         StatusDTO status = QuadrigeBeanFactory.newStatusDTO();
255         status.setCode(StatusCode.LOCAL_ENABLE.getValue());
256         programDTO.setCode(PROGRAM_CODE);
257         programDTO.setStatus(status);
258         programDTO.setDirty(true);
259         service.savePrograms(Lists.newArrayList(programDTO));
260 
261         // Keep only the first strategy
262         programDTO.setStrategies(Lists.newArrayList(programDTO.getStrategies().iterator().next()));
263 
264         programDTO.setDirty(true);
265         service.savePrograms(Lists.newArrayList(programDTO));
266     }
267 
268     private ProgramDTO loadFullProgram(String programCode) {
269 
270         ProgramDTO program = service.getWritableProgramByCode(programCode);
271 
272         // program has minimum properties
273         assertFalse(program.isStrategiesLoaded());
274         assertFalse(program.isLocationsLoaded());
275         assertTrue(program.isStrategiesEmpty());
276         assertTrue(program.isLocationsEmpty());
277 
278         // load strategies and applied strategies (=locations)
279         service.loadStrategiesAndLocations(program);
280         assertTrue(program.isStrategiesLoaded());
281         assertTrue(program.isLocationsLoaded());
282 //        assertFalse(program.isStrategieEmpty());
283 //        assertFalse(program.isLieuEmpty());
284 
285         // load applied periods (=applied strategies) for each strategy
286         for (StrategyDTO strategyProgStrat : program.getStrategies()) {
287 //            assertFalse(strategyProgStrat.isAppliedStrategiesLoaded());
288 //            assertTrue(strategyProgStrat.isAppliedStrategiesEmpty());
289             assertFalse(strategyProgStrat.isPmfmStrategiesLoaded());
290             assertTrue(strategyProgStrat.isPmfmStrategiesEmpty());
291             service.loadAppliedPeriodsAndPmfmStrategies(program, strategyProgStrat);
292             assertTrue(strategyProgStrat.isAppliedStrategiesLoaded());
293 //            assertFalse(strategyProgStrat.isLieuEmpty());
294             assertTrue(strategyProgStrat.isPmfmStrategiesLoaded());
295 //            assertFalse(strategyProgStrat.isPsfmEmpty());
296         }
297 
298         return program;
299     }
300 
301     private void assertProgramEquals(ProgramDTO expectedProgram, ProgramDTO programToTest) {
302         assertEquals(expectedProgram.getCode(), programToTest.getCode());
303         assertEquals(expectedProgram.getName(), programToTest.getName());
304         assertEquals(expectedProgram.getComment(), programToTest.getComment());
305         assertEquals(expectedProgram.getStatus().getCode(), programToTest.getStatus().getCode());
306 
307         assertStrategiesEquals(expectedProgram.getStrategies(), programToTest.getStrategies());
308         assertLocationsEquals(expectedProgram.getLocations(), programToTest.getLocations());
309     }
310 
311     private void assertStrategiesEquals(Collection<StrategyDTO> expectedStrategies, Collection<StrategyDTO> strategiesToTest) {
312         assertNotNull(expectedStrategies);
313         assertNotNull(strategiesToTest);
314         assertNotSame(expectedStrategies, strategiesToTest);
315         assertEquals(expectedStrategies.size(), strategiesToTest.size());
316         Map<Integer, StrategyDTO> strategiesToTestMap = DaliBeans.mapById(strategiesToTest);
317         for (StrategyDTO expectedStrategy : expectedStrategies) {
318             StrategyDTO strategyToTest = strategiesToTestMap.get(expectedStrategy.getId());
319             assertNotNull(strategyToTest);
320             assertEquals(expectedStrategy.getName(), strategyToTest.getName());
321             assertEquals(expectedStrategy.getComment(), strategyToTest.getComment());
322 
323             assertAppliedStrategiesEquals(expectedStrategy.getAppliedStrategies(), strategyToTest.getAppliedStrategies());
324             assertPmfmStrategiesEquals(expectedStrategy.getPmfmStrategies(), strategyToTest.getPmfmStrategies());
325         }
326     }
327     
328     private void assertLocationsEquals(Collection<LocationDTO> expectedLocations, Collection<LocationDTO> locationsToTest) {
329         assertNotNull(expectedLocations);
330         assertNotNull(locationsToTest);
331         assertNotSame(expectedLocations, locationsToTest);
332         assertTrue(expectedLocations.size() <= locationsToTest.size());
333         Map<Integer, LocationDTO> map = DaliBeans.mapById(locationsToTest);
334         for (LocationDTO expectedLocation : expectedLocations) {
335             LocationDTO appliedLocationToTest = map.get(expectedLocation.getId());
336             assertNotNull(appliedLocationToTest);
337             assertEquals(expectedLocation.getLabel(), appliedLocationToTest.getLabel());
338             assertEquals(expectedLocation.getName(), appliedLocationToTest.getName());
339         }
340     }
341 
342     private void assertAppliedStrategiesEquals(Collection<AppliedStrategyDTO> expectedAppliedStrategies, Collection<AppliedStrategyDTO> appliedStrategiesToTest) {
343         assertNotNull(expectedAppliedStrategies);
344         assertNotNull(appliedStrategiesToTest);
345         assertNotSame(expectedAppliedStrategies, appliedStrategiesToTest);
346         assertTrue(expectedAppliedStrategies.size() <= appliedStrategiesToTest.size());
347         Map<Integer, AppliedStrategyDTO> map = DaliBeans.mapById(appliedStrategiesToTest);
348         for (AppliedStrategyDTO expectedAppliedStrategy : expectedAppliedStrategies) {
349             AppliedStrategyDTO appliedStrategyToTest = map.get(expectedAppliedStrategy.getId());
350             assertNotNull(appliedStrategyToTest);
351             assertEquals(expectedAppliedStrategy.getAppliedStrategyId(), appliedStrategyToTest.getAppliedStrategyId());
352             assertEquals(expectedAppliedStrategy.getLabel(), appliedStrategyToTest.getLabel());
353             assertEquals(expectedAppliedStrategy.getName(), appliedStrategyToTest.getName());
354             assertEquals(expectedAppliedStrategy.getComment(), appliedStrategyToTest.getComment());
355             assertEquals(expectedAppliedStrategy.getSamplingDepartment(), appliedStrategyToTest.getSamplingDepartment());
356             assertEquals(expectedAppliedStrategy.getAnalysisDepartment(), appliedStrategyToTest.getAnalysisDepartment());
357             assertEquals(expectedAppliedStrategy.getStartDate(), appliedStrategyToTest.getStartDate());
358             assertEquals(expectedAppliedStrategy.getEndDate(), appliedStrategyToTest.getEndDate());
359         }
360     }
361 
362     private void assertPmfmStrategiesEquals(Collection<PmfmStrategyDTO> expectedPmfmStrategies, Collection<PmfmStrategyDTO> pmfmStrategiesToTest) {
363         assertNotNull(expectedPmfmStrategies);
364         assertNotNull(pmfmStrategiesToTest);
365         assertNotSame(expectedPmfmStrategies, pmfmStrategiesToTest);
366         assertEquals(expectedPmfmStrategies.size(), pmfmStrategiesToTest.size());
367         Map<Integer, PmfmStrategyDTO> map = DaliBeans.mapById(pmfmStrategiesToTest);
368         for (PmfmStrategyDTO expectedPmfmStrategy : expectedPmfmStrategies) {
369             PmfmStrategyDTO pmfmStrategyToTest = map.get(expectedPmfmStrategy.getId());
370             assertNotNull(pmfmStrategyToTest);
371             assertEquals(expectedPmfmStrategy.getPmfm(), pmfmStrategyToTest.getPmfm());
372             assertEquals(expectedPmfmStrategy.isSurvey(), pmfmStrategyToTest.isSurvey());
373             assertEquals(expectedPmfmStrategy.isSampling(), pmfmStrategyToTest.isSampling());
374             assertEquals(expectedPmfmStrategy.isGrouping(), pmfmStrategyToTest.isGrouping());
375             assertEquals(expectedPmfmStrategy.isUnique(), pmfmStrategyToTest.isUnique());
376         }
377     }
378 }