Project

General

Profile

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

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

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

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

    
22
import eu.etaxonomy.cdm.model.name.BotanicalName;
23
import eu.etaxonomy.cdm.model.name.Rank;
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.test.integration.CdmTransactionalIntegrationTest;
34
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
35

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

    
43

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

    
51

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

    
57

    
58

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

    
67
        checkPreconditions();
68

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

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

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

    
84

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

    
92
        // check preconditions
93
    	checkPreconditions();
94

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

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

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

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

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

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

    
137
    }
138

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

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

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

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

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

    
169

    
170
    /**
171
     * At the moment the data created is special to the issue http://dev.e-taxonomy.eu/trac/ticket/2778
172
     * ClassificationDaoHibernateImplTest.issue2778.xml
173
     *
174
     * {@inheritDoc}
175
     */
176
    @Override
177
//    @Test // uncomment to write out the test data xml file for this test class
178
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDBDataSet.xml")
179
    public final void createTestDataSet() throws FileNotFoundException {
180

    
181
	    // 1. create the entities   and save them
182
	    Classification flatHierarchieClassification = Classification.NewInstance("European Abies");
183
	    flatHierarchieClassification.setUuid(UUID.fromString(CLASSIFICATION_UUID));
184
	    classificationDao.save(flatHierarchieClassification);
185

    
186
	    Reference sec = ReferenceFactory.newBook();
187
	    sec.setTitleCache("Kohlbecker, A., Testcase standart views, 2013", true);
188
	    Reference sec_sensu = ReferenceFactory.newBook();
189
	    sec_sensu.setTitleCache("Komarov, V. L., Flora SSSR 29", true);
190
	    referenceDao.save(sec);
191
	    referenceDao.save(sec_sensu);
192

    
193

    
194
	    BotanicalName n_abies_alba = BotanicalName.NewInstance(Rank.SPECIES());
195
	    n_abies_alba.setNameCache("Abies alba", true);
196
	    Taxon t_abies_alba = Taxon.NewInstance(n_abies_alba, sec);
197
	    taxonDao.save(t_abies_alba);
198

    
199
	    BotanicalName n_abies_grandis = BotanicalName.NewInstance(Rank.SPECIES());
200
	    n_abies_grandis.setNameCache("Abies grandis", true);
201
	    Taxon t_abies_grandis = Taxon.NewInstance(n_abies_grandis, sec);
202
	    taxonDao.save(t_abies_grandis);
203

    
204
	    BotanicalName n_abies_kawakamii = BotanicalName.NewInstance(Rank.SPECIES());
205
	    n_abies_kawakamii.setNameCache("Abies kawakamii", true);
206
	    Taxon t_abies_kawakamii = Taxon.NewInstance(n_abies_kawakamii, sec);
207
	    taxonDao.save(t_abies_kawakamii);
208

    
209
//	    BotanicalName n_abies_lasiocarpa = BotanicalName.NewInstance(Rank.SPECIES());
210
//	    n_abies_lasiocarpa.setNameCache("Abies lasiocarpa", true);
211
//	    Taxon t_abies_lasiocarpa = Taxon.NewInstance(n_abies_lasiocarpa, sec);
212
//	    taxonDao.save(t_abies_lasiocarpa);
213

    
214
	    BotanicalName n_abies = BotanicalName.NewInstance(Rank.GENUS());
215
	    n_abies.setNameCache("Abies", true);
216
	    Taxon t_abies = Taxon.NewInstance(n_abies, sec);
217
	    t_abies.setUuid(UUID_ABIES);
218
	    taxonDao.save(t_abies);
219

    
220
	    BotanicalName n_pinaceae = BotanicalName.NewInstance(Rank.FAMILY());
221
	    n_pinaceae.setNameCache("Pinaceae", true);
222
	    Taxon t_pinaceae = Taxon.NewInstance(n_pinaceae, sec);
223
	    t_pinaceae.setUuid(UUID_PINACEAE);
224
	    taxonDao.save(t_pinaceae);
225

    
226

    
227
	    // add taxa to classifications
228
	    flatHierarchieClassification.addChildTaxon(t_abies_alba, null, null);
229
	    flatHierarchieClassification.addChildTaxon(t_abies_grandis, null, null);
230
	    flatHierarchieClassification.addChildTaxon(t_abies_kawakamii, null, null);
231
//	    flatHierarchieClassification.addChildTaxon(t_abies_lasiocarpa, null, null);
232
	    classificationDao.saveOrUpdate(flatHierarchieClassification);
233

    
234
	    // 1. create the entities   and save them
235
	    Classification fullHierarchieClassification = Classification.NewInstance("European Abies full hierarchie");
236
	    fullHierarchieClassification.setUuid(UUID.fromString(CLASSIFICATION_FULL_UUID));
237
	    classificationDao.save(fullHierarchieClassification);
238

    
239
	    fullHierarchieClassification.addParentChild(t_pinaceae, t_abies, null, null);
240
	    fullHierarchieClassification.addParentChild(t_abies, t_abies_alba, null, null);
241
	    fullHierarchieClassification.addParentChild(t_abies, t_abies_grandis, null, null);
242

    
243
	    classificationDao.saveOrUpdate(fullHierarchieClassification);
244

    
245

    
246

    
247
	    // 2. end the transaction so that all data is actually written to the db
248
	    setComplete();
249
	    endTransaction();
250

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

    
256
	    // 3.
257
	    writeDbUnitDataSetFile(new String[] {
258
	        "TAXONBASE", "TAXONNAMEBASE",
259
	        "REFERENCE",
260
	        "AGENTBASE","HOMOTYPICALGROUP",
261
	        "CLASSIFICATION", "TAXONNODE",
262
	        "LANGUAGESTRING",
263
	        "HIBERNATE_SEQUENCES" // IMPORTANT!!!
264
	        },
265
	        fileNameAppendix );
266
  }
267

    
268
}
(1-1/4)