Skip to content

Commit 163db89

Browse files
authored
Merge pull request #357 from alecmerdler/fix-relationship-id-filter
Respect resource ID filter when reading relationships
2 parents 1f31f43 + 4c402d5 commit 163db89

File tree

2 files changed

+70
-6
lines changed

2 files changed

+70
-6
lines changed

internal/commands/relationship.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,17 @@ func buildRelationshipsFilter(cmd *cobra.Command, args []string) (*v1.Relationsh
181181
filter := &v1.RelationshipFilter{ResourceType: args[0]}
182182

183183
if strings.Contains(args[0], ":") {
184-
resourceID := ""
184+
var resourceID string
185+
err := stringz.SplitExact(args[0], ":", &filter.ResourceType, &resourceID)
186+
if err != nil {
187+
return nil, err
188+
}
189+
185190
if strings.HasSuffix(resourceID, "%") {
186191
filter.OptionalResourceIdPrefix = strings.TrimSuffix(resourceID, "%")
187192
} else {
188193
filter.OptionalResourceId = resourceID
189194
}
190-
191-
err := stringz.SplitExact(args[0], ":", &filter.ResourceType, &resourceID)
192-
if err != nil {
193-
return nil, err
194-
}
195195
}
196196

197197
if len(args) > 1 {

internal/commands/relationship_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,70 @@ func fileFromStrings(t *testing.T, strings []string) *os.File {
466466
return file
467467
}
468468

469+
func TestBuildRelationshipsFilter(t *testing.T) {
470+
tests := []struct {
471+
name string
472+
args []string
473+
expected *v1.RelationshipFilter
474+
}{
475+
{
476+
name: "resource type",
477+
args: []string{"res"},
478+
expected: &v1.RelationshipFilter{ResourceType: "res"},
479+
},
480+
{
481+
name: "resource type, resource ID",
482+
args: []string{"res:123"},
483+
expected: &v1.RelationshipFilter{ResourceType: "res", OptionalResourceId: "123"},
484+
},
485+
{
486+
name: "resource type, resource ID, relation",
487+
args: []string{"res:123", "view"},
488+
expected: &v1.RelationshipFilter{ResourceType: "res", OptionalResourceId: "123", OptionalRelation: "view"},
489+
},
490+
{
491+
name: "resource type, resource ID, relation, subject type",
492+
args: []string{"res:123", "view", "sub"},
493+
expected: &v1.RelationshipFilter{
494+
ResourceType: "res",
495+
OptionalResourceId: "123",
496+
OptionalRelation: "view",
497+
OptionalSubjectFilter: &v1.SubjectFilter{SubjectType: "sub"},
498+
},
499+
},
500+
{
501+
name: "resource type, resource ID, relation, subject type, subject ID",
502+
args: []string{"res:123", "view", "sub:321"},
503+
expected: &v1.RelationshipFilter{
504+
ResourceType: "res",
505+
OptionalResourceId: "123",
506+
OptionalRelation: "view",
507+
OptionalSubjectFilter: &v1.SubjectFilter{SubjectType: "sub", OptionalSubjectId: "321"},
508+
},
509+
},
510+
}
511+
for _, tt := range tests {
512+
tt := tt
513+
t.Run(tt.name, func(t *testing.T) {
514+
t.Parallel()
515+
516+
cmd := &cobra.Command{}
517+
cmd.Flags().String("subject-filter", "", "")
518+
519+
filter, err := buildRelationshipsFilter(cmd, tt.args)
520+
require.NoError(t, err)
521+
require.Equal(t, tt.expected.ResourceType, filter.ResourceType, "resource types do not match")
522+
require.Equal(t, tt.expected.OptionalResourceId, filter.OptionalResourceId, "resource IDs do not match")
523+
require.Equal(t, tt.expected.OptionalRelation, filter.OptionalRelation, "relations do not match")
524+
525+
if tt.expected.OptionalSubjectFilter != nil {
526+
require.Equal(t, tt.expected.OptionalSubjectFilter.SubjectType, filter.OptionalSubjectFilter.SubjectType, "subject types do not match")
527+
require.Equal(t, tt.expected.OptionalSubjectFilter.OptionalSubjectId, filter.OptionalSubjectFilter.OptionalSubjectId, "subject IDs do not match")
528+
}
529+
})
530+
}
531+
}
532+
469533
type mockClient struct {
470534
v1.SchemaServiceClient
471535
v1.PermissionsServiceClient

0 commit comments

Comments
 (0)