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

Commit67a314b

Browse files
test: improve test coverage
1 parent53a2263 commit67a314b

File tree

2 files changed

+173
-105
lines changed

2 files changed

+173
-105
lines changed

‎coderd/database/dbauthz/dbauthz.go

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,9 @@ func As(ctx context.Context, actor rbac.Subject) context.Context {
512512
// running the insertFunc. The insertFunc is expected to return the object that
513513
// was inserted.
514514
funcinsert[
515-
ObjectTypeany,
516-
ArgumentTypeany,
517-
Insertfunc(ctx context.Context,argArgumentType) (ObjectType,error),
515+
ObjectTypeany,
516+
ArgumentTypeany,
517+
Insertfunc(ctx context.Context,argArgumentType) (ObjectType,error),
518518
](
519519
logger slog.Logger,
520520
authorizer rbac.Authorizer,
@@ -525,9 +525,9 @@ Insert func(ctx context.Context, arg ArgumentType) (ObjectType, error),
525525
}
526526

527527
funcinsertWithAction[
528-
ObjectTypeany,
529-
ArgumentTypeany,
530-
Insertfunc(ctx context.Context,argArgumentType) (ObjectType,error),
528+
ObjectTypeany,
529+
ArgumentTypeany,
530+
Insertfunc(ctx context.Context,argArgumentType) (ObjectType,error),
531531
](
532532
logger slog.Logger,
533533
authorizer rbac.Authorizer,
@@ -554,10 +554,10 @@ Insert func(ctx context.Context, arg ArgumentType) (ObjectType, error),
554554
}
555555

556556
funcdeleteQ[
557-
ObjectType rbac.Objecter,
558-
ArgumentTypeany,
559-
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
560-
Deletefunc(ctx context.Context,argArgumentType)error,
557+
ObjectType rbac.Objecter,
558+
ArgumentTypeany,
559+
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
560+
Deletefunc(ctx context.Context,argArgumentType)error,
561561
](
562562
logger slog.Logger,
563563
authorizer rbac.Authorizer,
@@ -569,10 +569,10 @@ Delete func(ctx context.Context, arg ArgumentType) error,
569569
}
570570

571571
funcupdateWithReturn[
572-
ObjectType rbac.Objecter,
573-
ArgumentTypeany,
574-
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
575-
UpdateQueryfunc(ctx context.Context,argArgumentType) (ObjectType,error),
572+
ObjectType rbac.Objecter,
573+
ArgumentTypeany,
574+
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
575+
UpdateQueryfunc(ctx context.Context,argArgumentType) (ObjectType,error),
576576
](
577577
logger slog.Logger,
578578
authorizer rbac.Authorizer,
@@ -583,10 +583,10 @@ UpdateQuery func(ctx context.Context, arg ArgumentType) (ObjectType, error),
583583
}
584584

585585
funcupdate[
586-
ObjectType rbac.Objecter,
587-
ArgumentTypeany,
588-
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
589-
Execfunc(ctx context.Context,argArgumentType)error,
586+
ObjectType rbac.Objecter,
587+
ArgumentTypeany,
588+
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
589+
Execfunc(ctx context.Context,argArgumentType)error,
590590
](
591591
logger slog.Logger,
592592
authorizer rbac.Authorizer,
@@ -604,9 +604,9 @@ Exec func(ctx context.Context, arg ArgumentType) error,
604604
// user cannot read the resource. This is because the resource details are
605605
// required to run a proper authorization check.
606606
funcfetchWithAction[
607-
ArgumentTypeany,
608-
ObjectType rbac.Objecter,
609-
DatabaseFuncfunc(ctx context.Context,argArgumentType) (ObjectType,error),
607+
ArgumentTypeany,
608+
ObjectType rbac.Objecter,
609+
DatabaseFuncfunc(ctx context.Context,argArgumentType) (ObjectType,error),
610610
](
611611
logger slog.Logger,
612612
authorizer rbac.Authorizer,
@@ -637,9 +637,9 @@ DatabaseFunc func(ctx context.Context, arg ArgumentType) (ObjectType, error),
637637
}
638638

639639
funcfetch[
640-
ArgumentTypeany,
641-
ObjectType rbac.Objecter,
642-
DatabaseFuncfunc(ctx context.Context,argArgumentType) (ObjectType,error),
640+
ArgumentTypeany,
641+
ObjectType rbac.Objecter,
642+
DatabaseFuncfunc(ctx context.Context,argArgumentType) (ObjectType,error),
643643
](
644644
logger slog.Logger,
645645
authorizer rbac.Authorizer,
@@ -652,10 +652,10 @@ DatabaseFunc func(ctx context.Context, arg ArgumentType) (ObjectType, error),
652652
// from SQL 'exec' functions which only return an error.
653653
// See fetchAndQuery for more information.
654654
funcfetchAndExec[
655-
ObjectType rbac.Objecter,
656-
ArgumentTypeany,
657-
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
658-
Execfunc(ctx context.Context,argArgumentType)error,
655+
ObjectType rbac.Objecter,
656+
ArgumentTypeany,
657+
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
658+
Execfunc(ctx context.Context,argArgumentType)error,
659659
](
660660
logger slog.Logger,
661661
authorizer rbac.Authorizer,
@@ -678,10 +678,10 @@ Exec func(ctx context.Context, arg ArgumentType) error,
678678
// **before** the query runs. The returns from the fetch are only used to
679679
// assert rbac. The final return of this function comes from the Query function.
680680
funcfetchAndQuery[
681-
ObjectType rbac.Objecter,
682-
ArgumentTypeany,
683-
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
684-
Queryfunc(ctx context.Context,argArgumentType) (ObjectType,error),
681+
ObjectType rbac.Objecter,
682+
ArgumentTypeany,
683+
Fetchfunc(ctx context.Context,argArgumentType) (ObjectType,error),
684+
Queryfunc(ctx context.Context,argArgumentType) (ObjectType,error),
685685
](
686686
logger slog.Logger,
687687
authorizer rbac.Authorizer,
@@ -715,9 +715,9 @@ Query func(ctx context.Context, arg ArgumentType) (ObjectType, error),
715715
// fetchWithPostFilter is like fetch, but works with lists of objects.
716716
// SQL filters are much more optimal.
717717
funcfetchWithPostFilter[
718-
ArgumentTypeany,
719-
ObjectType rbac.Objecter,
720-
DatabaseFuncfunc(ctx context.Context,argArgumentType) ([]ObjectType,error),
718+
ArgumentTypeany,
719+
ObjectType rbac.Objecter,
720+
DatabaseFuncfunc(ctx context.Context,argArgumentType) ([]ObjectType,error),
721721
](
722722
authorizer rbac.Authorizer,
723723
action policy.Action,

‎enterprise/coderd/prebuilds/reconcile_test.go

Lines changed: 138 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -521,89 +521,150 @@ func TestMultiplePresetsPerTemplateVersion(t *testing.T) {
521521
}
522522
}
523523

524-
funcTestMultiplePresetsPerTemplateVersionV2(t*testing.T) {
524+
funcTestPrebuildAutoscaling(t*testing.T) {
525525
t.Parallel()
526526

527527
if!dbtestutil.WillUsePostgres() {
528528
t.Skip("This test requires postgres")
529529
}
530530

531-
//prebuildLatestTransition := database.WorkspaceTransitionStart
532-
//prebuildJobStatus := database.ProvisionerJobStatusRunning
533531
templateDeleted:=false
534532

535-
clock:=quartz.NewMock(t)
536-
ctx:=testutil.Context(t,testutil.WaitShort)
537-
cfg:= codersdk.PrebuildsConfig{}
538-
logger:=slogtest.Make(
539-
t,&slogtest.Options{IgnoreErrors:true},
540-
).Leveled(slog.LevelDebug)
541-
db,pubSub:=dbtestutil.NewDB(t)
542-
controller:=prebuilds.NewStoreReconciler(db,pubSub,cfg,logger,quartz.NewMock(t),prometheus.NewRegistry(),newNoopEnqueuer())
533+
// The test includes 2 presets, each with 2 schedules.
534+
// It checks that the number of created prebuilds match expectations for various provided times,
535+
// based on the corresponding schedules.
536+
testCases:= []struct {
537+
namestring
538+
// now specifies the current time.
539+
now time.Time
540+
// expected prebuild counts for preset1 and preset2, respectively.
541+
expectedPrebuildCounts []int
542+
}{
543+
{
544+
name:"Before the 1st schedule",
545+
now:mustParseTime(t,time.RFC1123,"Mon, 02 Jun 2025 01:00:00 UTC"),
546+
expectedPrebuildCounts: []int{1,1},
547+
},
548+
{
549+
name:"1st schedule",
550+
now:mustParseTime(t,time.RFC1123,"Mon, 02 Jun 2025 03:00:00 UTC"),
551+
expectedPrebuildCounts: []int{2,1},
552+
},
553+
{
554+
name:"2nd schedule",
555+
now:mustParseTime(t,time.RFC1123,"Mon, 02 Jun 2025 07:00:00 UTC"),
556+
expectedPrebuildCounts: []int{3,1},
557+
},
558+
{
559+
name:"3rd schedule",
560+
now:mustParseTime(t,time.RFC1123,"Mon, 02 Jun 2025 11:00:00 UTC"),
561+
expectedPrebuildCounts: []int{1,4},
562+
},
563+
{
564+
name:"4th schedule",
565+
now:mustParseTime(t,time.RFC1123,"Mon, 02 Jun 2025 15:00:00 UTC"),
566+
expectedPrebuildCounts: []int{1,5},
567+
},
568+
}
543569

544-
ownerID:=uuid.New()
545-
dbgen.User(t,db, database.User{
546-
ID:ownerID,
547-
})
548-
org,template:=setupTestDBTemplate(t,db,ownerID,templateDeleted)
549-
templateVersionID:=setupTestDBTemplateVersion(
550-
ctx,
551-
t,
552-
clock,
553-
db,
554-
pubSub,
555-
org.ID,
556-
ownerID,
557-
template.ID,
558-
)
559-
preset:=setupTestDBPresetWithAutoscaling(
560-
t,
561-
db,
562-
templateVersionID,
563-
4,
564-
uuid.New().String(),
565-
true,
566-
"UTC",
567-
)
568-
preset2:=setupTestDBPresetWithAutoscaling(
569-
t,
570-
db,
571-
templateVersionID,
572-
10,
573-
uuid.New().String(),
574-
true,
575-
"UTC",
576-
)
570+
for_,tc:=rangetestCases {
571+
t.Run(tc.name,func(t*testing.T) {
572+
t.Parallel()
573+
clock:=quartz.NewMock(t)
574+
clock.Set(tc.now)
575+
ctx:=testutil.Context(t,testutil.WaitShort)
576+
cfg:= codersdk.PrebuildsConfig{}
577+
logger:=slogtest.Make(
578+
t,&slogtest.Options{IgnoreErrors:true},
579+
).Leveled(slog.LevelDebug)
580+
db,pubSub:=dbtestutil.NewDB(t)
581+
controller:=prebuilds.NewStoreReconciler(db,pubSub,cfg,logger,clock,prometheus.NewRegistry(),newNoopEnqueuer())
577582

578-
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
579-
PresetID:preset.ID,
580-
CronExpression:"* 2-4 * * 1-5",
581-
Instances:2,
582-
})
583-
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
584-
PresetID:preset.ID,
585-
CronExpression:"* 6-8 * * 1-5",
586-
Instances:3,
587-
})
588-
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
589-
PresetID:preset.ID,
590-
CronExpression:"* 10-12 * * 1-5",
591-
Instances:4,
592-
})
593-
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
594-
PresetID:preset.ID,
595-
CronExpression:"* 14-16 * * 1-5",
596-
Instances:5,
597-
})
583+
ownerID:=uuid.New()
584+
dbgen.User(t,db, database.User{
585+
ID:ownerID,
586+
})
587+
org,template:=setupTestDBTemplate(t,db,ownerID,templateDeleted)
588+
templateVersionID:=setupTestDBTemplateVersion(
589+
ctx,
590+
t,
591+
clock,
592+
db,
593+
pubSub,
594+
org.ID,
595+
ownerID,
596+
template.ID,
597+
)
598+
preset1:=setupTestDBPresetWithAutoscaling(
599+
t,
600+
db,
601+
templateVersionID,
602+
1,
603+
uuid.New().String(),
604+
true,
605+
"UTC",
606+
)
607+
preset2:=setupTestDBPresetWithAutoscaling(
608+
t,
609+
db,
610+
templateVersionID,
611+
1,
612+
uuid.New().String(),
613+
true,
614+
"UTC",
615+
)
598616

599-
err:=controller.ReconcileAll(ctx)
600-
require.NoError(t,err)
617+
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
618+
PresetID:preset1.ID,
619+
CronExpression:"* 2-4 * * 1-5",
620+
Instances:2,
621+
})
622+
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
623+
PresetID:preset1.ID,
624+
CronExpression:"* 6-8 * * 1-5",
625+
Instances:3,
626+
})
627+
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
628+
PresetID:preset2.ID,
629+
CronExpression:"* 10-12 * * 1-5",
630+
Instances:4,
631+
})
632+
dbgen.PresetPrebuildSchedule(t,db, database.InsertPresetPrebuildScheduleParams{
633+
PresetID:preset2.ID,
634+
CronExpression:"* 14-16 * * 1-5",
635+
Instances:5,
636+
})
601637

