@@ -5423,6 +5423,19 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppCodes() {
54235423UserID :user .ID ,
54245424}).Asserts (rbac .ResourceOauth2AppCodeToken .WithOwner (user .ID .String ()),policy .ActionDelete )
54255425}))
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+ }))
54265439}
54275440
54285441func (s * MethodTestSuite )TestOAuth2ProviderAppTokens () {
@@ -5498,6 +5511,110 @@ func (s *MethodTestSuite) TestOAuth2ProviderAppTokens() {
54985511}))
54995512}
55005513
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+
55015618func (s * MethodTestSuite )TestResourcesMonitor () {
55025619createAgent := func (t * testing.T ,db database.Store ) (database.WorkspaceAgent , database.WorkspaceTable ) {
55035620t .Helper ()