diff --git a/internal/datastore/memdb/errors_test.go b/internal/datastore/memdb/errors_test.go new file mode 100644 index 0000000000..5daad64078 --- /dev/null +++ b/internal/datastore/memdb/errors_test.go @@ -0,0 +1,15 @@ +package memdb + +import ( + "fmt" + "testing" + + v1 "github.com/authzed/authzed-go/proto/authzed/api/v1" + + "github.com/authzed/spicedb/pkg/spiceerrors" +) + +func TestErrors(t *testing.T) { + err := NewSerializationMaxRetriesReachedErr(fmt.Errorf("some error")) + spiceerrors.RequireReason(t, v1.ErrorReason_ERROR_REASON_UNSPECIFIED, err, "details") +} diff --git a/pkg/datastore/test/relationships.go b/pkg/datastore/test/relationships.go index 4f1784f6ed..1359003677 100644 --- a/pkg/datastore/test/relationships.go +++ b/pkg/datastore/test/relationships.go @@ -1021,6 +1021,19 @@ func QueryRelationshipsWithVariousFiltersTest(t *testing.T, tester DatastoreTest }, expected: []string{"document:first#viewer@user:tom", "document:second#viewer@user:tom"}, }, + { + name: "nonmatching resource type", + filter: datastore.RelationshipsFilter{ + OptionalResourceType: "other", + }, + relationships: []string{ + "document:first#viewer@user:tom", + "document:second#viewer@user:tom", + "folder:secondfolder#viewer@user:tom", + "folder:someotherfolder#viewer@user:tom", + }, + expected: []string{}, + }, { name: "resource id", filter: datastore.RelationshipsFilter{ @@ -1397,6 +1410,73 @@ func QueryRelationshipsWithVariousFiltersTest(t *testing.T, tester DatastoreTest "document:first#viewer@user:tom", }, }, + { + name: "multiple subject IDs with subject type", + filter: datastore.RelationshipsFilter{ + OptionalSubjectsSelectors: []datastore.SubjectsSelector{ + { + OptionalSubjectType: "user", + OptionalSubjectIds: []string{"tom", "fred"}, + }, + }, + }, + relationships: []string{ + "document:first#viewer@user:tom", + "document:first#viewer@user:fred", + "document:second#viewer@anotheruser:fred#something", + "folder:secondfolder#viewer@anotheruser:sarah", + "folder:someotherfolder#viewer@user:tom", + }, + expected: []string{ + "document:first#viewer@user:tom", + "document:first#viewer@user:fred", + "folder:someotherfolder#viewer@user:tom", + }, + }, + { + name: "multiple subject filters", + filter: datastore.RelationshipsFilter{ + OptionalSubjectsSelectors: []datastore.SubjectsSelector{ + { + OptionalSubjectType: "user", + OptionalSubjectIds: []string{"tom", "fred"}, + }, + { + OptionalSubjectType: "anotheruser", + OptionalSubjectIds: []string{"tom", "jerry"}, + }, + }, + }, + relationships: []string{ + "document:first#viewer@user:tom", + "document:first#viewer@user:fred", + "document:second#viewer@anotheruser:fred#something", + "folder:secondfolder#viewer@anotheruser:tom", + "folder:secondfolder#viewer@anotheruser:sarah", + "folder:secondfolder#viewer@anotheruser:jerry", + "folder:someotherfolder#viewer@user:tom", + }, + expected: []string{ + "document:first#viewer@user:tom", + "document:first#viewer@user:fred", + "folder:someotherfolder#viewer@user:tom", + "folder:secondfolder#viewer@anotheruser:tom", + "folder:secondfolder#viewer@anotheruser:jerry", + }, + }, + { + name: "relationships with expiration", + filter: datastore.RelationshipsFilter{ + OptionalResourceType: "document", + }, + relationships: []string{ + "document:first#expiring_viewer@user:tom[expiration:2020-01-01T00:00:00Z]", + "document:first#expiring_viewer@user:fred[expiration:2321-01-01T00:00:00Z]", + }, + expected: []string{ + "document:first#expiring_viewer@user:fred[expiration:2321-01-01T00:00:00Z]", + }, + }, } for _, tc := range tcs {