@@ -4,15 +4,6 @@ import (
4
4
"context"
5
5
"reflect"
6
6
"testing"
7
- "time"
8
-
9
- "github.com/moby/moby/pkg/namesgenerator"
10
-
11
- "github.com/coder/coder/testutil"
12
-
13
- "github.com/stretchr/testify/require"
14
-
15
- "github.com/coder/coder/coderd/database"
16
7
17
8
"github.com/google/uuid"
18
9
@@ -50,162 +41,8 @@ func TestAuthzQueryRecursive(t *testing.T) {
50
41
}
51
42
// Log the name of the last method, so if there is a panic, it is
52
43
// easy to know which method failed.
53
- t .Log (method .Name )
44
+ // t.Log(method.Name)
54
45
// Call the function. Any infinite recursion will stack overflow.
55
46
reflect .ValueOf (q ).Method (i ).Call (ins )
56
47
}
57
48
}
58
-
59
- type authorizeTest struct {
60
- Data func (t * testing.T , tc * authorizeTest ) map [string ]interface {}
61
- // Test is all the calls to the AuthzStore
62
- Test func (ctx context.Context , t * testing.T , tc * authorizeTest , q authzquery.AuthzStore )
63
- // Assert is the objects and the expected RBAC calls.
64
- // If 2 reads are expected on the same object, pass in 2 rbac.Reads.
65
- Asserts map [string ][]rbac.Action
66
-
67
- names map [string ]uuid.UUID
68
- }
69
-
70
- func (tc * authorizeTest ) Lookup (name string ) uuid.UUID {
71
- if tc .names == nil {
72
- tc .names = make (map [string ]uuid.UUID )
73
- }
74
- if id , ok := tc .names [name ]; ok {
75
- return id
76
- }
77
- id := uuid .New ()
78
- tc .names [name ] = id
79
- return id
80
- }
81
-
82
- func testAuthorizeFunction (t * testing.T , testCase * authorizeTest ) {
83
- t .Helper ()
84
-
85
- // The actor does not really matter since all authz calls will succeed.
86
- actor := rbac.Subject {
87
- ID : uuid .New ().String (),
88
- Roles : rbac.RoleNames {},
89
- Groups : []string {},
90
- Scope : rbac .ScopeAll ,
91
- }
92
-
93
- // Always use a fake database.
94
- db := databasefake .New ()
95
-
96
- // Record all authorization calls. This will allow all authorization calls
97
- // to succeed.
98
- rec := & coderdtest.RecordingAuthorizer {}
99
- q := authzquery .NewAuthzQuerier (db , rec )
100
-
101
- // Setup Context
102
- ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitShort )
103
- ctx = authzquery .WithAuthorizeContext (ctx , actor )
104
- t .Cleanup (cancel )
105
-
106
- // Seed all data into the database that is required for the test.
107
- data := setupTestData (t , testCase , db , ctx )
108
-
109
- // Run the test.
110
- testCase .Test (ctx , t , testCase , q )
111
-
112
- // Asset RBAC calls.
113
- pairs := make ([]coderdtest.ActionObjectPair , 0 )
114
- for objectName , asserts := range testCase .Asserts {
115
- object := data [objectName ]
116
- for _ , assert := range asserts {
117
- canRBAC , ok := object .(rbac.Objecter )
118
- require .True (t , ok , "object %q does not implement rbac.Objecter" , objectName )
119
- pairs = append (pairs , rec .Pair (assert , canRBAC .RBACObject ()))
120
- }
121
- }
122
- rec .UnorderedAssertActor (t , actor , pairs ... )
123
- require .NoError (t , rec .AllAsserted (), "all authz checks asserted" )
124
- }
125
-
126
- func setupTestData (t * testing.T , testCase * authorizeTest , db database.Store , ctx context.Context ) map [string ]interface {} {
127
- // Setup the test data.
128
- orgID := uuid .New ()
129
- data := testCase .Data (t , testCase )
130
- for name , v := range data {
131
- switch orig := v .(type ) {
132
- case database.Template :
133
- template , err := db .InsertTemplate (ctx , database.InsertTemplateParams {
134
- ID : testCase .Lookup (name ),
135
- CreatedAt : time .Now (),
136
- UpdatedAt : time .Now (),
137
- OrganizationID : takeFirst (orig .OrganizationID , orgID ),
138
- Name : takeFirst (orig .Name , namesgenerator .GetRandomName (1 )),
139
- Provisioner : takeFirst (orig .Provisioner , database .ProvisionerTypeEcho ),
140
- ActiveVersionID : takeFirst (orig .ActiveVersionID , uuid .New ()),
141
- Description : takeFirst (orig .Description , namesgenerator .GetRandomName (1 )),
142
- DefaultTTL : takeFirst (orig .DefaultTTL , 3600 ),
143
- CreatedBy : takeFirst (orig .CreatedBy , uuid .New ()),
144
- Icon : takeFirst (orig .Icon , namesgenerator .GetRandomName (1 )),
145
- UserACL : orig .UserACL ,
146
- GroupACL : orig .GroupACL ,
147
- DisplayName : takeFirst (orig .DisplayName , namesgenerator .GetRandomName (1 )),
148
- AllowUserCancelWorkspaceJobs : takeFirst (orig .AllowUserCancelWorkspaceJobs , true ),
149
- })
150
- require .NoError (t , err , "insert template" )
151
-
152
- data [name ] = template
153
- case database.Workspace :
154
- workspace , err := db .InsertWorkspace (ctx , database.InsertWorkspaceParams {
155
- ID : testCase .Lookup (name ),
156
- CreatedAt : time .Now (),
157
- UpdatedAt : time .Now (),
158
- OrganizationID : takeFirst (orig .OrganizationID , orgID ),
159
- TemplateID : takeFirst (orig .TemplateID , uuid .New ()),
160
- Name : takeFirst (orig .Name , namesgenerator .GetRandomName (1 )),
161
- AutostartSchedule : orig .AutostartSchedule ,
162
- Ttl : orig .Ttl ,
163
- })
164
- require .NoError (t , err , "insert workspace" )
165
-
166
- data [name ] = workspace
167
- case database.WorkspaceBuild :
168
- build , err := db .InsertWorkspaceBuild (ctx , database.InsertWorkspaceBuildParams {
169
- ID : testCase .Lookup (name ),
170
- CreatedAt : time .Now (),
171
- UpdatedAt : time .Now (),
172
- WorkspaceID : takeFirst (orig .WorkspaceID , uuid .New ()),
173
- TemplateVersionID : takeFirst (orig .TemplateVersionID , uuid .New ()),
174
- BuildNumber : takeFirst (orig .BuildNumber , 0 ),
175
- Transition : takeFirst (orig .Transition , database .WorkspaceTransitionStart ),
176
- InitiatorID : takeFirst (orig .InitiatorID , uuid .New ()),
177
- JobID : takeFirst (orig .InitiatorID , uuid .New ()),
178
- ProvisionerState : []byte {},
179
- Deadline : time .Now (),
180
- Reason : takeFirst (orig .Reason , database .BuildReasonInitiator ),
181
- })
182
- require .NoError (t , err , "insert workspace build" )
183
-
184
- data [name ] = build
185
- case database.User :
186
- user , err := db .InsertUser (ctx , database.InsertUserParams {
187
- ID : testCase .Lookup (name ),
188
- Email : takeFirst (orig .Email , namesgenerator .GetRandomName (1 )),
189
- Username : takeFirst (orig .Username , namesgenerator .GetRandomName (1 )),
190
- HashedPassword : []byte {},
191
- CreatedAt : time .Now (),
192
- UpdatedAt : time .Now (),
193
- RBACRoles : []string {},
194
- LoginType : takeFirst (orig .LoginType , database .LoginTypePassword ),
195
- })
196
- require .NoError (t , err , "insert user" )
197
-
198
- data [name ] = user
199
- }
200
- }
201
- return data
202
- }
203
-
204
- // takeFirst will take the first non empty value.
205
- func takeFirst [Value comparable ](def Value , next Value ) Value {
206
- var empty Value
207
- if def == empty {
208
- return next
209
- }
210
- return def
211
- }
0 commit comments