Skip to content

Commit a0a6004

Browse files
committed
test(authz): cover multi-resource obligation FQN limit validation
Add proto and service-side tests for FulfillableObligationFqns on GetDecisionMultiResourceRequest, which was previously untested. Signed-off-by: jakedoublev <jake.vanvorhis@virtru.com>
1 parent a6a155c commit a0a6004

2 files changed

Lines changed: 71 additions & 5 deletions

File tree

service/authorization/v2/authorization_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,34 @@ func Test_GetDecisionMultiResourceRequest_Succeeds(t *testing.T) {
973973
}
974974
}
975975

976+
func Test_GetDecisionMultiResourceRequest_ProtoValidationAllowsManyObligations(t *testing.T) {
977+
v := getValidator()
978+
979+
fiftyOneObligations := make([]string, 51)
980+
for i := range 51 {
981+
fiftyOneObligations[i] = sampleObligationValueFQN
982+
}
983+
984+
req := &authzV2.GetDecisionMultiResourceRequest{
985+
EntityIdentifier: &authzV2.EntityIdentifier{
986+
Identifier: &authzV2.EntityIdentifier_RegisteredResourceValueFqn{
987+
RegisteredResourceValueFqn: sampleRegisteredResourceFQN,
988+
},
989+
},
990+
Action: sampleActionCreate,
991+
Resources: []*authzV2.Resource{
992+
{
993+
Resource: &authzV2.Resource_RegisteredResourceValueFqn{
994+
RegisteredResourceValueFqn: sampleRegisteredResourceFQN,
995+
},
996+
},
997+
},
998+
FulfillableObligationFqns: fiftyOneObligations,
999+
}
1000+
err := v.Validate(req)
1001+
require.NoError(t, err, "validation should allow more than 50 obligations so the service can enforce configured limits")
1002+
}
1003+
9761004
func Test_GetDecisionMultiResourceRequest_ProtoValidationAllowsManyResources(t *testing.T) {
9771005
v := getValidator()
9781006
upperBoundLimit := 1000

service/authorization/v2/validation_test.go

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,34 @@ func Test_validateGetEntitlementsRequest_DefaultRequestLimit(t *testing.T) {
5757
assert.Contains(t, err.Error(), "entity_identifier.entity_chain.entities exceeds maximum count: got 11, max 10")
5858
}
5959

60-
func Test_validateGetDecisionMultiResourceRequest_DefaultRequestLimit(t *testing.T) {
60+
func Test_validateGetDecisionMultiResourceRequest_DefaultRequestLimits(t *testing.T) {
6161
service := newValidationTestService(t, nil)
6262

63-
err := service.validateGetDecisionMultiResourceRequest(newDecisionMultiResourceRequestWithResourceCount(1001), "")
64-
require.Error(t, err)
65-
assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
66-
assert.Contains(t, err.Error(), "resources exceeds maximum count: got 1001, max 1000")
63+
cases := []struct {
64+
name string
65+
request *authzV2.GetDecisionMultiResourceRequest
66+
expectedErr string
67+
}{
68+
{
69+
name: "resources",
70+
request: newDecisionMultiResourceRequestWithResourceCount(1001),
71+
expectedErr: "resources exceeds maximum count: got 1001, max 1000",
72+
},
73+
{
74+
name: "fulfillable obligation fqns",
75+
request: newDecisionMultiResourceRequestWithObligationCount(51),
76+
expectedErr: "fulfillable_obligation_fqns exceeds maximum count: got 51, max 50",
77+
},
78+
}
79+
80+
for _, tc := range cases {
81+
t.Run(tc.name, func(t *testing.T) {
82+
err := service.validateGetDecisionMultiResourceRequest(tc.request, "")
83+
require.Error(t, err)
84+
assert.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
85+
assert.Contains(t, err.Error(), tc.expectedErr)
86+
})
87+
}
6788
}
6889

6990
func Test_validateGetDecisionBulkRequest_DefaultRequestLimit(t *testing.T) {
@@ -106,6 +127,7 @@ func Test_validateGetDecisionMultiResourceRequest_ExactlyAtDefaultLimitPasses(t
106127
service := newValidationTestService(t, nil)
107128

108129
require.NoError(t, service.validateGetDecisionMultiResourceRequest(newDecisionMultiResourceRequestWithResourceCount(1000), ""))
130+
require.NoError(t, service.validateGetDecisionMultiResourceRequest(newDecisionMultiResourceRequestWithObligationCount(50), ""))
109131
}
110132

111133
func Test_validateGetDecisionBulkRequest_ExactlyAtDefaultLimitPasses(t *testing.T) {
@@ -127,6 +149,7 @@ func Test_validateDecisionRequests_UseCustomRequestLimits(t *testing.T) {
127149
require.NoError(t, service.validateGetDecisionRequest(newDecisionRequestWithAttributeValueCount(21)))
128150
require.NoError(t, service.validateGetDecisionRequest(newDecisionRequestWithObligationCount(51)))
129151
require.NoError(t, service.validateGetDecisionMultiResourceRequest(newDecisionMultiResourceRequestWithResourceCount(1001), ""))
152+
require.NoError(t, service.validateGetDecisionMultiResourceRequest(newDecisionMultiResourceRequestWithObligationCount(51), ""))
130153
require.NoError(t, service.validateGetDecisionBulkRequest(newDecisionBulkRequestWithDecisionCount(201)))
131154
}
132155

@@ -275,6 +298,21 @@ func newDecisionMultiResourceRequestWithAttributeValueCount(count int) *authzV2.
275298
}
276299
}
277300

301+
func newDecisionMultiResourceRequestWithObligationCount(count int) *authzV2.GetDecisionMultiResourceRequest {
302+
return &authzV2.GetDecisionMultiResourceRequest{
303+
EntityIdentifier: newTokenEntityIdentifier(),
304+
Action: sampleActionCreate,
305+
Resources: []*authzV2.Resource{
306+
{
307+
Resource: &authzV2.Resource_RegisteredResourceValueFqn{
308+
RegisteredResourceValueFqn: sampleRegisteredResourceFQN,
309+
},
310+
},
311+
},
312+
FulfillableObligationFqns: newObligationFQNs(count),
313+
}
314+
}
315+
278316
func newDecisionMultiResourceRequestWithResourceCount(count int) *authzV2.GetDecisionMultiResourceRequest {
279317
resources := make([]*authzV2.Resource, count)
280318
for i := range count {

0 commit comments

Comments
 (0)