Project

General

Profile

Download (16.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.api.service;
10

    
11
import static org.junit.Assert.assertFalse;
12
import static org.junit.Assert.assertNull;
13
import static org.junit.Assert.assertTrue;
14

    
15
import java.io.FileNotFoundException;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.junit.Assert;
22
import org.junit.Before;
23
import org.junit.Test;
24
import org.unitils.dbunit.annotation.DataSet;
25
import org.unitils.spring.annotation.SpringBeanByType;
26

    
27
import eu.etaxonomy.cdm.api.service.exception.HomotypicalGroupChangeException;
28
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
29
import eu.etaxonomy.cdm.model.name.INonViralName;
30
import eu.etaxonomy.cdm.model.name.TaxonName;
31
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
32
import eu.etaxonomy.cdm.model.reference.Reference;
33
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
34
import eu.etaxonomy.cdm.model.taxon.Synonym;
35
import eu.etaxonomy.cdm.model.taxon.SynonymType;
36
import eu.etaxonomy.cdm.model.taxon.Taxon;
37
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
39
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
40
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
41

    
42
/**
43
 * This test checks of all the business logic methods do what they are expected to do.
44
 *
45
 * @author n.hoffmann
46
 * @since Dec 16, 2010
47
 */
48
public class TaxonServiceImplBusinessTest extends CdmTransactionalIntegrationTest {
49

    
50
    @SpringBeanByType
51
    private ITaxonService service;
52

    
53
    @SpringBeanByType
54
    private INameService nameService;
55

    
56
	private Synonym s1;
57
	private Synonym s2;
58
	private Taxon t2;
59
	private Taxon t1;
60
	private String referenceDetail;
61
	private Reference reference;
62
	private SynonymType homoTypicSynonymType;
63
	private SynonymType heteroTypicSynonymType;
64
	private INonViralName s1n;
65
	private INonViralName t2n;
66
	private INonViralName t1n;
67
	private TaxonName s2n;
68

    
69
	@Before
70
	public void setUp() throws Exception {
71
		//service = new TaxonServiceImpl();
72
		//nameService = new NameServiceImpl();
73

    
74
		t1n = TaxonNameFactory.NewNonViralInstance(null);
75
		t1 = Taxon.NewInstance(t1n, reference);
76

    
77
		t2n = TaxonNameFactory.NewNonViralInstance(null);
78
		t2 = Taxon.NewInstance(t2n, reference);
79

    
80
		s1n = TaxonNameFactory.NewNonViralInstance(null);
81
		s1 = Synonym.NewInstance(s1n, reference);
82

    
83
		s2n = TaxonNameFactory.NewNonViralInstance(null);
84
		s2 = Synonym.NewInstance(s2n, reference);
85

    
86
		// referencing
87
		homoTypicSynonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();
88
		heteroTypicSynonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();
89
		reference = ReferenceFactory.newGeneric();
90
		referenceDetail = "test";
91
	}
92

    
93
	/**
94
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#swapSynonymAndAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
95
	 */
96
	@Test
97
	public final void testSwapSynonymAndAcceptedTaxon() {
98
		t1.addSynonym(s1, homoTypicSynonymType);
99

    
100
		UpdateResult result = service.swapSynonymAndAcceptedTaxon(s1, t1, true);
101
		Synonym syn = (Synonym)service.load(s1.getUuid());
102
		Assert.assertNull(syn);
103
		TaxonName name = nameService.load(s1n.getUuid());
104
		Assert.assertNotNull(name);
105

    
106
		//The name of the new accepted taxon should be the same as from the former synonym
107
		Assert.assertEquals(((Taxon)result.getCdmEntity()).getName(), name);
108
	}
109

    
110
	/**
111
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
112
	 */
113
	@Test
114
	public final void testChangeSynonymToAcceptedTaxon() {
115

    
116
		t1.addSynonym(s1, homoTypicSynonymType);
117
		HomotypicalGroup oldGroup = s1.getName().getHomotypicalGroup();
118
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
119
		boolean deleteSynonym = false;
120
		Taxon taxon = null;
121

    
122
		UpdateResult result;
123
        try {
124
            result = service.changeSynonymToAcceptedTaxon(s1, t1, deleteSynonym);
125
            Assert.assertTrue("Change must fail for synonym and taxon in same homotypical group",result.isAbort());
126
        } catch (HomotypicalGroupChangeException e1) {
127
            // TODO Auto-generated catch block
128
            e1.printStackTrace();
129
        }
130

    
131

    
132
		t1.addSynonym(s2, heteroTypicSynonymType);
133
		Assert.assertEquals("Homotypical group of old accepted taxon should still contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
134
		Assert.assertTrue("Old accepted taxon should now have 2 synonyms", t1.getSynonyms().size() == 2);
135
		try {
136
			taxon = (Taxon)service.changeSynonymToAcceptedTaxon(s2, t1, deleteSynonym).getCdmEntity();
137
		} catch (HomotypicalGroupChangeException e) {
138
			Assert.fail("Change must not throw exception for heterotypic synonym change");
139
		}
140

    
141
		Assert.assertTrue("Former accepted taxon should still have 1 synonym", t1.getSynonyms().size() == 1);
142
		Assert.assertNotNull(taxon);
143
		Assert.assertEquals(s2n, taxon.getName());
144
		HomotypicalGroup newGroup = taxon.getName().getHomotypicalGroup();
145
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly one name", 1, newGroup.getTypifiedNames().size());
146
	}
147

    
148
	/**
149
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
150
	 */
151
	@Test
152
	public final void testChangeSynonymWithMultipleSynonymsInHomotypicalGroupToAcceptedTaxon() {
153
		t1.addSynonym(s1, heteroTypicSynonymType);
154
		TaxonName otherHeteroSynonymName = TaxonNameFactory.NewNonViralInstance(null);
155
		t1.addHeterotypicSynonymName(otherHeteroSynonymName);
156
		TaxonName homotypicSynonymName = TaxonNameFactory.NewNonViralInstance(null);
157
		Synonym homotypicSynonym = Synonym.NewInstance(homotypicSynonymName, t1.getSec());
158
		t1.addHomotypicSynonym(homotypicSynonym);
159

    
160
		HomotypicalGroup group = s1.getHomotypicGroup();
161
		Reference citation1 = ReferenceFactory.newBook();
162
		String microReference1 = "p. 55";
163
		Synonym s2 = t1.addHeterotypicSynonymName(s2n, citation1, microReference1, group);
164
		HomotypicalGroup homoGroup2 = s1.getHomotypicGroup();
165
		Assert.assertEquals("Homotypical group must be the same group as for the old synonym", group, homoGroup2);
166

    
167
		//run
168
		Taxon newTaxon = null;
169
		try {
170
			newTaxon = (Taxon)service.changeSynonymToAcceptedTaxon(s1, t1, false).getCdmEntity();
171
		} catch (HomotypicalGroupChangeException e1) {
172
			Assert.fail("Invocation of change method should not throw an exception");
173
		}
174

    
175
		Assert.assertEquals("Former accepted taxon should now have 2 synonyms left", 2, t1.getSynonyms().size());
176
		Assert.assertEquals("Former accepted taxon should now have 1 heterotypic synonym group left", 1, t1.getHeterotypicSynonymyGroups().size());
177
		Assert.assertNotNull(newTaxon);
178
		Assert.assertEquals(s1n, newTaxon.getName());
179
		Assert.assertEquals("New accepted taxon should have 1 synonym", 1, newTaxon.getSynonyms().size());
180
		Assert.assertEquals("The new synonym must be the homotypic synonym of the old synonym", s2, newTaxon.getSynonyms().iterator().next());
181
		HomotypicalGroup homoGroup = newTaxon.getHomotypicGroup();
182
		Assert.assertEquals("Homotypical group must be the same group as for the old synonym", group, homoGroup);
183

    
184
		List<Synonym> synonymsInNewTaxonsGroup = newTaxon.getSynonymsInGroup(homoGroup);
185
		String message = "New accepted taxon should have 1 synonym in its homotypic group: s2. The old synonym may still exist (or not) but not as a synonym of the new taxon";
186
		Assert.assertEquals(message, 1, synonymsInNewTaxonsGroup.size());
187
		Assert.assertTrue("The old synonym's homotypic 'partner' must be a synonym of the new accepted taxon, too.", synonymsInNewTaxonsGroup.contains(s2));
188
		Assert.assertTrue("The old synonym must be in the new accepted taxons homotypic group as it has not been deleted ", newTaxon.getName().getHomotypicalGroup().equals(s2.getName().getHomotypicalGroup()));
189

    
190
		boolean iWasHere = false;
191
		for (Synonym syn : synonymsInNewTaxonsGroup){
192
			if (syn.equals(s2) ){
193
				Assert.assertEquals("s2 relationship needs to have the same citation as the former relation to the given accepted taxon.", citation1, s2.getSec());
194
				iWasHere = true;
195
			}
196
		}
197
		Assert.assertTrue("Relationship to s2 must have been concidered in 'for'-loop", iWasHere);
198

    
199
		try {
200
			UpdateResult result = service.changeSynonymToAcceptedTaxon(homotypicSynonym, t1, false);
201

    
202
			Assert.assertTrue("The method should throw an exception when invoked on taxa in the same homotypical group", !result.getExceptions().isEmpty());
203
		} catch (HomotypicalGroupChangeException e) {
204
			//OK
205
		}
206

    
207
//		Assert.assertNull("Synonym should not be used in a name anymore", s1.getName());
208
	}
209

    
210
	/**
211
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToRelatedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)}.
212
	 */
213
	@Test
214
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="../../database/ClearDBDataSet.xml")
215
	public final void testChangeSynonymToRelatedTaxon() {
216
		t1.addSynonym(s1, homoTypicSynonymType);
217
		t1.addSynonym(s2, homoTypicSynonymType);
218
		Set<TaxonBase> newInstances = new HashSet<>();
219
		newInstances.add(s1);
220
		newInstances.add(t1);
221
		newInstances.add(t2);
222
		service.save(newInstances);
223
		TaxonName synonymName = s1.getName();
224
		UUID synNameUUID = synonymName.getUuid();
225

    
226
		Taxon newTaxon = (Taxon) service.changeSynonymToRelatedTaxon(s1, t2, TaxonRelationshipType.CONGRUENT_OR_EXCLUDES(), reference, referenceDetail).getCdmEntity();
227
		//check removeTaxonBase()
228
		//UUID s1UUID = service.update(s1);
229
		UUID newTaxonUUID = service.save(newTaxon).getUuid();
230

    
231

    
232
		s1 =(Synonym)service.find(s1.getUuid());
233
		newTaxon = (Taxon)service.find(newTaxonUUID);
234
		assertNull(s1);
235
		synonymName = nameService.find(synNameUUID);
236
		assertFalse(synonymName.getTaxonBases().contains(s1));
237
		assertTrue(synonymName.getTaxonBases().contains(newTaxon));
238

    
239
		synonymName = s2.getName();
240
        newTaxon = (Taxon)service.changeSynonymToRelatedTaxon(s2, t1, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), reference, referenceDetail).getCdmEntity();
241
        //check removeTaxonBase()
242
        //UUID s1UUID = service.update(s1);
243
        newTaxonUUID = service.save(newTaxon).getUuid();
244

    
245
        s2 =(Synonym)service.find(s2.getUuid());
246
        newTaxon = (Taxon)service.find(newTaxonUUID);
247
        assertNull(s2);
248

    
249
        assertFalse(synonymName.getTaxonBases().contains(s2));
250
        assertTrue(synonymName.getTaxonBases().contains(newTaxon));
251
	}
252

    
253
	@Test
254
	public void changeHomotypicalGroupOfSynonym(){
255

    
256
		//s1 - Heterotypic
257
		t1.addSynonym(s1, heteroTypicSynonymType);
258

    
259
		//s2 - heterotypic
260
		TaxonName otherHeteroSynonymName = TaxonNameFactory.NewNonViralInstance(null);
261
		Synonym s2 = Synonym.NewInstance(otherHeteroSynonymName, t1.getSec());
262
		t1.addSynonym(s2, heteroTypicSynonymType);
263
		TaxonName otherHeteroSynonymNameB = TaxonNameFactory.NewNonViralInstance(null);
264
		otherHeteroSynonymName.addBasionym(otherHeteroSynonymNameB);
265
		Synonym s2b = Synonym.NewInstance(otherHeteroSynonymNameB, t1.getSec());
266
		t1.addSynonym(s2b, heteroTypicSynonymType);
267

    
268
		//homotypic
269
		TaxonName homotypicSynonymName = TaxonNameFactory.NewNonViralInstance(null);
270
		Synonym homotypicSynonym = Synonym.NewInstance(homotypicSynonymName, t1.getSec());
271
		t1.addHomotypicSynonym(homotypicSynonym);
272
		t1.getName().addBasionym(homotypicSynonymName);
273

    
274
		//Preconditions test
275
		Assert.assertFalse("s2 must not be in s1 homotypic group", s2.getHomotypicGroup().equals(s1.getHomotypicGroup()));
276
		Assert.assertFalse("s2 must not be in t1 homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
277
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/ must have accepted taxon", s2.getAcceptedTaxon());
278
		Assert.assertEquals("s2 must have heterotypic relationship type", heteroTypicSynonymType, s2.getType());
279
		Assert.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2.getName().getBasionyms().size());
280

    
281
		//do it
282
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, true);
283

    
284
		//postconditions
285
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
286
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
287
		Assert.assertEquals("s2 must have heterotypic relationship", heteroTypicSynonymType, s2.getType());
288
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
289

    
290

    
291
		//Preconditions test
292
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
293
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
294
		Assert.assertFalse("s2 must not be in t1 homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
295

    
296

    
297
		//do it
298
		service.changeHomotypicalGroupOfSynonym(s2, homotypicSynonym.getHomotypicGroup(), null, true);
299

    
300
		//postconditions
301
		Assert.assertEquals("s2 must be in 'homotypicSynonym' homotypic group", s2.getHomotypicGroup(), homotypicSynonym.getHomotypicGroup());
302
		Assert.assertEquals("s2 must be in 't1' homotypic group", s2.getHomotypicGroup(), t1.getHomotypicGroup());
303
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
304
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
305
		Assert.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2.getName().getBasionyms().size());
306
		Assert.assertEquals("'homotypicSynonym' must have exactly 2 basionym relationships", 2, homotypicSynonym.getName().getNameRelations().size());
307
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
308
		Assert.assertEquals("'t1' must have exactly 2 homotypic synonyms", 2, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
309
		Assert.assertEquals("'t1' must have exactly 2 names in homotypic group", 2, t1.getHomotypicSynonymsByHomotypicGroup(null).size());
310
		Assert.assertEquals("'t1' homotypic group must include 3 names (t1, s2, homotypicSynonym)", 3, t1.getHomotypicGroup().getTypifiedNames().size());
311

    
312

    
313
		//do it
314
		service.changeHomotypicalGroupOfSynonym(s2, t2.getHomotypicGroup(), t2, false);
315

    
316
		//postconditions
317
		Assert.assertEquals("s2 must be in 't2' homotypic group", t2.getHomotypicGroup(), s2.getHomotypicGroup());
318
		Assert.assertFalse("s2 must not be in 't1' homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
319
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
320
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
321
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
322
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
323
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
324
		Assert.assertEquals("'t1' must have exactly 1 homotypic synonyms", 1, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
325
		Assert.assertEquals("'t1' must have exactly 1 names in homotypic group", 1, t1.getHomotypicSynonymsByHomotypicGroup().size());
326
		Assert.assertEquals("'t1' homotypic group must include 2 names (t1, homotypicSynonym)", 2, t1.getHomotypicGroup().getTypifiedNames().size());
327

    
328
		//do it
329
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, false);
330

    
331
		//postconditions
332
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
333
		Assert.assertFalse("s2 must not be in 't2' homotypic group", t2.getHomotypicGroup().equals(s2.getHomotypicGroup()));
334
		//had 2 accepted taxa when synonym relationships still existed
335
		Assert.assertNotNull("s2 must have accepted taxon", s2.getAcceptedTaxon());
336
		Assert.assertEquals("Both relationships of s2 must be heterotypic", heteroTypicSynonymType, s2.getType());
337
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
338

    
339
	}
340

    
341
    @Override
342
    public void createTestDataSet() throws FileNotFoundException {}
343

    
344
}
(30-30/40)