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