Skip to content

Commit 361fc2d

Browse files
committed
Fix terms equality checks
1 parent 97bf01f commit 361fc2d

File tree

6 files changed

+62
-20
lines changed

6 files changed

+62
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# opa-async-java-client
1+
# opa-java-client
22
![build](https://github.com/content-cloud/opa-java-client/workflows/build/badge.svg?branch=main)
33

44
An asynchronous java client library for the [OpenPolicyAgent](https://www.openpolicyagent.org/) [REST API](https://www.openpolicyagent.org/docs/latest/rest-api/).

opa-async-java-client/src/main/java/eu/contentcloud/opa/client/api/QueryApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.List;
55
import java.util.concurrent.CompletableFuture;
66
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
78

89
public interface QueryApi {
910

@@ -15,6 +16,7 @@ class QueryResponse {
1516
}
1617

1718
@Data
19+
@EqualsAndHashCode(callSuper = true)
1820
class QueryResultEntry extends HashMap<String, Object> {
1921

2022
}

opa-async-java-client/src/test/java/eu/contentcloud/opa/client/OpaClientIntegrationTests.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import static org.assertj.core.api.InstanceOfAssertFactories.MAP;
66

77
import eu.contentcloud.abac.opa.rego.ast.AbstractSyntaxTree;
8+
import eu.contentcloud.abac.opa.rego.ast.Expression;
9+
import eu.contentcloud.abac.opa.rego.ast.Query;
10+
import eu.contentcloud.abac.opa.rego.ast.QuerySet;
11+
import eu.contentcloud.abac.opa.rego.ast.Term;
12+
import eu.contentcloud.abac.opa.rego.ast.Term.Ref;
813
import eu.contentcloud.opa.client.api.CompileApi;
914
import eu.contentcloud.opa.client.api.CompileApi.PartialEvaluationRequest;
1015
import eu.contentcloud.opa.client.api.DataApi;
@@ -312,8 +317,9 @@ class Scenarios {
312317
/**
313318
* Scenario for partial evaluation of a policy, based on 'group' attribute on a set of documents/results
314319
*
315-
* Context: 1. A user is member of a set of groups, expressed via an array as `input.user.groups[]` 2. Documents
316-
* have a (single) `group` attribute.
320+
* Context:
321+
* 1. A user is member of a set of groups, expressed via an array as `input.user.groups[]`
322+
* 2. Documents have a (single) `group` attribute.
317323
*
318324
* Policy: A user can access a document, when the document has a `group` attribute that matches with a group
319325
* from his users' profile.
@@ -327,25 +333,33 @@ void partialEval_getApiDocuments() {
327333
"data.test.allow == true",
328334
Map.of("method", "GET",
329335
"path", List.of("api", "documents"),
330-
"user", Map.of("group", List.of("my-group"))
336+
"user", Map.of("group", List.of("group-a", "group-b"))
331337
),
332338
List.of("data.documents")
333339
).join();
340+
334341
assertThat(result).isNotNull();
335342
assertThat(result.getResult()).isNotNull();
336-
assertThat(result.getResult().getQueries())
337-
.singleElement()
338-
.satisfies(query -> Assertions.assertThat(query)
339-
.singleElement()
340-
.satisfies(expr -> {
341-
assertThat(expr.getIndex()).isEqualTo(0);
342-
var terms = expr.getTerms();
343-
assertThat(terms).hasSize(3);
344-
assertThat(terms.get(0).toString()).isEqualTo("eq");
345-
assertThat(terms.get(1).toString()).isEqualTo("\"my-group\"");
346-
assertThat(terms.get(2).toString())
347-
.isEqualTo("data[\"documents\"][$11][\"group\"]");
348-
}));
343+
assertThat(result.getResult().getQueries()).containsExactly(
344+
new Query(new Expression(0, List.of(
345+
new Ref(List.of(new Term.Var("eq"))),
346+
new Term.Text("group-a"),
347+
new Ref(List.of(
348+
new Term.Var("data"),
349+
new Term.Text("documents"),
350+
new Term.Var("$11"),
351+
new Term.Text("group")))
352+
353+
))), new Query(new Expression(0, List.of(
354+
new Ref(List.of(new Term.Var("eq"))),
355+
new Term.Text("group-b"),
356+
new Ref(List.of(
357+
new Term.Var("data"),
358+
new Term.Text("documents"),
359+
new Term.Var("$11"),
360+
new Term.Text("group")))
361+
))));
362+
349363
}
350364

351365
/**

rego-java/src/main/java/eu/contentcloud/abac/opa/rego/ast/Expression.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ public class Expression implements Node {
1212
long index;
1313
List<? extends Term> terms;
1414

15+
public Expression(long index, Term ... terms) {
16+
this(index, List.of(terms));
17+
}
18+
1519
@Override
1620
public <T> T accept(RegoVisitor<T> visitor) {
1721
return visitor.visit(this);

rego-java/src/main/java/eu/contentcloud/abac/opa/rego/ast/Query.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
package eu.contentcloud.abac.opa.rego.ast;
22

33
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.List;
46
import lombok.Data;
57
import lombok.EqualsAndHashCode;
8+
import lombok.NoArgsConstructor;
9+
import lombok.NonNull;
610

711
@Data
12+
@NoArgsConstructor
813
@EqualsAndHashCode(callSuper = true)
9-
public
10-
class Query extends ArrayList<Expression> implements Node {
14+
public class Query extends ArrayList<Expression> implements Node {
15+
16+
public Query(@NonNull Expression expression) {
17+
this(List.of(expression));
18+
}
19+
20+
public Query(Collection<Expression> expression) {
21+
super(expression);
22+
}
1123

1224

1325
@Override

rego-java/src/main/java/eu/contentcloud/abac/opa/rego/ast/QuerySet.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package eu.contentcloud.abac.opa.rego.ast;
22

33
import java.util.ArrayList;
4+
import java.util.List;
45
import lombok.Data;
56
import lombok.EqualsAndHashCode;
7+
import lombok.NoArgsConstructor;
68

79
@Data
10+
@NoArgsConstructor
811
@EqualsAndHashCode(callSuper = true)
9-
public class QuerySet extends ArrayList<Query> implements Node{
12+
public class QuerySet extends ArrayList<Query> implements Node {
1013

14+
public QuerySet(List<Query> queries) {
15+
super(queries);
16+
}
17+
18+
public QuerySet(Query ... queries) {
19+
this(List.of(queries));
20+
}
1121

1222
@Override
1323
public <T> T accept(RegoVisitor<T> visitor) {

0 commit comments

Comments
 (0)