Skip to content

Commit c5bbe9b

Browse files
authored
Merge pull request #605 from overture-stack/rc/4.5.2
🔖 Rc/4.5.2
2 parents ba7ecc5 + 43a747b commit c5bbe9b

File tree

5 files changed

+121
-15
lines changed

5 files changed

+121
-15
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>bio.overture</groupId>
77
<artifactId>ego</artifactId>
8-
<version>4.5.1</version>
8+
<version>4.5.2</version>
99

1010
<name>ego</name>
1111
<description>OAuth 2.0 Authorization service that supports multiple OpenID Connect Providers</description>

src/main/java/bio/overture/ego/controller/UserController.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ public UserController(
121121
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
122122
final String authorization,
123123
@ApiParam(
124-
value = "Query string compares to Users Email, First Name, and Last Name fields.",
124+
value =
125+
"Query string compares to Users Email, First Name, Last Name, Status and ProviderType fields.",
125126
required = false)
126127
@RequestParam(value = "query", required = false)
127128
String query,

src/main/java/bio/overture/ego/model/enums/Fields.java

+2
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ public class Fields {
2525

2626
public static final String ID = "id";
2727
public static final String NAME = "name";
28+
public static final String EMAIL = "email";
29+
public static final String PROVIDERTYPE = "providerType";
2830
}

src/main/java/bio/overture/ego/repository/queryspecification/UserSpecification.java

+3-10
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@
1616

1717
package bio.overture.ego.repository.queryspecification;
1818

19-
import static bio.overture.ego.model.enums.JavaFields.APPLICATION;
20-
import static bio.overture.ego.model.enums.JavaFields.EMAIL;
21-
import static bio.overture.ego.model.enums.JavaFields.FIRSTNAME;
22-
import static bio.overture.ego.model.enums.JavaFields.GROUP;
23-
import static bio.overture.ego.model.enums.JavaFields.ID;
24-
import static bio.overture.ego.model.enums.JavaFields.LASTNAME;
25-
import static bio.overture.ego.model.enums.JavaFields.STATUS;
26-
import static bio.overture.ego.model.enums.JavaFields.USERAPPLICATIONS;
27-
import static bio.overture.ego.model.enums.JavaFields.USERGROUPS;
19+
import static bio.overture.ego.model.enums.JavaFields.*;
2820

2921
import bio.overture.ego.model.entity.Application;
3022
import bio.overture.ego.model.entity.Group;
@@ -47,7 +39,8 @@ public static Specification<User> containsText(@NonNull String text) {
4739
return (root, query, builder) -> {
4840
query.distinct(true);
4941
return builder.or(
50-
getQueryPredicates(builder, root, finalText, EMAIL, FIRSTNAME, LASTNAME, STATUS));
42+
getQueryPredicates(
43+
builder, root, finalText, EMAIL, FIRSTNAME, LASTNAME, STATUS, PROVIDERTYPE));
5144
};
5245
}
5346

src/test/java/bio/overture/ego/controller/UserControllerTest.java

+113-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static bio.overture.ego.model.enums.JavaFields.*;
2323
import static bio.overture.ego.model.enums.LanguageType.*;
2424
import static bio.overture.ego.model.enums.ProviderType.*;
25+
import static bio.overture.ego.model.enums.UserType.USER;
2526
import static bio.overture.ego.utils.CollectionUtils.mapToImmutableSet;
2627
import static bio.overture.ego.utils.CollectionUtils.mapToSet;
2728
import static bio.overture.ego.utils.CollectionUtils.repeatedCallsOf;
@@ -34,13 +35,15 @@
3435
import static com.google.common.collect.Lists.newArrayList;
3536
import static com.google.common.collect.Sets.newHashSet;
3637
import static org.junit.Assert.*;
38+
import static org.springframework.http.HttpStatus.OK;
3739

3840
import bio.overture.ego.AuthorizationServiceMain;
3941
import bio.overture.ego.model.entity.Application;
4042
import bio.overture.ego.model.entity.Group;
4143
import bio.overture.ego.model.entity.Identifiable;
4244
import bio.overture.ego.model.entity.Policy;
4345
import bio.overture.ego.model.entity.User;
46+
import bio.overture.ego.model.enums.ProviderType;
4447
import bio.overture.ego.service.ApplicationService;
4548
import bio.overture.ego.service.GroupService;
4649
import bio.overture.ego.service.UserService;
@@ -66,7 +69,6 @@
6669
import org.springframework.beans.factory.annotation.Autowired;
6770
import org.springframework.beans.factory.annotation.Value;
6871
import org.springframework.boot.test.context.SpringBootTest;
69-
import org.springframework.http.HttpStatus;
7072
import org.springframework.test.context.ActiveProfiles;
7173
import org.springframework.test.context.junit4.SpringRunner;
7274

