@@ -64,13 +64,6 @@ func TestOAuth2ProviderApps(t *testing.T) {
64
64
CallbackURL : "http://localhost:3000" ,
65
65
},
66
66
},
67
- {
68
- name : "NameTaken" ,
69
- req : codersdk.PostOAuth2ProviderAppRequest {
70
- Name : "taken" ,
71
- CallbackURL : "http://localhost:3000" ,
72
- },
73
- },
74
67
{
75
68
name : "URLMissing" ,
76
69
req : codersdk.PostOAuth2ProviderAppRequest {
@@ -135,17 +128,8 @@ func TestOAuth2ProviderApps(t *testing.T) {
135
128
},
136
129
}
137
130
138
- // Generate an application for testing name conflicts.
139
- req := codersdk.PostOAuth2ProviderAppRequest {
140
- Name : "taken" ,
141
- CallbackURL : "http://coder.com" ,
142
- }
143
- //nolint:gocritic // OAauth2 app management requires owner permission.
144
- _ , err := client .PostOAuth2ProviderApp (ctx , req )
145
- require .NoError (t , err )
146
-
147
131
// Generate an application for testing PUTs.
148
- req = codersdk.PostOAuth2ProviderAppRequest {
132
+ req : = codersdk.PostOAuth2ProviderAppRequest {
149
133
Name : fmt .Sprintf ("quark-%d" , time .Now ().UnixNano ()% 1000000 ),
150
134
CallbackURL : "http://coder.com" ,
151
135
}
@@ -271,6 +255,65 @@ func TestOAuth2ProviderApps(t *testing.T) {
271
255
require .NoError (t , err )
272
256
require .Len (t , apps , 0 )
273
257
})
258
+
259
+ t .Run ("DuplicateNames" , func (t * testing.T ) {
260
+ t .Parallel ()
261
+ client := coderdtest .New (t , nil )
262
+ _ = coderdtest .CreateFirstUser (t , client )
263
+ ctx := testutil .Context (t , testutil .WaitLong )
264
+
265
+ // Create multiple OAuth2 apps with the same name to verify RFC 7591 compliance
266
+ // RFC 7591 allows multiple apps to have the same name
267
+ appName := fmt .Sprintf ("duplicate-name-%d" , time .Now ().UnixNano ()% 1000000 )
268
+
269
+ // Create first app
270
+ //nolint:gocritic // OAuth2 app management requires owner permission.
271
+ app1 , err := client .PostOAuth2ProviderApp (ctx , codersdk.PostOAuth2ProviderAppRequest {
272
+ Name : appName ,
273
+ CallbackURL : "http://localhost:3001" ,
274
+ })
275
+ require .NoError (t , err )
276
+ require .Equal (t , appName , app1 .Name )
277
+
278
+ // Create second app with the same name
279
+ //nolint:gocritic // OAuth2 app management requires owner permission.
280
+ app2 , err := client .PostOAuth2ProviderApp (ctx , codersdk.PostOAuth2ProviderAppRequest {
281
+ Name : appName ,
282
+ CallbackURL : "http://localhost:3002" ,
283
+ })
284
+ require .NoError (t , err )
285
+ require .Equal (t , appName , app2 .Name )
286
+
287
+ // Create third app with the same name
288
+ //nolint:gocritic // OAuth2 app management requires owner permission.
289
+ app3 , err := client .PostOAuth2ProviderApp (ctx , codersdk.PostOAuth2ProviderAppRequest {
290
+ Name : appName ,
291
+ CallbackURL : "http://localhost:3003" ,
292
+ })
293
+ require .NoError (t , err )
294
+ require .Equal (t , appName , app3 .Name )
295
+
296
+ // Verify all apps have different IDs but same name
297
+ require .NotEqual (t , app1 .ID , app2 .ID )
298
+ require .NotEqual (t , app1 .ID , app3 .ID )
299
+ require .NotEqual (t , app2 .ID , app3 .ID )
300
+ require .Equal (t , app1 .Name , app2 .Name )
301
+ require .Equal (t , app1 .Name , app3 .Name )
302
+
303
+ // Verify all apps can be retrieved and have the same name
304
+ //nolint:gocritic // OAuth2 app management requires owner permission.
305
+ apps , err := client .OAuth2ProviderApps (ctx , codersdk.OAuth2ProviderAppFilter {})
306
+ require .NoError (t , err )
307
+
308
+ // Count apps with our duplicate name
309
+ duplicateNameCount := 0
310
+ for _ , app := range apps {
311
+ if app .Name == appName {
312
+ duplicateNameCount ++
313
+ }
314
+ }
315
+ require .Equal (t , 3 , duplicateNameCount , "Should have exactly 3 apps with the duplicate name" )
316
+ })
274
317
}
275
318
276
319
func TestOAuth2ProviderAppSecrets (t * testing.T ) {
0 commit comments