- fixed deep delete recursion bug
[cdmlib.git] / cdmlib-services / src / test / java / eu / etaxonomy / cdm / api / service / OccurrenceServiceDeepDeleteTest.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.api.service;
11
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertTrue;
15
16 import java.io.FileNotFoundException;
17 import java.util.UUID;
18
19 import org.apache.log4j.Logger;
20 import org.junit.Ignore;
21 import org.junit.Test;
22 import org.unitils.dbunit.annotation.DataSet;
23 import org.unitils.spring.annotation.SpringBeanByType;
24
25 import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
26 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
27 import eu.etaxonomy.cdm.model.molecular.AmplificationResult;
28 import eu.etaxonomy.cdm.model.molecular.DnaSample;
29 import eu.etaxonomy.cdm.model.molecular.Sequence;
30 import eu.etaxonomy.cdm.model.molecular.SingleRead;
31 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
32 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
33 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
34 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
35 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
36 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
37 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
38 import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
39
40 /**
41 * @author pplitzner
42 * @date 31.03.2014
43 *
44 */
45 public class OccurrenceServiceDeepDeleteTest extends CdmTransactionalIntegrationTest {
46
47 private final UUID FIELD_UNIT_UUID = UUID.fromString("b5f58da5-4442-4001-9d13-33f41518b72a");
48 private final UUID DERIVED_UNIT_UUID = UUID.fromString("448be6e7-f19c-4a10-9a0a-97aa005f817d");
49 private final UUID DNA_SAMPLE_UUID = UUID.fromString("bee4212b-aff1-484e-845f-065c7d6216af");
50 private final UUID SEQUENCE_UUID = UUID.fromString("0b867369-de8c-4837-a708-5b7d9f6091be");
51
52 @SuppressWarnings("unused")
53 private static final Logger logger = Logger.getLogger(OccurrenceServiceDeepDeleteTest.class);
54
55 @SpringBeanByType
56 private IOccurrenceService occurrenceService;
57
58 @SpringBeanByType
59 private ISequenceService sequenceService;
60
61 @Test
62 @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="OccurrenceServiceTest.testDeleteDerivateHierarchyStepByStep.xml")
63 public void testDeepDelete_FieldUnit(){
64
65
66 String assertMessage = "Incorrect number of specimens after deletion.";
67 DeleteResult deleteResult = null;
68 SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
69 config.setDeleteMolecularData(true);
70 config.setDeleteChildren(true);
71
72 FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(FIELD_UNIT_UUID);
73 DnaSample dnaSample = (DnaSample) occurrenceService.load(DNA_SAMPLE_UUID);
74
75 //check initial state
76 assertEquals(assertMessage, 3, occurrenceService.count(SpecimenOrObservationBase.class));
77 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
78 assertEquals(assertMessage, 2, occurrenceService.count(DerivedUnit.class));
79 assertEquals(assertMessage, 1, occurrenceService.count(DnaSample.class));
80 assertEquals("incorrect number of amplification results", 1, dnaSample.getAmplificationResults().size());
81 assertEquals("number of sequences incorrect", 1, dnaSample.getSequences().size());
82 assertEquals("incorrect number of single reads", 1, dnaSample.getAmplificationResults().iterator().next().getSingleReads().size());
83
84 //delete field unit
85 deleteResult = occurrenceService.deleteDerivateHierarchy(fieldUnit, config);
86 assertTrue(deleteResult.toString(), deleteResult.isOk());
87 assertEquals(assertMessage, 0, occurrenceService.count(SpecimenOrObservationBase.class));
88 assertEquals(assertMessage, 0, occurrenceService.count(FieldUnit.class));
89 assertEquals(assertMessage, 0, occurrenceService.count(DerivedUnit.class));
90 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
91 }
92
93 @Test
94 @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
95 public void testDeepDelete_DerivedUnit(){
96 String assertMessage = "Incorrect number of specimens after deletion.";
97 DeleteResult deleteResult = null;
98 SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
99 config.setDeleteMolecularData(true);
100 config.setDeleteChildren(true);
101
102 DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(DERIVED_UNIT_UUID);
103 DnaSample dnaSample = (DnaSample) occurrenceService.load(DNA_SAMPLE_UUID);
104
105 //check initial state
106 assertEquals(assertMessage, 3, occurrenceService.count(SpecimenOrObservationBase.class));
107 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
108 assertEquals(assertMessage, 2, occurrenceService.count(DerivedUnit.class));
109 assertEquals(assertMessage, 1, occurrenceService.count(DnaSample.class));
110 assertEquals("incorrect number of amplification results", 1, dnaSample.getAmplificationResults().size());
111 assertEquals("number of sequences incorrect", 1, dnaSample.getSequences().size());
112 assertEquals("incorrect number of single reads", 1, dnaSample.getAmplificationResults().iterator().next().getSingleReads().size());
113
114 //delete derived unit
115 deleteResult = occurrenceService.deleteDerivateHierarchy(derivedUnit, config);
116 assertTrue(deleteResult.toString(), deleteResult.isOk());
117 assertEquals(assertMessage, 1, occurrenceService.count(SpecimenOrObservationBase.class));
118 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
119 assertEquals(assertMessage, 0, occurrenceService.count(DerivedUnit.class));
120 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
121 }
122
123 @Test
124 @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
125 public void testDeepDelete_DnaSample(){
126 String assertMessage = "Incorrect number of specimens after deletion.";
127 DeleteResult deleteResult = null;
128 SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
129 config.setDeleteMolecularData(true);
130 config.setDeleteChildren(true);
131
132 DnaSample dnaSample = (DnaSample) occurrenceService.load(DNA_SAMPLE_UUID);
133
134 //check initial state
135 assertEquals(assertMessage, 3, occurrenceService.count(SpecimenOrObservationBase.class));
136 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
137 assertEquals(assertMessage, 2, occurrenceService.count(DerivedUnit.class));
138 assertEquals(assertMessage, 1, occurrenceService.count(DnaSample.class));
139 assertEquals("incorrect number of amplification results", 1, dnaSample.getAmplificationResults().size());
140 assertEquals("number of sequences incorrect", 1, dnaSample.getSequences().size());
141 assertEquals("incorrect number of single reads", 1, dnaSample.getAmplificationResults().iterator().next().getSingleReads().size());
142
143 //delete dna sample
144 deleteResult = occurrenceService.deleteDerivateHierarchy(dnaSample, config);
145 assertTrue(deleteResult.toString(), deleteResult.isOk());
146 assertEquals(assertMessage, 2, occurrenceService.count(SpecimenOrObservationBase.class));
147 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
148 assertEquals(assertMessage, 1, occurrenceService.count(DerivedUnit.class));
149 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
150 }
151
152
153 @Test
154 @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
155 public void testDeleteDerivateHierarchyStepByStep(){
156 String assertMessage = "Incorrect number of specimens after deletion.";
157 DeleteResult deleteResult = null;
158 SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
159
160 FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(FIELD_UNIT_UUID);
161 DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(DERIVED_UNIT_UUID);
162 DnaSample dnaSample = (DnaSample) occurrenceService.load(DNA_SAMPLE_UUID);
163 Sequence consensusSequence = sequenceService.load(SEQUENCE_UUID);
164
165 //check initial state
166 assertEquals(assertMessage, 3, occurrenceService.count(SpecimenOrObservationBase.class));
167 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
168 assertEquals(assertMessage, 2, occurrenceService.count(DerivedUnit.class));
169 assertEquals(assertMessage, 1, occurrenceService.count(DnaSample.class));
170 assertEquals("incorrect number of amplification results", 1, dnaSample.getAmplificationResults().size());
171 assertEquals("number of sequences incorrect", 1, dnaSample.getSequences().size());
172 assertEquals("incorrect number of single reads", 1, dnaSample.getAmplificationResults().iterator().next().getSingleReads().size());
173
174 //delete single read -> should fail
175 SingleRead singleRead = dnaSample.getAmplificationResults().iterator().next().getSingleReads().iterator().next();
176 deleteResult = occurrenceService.deleteDerivateHierarchy(singleRead, config);
177 assertFalse(deleteResult.toString(), deleteResult.isOk());
178 //delete sequence -> should fail
179 deleteResult = occurrenceService.deleteDerivateHierarchy(consensusSequence, config);
180 assertFalse(deleteResult.toString(), deleteResult.isOk());
181
182 //allow deletion of molecular data
183 config.setDeleteMolecularData(true);
184
185 deleteResult = occurrenceService.deleteDerivateHierarchy(singleRead, config);
186 assertTrue(deleteResult.toString(), deleteResult.isOk());
187 assertTrue(consensusSequence.getSingleReads().isEmpty());
188
189 //delete sequence -> should fail
190 deleteResult = occurrenceService.deleteDerivateHierarchy(consensusSequence, config);
191 assertTrue(deleteResult.toString(), deleteResult.isOk());
192 assertEquals("number of sequences incorrect", 0, dnaSample.getSequences().size());
193
194
195 //delete dna sample
196 deleteResult = occurrenceService.deleteDerivateHierarchy(dnaSample, config);
197 assertTrue(deleteResult.toString(), deleteResult.isOk());
198 assertEquals(assertMessage, 2, occurrenceService.count(SpecimenOrObservationBase.class));
199 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
200 assertEquals(assertMessage, 1, occurrenceService.count(DerivedUnit.class));
201 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
202
203 //delete derived unit
204 deleteResult = occurrenceService.deleteDerivateHierarchy(derivedUnit, config);
205 assertTrue(deleteResult.toString(), deleteResult.isOk());
206 assertEquals(assertMessage, 1, occurrenceService.count(SpecimenOrObservationBase.class));
207 assertEquals(assertMessage, 1, occurrenceService.count(FieldUnit.class));
208 assertEquals(assertMessage, 0, occurrenceService.count(DerivedUnit.class));
209 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
210
211 //delete field unit
212 deleteResult = occurrenceService.deleteDerivateHierarchy(fieldUnit, config);
213 deleteResult = occurrenceService.deleteDerivateHierarchy(fieldUnit, config);
214 assertTrue(deleteResult.toString(), deleteResult.isOk());
215 assertEquals(assertMessage, 0, occurrenceService.count(SpecimenOrObservationBase.class));
216 assertEquals(assertMessage, 0, occurrenceService.count(FieldUnit.class));
217 assertEquals(assertMessage, 0, occurrenceService.count(DerivedUnit.class));
218 assertEquals(assertMessage, 0, occurrenceService.count(DnaSample.class));
219 }
220
221 /* (non-Javadoc)
222 * @see eu.etaxonomy.cdm.test.integration.CdmIntegrationTest#createTestData()
223 */
224 @Override
225 @Test
226 @Ignore
227 public void createTestDataSet() throws FileNotFoundException {
228 //how the XML was generated
229 FieldUnit fieldUnit = FieldUnit.NewInstance();
230 fieldUnit.setUuid(FIELD_UNIT_UUID);
231 //sub derivates (DerivedUnit, DnaSample)
232 DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
233 derivedUnit.setUuid(DERIVED_UNIT_UUID);
234 DnaSample dnaSample = DnaSample.NewInstance();
235 dnaSample.setUuid(DNA_SAMPLE_UUID);
236
237 //derivation events
238 DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit, DerivationEventType.ACCESSIONING());
239 DerivationEvent.NewSimpleInstance(derivedUnit, dnaSample, DerivationEventType.DNA_EXTRACTION());
240
241 //DNA (Sequence, SingleRead, Amplification)
242 Sequence sequence = Sequence.NewInstance(dnaSample, "ATTCG", 5);
243 sequence.setUuid(SEQUENCE_UUID);
244 SingleRead singleRead = SingleRead.NewInstance();
245 sequence.addSingleRead(singleRead);
246 dnaSample.addSequence(sequence);
247 AmplificationResult amplificationResult = AmplificationResult.NewInstance(dnaSample);
248 amplificationResult.addSingleRead(singleRead);
249 occurrenceService.save(fieldUnit);
250 occurrenceService.save(derivedUnit);
251 occurrenceService.save(dnaSample);
252
253 commitAndStartNewTransaction(null);
254
255 setComplete();
256 endTransaction();
257
258
259 try {
260 writeDbUnitDataSetFile(new String[] {
261 "SpecimenOrObservationBase",
262 "SpecimenOrObservationBase_DerivationEvent",
263 "DerivationEvent",
264 "Sequence",
265 "Sequence_SingleRead",
266 "SingleRead",
267 "AmplificationResult"
268 });
269 } catch (FileNotFoundException e) {
270 e.printStackTrace();
271 }
272 }
273 }