@@ -122,7 +124,7 @@ public void listUsersNoFilter() {
122124
assertNotNull(response.getBody());
123125
val responseJson = MAPPER.readTree(response.getBody());
124126

125-
assertEquals(responseStatus, HttpStatus.OK);
127+
assertEquals(responseStatus, OK);
126128
assertTrue(responseJson.get("count").asInt() >= 3);
127129
assertTrue(responseJson.get("resultSet").isArray());
128130

@@ -135,6 +137,114 @@ public void listUsersNoFilter() {
135137
136138
}
137139

140+
@Test
141+
@SneakyThrows
142+
public void listUsersWithFilter_Success() {
143+
val numUsers = userService.getRepository().count();
144+
145+
// Since previous test may introduce new users. If there are more users than the
146+
// default page
147+
// size, only a subset will be returned and could cause a test failure
148+
val existingUsersResponse =
149+
initStringRequest().endpoint("/users?limit=%s&offset=0", numUsers).getAnd();
150+
existingUsersResponse.assertOk().assertHasBody().assertPageResultsOfType(User.class);
151+
152+
// filter by existing email
153+
val existingUser = existingUsersResponse.extractPageResults(User.class).get(0);
154+
val emailFilter = existingUser.getEmail();
155+
val emailFilteredResponse =
156+
initStringRequest().endpoint("/users?offset=0&email=%s", emailFilter).getAnd();
157+
emailFilteredResponse.assertOk();
158+
emailFilteredResponse.assertHasBody();
159+
emailFilteredResponse.assertPageResultsOfType(User.class);
160+
161+
val emailFilteredResults = emailFilteredResponse.extractPageResults(User.class);
162+
assertTrue(emailFilteredResults.size() >= 1);
163+
164+
// assert all users from response have email equal to original email filter
165+
assertTrue(emailFilteredResults.stream().allMatch(u -> u.getEmail().equals(emailFilter)));
166+
167+
// filter by existing providerType
168+
// generate another user with a different providerType from existingUser
169+
entityGenerator.setupUser(
170+
entityGenerator.generateNonExistentUserName(),
171+
USER,
172+
generateNonExistentProviderSubjectId(userService),
173+
randomEnumExcluding(ProviderType.class, existingUser.getProviderType()));
174+
val unfilteredRequest =
175+
initStringRequest().endpoint("/users?offset=0&limit=%s", numUsers).getAnd();
176+
val unfilteredResponse =
177+
unfilteredRequest.assertOk().assertHasBody().extractPageResults(User.class);
178+
179+
val providerTypeFilter = existingUser.getProviderType();
180+
val providerTypeFilteredResponse =
181+
initStringRequest()
182+
.endpoint("/users?offset=0&providerType=%s", providerTypeFilter.toString())
183+
.getAnd();
184+
185+
// verify response is ok
186+
providerTypeFilteredResponse.assertOk();
187+
providerTypeFilteredResponse.assertHasBody();
188+
providerTypeFilteredResponse.assertPageResultsOfType(User.class);
189+
190+
// verify unfilteredResponse has more items than filtered response
191+
val providerTypeFilteredResults = providerTypeFilteredResponse.extractPageResults(User.class);
192+
assertTrue(providerTypeFilteredResults.size() >= 1);
193+
assertTrue(unfilteredResponse.size() > providerTypeFilteredResults.size());
194+
195+
// verify users from result all match original providerType filter
196+
assertTrue(
197+
stream(providerTypeFilteredResults)
198+
.allMatch(x -> x.getProviderType().equals(providerTypeFilter)));
199+
}
200+
201+
@Test
202+
@SneakyThrows
203+
public void listUsersWithFilter_NoResults() {
204+
val numUsers = userService.getRepository().count();
205+
206+
// filter by non-existing email
207+
val nonExistingName = entityGenerator.generateNonExistentUserName().split(" ");
208+
val emailFilter = String.format("%s%[email protected]", nonExistingName[0], nonExistingName[1]);
209+
val emailFilteredResponse =
210+
initStringRequest().endpoint("/users?offset=0&email=%s", emailFilter).getAnd();
211+
212+
// assert response is ok
213+
emailFilteredResponse.assertOk();
214+
emailFilteredResponse.assertHasBody();
215+
emailFilteredResponse.assertPageResultsOfType(User.class);
216+
217+
// assert there are no users returned
218+
assertEquals(emailFilteredResponse.extractPageResults(User.class).size(), 0);
219+
220+
// filter by non-existing providerType
221+
val existingUsersResponse =
222+
initStringRequest().endpoint("/users?limit=%s&offset=0", numUsers).getAnd();
223+
existingUsersResponse.assertOk().assertHasBody().assertPageResultsOfType(User.class);
224+
val existingUsers = existingUsersResponse.extractPageResults(User.class);
225+
val existingProviderResult =
226+
existingUsers.stream().map(User::getProviderType).distinct().collect(toImmutableList());
227+
228+
// create a filter param from a providerType that does not exist
229+
ProviderType nonExistingProvider;
230+
do {
231+
nonExistingProvider = randomEnum(ProviderType.class);
232+
} while (existingProviderResult.contains(nonExistingProvider));
233+
val providerTypeFilteredResponse =
234+
initStringRequest()
235+
.endpoint("/users?offset=0&providerType=%s", nonExistingProvider)
236+
.getAnd();
237+
238+
// verify response is ok
239+
providerTypeFilteredResponse.assertOk();
240+
providerTypeFilteredResponse.assertHasBody();
241+
providerTypeFilteredResponse.assertPageResultsOfType(User.class);
242+
243+
// verify no users are returned
244+
val providerTypeFilteredResults = providerTypeFilteredResponse.extractPageResults(User.class);
245+
assertEquals(providerTypeFilteredResults.size(), 0);
246+
}
247+
138248
// prob breaking cuz email is no longer reliably unique. can you query on unique value?
139249
@Test
140250
@SneakyThrows
@@ -145,7 +255,7 @@ public void listUsersWithQuery() {
145255
assertNotNull(response.getBody());
146256
val responseJson = MAPPER.readTree(response.getBody());
147257

148-
assertEquals(responseStatus, HttpStatus.OK);
258+
assertEquals(responseStatus, OK);
149259
assertTrue(responseJson.get("count").asInt() >= 1);
150260
assertTrue(responseJson.get("resultSet").isArray());
151261
assertEquals(

0 commit comments

Comments
 (0)