@@ -67,7 +67,7 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
67
67
})
68
68
69
69
t .Run ("invalid argument when name is not specified" , func (t * testing.T ) {
70
- _ , _ , client := setupTokensService (t , withTokenFeatureDisabled )
70
+ _ , _ , client := setupTokensService (t , withTokenFeatureEnabled )
71
71
72
72
_ , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
73
73
Token : & v1.PersonalAccessToken {},
@@ -91,7 +91,7 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
91
91
})
92
92
93
93
t .Run ("invalid argument when expiration time is unspecified" , func (t * testing.T ) {
94
- _ , _ , client := setupTokensService (t , withTokenFeatureDisabled )
94
+ _ , _ , client := setupTokensService (t , withTokenFeatureEnabled )
95
95
96
96
_ , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
97
97
Token : & v1.PersonalAccessToken {
@@ -102,7 +102,7 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
102
102
})
103
103
104
104
t .Run ("invalid argument when expiration time is invalid" , func (t * testing.T ) {
105
- _ , _ , client := setupTokensService (t , withTokenFeatureDisabled )
105
+ _ , _ , client := setupTokensService (t , withTokenFeatureEnabled )
106
106
107
107
_ , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
108
108
Token : & v1.PersonalAccessToken {
@@ -115,6 +115,19 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
115
115
require .Equal (t , connect .CodeInvalidArgument , connect .CodeOf (err ))
116
116
})
117
117
118
+ t .Run ("invalid argument when disallowed scopes used" , func (t * testing.T ) {
119
+ _ , _ , client := setupTokensService (t , withTokenFeatureEnabled )
120
+
121
+ _ , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
122
+ Token : & v1.PersonalAccessToken {
123
+ Name : "my-token" ,
124
+ ExpirationTime : timestamppb .Now (),
125
+ Scopes : []string {"random:scope" },
126
+ },
127
+ }))
128
+ require .Equal (t , connect .CodeInvalidArgument , connect .CodeOf (err ))
129
+ })
130
+
118
131
t .Run ("crates personal access token" , func (t * testing.T ) {
119
132
serverMock , dbConn , client := setupTokensService (t , withTokenFeatureEnabled )
120
133
@@ -149,6 +162,53 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
149
162
require .NoError (t , err )
150
163
require .Equal (t , user .ID , storedInDB .UserID .String ())
151
164
})
165
+
166
+ t .Run ("crates personal access token with no scopes when none provided" , func (t * testing.T ) {
167
+ serverMock , dbConn , client := setupTokensService (t , withTokenFeatureEnabled )
168
+
169
+ serverMock .EXPECT ().GetLoggedInUser (gomock .Any ()).Return (user , nil )
170
+
171
+ token := & v1.PersonalAccessToken {
172
+ Name : "my-token" ,
173
+ ExpirationTime : timestamppb .Now (),
174
+ }
175
+
176
+ response , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
177
+ Token : token ,
178
+ }))
179
+ require .NoError (t , err )
180
+
181
+ created := response .Msg .GetToken ()
182
+ t .Cleanup (func () {
183
+ require .NoError (t , dbConn .Where ("id = ?" , created .GetId ()).Delete (& db.PersonalAccessToken {}).Error )
184
+ })
185
+
186
+ require .Len (t , created .GetScopes (), 0 , "must have no scopes, none were provided in the request" )
187
+ })
188
+
189
+ t .Run ("crates personal access token with full access when correct scopes provided" , func (t * testing.T ) {
190
+ serverMock , dbConn , client := setupTokensService (t , withTokenFeatureEnabled )
191
+
192
+ serverMock .EXPECT ().GetLoggedInUser (gomock .Any ()).Return (user , nil )
193
+
194
+ token := & v1.PersonalAccessToken {
195
+ Name : "my-token" ,
196
+ ExpirationTime : timestamppb .Now (),
197
+ Scopes : []string {"resource:default" , "function:*" },
198
+ }
199
+
200
+ response , err := client .CreatePersonalAccessToken (context .Background (), connect .NewRequest (& v1.CreatePersonalAccessTokenRequest {
201
+ Token : token ,
202
+ }))
203
+ require .NoError (t , err )
204
+
205
+ created := response .Msg .GetToken ()
206
+ t .Cleanup (func () {
207
+ require .NoError (t , dbConn .Where ("id = ?" , created .GetId ()).Delete (& db.PersonalAccessToken {}).Error )
208
+ })
209
+
210
+ require .Equal (t , []string {allFunctionsScope , defaultResourceScope }, created .GetScopes ())
211
+ })
152
212
}
153
213
154
214
func TestTokensService_GetPersonalAccessToken (t * testing.T ) {
@@ -617,6 +677,62 @@ func TestTokensService_Workflow(t *testing.T) {
617
677
require .NoError (t , err )
618
678
}
619
679
680
+ func TestValidateScopes (t * testing.T ) {
681
+ for _ , s := range []struct {
682
+ Name string
683
+ RequestedScopes []string
684
+ Error bool
685
+ }{
686
+ {
687
+ Name : "no scopes are permitted" ,
688
+ RequestedScopes : nil ,
689
+ },
690
+ {
691
+ Name : "empty scopes are permitted" ,
692
+ RequestedScopes : []string {},
693
+ },
694
+ {
695
+ Name : "all scopes are permitted" ,
696
+ RequestedScopes : []string {"function:*" , "resource:default" },
697
+ },
698
+ {
699
+ Name : "all scopes (unsorted) are permitted" ,
700
+ RequestedScopes : []string {"resource:default" , "function:*" },
701
+ },
702
+ {
703
+ Name : "only all function scope is not permitted" ,
704
+ RequestedScopes : []string {"function:*" },
705
+ Error : true ,
706
+ },
707
+ {
708
+ Name : "only all default resource scope is not permitted" ,
709
+ RequestedScopes : []string {"resource:default" },
710
+ Error : true ,
711
+ },
712
+ {
713
+ Name : "unknown scope is rejected" ,
714
+ RequestedScopes : []string {"unknown" },
715
+ Error : true ,
716
+ },
717
+ {
718
+ Name : "unknown scope, with all scopes, is rejected" ,
719
+ RequestedScopes : []string {"unknown" , "function:*" , "resource:default" },
720
+ Error : true ,
721
+ },
722
+ } {
723
+ t .Run (s .Name , func (t * testing.T ) {
724
+ _ , err := validateScopes (s .RequestedScopes )
725
+
726
+ if s .Error {
727
+ require .Error (t , err )
728
+ } else {
729
+ require .NoError (t , err )
730
+ }
731
+ })
732
+
733
+ }
734
+ }
735
+
620
736
func setupTokensService (t * testing.T , expClient experiments.Client ) (* protocol.MockAPIInterface , * gorm.DB , v1connect.TokensServiceClient ) {
621
737
t .Helper ()
622
738
0 commit comments