-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bdb217e
commit 6713f7b
Showing
8 changed files
with
278 additions
and
33 deletions.
There are no files selected for viewing
32 changes: 32 additions & 0 deletions
32
...nding/src/main/java/com/oviva/spicegen/spicedbbinding/internal/CheckPermissionMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.oviva.spicegen.spicedbbinding.internal; | ||
|
||
import com.authzed.api.v1.CheckPermissionRequest; | ||
import com.oviva.spicegen.api.CheckPermission; | ||
|
||
public class CheckPermissionMapper { | ||
|
||
private final ConsistencyMapper consistencyMapper; | ||
private final ObjectReferenceMapper objectReferenceMapper; | ||
private final SubjectReferenceMapper subjectReferenceMapper; | ||
|
||
public CheckPermissionMapper( | ||
ConsistencyMapper consistencyMapper, | ||
ObjectReferenceMapper objectReferenceMapper, | ||
SubjectReferenceMapper subjectReferenceMapper) { | ||
this.consistencyMapper = consistencyMapper; | ||
this.objectReferenceMapper = objectReferenceMapper; | ||
this.subjectReferenceMapper = subjectReferenceMapper; | ||
} | ||
|
||
public CheckPermissionRequest map(CheckPermission checkPermission) { | ||
|
||
var consistency = consistencyMapper.map(checkPermission.consistency()); | ||
|
||
return CheckPermissionRequest.newBuilder() | ||
.setConsistency(consistency) | ||
.setResource(objectReferenceMapper.map(checkPermission.resource())) | ||
.setSubject(subjectReferenceMapper.map(checkPermission.subject())) | ||
.setPermission(checkPermission.permission()) | ||
.build(); | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
...b-binding/src/main/java/com/oviva/spicegen/spicedbbinding/internal/ConsistencyMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package com.oviva.spicegen.spicedbbinding.internal; | ||
|
||
import com.authzed.api.v1.ZedToken; | ||
import com.oviva.spicegen.api.Consistency; | ||
|
||
public class ConsistencyMapper { | ||
|
||
public com.authzed.api.v1.Consistency map(Consistency consistency) { | ||
return switch (consistency.requirement()) { | ||
case FULLY_CONSISTENT -> | ||
com.authzed.api.v1.Consistency.newBuilder().setFullyConsistent(true).build(); | ||
case AT_LEAST_AS_FRESH -> | ||
com.authzed.api.v1.Consistency.newBuilder() | ||
.setAtLeastAsFresh( | ||
ZedToken.newBuilder().setToken(consistency.consistencyToken()).build()) | ||
.build(); | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
...nding/src/test/java/com/oviva/spicegen/spicedbbinding/internal/ConsistencyMapperTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package com.oviva.spicegen.spicedbbinding.internal; | ||
|
||
import static org.junit.jupiter.api.Assertions.*; | ||
|
||
import com.oviva.spicegen.api.Consistency; | ||
import org.junit.jupiter.api.Test; | ||
|
||
class ConsistencyMapperTest { | ||
|
||
@Test | ||
void map_consistent() { | ||
|
||
var consistency = Consistency.fullyConsistent(); | ||
|
||
var sut = new ConsistencyMapper(); | ||
|
||
// when | ||
var got = sut.map(consistency); | ||
|
||
// then | ||
assertEquals( | ||
com.authzed.api.v1.Consistency.RequirementCase.FULLY_CONSISTENT, got.getRequirementCase()); | ||
} | ||
|
||
@Test | ||
void map_atLeastAsFresh() { | ||
|
||
var token = "maTokan"; | ||
var consistency = Consistency.atLeastAsFreshAs(token); | ||
|
||
var sut = new ConsistencyMapper(); | ||
|
||
// when | ||
var got = sut.map(consistency); | ||
|
||
// then | ||
assertEquals( | ||
com.authzed.api.v1.Consistency.RequirementCase.AT_LEAST_AS_FRESH, got.getRequirementCase()); | ||
assertEquals(token, got.getAtLeastAsFresh().getToken()); | ||
} | ||
} |
93 changes: 93 additions & 0 deletions
93
...ding/src/test/java/com/oviva/spicegen/spicedbbinding/internal/PreconditionMapperTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package com.oviva.spicegen.spicedbbinding.internal; | ||
|
||
import static org.junit.jupiter.api.Assertions.*; | ||
|
||
import com.oviva.spicegen.api.Precondition; | ||
import com.oviva.spicegen.api.RelationshipFilter; | ||
import org.junit.jupiter.api.Test; | ||
|
||
class PreconditionMapperTest { | ||
|
||
@Test | ||
void map_objectExists() { | ||
|
||
var sut = new PreconditionMapper(); | ||
|
||
var relation = "user"; | ||
var userId = "17"; | ||
|
||
var precondition = | ||
Precondition.mustMatch( | ||
RelationshipFilter.newBuilder().resourceKind(relation).resourceId(userId).build()); | ||
|
||
// when | ||
var mapped = sut.map(precondition); | ||
|
||
// then | ||
assertEquals(relation, mapped.getFilter().getResourceType()); | ||
assertEquals(userId, mapped.getFilter().getOptionalResourceId()); | ||
assertEquals( | ||
com.authzed.api.v1.Precondition.Operation.OPERATION_MUST_MATCH, mapped.getOperation()); | ||
} | ||
|
||
@Test | ||
void map_objectNotExists() { | ||
|
||
var sut = new PreconditionMapper(); | ||
|
||
var relation = "user"; | ||
var userId = "77"; | ||
|
||
var precondition = | ||
Precondition.mustNotMatch( | ||
RelationshipFilter.newBuilder().resourceKind(relation).resourceId(userId).build()); | ||
|
||
// when | ||
var mapped = sut.map(precondition); | ||
|
||
// then | ||
assertEquals(relation, mapped.getFilter().getResourceType()); | ||
assertEquals(userId, mapped.getFilter().getOptionalResourceId()); | ||
assertEquals( | ||
com.authzed.api.v1.Precondition.Operation.OPERATION_MUST_NOT_MATCH, mapped.getOperation()); | ||
} | ||
|
||
@Test | ||
void map_subject() { | ||
|
||
var sut = new PreconditionMapper(); | ||
|
||
var relation = "file"; | ||
var fileId = "17"; | ||
|
||
var subject = "user"; | ||
var userId = "42"; | ||
|
||
var precondition = | ||
Precondition.mustMatch( | ||
RelationshipFilter.newBuilder() | ||
.resourceKind(relation) | ||
.resourceId(fileId) | ||
.subjectFilter( | ||
RelationshipFilter.SubjectFilter.newBuilder() | ||
.subjectKind(subject) | ||
.subjectId(userId) | ||
.build()) | ||
.build()); | ||
|
||
// when | ||
var mapped = sut.map(precondition); | ||
|
||
// then | ||
assertEquals( | ||
com.authzed.api.v1.Precondition.Operation.OPERATION_MUST_MATCH, mapped.getOperation()); | ||
|
||
var filter = mapped.getFilter(); | ||
assertEquals(relation, filter.getResourceType()); | ||
assertEquals(fileId, filter.getOptionalResourceId()); | ||
|
||
var subFilter = filter.getOptionalSubjectFilter(); | ||
assertEquals(subject, subFilter.getSubjectType()); | ||
assertEquals(userId, subFilter.getOptionalSubjectId()); | ||
} | ||
} |
71 changes: 71 additions & 0 deletions
71
...est/java/com/oviva/spicegen/spicedbbinding/internal/SpiceDbPermissionServiceImplTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
package com.oviva.spicegen.spicedbbinding.internal; | ||
|
||
import static org.junit.jupiter.api.Assertions.*; | ||
import static org.mockito.ArgumentMatchers.any; | ||
import static org.mockito.Mockito.mock; | ||
import static org.mockito.Mockito.when; | ||
|
||
import com.authzed.api.v1.*; | ||
import com.oviva.spicegen.api.*; | ||
import com.oviva.spicegen.api.Consistency; | ||
import org.junit.jupiter.api.Test; | ||
|
||
class SpiceDbPermissionServiceImplTest { | ||
|
||
@Test | ||
void updateRelationships() { | ||
|
||
var stub = mock(PermissionsServiceGrpc.PermissionsServiceBlockingStub.class); | ||
var sut = new SpiceDbPermissionServiceImpl(stub); | ||
|
||
var o = ObjectRef.of("file", "/test.txt"); | ||
var s = ObjectRef.of("user", "bob"); | ||
var updates = | ||
UpdateRelationships.newBuilder().update(UpdateRelationship.ofUpdate(o, "owner", s)).build(); | ||
|
||
var token = "atXyz"; | ||
var res = | ||
WriteRelationshipsResponse.newBuilder() | ||
.setWrittenAt(ZedToken.newBuilder().setToken(token).build()) | ||
.build(); | ||
when(stub.writeRelationships(any())).thenReturn(res); | ||
|
||
// when | ||
var got = sut.updateRelationships(updates); | ||
|
||
// then | ||
assertEquals(token, got.consistencyToken()); | ||
} | ||
|
||
@Test | ||
void checkPermission() { | ||
|
||
var stub = mock(PermissionsServiceGrpc.PermissionsServiceBlockingStub.class); | ||
var sut = new SpiceDbPermissionServiceImpl(stub); | ||
|
||
var permission = "write"; | ||
var consistency = Consistency.fullyConsistent(); | ||
|
||
var o = ObjectRef.of("file", "/test.txt"); | ||
var s = SubjectRef.ofObject(ObjectRef.of("user", "bob")); | ||
|
||
var res = | ||
CheckPermissionResponse.newBuilder() | ||
.setPermissionship(CheckPermissionResponse.Permissionship.PERMISSIONSHIP_HAS_PERMISSION) | ||
.build(); | ||
when(stub.checkPermission(any())).thenReturn(res); | ||
|
||
// when | ||
var got = | ||
sut.checkPermission( | ||
CheckPermission.newBuilder() | ||
.permission(permission) | ||
.consistency(consistency) | ||
.resource(o) | ||
.subject(s) | ||
.build()); | ||
|
||
// then | ||
assertTrue(got); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters