Skip to content

Commit 0d9f24e

Browse files
committed
Testing new CredentialFilter API
1 parent 74dd715 commit 0d9f24e

15 files changed

+904
-69
lines changed

access-grant/src/main/java/com/inrupt/client/accessgrant/AccessCredentialQuery.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
* An object to represent an access credential query.
3030
*
3131
* @param <T> The access credential type
32+
* @deprecated As of 1.3, replaced by {@link CredentialFilter}
3233
*/
34+
@Deprecated
3335
public class AccessCredentialQuery<T extends AccessCredential> {
3436

3537
private final Set<URI> purposes;

access-grant/src/main/java/com/inrupt/client/accessgrant/AccessGrantClient.java

Lines changed: 86 additions & 65 deletions
Large diffs are not rendered by default.

access-grant/src/main/java/com/inrupt/client/accessgrant/Utils.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.HashSet;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Objects;
3132
import java.util.Optional;
3233
import java.util.Set;
3334

@@ -84,6 +85,15 @@ public static Optional<Map<String, Object>> asMap(final Object value) {
8485
return Optional.empty();
8586
}
8687

88+
public static Optional<List<Object>> asList(final Object value) {
89+
if (value instanceof List) {
90+
@SuppressWarnings("unchecked")
91+
final List<Object> v = (List<Object>) value;
92+
return Optional.of(v);
93+
}
94+
return Optional.empty();
95+
}
96+
8797
public static Optional<Set<String>> asSet(final Object value) {
8898
if (value != null) {
8999
final Set<String> data = new HashSet<>();
@@ -119,6 +129,40 @@ public static List<Map<String, Object>> getCredentialsFromPresentation(final Map
119129
return credentials;
120130
}
121131

132+
public static int convertPage(final String page) {
133+
try {
134+
final int p = Integer.parseInt(page);
135+
return Math.max(1, p);
136+
} catch (final IllegalArgumentException ex) {
137+
// ignore invalid values
138+
}
139+
return 1;
140+
}
141+
142+
public static String convertPage(final int page) {
143+
return Integer.toString(page);
144+
}
145+
146+
public static String getQueryParam(final URI uri, final String name) {
147+
Objects.requireNonNull(uri, "uri may not be null!");
148+
Objects.requireNonNull(name, "name may not be null!");
149+
final String params = uri.getQuery();
150+
if (params != null) {
151+
for (final String param : params.split("&")) {
152+
final String[] parts = param.split("=", 2);
153+
if (parts.length == 2 && name.equals(parts[0])) {
154+
return parts[1];
155+
}
156+
}
157+
}
158+
return null;
159+
}
160+
161+
// Math.ceilDiv is not available in Java 11. This is an equivalent.
162+
public static int ceilDiv(final int x, final int y) {
163+
return (x + y - 1) / y;
164+
}
165+
122166
private Utils() {
123167
// prevent instantiation
124168
}

access-grant/src/test/java/com/inrupt/client/accessgrant/AccessGrantClientTest.java

Lines changed: 200 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@ class AccessGrantClientTest {
6767

6868
private static final MockAccessGrantServer mockServer = new MockAccessGrantServer();
6969
private static AccessGrantClient agClient;
70+
private static AccessGrantClient altAgClient;
7071
private static URI baseUri;
7172

7273
@BeforeAll
7374
static void setup() {
7475
baseUri = URI.create(mockServer.start());
7576
agClient = new AccessGrantClient(baseUri);
77+
altAgClient = new AccessGrantClient(URIBuilder.newBuilder(baseUri).path("alternative").build());
7678
}
7779

7880
@AfterAll
@@ -390,6 +392,202 @@ void testGrantAccessNoAuth() {
390392
assertInstanceOf(AccessGrantException.class, err.getCause());
391393
}
392394

395+
@Test
396+
void testQueryGrantFilter() {
397+
final Map<String, Object> claims = new HashMap<>();
398+
claims.put("webid", WEBID);
399+
claims.put("sub", SUB);
400+
claims.put("iss", ISS);
401+
claims.put("azp", AZP);
402+
final String token = generateIdToken(claims);
403+
final AccessGrantClient client = agClient.session(OpenIdSession.ofIdToken(token));
404+
405+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/a/b/c");
406+
407+
final CredentialFilter<AccessGrant> filter = CredentialFilter.newBuilder().build(AccessGrant.class);
408+
409+
final CredentialResult<AccessGrant> results = client.query(filter).toCompletableFuture().join();
410+
411+
assertEquals(1, results.getItems().size());
412+
assertEquals("/access-grant-1", results.getItems().get(0).getIdentifier().getPath());
413+
}
414+
415+
@Test
416+
void testQueryRequestFilter() {
417+
final Map<String, Object> claims = new HashMap<>();
418+
claims.put("webid", WEBID);
419+
claims.put("sub", SUB);
420+
claims.put("iss", ISS);
421+
claims.put("azp", AZP);
422+
final String token = generateIdToken(claims);
423+
final AccessGrantClient client = agClient.session(OpenIdSession.ofIdToken(token));
424+
425+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/a/b/c");
426+
427+
final CredentialFilter<AccessRequest> filter = CredentialFilter.newBuilder().build(AccessRequest.class);
428+
429+
final CredentialResult<AccessRequest> results = client.query(filter).toCompletableFuture().join();
430+
431+
assertEquals(1, results.getItems().size());
432+
assertEquals("https://accessgrant.test/credential/d604c858-209a-4bb6-a7f8-2f52c9617cab",
433+
results.getItems().get(0).getIdentifier().toString());
434+
}
435+
436+
@Test
437+
void testQueryDenialFilter() {
438+
final Map<String, Object> claims = new HashMap<>();
439+
claims.put("webid", WEBID);
440+
claims.put("sub", SUB);
441+
claims.put("iss", ISS);
442+
claims.put("azp", AZP);
443+
final String token = generateIdToken(claims);
444+
final AccessGrantClient client = agClient.session(OpenIdSession.ofIdToken(token));
445+
446+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/a/b/c");
447+
448+
final CredentialFilter<AccessDenial> filter = CredentialFilter.newBuilder().build(AccessDenial.class);
449+
450+
final CredentialResult<AccessDenial> results = client.query(filter).toCompletableFuture().join();
451+
452+
assertEquals(1, results.getItems().size());
453+
assertEquals("https://accessgrant.test/credential/fc2dbcd9-81d4-4fa4-8fd4-239e16dd83ab",
454+
results.getItems().get(0).getIdentifier().toString());
455+
}
456+
457+
@Test
458+
void testQueryPageFilter() {
459+
final Map<String, Object> claims = new HashMap<>();
460+
claims.put("webid", WEBID);
461+
claims.put("sub", SUB);
462+
claims.put("iss", ISS);
463+
claims.put("azp", AZP);
464+
final String token = generateIdToken(claims);
465+
final AccessGrantClient client = agClient.session(OpenIdSession.ofIdToken(token));
466+
467+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/a/b/c");
468+
469+
final CredentialFilter<AccessRequest> filter = CredentialFilter.newBuilder().page("1").pageSize(5)
470+
.build(AccessRequest.class);
471+
472+
final CredentialResult<AccessRequest> results = client.query(filter).toCompletableFuture().join();
473+
474+
assertEquals(5, results.getItems().size());
475+
assertEquals("https://accessgrant.test/credential/d604c858-209a-4bb6-a7f8-2f52c9617cab",
476+
results.getItems().get(0).getIdentifier().toString());
477+
assertEquals("https://accessgrant.test/credential/52049498-fc2e-45be-be79-703a39086574",
478+
results.getItems().get(1).getIdentifier().toString());
479+
assertEquals("https://accessgrant.test/credential/a0a73677-d139-48e4-8e62-0ae63925bd2b",
480+
results.getItems().get(2).getIdentifier().toString());
481+
assertEquals("https://accessgrant.test/credential/3869d6d9-3b3e-4c77-b842-6c938367e3b5",
482+
results.getItems().get(3).getIdentifier().toString());
483+
assertEquals("https://accessgrant.test/credential/3f61667a-4569-43f3-854e-1832f898049e",
484+
results.getItems().get(4).getIdentifier().toString());
485+
assertEquals(Optional.empty(), results.prevPage());
486+
assertEquals(Optional.of("1"), results.firstPage().flatMap(CredentialFilter::getPage));
487+
assertEquals(Optional.of("2"), results.nextPage().flatMap(CredentialFilter::getPage));
488+
assertEquals(Optional.of("3"), results.lastPage().flatMap(CredentialFilter::getPage));
489+
490+
}
491+
492+
@Test
493+
void testQueryAltPage1Filter() {
494+
final Map<String, Object> claims = new HashMap<>();
495+
claims.put("webid", WEBID);
496+
claims.put("sub", SUB);
497+
claims.put("iss", ISS);
498+
claims.put("azp", AZP);
499+
final String token = generateIdToken(claims);
500+
final AccessGrantClient client = altAgClient.session(OpenIdSession.ofIdToken(token));
501+
502+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/");
503+
final CredentialFilter<AccessGrant> filter = CredentialFilter.newBuilder().page("1").pageSize(2)
504+
.resource(resource).build(AccessGrant.class);
505+
506+
final CredentialResult<AccessGrant> results = client.query(filter).toCompletableFuture().join();
507+
508+
assertEquals(2, results.getItems().size());
509+
assertEquals("/access-grant-1", results.getItems().get(0).getIdentifier().getPath());
510+
assertEquals("/access-grant-2", results.getItems().get(1).getIdentifier().getPath());
511+
assertEquals(Optional.of("1"), results.firstPage().flatMap(CredentialFilter::getPage));
512+
assertEquals(Optional.of("2"), results.lastPage().flatMap(CredentialFilter::getPage));
513+
assertEquals(Optional.of("2"), results.nextPage().flatMap(CredentialFilter::getPage));
514+
assertEquals(Optional.empty(), results.prevPage());
515+
}
516+
517+
@Test
518+
void testQueryAltPageFilter() {
519+
final Map<String, Object> claims = new HashMap<>();
520+
claims.put("webid", WEBID);
521+
claims.put("sub", SUB);
522+
claims.put("iss", ISS);
523+
claims.put("azp", AZP);
524+
final String token = generateIdToken(claims);
525+
final AccessGrantClient client = altAgClient.session(OpenIdSession.ofIdToken(token));
526+
527+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/");
528+
final CredentialFilter<AccessGrant> filter = CredentialFilter.newBuilder().pageSize(2)
529+
.resource(resource).build(AccessGrant.class);
530+
531+
final CredentialResult<AccessGrant> results = client.query(filter).toCompletableFuture().join();
532+
533+
assertEquals(2, results.getItems().size());
534+
assertEquals("/access-grant-1", results.getItems().get(0).getIdentifier().getPath());
535+
assertEquals("/access-grant-2", results.getItems().get(1).getIdentifier().getPath());
536+
assertEquals(Optional.of("1"), results.firstPage().flatMap(CredentialFilter::getPage));
537+
assertEquals(Optional.of("2"), results.lastPage().flatMap(CredentialFilter::getPage));
538+
assertEquals(Optional.of("2"), results.nextPage().flatMap(CredentialFilter::getPage));
539+
assertEquals(Optional.empty(), results.prevPage());
540+
}
541+
542+
@Test
543+
void testQueryAltPage2Filter() {
544+
final Map<String, Object> claims = new HashMap<>();
545+
claims.put("webid", WEBID);
546+
claims.put("sub", SUB);
547+
claims.put("iss", ISS);
548+
claims.put("azp", AZP);
549+
final String token = generateIdToken(claims);
550+
final AccessGrantClient client = altAgClient.session(OpenIdSession.ofIdToken(token));
551+
552+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/");
553+
final CredentialFilter<AccessGrant> filter = CredentialFilter.newBuilder().page("2").pageSize(2)
554+
.resource(resource).build(AccessGrant.class);
555+
556+
final CredentialResult<AccessGrant> results = client.query(filter).toCompletableFuture().join();
557+
558+
assertEquals(2, results.getItems().size());
559+
assertEquals("/access-grant-3", results.getItems().get(0).getIdentifier().getPath());
560+
assertEquals("/access-grant-4", results.getItems().get(1).getIdentifier().getPath());
561+
assertEquals(Optional.of("1"), results.firstPage().flatMap(CredentialFilter::getPage));
562+
assertEquals(Optional.of("2"), results.lastPage().flatMap(CredentialFilter::getPage));
563+
assertEquals(Optional.of("1"), results.prevPage().flatMap(CredentialFilter::getPage));
564+
assertEquals(Optional.empty(), results.nextPage());
565+
}
566+
567+
@Test
568+
void testQueryAltPageFilterSingleton() {
569+
final Map<String, Object> claims = new HashMap<>();
570+
claims.put("webid", WEBID);
571+
claims.put("sub", SUB);
572+
claims.put("iss", ISS);
573+
claims.put("azp", AZP);
574+
final String token = generateIdToken(claims);
575+
final AccessGrantClient client = altAgClient.session(OpenIdSession.ofIdToken(token));
576+
577+
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/");
578+
final CredentialFilter<AccessGrant> filter = CredentialFilter.newBuilder().page("1")
579+
.resource(resource).build(AccessGrant.class);
580+
581+
final CredentialResult<AccessGrant> results = client.query(filter).toCompletableFuture().join();
582+
583+
assertEquals(4, results.getItems().size());
584+
assertEquals("/access-grant-1", results.getItems().get(0).getIdentifier().getPath());
585+
assertEquals(Optional.empty(), results.prevPage());
586+
assertEquals(Optional.empty(), results.nextPage());
587+
assertEquals(Optional.empty(), results.firstPage());
588+
assertEquals(Optional.empty(), results.lastPage());
589+
}
590+
393591
@Test
394592
void testQueryGrant() {
395593
final Map<String, Object> claims = new HashMap<>();
@@ -403,7 +601,7 @@ void testQueryGrant() {
403601
final URI resource = URI.create("https://storage.example/e973cc3d-5c28-4a10-98c5-e40079289358/a/b/c");
404602
final List<AccessGrant> grants = client.query(resource, null, null, null, "Read", AccessGrant.class)
405603
.toCompletableFuture().join();
406-
assertEquals(1, grants.size());
604+
assertEquals(4, grants.size());
407605
}
408606

409607
@Test
@@ -420,7 +618,7 @@ void testQueryGrantBuilder() {
420618
final AccessCredentialQuery<AccessGrant> query = AccessCredentialQuery.newBuilder()
421619
.resource(resource).mode("Read").build(AccessGrant.class);
422620
final List<AccessGrant> grants = client.query(query).toCompletableFuture().join();
423-
assertEquals(1, grants.size());
621+
assertEquals(4, grants.size());
424622
}
425623

426624
@Test

access-grant/src/test/java/com/inrupt/client/accessgrant/CredentialFilterTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,34 @@ void testCredentialEmptyFilterBuilder() {
5959
assertEquals(expectedUri, filter.asURI(BASE_URL));
6060
}
6161

62+
@Test
63+
void testCredentialInvalidPageSizeFilterBuilder() {
64+
final CredentialFilter<AccessDenial> filter = CredentialFilter.newBuilder()
65+
.pageSize(-10)
66+
.build(AccessDenial.class);
67+
assertEquals(20, filter.getPageSize());
68+
assertEquals(AccessDenial.class, filter.getCredentialType());
69+
70+
final URI expectedUri = URIBuilder.newBuilder(BASE_URL)
71+
.queryParam("type", "SolidAccessDenial")
72+
.queryParam("pageSize", "20").build();
73+
assertEquals(expectedUri, filter.asURI(BASE_URL));
74+
}
75+
76+
@Test
77+
void testCredentialExcessivePageSizeFilterBuilder() {
78+
final CredentialFilter<AccessDenial> filter = CredentialFilter.newBuilder()
79+
.pageSize(200)
80+
.build(AccessDenial.class);
81+
assertEquals(20, filter.getPageSize());
82+
assertEquals(AccessDenial.class, filter.getCredentialType());
83+
84+
final URI expectedUri = URIBuilder.newBuilder(BASE_URL)
85+
.queryParam("type", "SolidAccessDenial")
86+
.queryParam("pageSize", "20").build();
87+
assertEquals(expectedUri, filter.asURI(BASE_URL));
88+
}
89+
6290
@Test
6391
void testCredentialFilterBuilder() {
6492
final String page = UUID.randomUUID().toString();
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright Inrupt Inc.
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy
5+
* of this software and associated documentation files (the "Software"), to deal in
6+
* the Software without restriction, including without limitation the rights to use,
7+
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8+
* Software, and to permit persons to whom the Software is furnished to do so,
9+
* subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in
12+
* all copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15+
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16+
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17+
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
*/
21+
package com.inrupt.client.accessgrant;
22+
23+
import static org.junit.jupiter.api.Assertions.*;
24+
25+
import java.util.Collections;
26+
27+
import org.junit.jupiter.api.Test;
28+
29+
class CredentialResultTest {
30+
31+
@Test
32+
void checkNullCredentialResult() {
33+
final CredentialResult<AccessGrant> result = new CredentialResult<>(Collections.emptyList(),
34+
null, null, null, null);
35+
36+
assertTrue(result.getItems().isEmpty());
37+
assertFalse(result.firstPage().isPresent());
38+
assertFalse(result.prevPage().isPresent());
39+
assertFalse(result.nextPage().isPresent());
40+
assertFalse(result.lastPage().isPresent());
41+
}
42+
}

0 commit comments

Comments
 (0)