@@ -5531,6 +5531,19 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppCodes() {
5531
5531
UserID : user .ID ,
5532
5532
}).Asserts (rbac .ResourceOauth2AppCodeToken .WithOwner (user .ID .String ()), policy .ActionDelete )
5533
5533
}))
5534
+ s .Run ("ConsumeOAuth2ProviderAppCodeByPrefix" , s .Subtest (func (db database.Store , check * expects ) {
5535
+ user := dbgen .User (s .T (), db , database.User {})
5536
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5537
+ // Use unique prefix to avoid test isolation issues
5538
+ uniquePrefix := fmt .Sprintf ("prefix-%s-%d" , s .T ().Name (), time .Now ().UnixNano ())
5539
+ code := dbgen .OAuth2ProviderAppCode (s .T (), db , database.OAuth2ProviderAppCode {
5540
+ SecretPrefix : []byte (uniquePrefix ),
5541
+ UserID : user .ID ,
5542
+ AppID : app .ID ,
5543
+ ExpiresAt : time .Now ().Add (24 * time .Hour ), // Extended expiry for test stability
5544
+ })
5545
+ check .Args (code .SecretPrefix ).Asserts (code , policy .ActionUpdate ).Returns (code )
5546
+ }))
5534
5547
}
5535
5548
5536
5549
func (s * MethodTestSuite ) TestOAuth2ProviderAppTokens () {
@@ -5606,6 +5619,115 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppTokens() {
5606
5619
}))
5607
5620
}
5608
5621
5622
+ func (s * MethodTestSuite ) TestOAuth2ProviderDeviceCodes () {
5623
+ s .Run ("InsertOAuth2ProviderDeviceCode" , s .Subtest (func (db database.Store , check * expects ) {
5624
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5625
+ check .Args (database.InsertOAuth2ProviderDeviceCodeParams {
5626
+ ClientID : app .ID ,
5627
+ DeviceCodePrefix : "testpref" ,
5628
+ DeviceCodeHash : []byte ("hash" ),
5629
+ UserCode : "TEST1234" ,
5630
+ VerificationUri : "http://example.com/device" ,
5631
+ }).Asserts (rbac .ResourceOauth2AppCodeToken , policy .ActionCreate )
5632
+ }))
5633
+ s .Run ("GetOAuth2ProviderDeviceCodeByID" , s .Subtest (func (db database.Store , check * expects ) {
5634
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5635
+ deviceCode , err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5636
+ ClientID : app .ID ,
5637
+ DeviceCodePrefix : "testpref" ,
5638
+ UserCode : "TEST1234" ,
5639
+ VerificationUri : "http://example.com/device" ,
5640
+ })
5641
+ require .NoError (s .T (), err )
5642
+ check .Args (deviceCode .ID ).Asserts (deviceCode , policy .ActionRead ).Returns (deviceCode )
5643
+ }))
5644
+ s .Run ("GetOAuth2ProviderDeviceCodeByPrefix" , s .Subtest (func (db database.Store , check * expects ) {
5645
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5646
+ deviceCode , err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5647
+ ClientID : app .ID ,
5648
+ DeviceCodePrefix : "testpref" ,
5649
+ UserCode : "TEST1234" ,
5650
+ VerificationUri : "http://example.com/device" ,
5651
+ })
5652
+ require .NoError (s .T (), err )
5653
+ check .Args (deviceCode .DeviceCodePrefix ).Asserts (deviceCode , policy .ActionRead ).Returns (deviceCode )
5654
+ }))
5655
+ s .Run ("GetOAuth2ProviderDeviceCodeByUserCode" , s .Subtest (func (db database.Store , check * expects ) {
5656
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5657
+ deviceCode , err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5658
+ ClientID : app .ID ,
5659
+ DeviceCodePrefix : "testpref" ,
5660
+ UserCode : "TEST1234" ,
5661
+ VerificationUri : "http://example.com/device" ,
5662
+ })
5663
+ require .NoError (s .T (), err )
5664
+ check .Args (deviceCode .UserCode ).Asserts (deviceCode , policy .ActionRead ).Returns (deviceCode )
5665
+ }))
5666
+ s .Run ("GetOAuth2ProviderDeviceCodesByClientID" , s .Subtest (func (db database.Store , check * expects ) {
5667
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5668
+ deviceCode , err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5669
+ ClientID : app .ID ,
5670
+ DeviceCodePrefix : "testpref" ,
5671
+ UserCode : "TEST1234" ,
5672
+ VerificationUri : "http://example.com/device" ,
5673
+ })
5674
+ require .NoError (s .T (), err )
5675
+ check .Args (app .ID ).Asserts (rbac .ResourceOauth2AppCodeToken , policy .ActionRead ).Returns ([]database.OAuth2ProviderDeviceCode {deviceCode })
5676
+ }))
5677
+ s .Run ("ConsumeOAuth2ProviderDeviceCodeByPrefix" , s .Subtest (func (db database.Store , check * expects ) {
5678
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5679
+ user := dbgen .User (s .T (), db , database.User {})
5680
+ // Use unique identifiers to avoid test isolation issues
5681
+ // Device code prefix must be exactly 8 characters
5682
+ uniquePrefix := fmt .Sprintf ("t%07d" , time .Now ().UnixNano ()% 10000000 )
5683
+ uniqueUserCode := fmt .Sprintf ("USER%04d" , time .Now ().UnixNano ()% 10000 )
5684
+ // Create device code using dbgen (now available!)
5685
+ deviceCode := dbgen .OAuth2ProviderDeviceCode (s .T (), db , database.OAuth2ProviderDeviceCode {
5686
+ DeviceCodePrefix : uniquePrefix ,
5687
+ UserCode : uniqueUserCode ,
5688
+ ClientID : app .ID ,
5689
+ ExpiresAt : time .Now ().Add (24 * time .Hour ), // Extended expiry for test stability
5690
+ })
5691
+ // Authorize the device code so it can be consumed
5692
+ deviceCode , err := db .UpdateOAuth2ProviderDeviceCodeAuthorization (s .T ().Context (), database.UpdateOAuth2ProviderDeviceCodeAuthorizationParams {
5693
+ ID : deviceCode .ID ,
5694
+ UserID : uuid.NullUUID {UUID : user .ID , Valid : true },
5695
+ Status : database .OAuth2DeviceStatusAuthorized ,
5696
+ })
5697
+ require .NoError (s .T (), err )
5698
+ require .Equal (s .T (), database .OAuth2DeviceStatusAuthorized , deviceCode .Status )
5699
+ check .Args (uniquePrefix ).Asserts (deviceCode , policy .ActionUpdate ).Returns (deviceCode )
5700
+ }))
5701
+ s .Run ("UpdateOAuth2ProviderDeviceCodeAuthorization" , s .Subtest (func (db database.Store , check * expects ) {
5702
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5703
+ user := dbgen .User (s .T (), db , database.User {})
5704
+ // Create device code using dbgen
5705
+ deviceCode := dbgen .OAuth2ProviderDeviceCode (s .T (), db , database.OAuth2ProviderDeviceCode {
5706
+ ClientID : app .ID ,
5707
+ })
5708
+ require .Equal (s .T (), database .OAuth2DeviceStatusPending , deviceCode .Status )
5709
+ check .Args (database.UpdateOAuth2ProviderDeviceCodeAuthorizationParams {
5710
+ ID : deviceCode .ID ,
5711
+ UserID : uuid.NullUUID {UUID : user .ID , Valid : true },
5712
+ Status : database .OAuth2DeviceStatusAuthorized ,
5713
+ }).Asserts (deviceCode , policy .ActionUpdate )
5714
+ }))
5715
+ s .Run ("DeleteOAuth2ProviderDeviceCodeByID" , s .Subtest (func (db database.Store , check * expects ) {
5716
+ app := dbgen .OAuth2ProviderApp (s .T (), db , database.OAuth2ProviderApp {})
5717
+ deviceCode , err := db .InsertOAuth2ProviderDeviceCode (context .Background (), database.InsertOAuth2ProviderDeviceCodeParams {
5718
+ ClientID : app .ID ,
5719
+ DeviceCodePrefix : "testpref" ,
5720
+ UserCode : "TEST1234" ,
5721
+ VerificationUri : "http://example.com/device" ,
5722
+ })
5723
+ require .NoError (s .T (), err )
5724
+ check .Args (deviceCode .ID ).Asserts (deviceCode , policy .ActionDelete )
5725
+ }))
5726
+ s .Run ("DeleteExpiredOAuth2ProviderDeviceCodes" , s .Subtest (func (db database.Store , check * expects ) {
5727
+ check .Args ().Asserts (rbac .ResourceSystem , policy .ActionDelete )
5728
+ }))
5729
+ }
5730
+
5609
5731
func (s * MethodTestSuite ) TestResourcesMonitor () {
5610
5732
createAgent := func (t * testing.T , db database.Store ) (database.WorkspaceAgent , database.WorkspaceTable ) {
5611
5733
t .Helper ()
0 commit comments