aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be/src/test/java/org/openecomp/sdc/be/components/merge/group/ComponentGroupMergeCommandTest.java
blob: e8b2535f88964afb7b74d6962667f10ba379f999 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
package org.openecomp.sdc.be.components.merge.group;

import fj.data.Either;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.openecomp.sdc.be.auditing.impl.AuditingManager;
import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
import org.openecomp.sdc.be.components.utils.ResourceBuilder;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.datatypes.enums.CreatedFrom;
import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.GroupDefinition;
import org.openecomp.sdc.be.model.Resource;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;

import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static java.util.Arrays.asList;
import static java.util.Collections.*;
import static java.util.stream.Collectors.toMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class ComponentGroupMergeCommandTest {

    private static final Resource DONT_CARE = new Resource();
    private ComponentGroupMergeCommand testInstance;
    @Mock
    private GroupsOperation groupsOperation;

    @Captor
    private ArgumentCaptor<List<GroupDefinition>> groupsToAddCaptor;

    @Before
    public void setUp() throws Exception {
        testInstance = new ComponentGroupMergeCommand(groupsOperation, new ComponentsUtils(Mockito.mock(AuditingManager.class)));
    }

    @Test
    public void whenPrevComponentHasNoGroups_returnOk() {
        ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), DONT_CARE);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);

        Resource prevResource = new Resource();
        prevResource.setGroups(emptyList());

        actionStatus = testInstance.mergeComponents(prevResource, DONT_CARE);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        verifyZeroInteractions(groupsOperation);
    }

    @Test
    public void whenAllPrevGroupsCreatedFromCsar_returnOk() {
        GroupDefinition group1 = createCsarGroup("group1");
        GroupDefinition group2 = createCsarGroup("group2");
        Resource prevResource = createResourceWithGroups(group1, group2);
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, DONT_CARE);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        verifyZeroInteractions(groupsOperation);
    }

    @Test
    public void whenAllPrevGroupsAlreadyExistInNewComponent_returnOk() {
        GroupDefinition group1 = createCsarGroup("group1");
        GroupDefinition group2 = createUserDefinedGroup("group2");
        GroupDefinition group3 = createUserDefinedGroup("group3");
        Resource prevResource = createResourceWithGroups(group1, group2, group3);
        Resource currResource = createResourceWithGroups(group1, group2, group3);
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        verifyZeroInteractions(groupsOperation);
    }

    @Test
    public void addAllPrevUserDefinedGroupsToComponent() {
        GroupDefinition group1 = createCsarGroup("group1");
        GroupDefinition group2 = createUserDefinedGroup("group2");
        GroupDefinition group3 = createUserDefinedGroup("group3");
        Resource prevResource = createResourceWithGroups(group1, group2, group3);
        Resource currResource = createResourceWithGroups(group1, group2);
        when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        assertThat(groupsToAddCaptor.getValue())
                .containsExactlyInAnyOrder(group3);
        assertThat(currResource.getGroups())
                .containsExactlyInAnyOrder(group1, group2, group3);
    }

    @Test
    public void whenPrevUserDefinedGroupHasNoMembers_itShouldHaveNoMembersInNewComponent() {
        GroupDefinition group1 = createUserDefinedGroup("group1");
        Resource prevResource = createResourceWithGroups(group1);
        Resource currResource = new Resource();
        when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
        assertThat(groupsAdded)
                .extracting("members")
                .containsNull();
    }

    @Test
    public void whenPrevUserDefinedGroupHasInstanceMembersThatNotExistInNewComponent_removeMembersFromGroup() {
        GroupDefinition group1 = createUserDefinedGroup("group1", "inst1Id", "inst2Id", "inst3Id");
        GroupDefinition group2 = createUserDefinedGroup("group2", "inst1Id");

        ComponentInstance inst1 = createInstance("inst1", "inst1Id");
        ComponentInstance inst2 = createInstance("inst2", "inst2Id");
        ComponentInstance inst3 = createInstance("inst3", "inst3Id");

        Resource prevResource = createResourceWithGroupsAndInstances(asList(group1, group2), asList(inst1, inst2, inst3));
        Resource currResource = createResourceWithInstances(inst3);

        when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);

        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
        Map<String, String> group1ExpectedMembers = cmptInstancesToGroups(inst3);
        Map<String, String> group2ExpectedMembers = emptyMap();
        assertThat(groupsAdded)
                .extracting("members")
                .containsExactlyInAnyOrder(group1ExpectedMembers, group2ExpectedMembers);
    }

    @Test
    public void groupsMembersShouldBeUpdatedAccordingToNewInstancesIds() {
        String prevInstance1Id = "inst1Id";
        String prevInstance2Id = "inst2Id";

        String currInstance1Id = "newInst1Id";
        String currInstance2Id = "newInst2Id";

        GroupDefinition group1 = createUserDefinedGroup("group1", prevInstance1Id, prevInstance2Id);
        ComponentInstance prevInst1 = createInstance("inst1", prevInstance1Id);
        ComponentInstance prevInst2 = createInstance("inst2", prevInstance2Id);
        Resource prevResource = createResourceWithGroupsAndInstances(singletonList(group1), asList(prevInst1, prevInst2));

        ComponentInstance currInst1 = createInstance("inst1", currInstance1Id);
        ComponentInstance currInst2 = createInstance("inst2", currInstance2Id);
        Resource currResource = createResourceWithInstances(currInst1, currInst2);

        when(groupsOperation.addGroups(eq(currResource), groupsToAddCaptor.capture())).thenReturn(Either.left(null));
        ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
        assertThat(actionStatus).isEqualTo(ActionStatus.OK);
        List<GroupDefinition> groupsAdded = groupsToAddCaptor.getValue();
        assertThat(groupsAdded)
                .extracting("members")
                .containsExactly(cmptInstancesToGroups(currInst1, currInst2));
    }

    private ComponentInstance createInstance(String name, String instId) {
        return new ComponentInstanceBuilder()
                    .setName(name)
                    .setUniqueId(instId)
                    .build();
    }

    private GroupDefinition createCsarGroup(String id) {
        return createGroup(id, CreatedFrom.CSAR);
    }

    private GroupDefinition createUserDefinedGroup(String id, String ... members) {
        return createGroup(id, CreatedFrom.UI, members);
    }

    private GroupDefinition createGroup(String id, CreatedFrom createdFrom, String ... members) {
        GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create()
                .setUniqueId(id)
                .setCreatedFrom(createdFrom)
                .setName("name" + id)
                .setInvariantName("invName" + id);
        Stream.of(members).forEach(groupDefinitionBuilder::addMember);
        return groupDefinitionBuilder.build();
    }

    private Resource createResourceWithGroups(GroupDefinition ... groups) {
        return createResourceWithGroupsAndInstances(asList(groups), null);
    }

    private Resource createResourceWithInstances(ComponentInstance ... instances) {
        return createResourceWithGroupsAndInstances(null, asList(instances));
    }

    private Resource createResourceWithGroupsAndInstances(List<GroupDefinition> groups, List<ComponentInstance> instances) {
        ResourceBuilder resourceBuilder = new ResourceBuilder();
        if (groups != null) {
            groups.forEach(resourceBuilder::addGroup);
        }
        if (instances != null) {
            instances.forEach(resourceBuilder::addComponentInstance);
        }
        return resourceBuilder.build();
    }

    private Map<String, String> cmptInstancesToGroups(ComponentInstance ... instances) {
        return Stream.of(instances).collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
    }

}