Sync Integ to Master
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / version / GroupMembersUpdateOperationTest.java
1 package org.openecomp.sdc.be.components.impl.version;
2
3 import fj.data.Either;
4 import org.junit.Before;
5 import org.junit.Test;
6 import org.junit.runner.RunWith;
7 import org.mockito.ArgumentCaptor;
8 import org.mockito.Captor;
9 import org.mockito.InjectMocks;
10 import org.mockito.Mock;
11 import org.mockito.junit.MockitoJUnitRunner;
12 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
13 import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
14 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
15 import org.openecomp.sdc.be.dao.api.ActionStatus;
16 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
17 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
18 import org.openecomp.sdc.be.impl.ComponentsUtils;
19 import org.openecomp.sdc.be.model.ComponentInstance;
20 import org.openecomp.sdc.be.model.GroupDefinition;
21 import org.openecomp.sdc.be.model.Resource;
22 import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation;
23 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
24
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.stream.Stream;
28
29 import static java.util.Collections.emptyMap;
30 import static org.assertj.core.api.Assertions.assertThat;
31 import static org.mockito.ArgumentMatchers.eq;
32 import static org.mockito.Mockito.when;
33
34 @RunWith(MockitoJUnitRunner.class)
35 public class GroupMembersUpdateOperationTest {
36
37     private static final String CONTAINER_ID = "containerId";
38     private static final String INSTANCE_ID_PRE_CHANGE = "inst2";
39     private static final String INSTANCE_ID_POST_CHANGE = "newInst2";
40     @InjectMocks
41     private GroupMembersUpdateOperation testInstance;
42     @Mock
43     private GroupsOperation groupsOperation;
44     @Mock
45     private ComponentsUtils componentsUtils;
46
47     @Captor
48     private ArgumentCaptor<List<GroupDataDefinition>> updatedGroupsCaptor;
49     private GroupDefinition group1, group2, group3;
50     private Resource container;
51     private ComponentInstance prevInst2Version, currInst2Version;
52     private static final ComponentInstance DONT_CARE = new ComponentInstance();
53
54     @Before
55     public void setUp() throws Exception {
56         group1 = createGroupWithMembers("group1", "inst1", INSTANCE_ID_PRE_CHANGE);
57         group2 = createGroupWithMembers("group2", "inst1", "inst2", "inst3");
58         group3 = createGroupWithMembers("group3", "inst1", "inst3");
59         container = new ResourceBuilder()
60                 .addGroups(group1)
61                 .addGroups(group2)
62                 .setUniqueId(CONTAINER_ID)
63                 .setComponentType(ComponentTypeEnum.RESOURCE)
64                 .build();
65         prevInst2Version = new ComponentInstanceBuilder()
66                 .setId(INSTANCE_ID_PRE_CHANGE)
67                 .build();
68         currInst2Version = new ComponentInstanceBuilder()
69                 .setId(INSTANCE_ID_POST_CHANGE)
70                 .build();
71     }
72
73     @Test
74     public void whenNoGroupsOnContainer_returnOk() {
75         ActionStatus actionStatus = testInstance.onChangeVersion(new Resource(), DONT_CARE, DONT_CARE);
76         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
77     }
78
79     @Test
80     public void whenEmptyListOfGroups_returnOk() {
81         Resource resource = new Resource();
82         resource.setGroups(new ArrayList<>());
83         ActionStatus actionStatus = testInstance.onChangeVersion(resource, DONT_CARE, DONT_CARE);
84         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
85     }
86
87     @Test
88     public void whenGroupsHasNoMembers_returnOk() {
89         GroupDefinition group1 = new GroupDefinition();
90         group1.setMembers(emptyMap());
91         GroupDefinition group2 = new GroupDefinition();
92         group2.setMembers(emptyMap());
93         Resource container = new ResourceBuilder()
94                 .addGroups(group1)
95                 .addGroups(group2)
96                 .build();
97         ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("inst1").build();
98         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE);
99         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
100     }
101
102     @Test
103     public void whenPrevInstanceIsNotAMemberOfAnyGroup_returnOk() {
104         ComponentInstance prevInstance = new ComponentInstanceBuilder().setId("nonMemberInst").build();
105         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInstance, DONT_CARE);
106         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
107     }
108
109     @Test
110     public void whenGroupHasPrevInstanceAsMember_replaceWithNewInstanceId_updateReplacedGroups() {
111         verifyAllGroupsHasPrevInstancesAsMembers();
112         when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture())).thenReturn(Either.left(null));
113         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
114         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
115         verifyGroupWithPrevInstanceMemberWereReplaced();
116         assertThat(updatedGroupsCaptor.getValue())
117                 .containsExactlyInAnyOrder(group1, group2);
118     }
119
120     @Test
121     public void whenFailingToUpdateGroups_propagateError() {
122         when(groupsOperation.updateGroups(eq(container), updatedGroupsCaptor.capture())).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
123         when(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, ComponentTypeEnum.RESOURCE)).thenCallRealMethod();
124         ActionStatus actionStatus = testInstance.onChangeVersion(container, prevInst2Version, currInst2Version);
125         assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
126     }
127
128     private void verifyGroupWithPrevInstanceMemberWereReplaced() {
129         assertGroupMembersIds(group1, "inst1", INSTANCE_ID_POST_CHANGE);
130         assertGroupMembersIds(group2, "inst1", INSTANCE_ID_POST_CHANGE, "inst3");
131         assertGroupMembersIds(group3, "inst1", "inst3");
132     }
133
134     private void verifyAllGroupsHasPrevInstancesAsMembers() {
135         assertGroupMembersIds(group1, "inst1", INSTANCE_ID_PRE_CHANGE);
136         assertGroupMembersIds(group2, "inst1", INSTANCE_ID_PRE_CHANGE, "inst3");
137         assertGroupMembersIds(group3, "inst1", "inst3");
138     }
139
140     private void assertGroupMembersIds(GroupDefinition group, String ... expectedMembersIds) {
141         assertThat(group.getMembers())
142                 .containsValues(expectedMembersIds);
143     }
144
145     private GroupDefinition createGroupWithMembers(String groupId, String ... membersIds) {
146         GroupDefinitionBuilder groupDefinitionBuilder = GroupDefinitionBuilder.create();
147         Stream.of(membersIds).forEach(memberId -> groupDefinitionBuilder.addMember(memberId + "name", memberId));
148         groupDefinitionBuilder.setUniqueId(groupId);
149         return groupDefinitionBuilder.build();
150     }
151
152 }