|
1 | 1 | // |
2 | | -// Copyright 2024 The Chainloop Authors. |
| 2 | +// Copyright 2024-2025 The Chainloop Authors. |
3 | 3 | // |
4 | 4 | // Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | // you may not use this file except in compliance with the License. |
|
16 | 16 | package authz |
17 | 17 |
|
18 | 18 | import ( |
19 | | - "fmt" |
20 | 19 | "io" |
21 | 20 | "os" |
22 | 21 | "testing" |
23 | 22 |
|
24 | | - "github.com/google/uuid" |
25 | 23 | "github.com/stretchr/testify/assert" |
26 | 24 | "github.com/stretchr/testify/require" |
27 | 25 | ) |
28 | 26 |
|
29 | | -func TestAddPolicies(t *testing.T) { |
30 | | - testcases := []struct { |
31 | | - name string |
32 | | - subject *SubjectAPIToken |
33 | | - policies []*Policy |
34 | | - wantErr bool |
35 | | - wantNumberPolicies int |
36 | | - }{ |
37 | | - { |
38 | | - name: "empty policies and subject", |
39 | | - wantErr: true, |
40 | | - }, |
41 | | - { |
42 | | - name: "no subject", |
43 | | - policies: []*Policy{ |
44 | | - PolicyWorkflowContractList, |
45 | | - }, |
46 | | - wantErr: true, |
47 | | - }, |
48 | | - { |
49 | | - name: "no policies", |
50 | | - subject: &SubjectAPIToken{ID: uuid.NewString()}, |
51 | | - wantErr: true, |
52 | | - }, |
53 | | - { |
54 | | - name: "adds two policies", |
55 | | - subject: &SubjectAPIToken{ID: uuid.NewString()}, |
56 | | - policies: []*Policy{ |
57 | | - PolicyWorkflowContractList, |
58 | | - PolicyReferrerRead, |
59 | | - }, |
60 | | - wantNumberPolicies: 2, |
61 | | - }, |
62 | | - { |
63 | | - name: "handles duplicated policies", |
64 | | - subject: &SubjectAPIToken{ |
65 | | - ID: uuid.NewString(), |
66 | | - }, |
67 | | - policies: []*Policy{ |
68 | | - PolicyWorkflowContractList, |
69 | | - PolicyWorkflowContractRead, |
70 | | - PolicyWorkflowContractUpdate, |
71 | | - PolicyWorkflowContractList, |
72 | | - PolicyArtifactDownload, |
73 | | - PolicyWorkflowContractUpdate, |
74 | | - PolicyArtifactDownload, |
75 | | - }, |
76 | | - wantNumberPolicies: 4, |
77 | | - }, |
78 | | - } |
79 | | - |
80 | | - for _, tc := range testcases { |
81 | | - t.Run(tc.name, func(t *testing.T) { |
82 | | - enforcer, closer := testEnforcer(t) |
83 | | - closer.Close() |
84 | | - |
85 | | - err := enforcer.AddPolicies(tc.subject, tc.policies...) |
86 | | - if tc.wantErr { |
87 | | - assert.Error(t, err) |
88 | | - return |
89 | | - } |
90 | | - |
91 | | - require.NoError(t, err) |
92 | | - |
93 | | - for _, p := range tc.policies { |
94 | | - ok, err := enforcer.HasPolicy(tc.subject.String(), p.Resource, p.Action) |
95 | | - assert.NoError(t, err) |
96 | | - assert.True(t, ok, fmt.Sprintf("policy %s:%s not found", p.Resource, p.Action)) |
97 | | - } |
98 | | - |
99 | | - gotLength, err := enforcer.GetFilteredPolicy(0, tc.subject.String()) |
100 | | - assert.NoError(t, err) |
101 | | - assert.Len(t, gotLength, tc.wantNumberPolicies) |
102 | | - }) |
103 | | - } |
104 | | -} |
105 | 27 |
|
106 | 28 | // simulate 2 enforcers on the same database (by acting on the same file enforcer) |
107 | 29 | func TestSyncMultipleEnforcers(t *testing.T) { |
@@ -219,31 +141,6 @@ func TestSyncMultipleEnforcers(t *testing.T) { |
219 | 141 | } |
220 | 142 | } |
221 | 143 |
|
222 | | -func TestAddPoliciesDuplication(t *testing.T) { |
223 | | - want := []*Policy{ |
224 | | - PolicyWorkflowContractList, |
225 | | - PolicyWorkflowContractRead, |
226 | | - } |
227 | | - |
228 | | - enforcer, closer := testEnforcer(t) |
229 | | - defer closer.Close() |
230 | | - sub := &SubjectAPIToken{ID: uuid.NewString()} |
231 | | - |
232 | | - err := enforcer.AddPolicies(sub, want...) |
233 | | - require.NoError(t, err) |
234 | | - got, err := enforcer.GetFilteredPolicy(0, sub.String()) |
235 | | - require.NoError(t, err) |
236 | | - assert.Len(t, got, 2) |
237 | | - |
238 | | - // Update the list of policies we want to add by appending an extra one |
239 | | - want = append(want, PolicyWorkflowContractUpdate) |
240 | | - // AddPolicies only add the policies that are not already present preventing duplication |
241 | | - err = enforcer.AddPolicies(sub, want...) |
242 | | - assert.NoError(t, err) |
243 | | - got, err = enforcer.GetFilteredPolicy(0, sub.String()) |
244 | | - assert.NoError(t, err) |
245 | | - assert.Len(t, got, 3) |
246 | | -} |
247 | 144 |
|
248 | 145 | func TestSyncRBACRoles(t *testing.T) { |
249 | 146 | e, closer := testEnforcer(t) |
@@ -346,39 +243,6 @@ func TestDoSync(t *testing.T) { |
346 | 243 | assert.Len(t, got, 2) |
347 | 244 | } |
348 | 245 |
|
349 | | -func TestClearPolicies(t *testing.T) { |
350 | | - want := []*Policy{ |
351 | | - PolicyWorkflowContractList, |
352 | | - PolicyWorkflowContractRead, |
353 | | - } |
354 | | - |
355 | | - enforcer, closer := testEnforcer(t) |
356 | | - defer closer.Close() |
357 | | - sub := &SubjectAPIToken{ID: uuid.NewString()} |
358 | | - sub2 := &SubjectAPIToken{ID: uuid.NewString()} |
359 | | - |
360 | | - // Create policies for two different subjects |
361 | | - err := enforcer.AddPolicies(sub, want...) |
362 | | - require.NoError(t, err) |
363 | | - err = enforcer.AddPolicies(sub2, want...) |
364 | | - require.NoError(t, err) |
365 | | - // Each have 2 items |
366 | | - got, err := enforcer.GetFilteredPolicy(0, sub.String()) |
367 | | - require.NoError(t, err) |
368 | | - assert.Len(t, got, 2) |
369 | | - |
370 | | - // Clear all the policies for the subject |
371 | | - err = enforcer.ClearPolicies(sub) |
372 | | - assert.NoError(t, err) |
373 | | - // there should be no policies left for this user |
374 | | - got, err = enforcer.GetFilteredPolicy(0, sub.String()) |
375 | | - require.NoError(t, err) |
376 | | - assert.Len(t, got, 0) |
377 | | - // but the other user should still have 2 |
378 | | - got, err = enforcer.GetFilteredPolicy(0, sub2.String()) |
379 | | - require.NoError(t, err) |
380 | | - assert.Len(t, got, 2) |
381 | | -} |
382 | 246 |
|
383 | 247 | func testEnforcer(t *testing.T) (*Enforcer, io.Closer) { |
384 | 248 | f, err := os.CreateTemp(t.TempDir(), "policy*.csv") |
|
0 commit comments