Skip to content

Commit

Permalink
ARC-1807: Better Test Coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasrichner-oviva committed Jun 16, 2024
1 parent bdb217e commit 6713f7b
Show file tree
Hide file tree
Showing 8 changed files with 278 additions and 33 deletions.
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();
}
}
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();
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,27 @@

import com.authzed.api.v1.*;
import com.oviva.spicegen.api.*;
import com.oviva.spicegen.api.Consistency;
import com.oviva.spicegen.api.PermissionService;
import io.grpc.StatusRuntimeException;

public class SpiceDbPermissionServiceImpl implements PermissionService {
private final UpdateRelationshipMapper updateRelationshipMapper = new UpdateRelationshipMapper();

private final PreconditionMapper preconditionMapper = new PreconditionMapper();

private final ObjectReferenceMapper objectReferenceMapper = new ObjectReferenceMapper();
private final SubjectReferenceMapper subjectReferenceMapper = new SubjectReferenceMapper();
private final ConsistencyMapper consistencyMapper = new ConsistencyMapper();

private final UpdateRelationshipMapper updateRelationshipMapper =
new UpdateRelationshipMapper(objectReferenceMapper, subjectReferenceMapper);

private final CheckPermissionMapper checkPermissionMapper =
new CheckPermissionMapper(consistencyMapper, objectReferenceMapper, subjectReferenceMapper);

private final PermissionsServiceGrpc.PermissionsServiceBlockingStub permissionsService;

private final GrpcExceptionMapper exceptionMapper = new GrpcExceptionMapper();

private final ObjectReferenceMapper objectReferenceMapper = new ObjectReferenceMapper();
private final SubjectReferenceMapper subjectReferenceMapper = new SubjectReferenceMapper();

public SpiceDbPermissionServiceImpl(
PermissionsServiceGrpc.PermissionsServiceBlockingStub permissionsService) {
this.permissionsService = permissionsService;
Expand Down Expand Up @@ -47,7 +53,7 @@ public UpdateResult updateRelationships(UpdateRelationships updates) {
@Override
public boolean checkPermission(CheckPermission checkPermission) {

var request = mapCheckPermission(checkPermission);
var request = checkPermissionMapper.map(checkPermission);

try {
var response = permissionsService.checkPermission(request);
Expand All @@ -57,28 +63,4 @@ public boolean checkPermission(CheckPermission checkPermission) {
throw exceptionMapper.map(e);
}
}

private CheckPermissionRequest mapCheckPermission(CheckPermission checkPermission) {

var consistency = mapConsistency(checkPermission.consistency());

return CheckPermissionRequest.newBuilder()
.setConsistency(consistency)
.setResource(objectReferenceMapper.map(checkPermission.resource()))
.setSubject(subjectReferenceMapper.map(checkPermission.subject()))
.setPermission(checkPermission.permission())
.build();
}

private com.authzed.api.v1.Consistency mapConsistency(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();
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@

public class UpdateRelationshipMapper {

private final ObjectReferenceMapper objectReferenceMapper = new ObjectReferenceMapper();
private final SubjectReferenceMapper subjectReferenceMapper = new SubjectReferenceMapper();
private final ObjectReferenceMapper objectReferenceMapper;
private final SubjectReferenceMapper subjectReferenceMapper;

public UpdateRelationshipMapper(
ObjectReferenceMapper objectReferenceMapper, SubjectReferenceMapper subjectReferenceMapper) {
this.objectReferenceMapper = objectReferenceMapper;
this.subjectReferenceMapper = subjectReferenceMapper;
}

public RelationshipUpdate map(UpdateRelationship updateRelationship) {

Expand Down
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());
}
}
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());
}
}
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ class UpdateRelationshipMapperTest {
private static final String ADMINISTRATOR = "administrator";
private static final String ID = "9392";

private final UpdateRelationshipMapper mapper = new UpdateRelationshipMapper();
private final UpdateRelationshipMapper mapper =
new UpdateRelationshipMapper(new ObjectReferenceMapper(), new SubjectReferenceMapper());

@Test
void test_mapper_withUpdateOperation() {
Expand Down

0 comments on commit 6713f7b

Please sign in to comment.