Project

General

Profile

Download (12.1 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2020 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.assertNotNull;
12
import static org.junit.Assert.assertNull;
13

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

    
19
import org.junit.Assert;
20
import org.junit.Test;
21
import org.unitils.dbunit.annotation.DataSet;
22
import org.unitils.dbunit.annotation.DataSets;
23
import org.unitils.dbunit.datasetloadstrategy.impl.RefreshLoadStrategy;
24
import org.unitils.spring.annotation.SpringBeanByType;
25

    
26
import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling;
27
import eu.etaxonomy.cdm.api.service.config.TermNodeDeletionConfigurator;
28
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
29
import eu.etaxonomy.cdm.model.common.CdmBase;
30
import eu.etaxonomy.cdm.model.common.ITreeNode;
31
import eu.etaxonomy.cdm.model.common.Language;
32
import  eu.etaxonomy.cdm.model.description.Character;
33
import eu.etaxonomy.cdm.model.description.Feature;
34
import eu.etaxonomy.cdm.model.term.DefinedTerm;
35
import eu.etaxonomy.cdm.model.term.Representation;
36
import eu.etaxonomy.cdm.model.term.TermNode;
37
import eu.etaxonomy.cdm.model.term.TermTree;
38
import eu.etaxonomy.cdm.model.term.TermType;
39
import eu.etaxonomy.cdm.persistence.dto.CharacterDto;
40
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
41
import eu.etaxonomy.cdm.persistence.dto.TermDto;
42
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
43
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
44
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
45
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
46

    
47
/**
48
 * @author k.luther
49
 * @since Oct 30, 2020
50
 */
51
public class TermNodeServiceImplTest  extends CdmTransactionalIntegrationTest{
52

    
53
    private static final String sep = ITreeNode.separator;
54
    private static final String pref = ITreeNode.treePrefix;
55

    
56
    private static final UUID featureTreeUuid = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
57
    private static final UUID featureTree2Uuid = UUID.fromString("43d67247-936f-42a3-a739-bbcde372e334");
58
    private static final UUID node2Uuid= UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
59
    private static final UUID node3Uuid = UUID.fromString("2d41f0c2-b785-4f73-a436-cc2d5e93cc5b");
60
    private static final UUID node4Uuid = UUID.fromString("fdaec4bd-c78e-44df-ae87-28f18110968c");
61
    private static final UUID node5Uuid = UUID.fromString("c4d5170a-7967-4dac-ab76-ae2019eefde5");
62
    private static final UUID node6Uuid = UUID.fromString("b419ba5e-9c8b-449c-ad86-7abfca9a7340");
63

    
64
    private TermNode<Feature> node3;
65
    private TermNode<Feature> node2;
66

    
67
    @SpringBeanByType
68
    private ITermNodeService termNodeService;
69

    
70
    @SpringBeanByType
71
    private ITermTreeService termTreeService;
72

    
73
    @SpringBeanByType
74
    private ITermService termService;
75

    
76
    @Test
77
    @DataSets({
78
        @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
79
        @DataSet(value="/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml"),
80
    })
81
    public void testSaveCharacterNode_supportedData() {
82
        UUID characterTreeUuid = createAndSaveCharacterTree();
83

    
84
        TermTreeDto dto = termTreeService.getTermTreeDtoByUuid(characterTreeUuid);
85
        List<TermNodeDto> children = dto.getRoot().getChildren();
86
        CharacterNodeDto nodeDto = (CharacterNodeDto) children.get(0);
87
        TermDto termDto = nodeDto.getTerm();
88
        if (termDto instanceof CharacterDto){
89
            CharacterDto characterDto = (CharacterDto) termDto;
90
            characterDto.setSupportsCategoricalData(true);
91
            List<CharacterNodeDto> dtos = new ArrayList<>();
92
            dtos.add(nodeDto);
93
            termNodeService.saveCharacterNodeDtoList(dtos);
94
            commitAndStartNewTransaction();
95
            @SuppressWarnings("unchecked")
96
            TermTree<Feature> characterTree = termTreeService.load(characterTreeUuid);
97
            List<TermNode<Feature>> childNodes = characterTree.getRoot().getChildNodes();
98
            TermNode<Feature> child = childNodes.get(0);
99

    
100
            Assert.assertTrue(child.getTerm().isSupportsCategoricalData());
101

    
102
        }else{
103
            Assert.fail();
104
        }
105
    }
106

    
107
    @Test
108
    public void testSaveCharacterNode_representation() {
109
        UUID characterTreeUuid = createAndSaveCharacterTree();
110

    
111
        TermTreeDto dto = termTreeService.getTermTreeDtoByUuid(characterTreeUuid);
112
        List<TermNodeDto> children = dto.getRoot().getChildren();
113
        CharacterNodeDto nodeDto = (CharacterNodeDto) children.get(0);
114
        TermDto termDto = nodeDto.getTerm();
115
        if (termDto instanceof CharacterDto){
116
            CharacterDto characterDto = (CharacterDto) termDto;
117
            Representation rep = characterDto.getPreferredRepresentation(Language.DEFAULT());
118
            if (rep != null){
119
                rep.setText("Test");
120
            }else{
121
                rep = Representation.NewInstance("Test", "", "", Language.DEFAULT());
122
                characterDto.addRepresentation(rep);
123
            }
124
            List<CharacterNodeDto> dtos = new ArrayList<>();
125
            dtos.add(nodeDto);
126
            termNodeService.saveCharacterNodeDtoList(dtos);
127
            commitAndStartNewTransaction();
128
            @SuppressWarnings("unchecked")
129
            TermTree<Feature> characterTree = termTreeService.load(characterTreeUuid);
130
            List<TermNode<Feature>> childNodes = characterTree.getRoot().getChildNodes();
131
            TermNode<Feature> child = childNodes.get(0);
132

    
133
            Assert.assertTrue(child.getTerm().getPreferredRepresentation(Language.DEFAULT()).getText().equals("Test"));
134

    
135
        }else{
136
            Assert.fail();
137
        }
138
    }
139

    
140
    private UUID createAndSaveCharacterTree() {
141
        DefinedTerm structure = DefinedTerm.NewInstance(TermType.Structure);
142
        TermTree<DefinedTerm> structureTree = TermTree.NewInstance(TermType.Structure);
143
        TermNode<DefinedTerm> nodeStructure = structureTree.getRoot().addChild(structure);
144

    
145
        DefinedTerm property = DefinedTerm.NewInstance(TermType.Property);
146
        TermTree<DefinedTerm> propertyTree = TermTree.NewInstance(TermType.Property);
147
        TermNode<DefinedTerm> nodeProperty = propertyTree.getRoot().addChild(property);
148
        termService.saveOrUpdate(property);
149
        termService.saveOrUpdate(structure);
150
        termTreeService.saveOrUpdate(structureTree);
151
        termTreeService.saveOrUpdate(propertyTree);
152

    
153
        TermTree<Feature> characterTree = TermTree.NewInstance(TermType.Feature);
154
        UUID characterTreeUuid = characterTree.getUuid();
155
        Character character = Character.NewInstance(nodeStructure, nodeProperty);
156
        character.setSupportsCategoricalData(false);
157

    
158
        characterTree.getRoot().addChild(character);
159
        termService.saveOrUpdate(character);
160
        termTreeService.saveOrUpdate(characterTree);
161
        commitAndStartNewTransaction();
162

    
163
        return characterTreeUuid;
164
    }
165

    
166

    
167
    @Test
168
    public void testIndexCreatRoot() {
169
        TermTree<Feature> featureTree = TermTree.NewFeatureInstance();
170
        termTreeService.save(featureTree);
171

    
172
        Feature feature = (Feature)termService.find(914);
173
        TermNode<Feature> newNode = featureTree.getRoot().addChild(feature);
174
        termTreeService.save(featureTree);
175

    
176
        termNodeService.saveOrUpdate(newNode);
177

    
178
        commitAndStartNewTransaction(/*new String[]{"FeatureNode"}*/);
179
        newNode = termNodeService.load(newNode.getUuid());
180
        Assert.assertEquals("", sep + pref+featureTree.getId()+sep + featureTree.getRoot().getId()+ sep  + newNode.getId() + sep, newNode.treeIndex());
181
    }
182

    
183

    
184
    @Test
185
    @DataSet(loadStrategy=RefreshLoadStrategy.class, value="TermNodeServiceImplTest-indexing.xml")
186
    public final void testIndexCreateNode() {
187

    
188
        Feature feature = (Feature)termService.find(914);
189

    
190
        node2 = termNodeService.load(node2Uuid);
191
        String oldTreeIndex = node2.treeIndex();
192

    
193
        TermNode<Feature> newNode = node2.addChild(feature);
194
        termNodeService.saveOrUpdate(node2);
195

    
196
        commitAndStartNewTransaction();
197
        newNode = termNodeService.load(newNode.getUuid());
198
        Assert.assertEquals("", oldTreeIndex + newNode.getId() + sep, newNode.treeIndex());
199
    }
200

    
201

    
202
    @Test
203
    @DataSet(loadStrategy=RefreshLoadStrategy.class ,value="TermNodeServiceImplTest-indexing.xml")
204
    //this may fail in single test if it is the first test as long as #8174 is not fixed
205
    public void testIndexMoveNode() {
206
        //in feature tree
207
        @SuppressWarnings("unused")
208
        TermTree<Feature> featureTree = termTreeService.load(featureTreeUuid);
209
        node2 = termNodeService.load(node2Uuid);
210
        node3 = termNodeService.load(node3Uuid);
211
        node3.addChild(node2);
212
        termNodeService.saveOrUpdate(node2);
213
        commitAndStartNewTransaction();
214
        TermNode<?> node6 = termNodeService.load(node6Uuid);
215
        Assert.assertEquals("Node6 treeindex is not correct", node3.treeIndex() + "2#4#6#", node6.treeIndex());
216

    
217
        //root of new feature tree
218
        TermTree<Feature> featureTree2 = termTreeService.load(featureTree2Uuid);
219
        node2 = termNodeService.load(node2Uuid);
220
        featureTree2.getRoot().addChild(node2);
221
        termNodeService.saveOrUpdate(node2);
222
        commitAndStartNewTransaction();
223
        node2 = termNodeService.load(node2Uuid);
224
        Assert.assertEquals("Node2 treeindex is not correct", "#t5002#7#2#", node2.treeIndex());
225
        node6 = termNodeService.load(node6Uuid);
226
        Assert.assertEquals("Node6 treeindex is not correct", "#t5002#7#2#4#6#", node6.treeIndex());
227

    
228
        //into new classification
229
        node3 = termNodeService.load(node3Uuid);
230
        TermNode<Feature> node5 = termNodeService.load(node5Uuid);
231
        node5.addChild(node3);
232
        termNodeService.saveOrUpdate(node5);
233
        commitAndStartNewTransaction(new String[]{"FeatureNode"});
234
        node3 = termNodeService.load(node3Uuid);
235
        Assert.assertEquals("Node3 treeindex is not correct", node5.treeIndex() + node3.getId() + sep, node3.treeIndex());
236
    }
237

    
238
    @Test  //here we may have a test for testing delete of a node and attaching the children
239
    //to its parents, however this depends on the way delete is implemented and therefore needs
240
    //to wait until this is finally done
241
    @DataSet(loadStrategy=RefreshLoadStrategy.class, value="TermNodeServiceImplTest-indexing.xml")
242
    public final void testIndexDeleteNode() {
243
        node2 = termNodeService.load(node2Uuid);
244
        TermNodeDeletionConfigurator config = new TermNodeDeletionConfigurator();
245
        config.setDeleteElement(false);
246
        config.setChildHandling(ChildHandling.MOVE_TO_PARENT);
247
        termNodeService.deleteNode(node2Uuid, config);
248
        commitAndStartNewTransaction(new String[]{"FeatureNode"});
249
        TermTree<Feature> tree1 = termTreeService.load(featureTreeUuid);
250
        assertNotNull(tree1);
251
        node2 = termNodeService.load(node2Uuid);
252
        assertNull(node2);
253
        node3 = termNodeService.load(node3Uuid);
254
        assertNotNull(node3);
255
        TermNode<Feature> node4 = termNodeService.load(node4Uuid);
256
        assertNotNull(node4);
257
        config.setDeleteElement(false);
258
        config.setChildHandling(ChildHandling.DELETE);
259
        termNodeService.deleteNode(node4Uuid, config);
260
        commitAndStartNewTransaction(new String[]{"FeatureNode"});
261
        tree1 = termTreeService.load(featureTreeUuid);
262
        node4 = termNodeService.load(node4Uuid);
263
        assertNull(node4);
264
        TermNode<Feature> node6 = termNodeService.load(node6Uuid);
265
        assertNull(node6);
266

    
267
        HibernateProxyHelper.deproxy(tree1, TermTree.class);
268
        TermNode<Feature> rootNode = CdmBase.deproxy(tree1.getRoot());
269
        assertNotNull(tree1);
270
        termTreeService.delete(tree1.getUuid());
271
        commitAndStartNewTransaction(/*new String[]{"TaxonNode"}*/);
272
        tree1 = termTreeService.load(featureTreeUuid);
273
        assertNull(tree1);
274
    }
275

    
276
    @Override
277
    public void createTestDataSet() throws FileNotFoundException {}
278
}
(34-34/37)