Project

General

Profile

Download (12.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2015 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.persistence.dao.hibernate.taxon;
10

    
11
import static org.junit.Assert.assertEquals;
12

    
13
import java.io.FileNotFoundException;
14
import java.util.List;
15
import java.util.UUID;
16

    
17
import org.junit.Test;
18
import org.unitils.dbunit.annotation.DataSet;
19
import org.unitils.spring.annotation.SpringBeanByType;
20

    
21
import eu.etaxonomy.cdm.model.name.BotanicalName;
22
import eu.etaxonomy.cdm.model.name.Rank;
23
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
24
import eu.etaxonomy.cdm.model.reference.Reference;
25
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
26
import eu.etaxonomy.cdm.model.taxon.Classification;
27
import eu.etaxonomy.cdm.model.taxon.Taxon;
28
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
29
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
30
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
31
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
32
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
33
import eu.etaxonomy.cdm.persistence.dto.ClassificationLookupDTO;
34
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
35
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
36

    
37
/**
38
 * @author a.kohlbecker
39
 * @date Jun 15, 2015
40
 *
41
 */
42
public class ClassificationDaoHibernateImplTest extends CdmTransactionalIntegrationTest {
43

    
44

    
45
    @SpringBeanByType
46
    private ITaxonDao taxonDao;
47
    @SpringBeanByType
48
    private IClassificationDao classificationDao;
49
    @SpringBeanByType
50
    private IReferenceDao referenceDao;
51

    
52

    
53
    private static final String CLASSIFICATION_UUID = "2a5ceebb-4830-4524-b330-78461bf8cb6b";
54
    private static final String CLASSIFICATION_FULL_UUID = "a71467a6-74dc-4148-9530-484628a5ab0e";
55
    private static final UUID UUID_ABIES = UUID.fromString("19f560d9-a555-4883-9c54-39d04872307c");
56
    private static final UUID UUID_PINACEAE = UUID.fromString("74216ed8-5f04-439e-87e0-500738f5e7fc");
57

    
58

    
59

    
60
    /**
61
     * see http://dev.e-taxonomy.eu/trac/ticket/2778
62
     * Classification/{uuid}/childNodesAt/{rank-uuid} fails if only species in database
63
     */
64
    @Test
65
    @DataSet(value="ClassificationDaoHibernateImplTest.listRankSpecificRootNodes.xml")
66
    public void testListRankSpecificRootNodesFlatHierarchie() {
67

    
68
        checkPreconditions();
69

    
70
        Classification classification = classificationDao.load(UUID.fromString(CLASSIFICATION_UUID));
71

    
72
        // test for the bug in http://dev.e-taxonomy.eu/trac/ticket/2778
73
        Rank rank = Rank.GENUS();
74
        // run both queries in dao method since rank != null
75
        List<TaxonNode> rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
76
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
77
        assertEquals(3, rootNodes.size());
78

    
79
        rank = null;
80
        // run only fist query in dao method since rank == null
81
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
82
        assertEquals("The absolut root nodes should be returned", 3, rootNodes.size());
83
    }
84

    
85

    
86
    /**
87
     * Test listRankSpecificRootNode with an existing classification
88
     */
89
    @Test
90
    @DataSet(value="ClassificationDaoHibernateImplTest.listRankSpecificRootNodes.xml")
91
    public void testListRankSpecificRootNodesWithHierarchie() {
92

    
93
        // check preconditions
94
    	checkPreconditions();
95

    
96
        Classification classification = classificationDao.load(UUID.fromString(CLASSIFICATION_FULL_UUID));
97

    
98
        Rank rank = Rank.GENUS();
99
        // run both queries in dao method since rank != null
100
        List<TaxonNode> rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
101
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
102
        assertEquals("Only the genus should come back", 1, rootNodes.size());
103
        assertEquals(Rank.GENUS(), rootNodes.get(0).getTaxon().getName().getRank());
104
        assertEquals(UUID_ABIES, rootNodes.get(0).getTaxon().getUuid());
105

    
106
        rank = Rank.SUBGENUS();
107
        // run both queries in dao method since rank != null
108
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
109
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
110
        assertEquals("Only the 3 species should come back", 2, rootNodes.size());
111
        for (TaxonNode tn : rootNodes){
112
        	assertEquals(Rank.SPECIES(), tn.getTaxon().getName().getRank());
113
        }
114

    
115
        rank = Rank.SUBFAMILY();
116
        // run both queries in dao method since rank != null
117
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
118
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
119
        assertEquals("Only the genus should come back", 1, rootNodes.size());
120
        assertEquals(Rank.GENUS(), rootNodes.get(0).getTaxon().getName().getRank());
121
        assertEquals(UUID_ABIES, rootNodes.get(0).getTaxon().getUuid());
122

    
123
        rank = Rank.FAMILY();
124
        // run both queries in dao method since rank != null
125
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
126
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
127
        assertEquals("Only the family should come back", 1, rootNodes.size());
128
        assertEquals(Rank.FAMILY(), rootNodes.get(0).getTaxon().getName().getRank());
129
        assertEquals(UUID_PINACEAE, rootNodes.get(0).getTaxon().getUuid());
130

    
131
        rank = null;
132
        // run only fist query in dao method since rank == null
133
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
134
        assertEquals("Only the family as the absolut root node should come back", 1, rootNodes.size());
135
        assertEquals(Rank.FAMILY(), rootNodes.get(0).getTaxon().getName().getRank());
136
        assertEquals(UUID_PINACEAE, rootNodes.get(0).getTaxon().getUuid());
137

    
138
    }
139

    
140
    /**
141
     * Test listRankSpecificRootNode with all classifications
142
     */
143
    @Test
144
    @DataSet(value="ClassificationDaoHibernateImplTest.listRankSpecificRootNodes.xml")
145
    public void testListRankSpecificRootNodesWithNoClassification() {
146
    	Classification classification = null;
147

    
148
    	Rank rank = Rank.GENUS();
149
        // run both queries in dao method since rank != null
150
        List<TaxonNode> rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
151
        rootNodes.addAll(classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 1));
152
        assertEquals("3 Species from no hierarchie and 1 genus from hierarchie should return", 4, rootNodes.size());
153

    
154
        rank = null;
155
        // run only fist query in dao method since rank == null
156
        rootNodes = classificationDao.listRankSpecificRootNodes(classification, rank, null, null, null, 0);
157
        assertEquals("4 taxa should return (3 species from no hierarchie, 1 family, from hierarchie classification", 4, rootNodes.size());
158
    }
159

    
160
    private void checkPreconditions() {
161
		// check preconditions
162
        List<TaxonBase> taxa = taxonDao.list(null, null);
163
        assertEquals(5, taxa.size());
164

    
165
//        for(TaxonBase t : taxa) {
166
//            assertEquals(Rank.SPECIES().getUuid(), t.getName().getRank().getUuid());
167
//        }
168
	}
169

    
170
    @Test
171
    @DataSet(value="ClassificationDaoHibernateImplTest.listRankSpecificRootNodes.xml")
172
    public void testClassificationLookup() {
173

    
174
        Classification classification = classificationDao.load(UUID.fromString(CLASSIFICATION_FULL_UUID));
175
        ClassificationLookupDTO classificationLookupDto = classificationDao.classificationLookup(classification);
176
        assertEquals(4, classificationLookupDto.getTaxonIds().size());
177
    }
178

    
179

    
180
    /**
181
     * At the moment the data created is special to the issue http://dev.e-taxonomy.eu/trac/ticket/2778
182
     * ClassificationDaoHibernateImplTest.issue2778.xml
183
     *
184
     * {@inheritDoc}
185
     */
186
    @Override
187
//    @Test // uncomment to write out the test data xml file for this test class
188
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDBDataSet.xml")
189
    public final void createTestDataSet() throws FileNotFoundException {
190

    
191
	    // 1. create the entities   and save them
192
	    Classification flatHierarchieClassification = Classification.NewInstance("European Abies");
193
	    flatHierarchieClassification.setUuid(UUID.fromString(CLASSIFICATION_UUID));
194
	    classificationDao.save(flatHierarchieClassification);
195

    
196
	    Reference sec = ReferenceFactory.newBook();
197
	    sec.setTitleCache("Kohlbecker, A., Testcase standart views, 2013", true);
198
	    Reference sec_sensu = ReferenceFactory.newBook();
199
	    sec_sensu.setTitleCache("Komarov, V. L., Flora SSSR 29", true);
200
	    referenceDao.save(sec);
201
	    referenceDao.save(sec_sensu);
202

    
203

    
204
	    BotanicalName n_abies_alba = TaxonNameBase.NewBotanicalInstance(Rank.SPECIES());
205
	    n_abies_alba.setNameCache("Abies alba", true);
206
	    Taxon t_abies_alba = Taxon.NewInstance(n_abies_alba, sec);
207
	    taxonDao.save(t_abies_alba);
208

    
209
	    BotanicalName n_abies_grandis = TaxonNameBase.NewBotanicalInstance(Rank.SPECIES());
210
	    n_abies_grandis.setNameCache("Abies grandis", true);
211
	    Taxon t_abies_grandis = Taxon.NewInstance(n_abies_grandis, sec);
212
	    taxonDao.save(t_abies_grandis);
213

    
214
	    BotanicalName n_abies_kawakamii = TaxonNameBase.NewBotanicalInstance(Rank.SPECIES());
215
	    n_abies_kawakamii.setNameCache("Abies kawakamii", true);
216
	    Taxon t_abies_kawakamii = Taxon.NewInstance(n_abies_kawakamii, sec);
217
	    taxonDao.save(t_abies_kawakamii);
218

    
219
//	    BotanicalName n_abies_lasiocarpa = TaxonNameBase.NewBotanicalInstance(Rank.SPECIES());
220
//	    n_abies_lasiocarpa.setNameCache("Abies lasiocarpa", true);
221
//	    Taxon t_abies_lasiocarpa = Taxon.NewInstance(n_abies_lasiocarpa, sec);
222
//	    taxonDao.save(t_abies_lasiocarpa);
223

    
224
	    BotanicalName n_abies = TaxonNameBase.NewBotanicalInstance(Rank.GENUS());
225
	    n_abies.setNameCache("Abies", true);
226
	    Taxon t_abies = Taxon.NewInstance(n_abies, sec);
227
	    t_abies.setUuid(UUID_ABIES);
228
	    taxonDao.save(t_abies);
229

    
230
	    BotanicalName n_pinaceae = TaxonNameBase.NewBotanicalInstance(Rank.FAMILY());
231
	    n_pinaceae.setNameCache("Pinaceae", true);
232
	    Taxon t_pinaceae = Taxon.NewInstance(n_pinaceae, sec);
233
	    t_pinaceae.setUuid(UUID_PINACEAE);
234
	    taxonDao.save(t_pinaceae);
235

    
236

    
237
	    // add taxa to classifications
238
	    flatHierarchieClassification.addChildTaxon(t_abies_alba, null, null);
239
	    flatHierarchieClassification.addChildTaxon(t_abies_grandis, null, null);
240
	    flatHierarchieClassification.addChildTaxon(t_abies_kawakamii, null, null);
241
//	    flatHierarchieClassification.addChildTaxon(t_abies_lasiocarpa, null, null);
242
	    classificationDao.saveOrUpdate(flatHierarchieClassification);
243

    
244
	    // 1. create the entities   and save them
245
	    Classification fullHierarchieClassification = Classification.NewInstance("European Abies full hierarchie");
246
	    fullHierarchieClassification.setUuid(UUID.fromString(CLASSIFICATION_FULL_UUID));
247
	    classificationDao.save(fullHierarchieClassification);
248

    
249
	    fullHierarchieClassification.addParentChild(t_pinaceae, t_abies, null, null);
250
	    fullHierarchieClassification.addParentChild(t_abies, t_abies_alba, null, null);
251
	    fullHierarchieClassification.addParentChild(t_abies, t_abies_grandis, null, null);
252

    
253
	    classificationDao.saveOrUpdate(fullHierarchieClassification);
254

    
255

    
256

    
257
	    // 2. end the transaction so that all data is actually written to the db
258
	    setComplete();
259
	    endTransaction();
260

    
261
	    // use the fileNameAppendix if you are creating a data set file which need to be named differently
262
	    // from the standard name. Fir example if a single test method needs different data then the other
263
	    // methods the test class you may want to set the fileNameAppendix when creating the data for this method.
264
	    String fileNameAppendix = "listRankSpecificRootNodes";
265

    
266
	    // 3.
267
	    writeDbUnitDataSetFile(new String[] {
268
	        "TAXONBASE", "TAXONNAMEBASE",
269
	        "REFERENCE",
270
	        "AGENTBASE","HOMOTYPICALGROUP",
271
	        "CLASSIFICATION", "TAXONNODE",
272
	        "LANGUAGESTRING",
273
	        "HIBERNATE_SEQUENCES" // IMPORTANT!!!
274
	        },
275
	        fileNameAppendix );
276
  }
277

    
278
}
(1-1/4)