602-
workspaces,err:=db.GetWorkspacesByTemplateID(ctx,template.ID)
603-
require.NoError(t,err)
604-
prebuildCount:=len(workspaces)
638+
err:=controller.ReconcileAll(ctx)
639+
require.NoError(t,err)
640+
641+
// get workspace builds
642+
workspaces,err:=db.GetWorkspacesByTemplateID(ctx,template.ID)
643+
workspaceIDs:=make([]uuid.UUID,0,len(workspaces))
644+
for_,workspace:=rangeworkspaces {
645+
workspaceIDs=append(workspaceIDs,workspace.ID)
646+
}
647+
workspaceBuilds,err:=db.GetLatestWorkspaceBuildsByWorkspaceIDs(ctx,workspaceIDs)
648+
require.NoError(t,err)
649+
650+
// calculate number of workspace builds per preset
651+
var (
652+
preset1PrebuildCountint
653+
preset2PrebuildCountint
654+
)
655+
for_,workspaceBuild:=rangeworkspaceBuilds {
656+
ifpreset1.ID==workspaceBuild.TemplateVersionPresetID.UUID {
657+
preset1PrebuildCount++
658+
}
659+
ifpreset2.ID==workspaceBuild.TemplateVersionPresetID.UUID {
660+
preset2PrebuildCount++
661+
}
662+
}
605663

606-
require.Equal(t,preset.DesiredInstances.Int32+preset2.DesiredInstances.Int32,int32(prebuildCount))// nolint:gosec
664+
require.Equal(t,tc.expectedPrebuildCounts[0],preset1PrebuildCount)
665+
require.Equal(t,tc.expectedPrebuildCounts[1],preset2PrebuildCount)
666+
})
667+
}
607668
}
608669

609670
funcTestInvalidPreset(t*testing.T) {
@@ -1810,3 +1871,10 @@ func allJobStatusesExcept(except ...database.ProvisionerJobStatus) []database.Pr
18101871
return!slice.Contains(allJobStatuses,status)
18111872
})
18121873
}
1874+
1875+
funcmustParseTime(t*testing.T,layout,valuestring) time.Time {
1876+
t.Helper()
1877+
parsedTime,err:=time.Parse(layout,value)
1878+
require.NoError(t,err)
1879+
returnparsedTime
1880+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp