Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitceb15c5

Browse files
committed
add unit test to test expired keys
1 parentd068ae0 commitceb15c5

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

‎coderd/database/dbauthz/dbauthz_test.go‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ func (s *MethodTestSuite) TestAPIKey() {
216216
dbm.EXPECT().DeleteAPIKeyByID(gomock.Any(),key.ID).Return(nil).AnyTimes()
217217
check.Args(key.ID).Asserts(key,policy.ActionDelete).Returns()
218218
}))
219+
s.Run("DeleteExpiredAPIKeys",s.Mocked(func(dbm*dbmock.MockStore,faker*gofakeit.Faker,check*expects) {
220+
args:= database.DeleteExpiredAPIKeysParams{
221+
Before:time.Date(2025,11,21,0,0,0,0,time.UTC),
222+
LimitCount:1000,
223+
}
224+
dbm.EXPECT().DeleteExpiredAPIKeys(gomock.Any(),args).Return(nil,0).AnyTimes()
225+
check.Args(args).Asserts(rbac.ResourceApiKey,policy.ActionDelete).Returns()
226+
}))
219227
s.Run("GetAPIKeyByID",s.Mocked(func(dbm*dbmock.MockStore,faker*gofakeit.Faker,check*expects) {
220228
key:=testutil.Fake(s.T(),faker, database.APIKey{})
221229
dbm.EXPECT().GetAPIKeyByID(gomock.Any(),key.ID).Return(key,nil).AnyTimes()

‎coderd/database/dbgen/dbgen.go‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,13 @@ func APIKey(t testing.TB, db database.Store, seed database.APIKey, munge ...func
175175
}
176176
}
177177

178+
// It does not make sense for the created_at to be after the expires_at.
179+
// So if expires is set, change the default created_at to be 24 hours before.
180+
varcreatedAt time.Time
181+
if!seed.ExpiresAt.IsZero()&&seed.CreatedAt.IsZero() {
182+
createdAt=seed.ExpiresAt.Add(-24*time.Hour)
183+
}
184+
178185
params:= database.InsertAPIKeyParams{
179186
ID:takeFirst(seed.ID,id),
180187
// 0 defaults to 86400 at the db layer
@@ -184,7 +191,7 @@ func APIKey(t testing.TB, db database.Store, seed database.APIKey, munge ...func
184191
UserID:takeFirst(seed.UserID,uuid.New()),
185192
LastUsed:takeFirst(seed.LastUsed,dbtime.Now()),
186193
ExpiresAt:takeFirst(seed.ExpiresAt,dbtime.Now().Add(time.Hour)),
187-
CreatedAt:takeFirst(seed.CreatedAt,dbtime.Now()),
194+
CreatedAt:takeFirst(seed.CreatedAt,createdAt,dbtime.Now()),
188195
UpdatedAt:takeFirst(seed.UpdatedAt,dbtime.Now()),
189196
LoginType:takeFirst(seed.LoginType,database.LoginTypePassword),
190197
Scopes:takeFirstSlice([]database.APIKeyScope(seed.Scopes), []database.APIKeyScope{database.ApiKeyScopeCoderAll}),

‎coderd/database/querier_test.go‎

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7835,3 +7835,79 @@ func TestUpdateAIBridgeInterceptionEnded(t *testing.T) {
78357835
}
78367836
})
78377837
}
7838+
7839+
funcTestDeleteExpiredAPIKeys(t*testing.T) {
7840+
t.Parallel()
7841+
db,_:=dbtestutil.NewDB(t)
7842+
7843+
// Constant time for testing
7844+
now:=time.Date(2025,11,20,12,0,0,0,time.UTC)
7845+
expiredBefore:=now.Add(-time.Hour)// Anything before this is expired
7846+
7847+
ctx:=testutil.Context(t,testutil.WaitLong)
7848+
7849+
user:=dbgen.User(t,db, database.User{})
7850+
7851+
expiredTimes:= []time.Time{
7852+
expiredBefore.Add(-time.Hour*24*365),
7853+
expiredBefore.Add(-time.Hour*24),
7854+
expiredBefore.Add(-time.Hour),
7855+
expiredBefore.Add(-time.Minute),
7856+
expiredBefore.Add(-time.Second),
7857+
}
7858+
for_,exp:=rangeexpiredTimes {
7859+
// Expired api keys
7860+
dbgen.APIKey(t,db, database.APIKey{UserID:user.ID,ExpiresAt:exp})
7861+
}
7862+
7863+
unexpiredTimes:= []time.Time{
7864+
expiredBefore.Add(time.Hour*24*365),
7865+
expiredBefore.Add(time.Hour*24),
7866+
expiredBefore.Add(time.Hour),
7867+
expiredBefore.Add(time.Minute),
7868+
expiredBefore.Add(time.Second),
7869+
}
7870+
for_,unexp:=rangeunexpiredTimes {
7871+
// Unexpired api keys
7872+
dbgen.APIKey(t,db, database.APIKey{UserID:user.ID,ExpiresAt:unexp})
7873+
}
7874+
7875+
// All keys are present before deletion
7876+
keys,err:=db.GetAPIKeysByUserID(ctx, database.GetAPIKeysByUserIDParams{
7877+
LoginType:user.LoginType,
7878+
UserID:user.ID,
7879+
})
7880+
require.NoError(t,err)
7881+
require.Len(t,keys,len(expiredTimes)+len(unexpiredTimes))
7882+
7883+
// Delete expired keys
7884+
// First verify the limit works by deleting one at a time
7885+
err=db.DeleteExpiredAPIKeys(ctx, database.DeleteExpiredAPIKeysParams{
7886+
Before:expiredBefore,
7887+
LimitCount:1,
7888+
})
7889+
require.NoError(t,err)
7890+
7891+
// Ensure it was deleted
7892+
remaining,err:=db.GetAPIKeysByUserID(ctx, database.GetAPIKeysByUserIDParams{
7893+
LoginType:user.LoginType,
7894+
UserID:user.ID,
7895+
})
7896+
require.NoError(t,err)
7897+
require.Len(t,remaining,len(expiredTimes)+len(unexpiredTimes)-1)
7898+
7899+
// Delete the rest of the expired keys
7900+
err=db.DeleteExpiredAPIKeys(ctx, database.DeleteExpiredAPIKeysParams{
7901+
Before:expiredBefore,
7902+
LimitCount:100,
7903+
})
7904+
require.NoError(t,err)
7905+
7906+
// Ensure only unexpired keys remain
7907+
remaining,err=db.GetAPIKeysByUserID(ctx, database.GetAPIKeysByUserIDParams{
7908+
LoginType:user.LoginType,
7909+
UserID:user.ID,
7910+
})
7911+
require.NoError(t,err)
7912+
require.Len(t,remaining,len(unexpiredTimes))
7913+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp