Skip to content

Commit 8d8edcd

Browse files
committed
PR review changes and IntTest improvements #4056
1 parent 25c039f commit 8d8edcd

File tree

9 files changed

+206
-49
lines changed

9 files changed

+206
-49
lines changed

sechub-administration/src/main/java/com/mercedesbenz/sechub/domain/administration/project/ProjectService.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,15 @@ private List<ProjectData> collectProjectDataForUser(User user) {
6262
List<ProjectData> projectDataList = new ArrayList<>();
6363
for (Project project : user.getProjects()) {
6464

65-
ProjectData projectData = createProjectDataForProject(user, project);
66-
List<String> profileIds = projectToProfileIds.get(project.getId());
67-
if (profileIds != null) {
68-
projectData.setAssignedProfileIds(new HashSet<>(profileIds));
69-
}
65+
ProjectData projectData = createProjectDataForProject(user, project, projectToProfileIds);
7066
projectDataList.add(projectData);
7167

7268
}
7369

7470
return projectDataList;
7571
}
7672

77-
private static ProjectData createProjectDataForProject(User user, Project project) {
73+
private static ProjectData createProjectDataForProject(User user, Project project, Map<String, List<String>> projectToProfileIds) {
7874

7975
ProjectData projectData = new ProjectData();
8076
projectData.setProjectId(project.getId());
@@ -93,6 +89,11 @@ private static ProjectData createProjectDataForProject(User user, Project projec
9389
if (user.isSuperAdmin() || isOwner) {
9490
addAssignedUsersToProjectData(project, projectData);
9591
}
92+
93+
List<String> profileIds = projectToProfileIds.get(project.getId());
94+
if (profileIds != null) {
95+
projectData.setAssignedProfileIds(new HashSet<>(profileIds));
96+
}
9697
return projectData;
9798
}
9899

sechub-administration/src/test/java/com/mercedesbenz/sechub/domain/administration/project/ProjectServiceTest.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import static com.mercedesbenz.sechub.domain.administration.user.TestUserCreationFactory.createProjectUser;
55
import static com.mercedesbenz.sechub.sharedkernel.messaging.MessageDataKeys.PROJECT_ASSIGNED_PROFILE_IDS;
6-
import static com.mercedesbenz.sechub.sharedkernel.messaging.MessageDataKeys.PROJECT_IDS;
76
import static org.assertj.core.api.Assertions.assertThat;
87
import static org.mockito.ArgumentMatchers.any;
98
import static org.mockito.Mockito.mock;
@@ -59,7 +58,6 @@ void users_receive_expected_number_of_projects(String userId, int expectedProjec
5958
String expectedOwnerEmailAddress) {
6059
/* prepare */
6160
DomainMessageSynchronousResult mockedResponse = mock();
62-
when(mockedResponse.get(PROJECT_IDS)).thenReturn(List.of("mocked-project"));
6361
when(mockedResponse.get(PROJECT_ASSIGNED_PROFILE_IDS)).thenReturn(Collections.emptyMap());
6462
when(eventBus.sendSynchron(any())).thenReturn(mockedResponse);
6563

@@ -104,19 +102,21 @@ void user2_sees_assigned_and_owned_projects_with_users_and_with_assigned_profile
104102
assertThat(projects.get(1).getAssignedUsers().size()).isGreaterThan(0);
105103

106104
// verify profile IDs are included correctly
105+
boolean assertionDone = false;
107106
for (ProjectData projectData : projects) {
108107
if (PROJECT_ID_2.equals(projectData.getProjectId())) {
109108
assertThat(projectData.getAssignedProfileIds()).containsAll(profileIdsProject2);
109+
assertionDone = true;
110110
}
111111
}
112+
assertThat(assertionDone).isTrue();
112113
}
113114

114115
@Test
115116
void user3_sees_assigned_project_without_users() {
116117
/* prepare */
117118
String userId = USER_ID_3;
118119
DomainMessageSynchronousResult mockedResponse = mock();
119-
when(mockedResponse.get(PROJECT_IDS)).thenReturn(List.of("mocked-project"));
120120
when(mockedResponse.get(PROJECT_ASSIGNED_PROFILE_IDS)).thenReturn(Collections.emptyMap());
121121
when(eventBus.sendSynchron(any())).thenReturn(mockedResponse);
122122

@@ -133,7 +133,6 @@ void user4_is_admin_and_sees_assigned_project_with_users() {
133133
/* prepare */
134134
String userId = USER_ID_4;
135135
DomainMessageSynchronousResult mockedResponse = mock();
136-
when(mockedResponse.get(PROJECT_IDS)).thenReturn(List.of("mocked-project"));
137136
when(mockedResponse.get(PROJECT_ASSIGNED_PROFILE_IDS)).thenReturn(Collections.emptyMap());
138137
when(eventBus.sendSynchron(any())).thenReturn(mockedResponse);
139138

@@ -214,7 +213,6 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
214213
private DomainMessageSynchronousResult prepareValidSyncResult(String projectId, List<String> profileIds) {
215214
DomainMessageSynchronousResult response = new DomainMessageSynchronousResult(MessageID.REQUEST_PROFILE_IDS_FOR_PROJECT);
216215
response.set(PROJECT_ASSIGNED_PROFILE_IDS, Map.of(projectId, profileIds));
217-
response.set(PROJECT_IDS, null);
218216
return response;
219217
}
220218
}

sechub-integrationtest/src/main/java/com/mercedesbenz/sechub/integrationtest/api/AsUser.java

+5
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ private TestRestHelper getRestHelper() {
173173
return getContext().getRestHelper(user);
174174
}
175175

176+
public AsUser deleteUser(TestUser user) {
177+
getRestHelper().delete(getUrlBuilder().buildAdminDeletesUserUrl(user.getUserId()));
178+
return this;
179+
}
180+
176181
/**
177182
* Signup given (new) user
178183
*

sechub-integrationtest/src/test/java/com/mercedesbenz/sechub/integrationtest/scenario3/ProjectAdministrationScenario3IntTest.java

+91-18
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
// SPDX-License-Identifier: MIT
22
package com.mercedesbenz.sechub.integrationtest.scenario3;
33

4-
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.*;
5-
import static com.mercedesbenz.sechub.integrationtest.internal.IntegrationTestDefaultProfiles.*;
6-
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.*;
4+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.ANONYMOUS;
5+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.SUPER_ADMIN;
6+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.as;
7+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.assertUser;
8+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.expectHttpFailure;
9+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.getLinkToFetchNewAPITokenAfterSignupAccepted;
10+
import static com.mercedesbenz.sechub.integrationtest.api.TestAPI.udpdateAPITokenByOneTimeTokenLink;
11+
import static com.mercedesbenz.sechub.integrationtest.internal.IntegrationTestDefaultProfiles.PROFILE_1;
12+
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.PROJECT_1;
13+
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.PROJECT_2;
14+
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.USER_1;
15+
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.USER_2;
16+
import static com.mercedesbenz.sechub.integrationtest.scenario3.Scenario3.USER_3;
717
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.junit.Assert.assertFalse;
819

920
import java.util.List;
1021
import java.util.Set;
@@ -14,7 +25,11 @@
1425
import org.springframework.http.HttpStatus;
1526

1627
import com.mercedesbenz.sechub.domain.administration.project.ProjectData;
28+
import com.mercedesbenz.sechub.domain.administration.project.ProjectUserData;
29+
import com.mercedesbenz.sechub.integrationtest.api.FixedTestUser;
1730
import com.mercedesbenz.sechub.integrationtest.api.IntegrationTestExtension;
31+
import com.mercedesbenz.sechub.integrationtest.api.TestProject;
32+
import com.mercedesbenz.sechub.integrationtest.api.TestUser;
1833
import com.mercedesbenz.sechub.integrationtest.api.TextSearchMode;
1934
import com.mercedesbenz.sechub.integrationtest.api.WithTestScenario;
2035

@@ -93,28 +108,86 @@ void change_project_ownership_by_admin_and_owners() {
93108
unassignUserFromProject(USER_1, PROJECT_2);
94109

95110
assertUser(USER_1).
96-
isOwnerOf(PROJECT_2). // lost ownership
111+
isOwnerOf(PROJECT_2).
97112
isNotAssignedToProject(PROJECT_2). // still assigned after ownership loss
98113
hasOwnerRole(); // has still owner role
99114

100-
/* test 4 - project details contain profile IDs */
115+
/* test 4 - users can get information about assigned projects */
116+
assertProjectDataAsExpectedAfterAssignments();
117+
}
118+
/* @formatter:on */
119+
120+
private void assertProjectDataAsExpectedAfterAssignments() {
121+
TestProject project = PROJECT_1;
122+
String expectedProfileId = PROFILE_1.id;
123+
124+
TestUser user = USER_2;
125+
TestUser owner = USER_3;
126+
TestUser tmpAdmin = createTemporaryAdminForAndAssignToProject(project);
127+
128+
ProjectUserData userData = new ProjectUserData();
129+
userData.setUserId(user.getUserId());
130+
userData.setEmailAddress(user.getEmail());
131+
132+
ProjectUserData ownerData = new ProjectUserData();
133+
ownerData.setUserId(owner.getUserId());
134+
ownerData.setEmailAddress(owner.getEmail());
135+
136+
ProjectUserData adminData = new ProjectUserData();
137+
adminData.setUserId(tmpAdmin.getUserId());
138+
adminData.setEmailAddress(tmpAdmin.getEmail());
139+
140+
ProjectUserData user1Data = new ProjectUserData();
141+
user1Data.setUserId(USER_1.getUserId());
142+
user1Data.setEmailAddress(USER_1.getEmail());
101143

102-
// normal user can view profiles of assigned projects
103-
List<ProjectData> projectDetailsOfnormalUser = as(USER_2).getAssignedProjectDataList();
104-
assertThat(projectDetailsOfnormalUser).hasSize(1);
105-
Set<String> userAssignedProfileIds = projectDetailsOfnormalUser.get(0).getAssignedProfileIds();
106-
assertThat(userAssignedProfileIds).containsExactly(PROFILE_1.id);
144+
// normal user, does not see users of the project
145+
assertProjectData(user, project, expectedProfileId, ownerData);
107146

108-
// owner can view profiles of assigned projects
109-
List<ProjectData> projectDetailsOfOwner = as(USER_1).getAssignedProjectDataList();
110-
assertThat(projectDetailsOfOwner).hasSize(1);
111-
Set<String> ownerAssignedProfileIds = projectDetailsOfOwner.get(0).getAssignedProfileIds();
112-
assertThat(ownerAssignedProfileIds).containsExactly(PROFILE_1.id);
147+
// owner, does see users of the project
148+
assertProjectData(owner, project, expectedProfileId, ownerData, userData, ownerData, adminData, user1Data);
113149

114-
// admin can view profiles of assigned projects
115-
assertThat(as(SUPER_ADMIN).getAssignedProjectDataList()).isEmpty();
150+
// admin, does see users of the project
151+
assertProjectData(tmpAdmin, project, expectedProfileId, ownerData, userData, ownerData, adminData, user1Data);
116152

153+
// clean up
154+
as(SUPER_ADMIN).deleteUser(tmpAdmin);
155+
}
156+
157+
private void assertProjectData(TestUser asUser, TestProject project, String expectedProfileId, ProjectUserData expectedOwner,
158+
ProjectUserData... expectedAssignedUsers) {
159+
List<ProjectData> projectDetails = as(asUser).getAssignedProjectDataList();
160+
assertThat(projectDetails).hasSize(1);
161+
162+
ProjectData projectData = projectDetails.get(0);
163+
assertThat(projectData.getProjectId()).isEqualTo(project.getProjectId());
164+
assertThat(projectData.getOwner()).isEqualTo(expectedOwner);
165+
166+
List<ProjectUserData> assignedUsers = projectData.getAssignedUsers();
167+
if (expectedAssignedUsers == null || expectedAssignedUsers.length == 0) {
168+
assertThat(assignedUsers).isNull();
169+
} else {
170+
assertThat(assignedUsers).containsOnly(expectedAssignedUsers);
171+
}
172+
173+
Set<String> assignedProfileIds = projectData.getAssignedProfileIds();
174+
assertThat(assignedProfileIds).containsExactly(expectedProfileId);
175+
}
176+
177+
private TestUser createTemporaryAdminForAndAssignToProject(TestProject project) {
178+
String adminId = "admin_" + System.currentTimeMillis();
179+
TestUser tmpAdmin = new FixedTestUser(adminId, adminId + "-pwd");
180+
as(ANONYMOUS).signUpAs(tmpAdmin);
181+
as(SUPER_ADMIN).acceptSignup(tmpAdmin);
182+
assertUser(tmpAdmin).doesExist();
183+
184+
/* execute receive of new api token */
185+
String link = getLinkToFetchNewAPITokenAfterSignupAccepted(tmpAdmin);
186+
assertFalse(link.isEmpty());
187+
udpdateAPITokenByOneTimeTokenLink(tmpAdmin, link);
188+
as(SUPER_ADMIN).grantSuperAdminRightsTo(tmpAdmin);
189+
as(SUPER_ADMIN).assignUserToProject(tmpAdmin, project);
190+
return tmpAdmin;
117191
}
118-
/* @formatter:on */
119192

120193
}

sechub-scan/src/main/java/com/mercedesbenz/sechub/domain/scan/product/config/ProfileMessageHandler.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.mercedesbenz.sechub.sharedkernel.messaging.DomainMessage;
1515
import com.mercedesbenz.sechub.sharedkernel.messaging.DomainMessageSynchronousResult;
1616
import com.mercedesbenz.sechub.sharedkernel.messaging.IsRecevingSyncMessage;
17+
import com.mercedesbenz.sechub.sharedkernel.messaging.IsSendingSyncMessageAnswer;
1718
import com.mercedesbenz.sechub.sharedkernel.messaging.MessageID;
1819
import com.mercedesbenz.sechub.sharedkernel.messaging.SynchronMessageHandler;
1920

@@ -27,11 +28,12 @@ public ProfileMessageHandler(ProductExecutionProfileRepository productExecutionP
2728
}
2829

2930
@IsRecevingSyncMessage(MessageID.REQUEST_PROFILE_IDS_FOR_PROJECT)
31+
@IsSendingSyncMessageAnswer(value = MessageID.RESULT_PROFILE_IDS_FOR_PROJECT, answeringTo = MessageID.REQUEST_PROFILE_IDS_FOR_PROJECT, branchName = "success")
3032
@Override
3133
public DomainMessageSynchronousResult receiveSynchronMessage(DomainMessage request) {
3234
List<String> projectIds = request.get(PROJECT_IDS);
3335

34-
DomainMessageSynchronousResult response = new DomainMessageSynchronousResult(MessageID.REQUEST_PROFILE_IDS_FOR_PROJECT);
36+
DomainMessageSynchronousResult response = new DomainMessageSynchronousResult(MessageID.RESULT_PROFILE_IDS_FOR_PROJECT);
3537
Map<String, List<String>> projectToProfileIds = new HashMap<>();
3638
for (String id : projectIds) {
3739
List<ProductExecutionProfile> executionProfilesForProject = productExecutionProfileRepository.findExecutionProfilesForProject(id);
@@ -43,7 +45,6 @@ public DomainMessageSynchronousResult receiveSynchronMessage(DomainMessage reque
4345
projectToProfileIds.put(id, profileIds);
4446
}
4547
response.set(PROJECT_ASSIGNED_PROFILE_IDS, projectToProfileIds);
46-
response.set(PROJECT_IDS, null);
4748
return response;
4849
}
4950

sechub-scan/src/test/java/com/mercedesbenz/sechub/domain/scan/product/config/ProfileMessageHandlerTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ void profiles_assigned_results_in_profiles_list_in_response() {
6868

6969
private DomainMessage prepareValidDomainMessage() {
7070
DomainMessage message = new DomainMessage(MessageID.REQUEST_PROFILE_IDS_FOR_PROJECT);
71-
message.set(PROJECT_ASSIGNED_PROFILE_IDS, null);
7271
message.set(PROJECT_IDS, List.of(TEST_PROJECT_ID));
7372
return message;
7473
}

sechub-shared-kernel/src/main/java/com/mercedesbenz/sechub/sharedkernel/messaging/MessageID.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,13 @@ public enum MessageID {
262262
* Request all execution profile IDs for each project. This is sent when a user
263263
* requests information about all projects the user is part of.
264264
*/
265-
REQUEST_PROFILE_IDS_FOR_PROJECT(MessageDataKeys.PROJECT_ASSIGNED_PROFILE_IDS, MessageDataKeys.PROJECT_IDS),
265+
REQUEST_PROFILE_IDS_FOR_PROJECT(MessageDataKeys.PROJECT_IDS),
266+
267+
/**
268+
* This is sent as a result to a message with the request:
269+
* {@link #REQUEST_PROFILE_IDS_FOR_PROJECT}.
270+
*/
271+
RESULT_PROFILE_IDS_FOR_PROJECT(MessageDataKeys.PROJECT_ASSIGNED_PROFILE_IDS),
266272

267273
;
268274

sechub-shared-kernel/src/test/java/com/mercedesbenz/sechub/sharedkernel/messaging/ListOfStringsMessageDataProviderTest.java

+40-8
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,77 @@
77
import java.util.List;
88

99
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.NullSource;
12+
import org.junit.jupiter.params.provider.ValueSource;
1013

1114
class ListOfStringsMessageDataProviderTest {
1215

1316
private ListOfStringsMessageDataProvider providerToTest = new ListOfStringsMessageDataProvider();
1417

1518
@Test
16-
void null_handled_correctly() {
19+
void null_handled_correctly_on_getString() {
1720
/* execute */
18-
List<String> profileIds = providerToTest.get(null);
1921
String profileIdsAsString = providerToTest.getString(null);
2022

2123
/* test */
22-
assertThat(profileIds).isNull();
2324
assertThat(profileIdsAsString).isNull();
2425
}
2526

27+
@ParameterizedTest
28+
@NullSource
29+
@ValueSource(strings = { "", " ", "\n", "\r", "\r\n" })
30+
void null_and_blank_strings_handled_correctly_on_get(String json) {
31+
/* execute */
32+
List<String> profileIds = providerToTest.get(json);
33+
34+
/* test */
35+
assertThat(profileIds).isNull();
36+
}
37+
2638
@Test
27-
void empty_values_handled_correctly() {
39+
void empty_values_handled_correctly_on_getString() {
2840
/* execute */
29-
List<String> profileIds = providerToTest.get("[]");
3041
String profileIdsAsString = providerToTest.getString(Collections.emptyList());
3142

3243
/* test */
33-
assertThat(profileIds).isEmpty();
3444
assertThat(profileIdsAsString).isEqualTo("[]");
3545
}
3646

3747
@Test
38-
void non_empty_data_handled_correctly() {
48+
void empty_values_handled_correctly_on_get() {
49+
/* execute */
50+
List<String> profileIds = providerToTest.get("[]");
51+
52+
/* test */
53+
assertThat(profileIds).isEmpty();
54+
}
55+
56+
@Test
57+
void non_empty_data_handled_correctly_on_getString() {
3958
/* prepare */
4059
String profile1 = "profile1";
4160
String profile2 = "profile2";
4261

4362
/* execute */
4463
String profileIdsAsString = providerToTest.getString(List.of(profile1, profile2));
64+
65+
/* test */
66+
assertThat(profileIdsAsString).contains(profile1, profile2);
67+
}
68+
69+
@Test
70+
void non_empty_data_handled_correctly_on_get() {
71+
/* prepare */
72+
String profileIdsAsString = """
73+
["profile1", "profile2"]
74+
""";
75+
76+
/* execute */
4577
List<String> profileIds = providerToTest.get(profileIdsAsString);
4678

4779
/* test */
48-
assertThat(profileIds).contains(profile1, profile2);
80+
assertThat(profileIds).contains("profile1", "profile2");
4981
}
5082

5183
}

0 commit comments

Comments
 (0)