@@ -5423,6 +5423,19 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppCodes() {
5423
5423
UserID :user .ID ,
5424
5424
}).Asserts (rbac .ResourceOauth2AppCodeToken .WithOwner (user .ID .String ()),policy .ActionDelete )
5425
5425
}))
5426
+ s .Run ("ConsumeOAuth2ProviderAppCodeByPrefix" ,s .Subtest (func (db database.Store ,check * expects ) {
5427
+ user := dbgen .User (s .T (),db , database.User {})
5428
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5429
+ // Use unique prefix to avoid test isolation issues
5430
+ uniquePrefix := fmt .Sprintf ("prefix-%s-%d" ,s .T ().Name (),time .Now ().UnixNano ())
5431
+ code := dbgen .OAuth2ProviderAppCode (s .T (),db , database.OAuth2ProviderAppCode {
5432
+ SecretPrefix : []byte (uniquePrefix ),
5433
+ UserID :user .ID ,
5434
+ AppID :app .ID ,
5435
+ ExpiresAt :time .Now ().Add (24 * time .Hour ),// Extended expiry for test stability
5436
+ })
5437
+ check .Args (code .SecretPrefix ).Asserts (code ,policy .ActionUpdate ).Returns (code )
5438
+ }))
5426
5439
}
5427
5440
5428
5441
func (s * MethodTestSuite )TestOAuth2ProviderAppTokens () {
@@ -5498,6 +5511,110 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppTokens() {
5498
5511
}))
5499
5512
}
5500
5513
5514
+ func (s * MethodTestSuite )TestOAuth2ProviderDeviceCodes () {
5515
+ s .Run ("InsertOAuth2ProviderDeviceCode" ,s .Subtest (func (db database.Store ,check * expects ) {
5516
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5517
+ check .Args (database.InsertOAuth2ProviderDeviceCodeParams {
5518
+ ClientID :app .ID ,
5519
+ }).Asserts (rbac .ResourceOauth2AppCodeToken ,policy .ActionCreate )
5520
+ }))
5521
+ s .Run ("GetOAuth2ProviderDeviceCodeByID" ,s .Subtest (func (db database.Store ,check * expects ) {
5522
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5523
+ deviceCode ,err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5524
+ ClientID :app .ID ,
5525
+ DeviceCodePrefix :"test-prefix" ,
5526
+ UserCode :"TEST1234" ,
5527
+ VerificationUri :"http://example.com/device" ,
5528
+ })
5529
+ require .NoError (s .T (),err )
5530
+ check .Args (deviceCode .ID ).Asserts (deviceCode ,policy .ActionRead ).Returns (deviceCode )
5531
+ }))
5532
+ s .Run ("GetOAuth2ProviderDeviceCodeByPrefix" ,s .Subtest (func (db database.Store ,check * expects ) {
5533
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5534
+ deviceCode ,err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5535
+ ClientID :app .ID ,
5536
+ DeviceCodePrefix :"test-prefix" ,
5537
+ UserCode :"TEST1234" ,
5538
+ VerificationUri :"http://example.com/device" ,
5539
+ })
5540
+ require .NoError (s .T (),err )
5541
+ check .Args (deviceCode .DeviceCodePrefix ).Asserts (deviceCode ,policy .ActionRead ).Returns (deviceCode )
5542
+ }))
5543
+ s .Run ("GetOAuth2ProviderDeviceCodeByUserCode" ,s .Subtest (func (db database.Store ,check * expects ) {
5544
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5545
+ deviceCode ,err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5546
+ ClientID :app .ID ,
5547
+ DeviceCodePrefix :"test-prefix" ,
5548
+ UserCode :"TEST1234" ,
5549
+ VerificationUri :"http://example.com/device" ,
5550
+ })
5551
+ require .NoError (s .T (),err )
5552
+ check .Args (deviceCode .UserCode ).Asserts (deviceCode ,policy .ActionRead ).Returns (deviceCode )
5553
+ }))
5554
+ s .Run ("GetOAuth2ProviderDeviceCodesByClientID" ,s .Subtest (func (db database.Store ,check * expects ) {
5555
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5556
+ deviceCode ,err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5557
+ ClientID :app .ID ,
5558
+ DeviceCodePrefix :"test-prefix" ,
5559
+ UserCode :"TEST1234" ,
5560
+ VerificationUri :"http://example.com/device" ,
5561
+ })
5562
+ require .NoError (s .T (),err )
5563
+ check .Args (app .ID ).Asserts (rbac .ResourceOauth2AppCodeToken ,policy .ActionRead ).Returns ([]database.OAuth2ProviderDeviceCode {deviceCode })
5564
+ }))
5565
+ s .Run ("ConsumeOAuth2ProviderDeviceCodeByPrefix" ,s .Subtest (func (db database.Store ,check * expects ) {
5566
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5567
+ user := dbgen .User (s .T (),db , database.User {})
5568
+ // Use unique identifiers to avoid test isolation issues
5569
+ uniquePrefix := fmt .Sprintf ("dev-prefix-%s-%d" ,s .T ().Name (),time .Now ().UnixNano ())
5570
+ uniqueUserCode := fmt .Sprintf ("USER%s-%d" ,s .T ().Name (),time .Now ().UnixNano ())
5571
+ // Create device code using dbgen (now available!)
5572
+ deviceCode := dbgen .OAuth2ProviderDeviceCode (s .T (),db , database.OAuth2ProviderDeviceCode {
5573
+ DeviceCodePrefix :uniquePrefix ,
5574
+ UserCode :uniqueUserCode ,
5575
+ ClientID :app .ID ,
5576
+ ExpiresAt :time .Now ().Add (24 * time .Hour ),// Extended expiry for test stability
5577
+ })
5578
+ // Authorize the device code so it can be consumed
5579
+ deviceCode ,err := db .UpdateOAuth2ProviderDeviceCodeAuthorization (s .T ().Context (), database.UpdateOAuth2ProviderDeviceCodeAuthorizationParams {
5580
+ ID :deviceCode .ID ,
5581
+ UserID : uuid.NullUUID {UUID :user .ID ,Valid :true },
5582
+ Status :database .OAuth2DeviceStatusAuthorized ,
5583
+ })
5584
+ require .NoError (s .T (),err )
5585
+ require .Equal (s .T (),database .OAuth2DeviceStatusAuthorized ,deviceCode .Status )
5586
+ check .Args (uniquePrefix ).Asserts (deviceCode ,policy .ActionUpdate ).Returns (deviceCode )
5587
+ }))
5588
+ s .Run ("UpdateOAuth2ProviderDeviceCodeAuthorization" ,s .Subtest (func (db database.Store ,check * expects ) {
5589
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5590
+ user := dbgen .User (s .T (),db , database.User {})
5591
+ // Create device code using dbgen
5592
+ deviceCode := dbgen .OAuth2ProviderDeviceCode (s .T (),db , database.OAuth2ProviderDeviceCode {
5593
+ ClientID :app .ID ,
5594
+ })
5595
+ require .Equal (s .T (),database .OAuth2DeviceStatusPending ,deviceCode .Status )
5596
+ check .Args (database.UpdateOAuth2ProviderDeviceCodeAuthorizationParams {
5597
+ ID :deviceCode .ID ,
5598
+ UserID : uuid.NullUUID {UUID :user .ID ,Valid :true },
5599
+ Status :database .OAuth2DeviceStatusAuthorized ,
5600
+ }).Asserts (deviceCode ,policy .ActionUpdate )
5601
+ }))
5602
+ s .Run ("DeleteOAuth2ProviderDeviceCodeByID" ,s .Subtest (func (db database.Store ,check * expects ) {
5603
+ app := dbgen .OAuth2ProviderApp (s .T (),db , database.OAuth2ProviderApp {})
5604
+ deviceCode ,err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5605
+ ClientID :app .ID ,
5606
+ DeviceCodePrefix :"test-prefix" ,
5607
+ UserCode :"TEST1234" ,
5608
+ VerificationUri :"http://example.com/device" ,
5609
+ })
5610
+ require .NoError (s .T (),err )
5611
+ check .Args (deviceCode .ID ).Asserts (deviceCode ,policy .ActionDelete )
5612
+ }))
5613
+ s .Run ("DeleteExpiredOAuth2ProviderDeviceCodes" ,s .Subtest (func (db database.Store ,check * expects ) {
5614
+ check .Args ().Asserts (rbac .ResourceSystem ,policy .ActionDelete )
5615
+ }))
5616
+ }
5617
+
5501
5618
func (s * MethodTestSuite )TestResourcesMonitor () {
5502
5619
createAgent := func (t * testing.T ,db database.Store ) (database.WorkspaceAgent , database.WorkspaceTable ) {
5503
5620
t .Helper ()