@@ -9,6 +9,18 @@ import (
99 "github.com/stretchr/testify/require"
1010)
1111
12+ func createToken (t * testing.T , s * testutil.State ) string {
13+ t .Helper ()
14+ uid := testutil .UniqueID ()
15+ body , err := s .Post ("/v1/gittokens" , map [string ]any {
16+ "name" : "Token " + uid ,
17+ "provider" : "github" ,
18+ "token" : "ghp_test1234567890abcd" ,
19+ })
20+ require .NoError (t , err )
21+ return fmt .Sprintf ("%.0f" , body ["id" ].(float64 ))
22+ }
23+
1224func TestDelete_success (t * testing.T ) {
1325 t .Parallel ()
1426 s := testutil .NewAuthState (t )
@@ -34,6 +46,40 @@ func TestDelete_notFound(t *testing.T) {
3446 testutil .RequireStatus (t , err , http .StatusNotFound )
3547}
3648
49+ func TestDelete_blockedWhenInUse (t * testing.T ) {
50+ t .Parallel ()
51+ s := testutil .NewAuthState (t )
52+
53+ // Create a token
54+ uid := testutil .UniqueID ()
55+ tokenBody , err := s .Post ("/v1/gittokens" , map [string ]any {
56+ "name" : "In-Use Token " + uid ,
57+ "provider" : "github" ,
58+ "token" : "ghp_test1234567890abcd" ,
59+ })
60+ require .NoError (t , err )
61+ tokenIDFloat := tokenBody ["id" ].(float64 )
62+ tokenID := fmt .Sprintf ("%.0f" , tokenIDFloat )
63+
64+ // Create a workspace and a private repo referencing the token
65+ wsBody , err := s .Post ("/v1/workspaces" , map [string ]any {
66+ "name" : "Token In Use WS " + uid ,
67+ })
68+ require .NoError (t , err )
69+ wid := fmt .Sprintf ("%.0f" , wsBody ["id" ].(float64 ))
70+
71+ _ , err = s .Post ("/v1/workspaces/" + wid + "/repos" , map [string ]any {
72+ "url" : "https://github.com/example/private-" + uid ,
73+ "is_private" : true ,
74+ "git_token_id" : tokenIDFloat ,
75+ })
76+ require .NoError (t , err )
77+
78+ // Delete should be blocked
79+ deleteErr := s .DeleteStatus ("/v1/gittokens/" + tokenID )
80+ testutil .RequireStatus (t , deleteErr , http .StatusConflict )
81+ }
82+
3783func TestDelete_requiresAuth (t * testing.T ) {
3884 t .Parallel ()
3985 s := testutil .NewState (t )
0 commit comments