1 package fr.ifremer.dali.service.administration.program;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
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
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
96 program.setLocations(referentialService.getLocations(StatusFilter.ACTIVE));
97
98 program.setDirty(true);
99 service.savePrograms(programs);
100
101
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
122 ProgramDTO reloadedProgram = loadFullProgram(PROGRAM_CODE);
123
124
125 assertProgramEquals(program, reloadedProgram);
126
127
128
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
141 strategy2.getAppliedStrategies().remove(0);
142
143
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
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
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
175 program.setDirty(true);
176 service.savePrograms(programs);
177
178
179 reloadedProgram = loadFullProgram(PROGRAM_CODE);
180
181
182 assertProgramEquals(program, reloadedProgram);
183
184
185
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
209 program.setDirty(true);
210 service.savePrograms(programs);
211
212
213 reloadedProgram = loadFullProgram(PROGRAM_CODE);
214
215
216 assertProgramEquals(program, reloadedProgram);
217
218
219
220 program.getLocations().remove(0);
221
222 if (log.isDebugEnabled()) {
223 log.debug("update program with removing 1 location on program");
224 }
225
226
227 program.setDirty(true);
228 service.savePrograms(programs);
229
230
231 reloadedProgram = loadFullProgram(PROGRAM_CODE);
232
233
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
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
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
273 assertFalse(program.isStrategiesLoaded());
274 assertFalse(program.isLocationsLoaded());
275 assertTrue(program.isStrategiesEmpty());
276 assertTrue(program.isLocationsEmpty());
277
278
279 service.loadStrategiesAndLocations(program);
280 assertTrue(program.isStrategiesLoaded());
281 assertTrue(program.isLocationsLoaded());
282
283
284
285
286 for (StrategyDTO strategyProgStrat : program.getStrategies()) {
287
288
289 assertFalse(strategyProgStrat.isPmfmStrategiesLoaded());
290 assertTrue(strategyProgStrat.isPmfmStrategiesEmpty());
291 service.loadAppliedPeriodsAndPmfmStrategies(program, strategyProgStrat);
292 assertTrue(strategyProgStrat.isAppliedStrategiesLoaded());
293
294 assertTrue(strategyProgStrat.isPmfmStrategiesLoaded());
295
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 }