44"context"
55"database/sql"
66"encoding/json"
7+ "errors"
78"fmt"
89"os"
910"reflect"
@@ -25,7 +26,6 @@ import (
2526"github.com/coder/coder/v2/coderd/coderdtest"
2627"github.com/coder/coder/v2/coderd/database"
2728"github.com/coder/coder/v2/coderd/database/dbgen"
28- "github.com/coder/coder/v2/coderd/database/dbmem"
2929"github.com/coder/coder/v2/coderd/database/dbtestutil"
3030"github.com/coder/coder/v2/coderd/database/dbtime"
3131"github.com/coder/coder/v2/coderd/prometheusmetrics"
@@ -51,13 +51,15 @@ func TestActiveUsers(t *testing.T) {
5151}{{
5252Name :"None" ,
5353Database :func (t * testing.T ) database.Store {
54- return dbmem .New ()
54+ db ,_ := dbtestutil .NewDB (t )
55+ return db
5556},
5657Count :0 ,
5758}, {
5859Name :"One" ,
5960Database :func (t * testing.T ) database.Store {
60- db := dbmem .New ()
61+ db ,_ := dbtestutil .NewDB (t )
62+ dbtestutil .DisableForeignKeysAndTriggers (t ,db )
6163dbgen .APIKey (t ,db , database.APIKey {
6264LastUsed :dbtime .Now (),
6365})
@@ -67,7 +69,8 @@ func TestActiveUsers(t *testing.T) {
6769}, {
6870Name :"OneWithExpired" ,
6971Database :func (t * testing.T ) database.Store {
70- db := dbmem .New ()
72+ db ,_ := dbtestutil .NewDB (t )
73+ dbtestutil .DisableForeignKeysAndTriggers (t ,db )
7174
7275dbgen .APIKey (t ,db , database.APIKey {
7376LastUsed :dbtime .Now (),
@@ -84,7 +87,8 @@ func TestActiveUsers(t *testing.T) {
8487}, {
8588Name :"Multiple" ,
8689Database :func (t * testing.T ) database.Store {
87- db := dbmem .New ()
90+ db ,_ := dbtestutil .NewDB (t )
91+ dbtestutil .DisableForeignKeysAndTriggers (t ,db )
8892dbgen .APIKey (t ,db , database.APIKey {
8993LastUsed :dbtime .Now (),
9094})
@@ -123,21 +127,22 @@ func TestUsers(t *testing.T) {
123127}{{
124128Name :"None" ,
125129Database :func (t * testing.T ) database.Store {
126- return dbmem .New ()
130+ db ,_ := dbtestutil .NewDB (t )
131+ return db
127132},
128133Count :map [database.UserStatus ]int {},
129134}, {
130135Name :"One" ,
131136Database :func (t * testing.T ) database.Store {
132- db := dbmem . New ( )
137+ db , _ := dbtestutil . NewDB ( t )
133138dbgen .User (t ,db , database.User {Status :database .UserStatusActive })
134139return db
135140},
136141Count :map [database.UserStatus ]int {database .UserStatusActive :1 },
137142}, {
138143Name :"MultipleStatuses" ,
139144Database :func (t * testing.T ) database.Store {
140- db := dbmem . New ( )
145+ db , _ := dbtestutil . NewDB ( t )
141146
142147dbgen .User (t ,db , database.User {Status :database .UserStatusActive })
143148dbgen .User (t ,db , database.User {Status :database .UserStatusDormant })
@@ -148,7 +153,7 @@ func TestUsers(t *testing.T) {
148153}, {
149154Name :"MultipleActive" ,
150155Database :func (t * testing.T ) database.Store {
151- db := dbmem . New ( )
156+ db , _ := dbtestutil . NewDB ( t )
152157dbgen .User (t ,db , database.User {Status :database .UserStatusActive })
153158dbgen .User (t ,db , database.User {Status :database .UserStatusActive })
154159dbgen .User (t ,db , database.User {Status :database .UserStatusActive })
@@ -216,20 +221,25 @@ func TestWorkspaceLatestBuildTotals(t *testing.T) {
216221Total int
217222Status map [codersdk.ProvisionerJobStatus ]int
218223}{{
219- Name :"None" ,
220- Database :dbmem .New ,
221- Total :0 ,
224+ Name :"None" ,
225+ Database :func () database.Store {
226+ db ,_ := dbtestutil .NewDB (t )
227+ return db
228+ },
229+ Total :0 ,
222230}, {
223231Name :"Multiple" ,
224232Database :func () database.Store {
225- db := dbmem .New ()
226- insertCanceled (t ,db )
227- insertFailed (t ,db )
228- insertFailed (t ,db )
229- insertSuccess (t ,db )
230- insertSuccess (t ,db )
231- insertSuccess (t ,db )
232- insertRunning (t ,db )
233+ db ,_ := dbtestutil .NewDB (t )
234+ u := dbgen .User (t ,db , database.User {})
235+ org := dbgen .Organization (t ,db , database.Organization {})
236+ insertCanceled (t ,db ,u ,org )
237+ insertFailed (t ,db ,u ,org )
238+ insertFailed (t ,db ,u ,org )
239+ insertSuccess (t ,db ,u ,org )
240+ insertSuccess (t ,db ,u ,org )
241+ insertSuccess (t ,db ,u ,org )
242+ insertRunning (t ,db ,u ,org )
233243return db
234244},
235245Total :7 ,
@@ -287,21 +297,26 @@ func TestWorkspaceLatestBuildStatuses(t *testing.T) {
287297ExpectedWorkspaces int
288298ExpectedStatuses map [codersdk.ProvisionerJobStatus ]int
289299}{{
290- Name :"None" ,
291- Database :dbmem .New ,
300+ Name :"None" ,
301+ Database :func () database.Store {
302+ db ,_ := dbtestutil .NewDB (t )
303+ return db
304+ },
292305ExpectedWorkspaces :0 ,
293306}, {
294307Name :"Multiple" ,
295308Database :func () database.Store {
296- db := dbmem .New ()
297- insertTemplates (t ,db )
298- insertCanceled (t ,db )
299- insertFailed (t ,db )
300- insertFailed (t ,db )
301- insertSuccess (t ,db )
302- insertSuccess (t ,db )
303- insertSuccess (t ,db )
304- insertRunning (t ,db )
309+ db ,_ := dbtestutil .NewDB (t )
310+ u := dbgen .User (t ,db , database.User {})
311+ org := dbgen .Organization (t ,db , database.Organization {})
312+ insertTemplates (t ,db ,u ,org )
313+ insertCanceled (t ,db ,u ,org )
314+ insertFailed (t ,db ,u ,org )
315+ insertFailed (t ,db ,u ,org )
316+ insertSuccess (t ,db ,u ,org )
317+ insertSuccess (t ,db ,u ,org )
318+ insertSuccess (t ,db ,u ,org )
319+ insertRunning (t ,db ,u ,org )
305320return db
306321},
307322ExpectedWorkspaces :7 ,
@@ -727,76 +742,102 @@ var (
727742templateVersionB = uuid .New ()
728743)
729744
730- func insertTemplates (t * testing.T ,db database.Store ) {
745+ func insertTemplates (t * testing.T ,db database.Store , u database. User , org database. Organization ) {
731746require .NoError (t ,db .InsertTemplate (context .Background (), database.InsertTemplateParams {
732747ID :templateA ,
733748Name :"template-a" ,
734749Provisioner :database .ProvisionerTypeTerraform ,
735750MaxPortSharingLevel :database .AppSharingLevelAuthenticated ,
751+ CreatedBy :u .ID ,
752+ OrganizationID :org .ID ,
736753}))
754+ pj := dbgen .ProvisionerJob (t ,db ,nil , database.ProvisionerJob {})
737755
738756require .NoError (t ,db .InsertTemplateVersion (context .Background (), database.InsertTemplateVersionParams {
739- ID :templateVersionA ,
740- TemplateID : uuid.NullUUID {UUID :templateA },
741- Name :"version-1a" ,
757+ ID :templateVersionA ,
758+ TemplateID : uuid.NullUUID {UUID :templateA },
759+ Name :"version-1a" ,
760+ JobID :pj .ID ,
761+ OrganizationID :org .ID ,
762+ CreatedBy :u .ID ,
742763}))
743764
744765require .NoError (t ,db .InsertTemplate (context .Background (), database.InsertTemplateParams {
745766ID :templateB ,
746767Name :"template-b" ,
747768Provisioner :database .ProvisionerTypeTerraform ,
748769MaxPortSharingLevel :database .AppSharingLevelAuthenticated ,
770+ CreatedBy :u .ID ,
771+ OrganizationID :org .ID ,
749772}))
750773
751774require .NoError (t ,db .InsertTemplateVersion (context .Background (), database.InsertTemplateVersionParams {
752- ID :templateVersionB ,
753- TemplateID : uuid.NullUUID {UUID :templateB },
754- Name :"version-1b" ,
775+ ID :templateVersionB ,
776+ TemplateID : uuid.NullUUID {UUID :templateB },
777+ Name :"version-1b" ,
778+ JobID :pj .ID ,
779+ OrganizationID :org .ID ,
780+ CreatedBy :u .ID ,
755781}))
756782}
757783
758- func insertUser (t * testing.T ,db database.Store ) database.User {
759- username ,err := cryptorand .String (8 )
760- require .NoError (t ,err )
761-
762- user ,err := db .InsertUser (context .Background (), database.InsertUserParams {
763- ID :uuid .New (),
764- Username :username ,
765- LoginType :database .LoginTypeNone ,
766- })
784+ func insertRunning (t * testing.T ,db database.Store ,u database.User ,org database.Organization ) database.ProvisionerJob {
785+ var templateID ,templateVersionID uuid.UUID
786+ rnd ,err := cryptorand .Intn (10 )
767787require .NoError (t ,err )
768788
769- return user
770- }
789+ pairs := []struct {
790+ tplID uuid.UUID
791+ versionID uuid.UUID
792+ }{
793+ {templateA ,templateVersionA },
794+ {templateB ,templateVersionB },
795+ }
796+ for _ ,pair := range pairs {
797+ _ ,err := db .GetTemplateByID (context .Background (),pair .tplID )
798+ if errors .Is (err ,sql .ErrNoRows ) {
799+ _ = dbgen .Template (t ,db , database.Template {
800+ ID :pair .tplID ,
801+ OrganizationID :org .ID ,
802+ CreatedBy :u .ID ,
803+ })
804+ _ = dbgen .TemplateVersion (t ,db , database.TemplateVersion {
805+ ID :pair .versionID ,
806+ OrganizationID :org .ID ,
807+ CreatedBy :u .ID ,
808+ })
809+ }else {
810+ require .NoError (t ,err )
811+ }
812+ }
771813
772- func insertRunning (t * testing.T ,db database.Store ) database.ProvisionerJob {
773- var template ,templateVersion uuid.UUID
774- rnd ,err := cryptorand .Intn (10 )
775- require .NoError (t ,err )
776814if rnd > 5 {
777- template = templateB
778- templateVersion = templateVersionB
815+ templateID = templateB
816+ templateVersionID = templateVersionB
779817}else {
780- template = templateA
781- templateVersion = templateVersionA
818+ templateID = templateA
819+ templateVersionID = templateVersionA
782820}
783821
784822workspace ,err := db .InsertWorkspace (context .Background (), database.InsertWorkspaceParams {
785823ID :uuid .New (),
786- OwnerID :insertUser ( t , db ) .ID ,
824+ OwnerID :u .ID ,
787825Name :uuid .NewString (),
788- TemplateID :template ,
826+ TemplateID :templateID ,
789827AutomaticUpdates :database .AutomaticUpdatesNever ,
828+ OrganizationID :org .ID ,
790829})
791830require .NoError (t ,err )
792831
793832job ,err := db .InsertProvisionerJob (context .Background (), database.InsertProvisionerJobParams {
794- ID :uuid .New (),
795- CreatedAt :dbtime .Now (),
796- UpdatedAt :dbtime .Now (),
797- Provisioner :database .ProvisionerTypeEcho ,
798- StorageMethod :database .ProvisionerStorageMethodFile ,
799- Type :database .ProvisionerJobTypeWorkspaceBuild ,
833+ ID :uuid .New (),
834+ CreatedAt :dbtime .Now (),
835+ UpdatedAt :dbtime .Now (),
836+ Provisioner :database .ProvisionerTypeEcho ,
837+ StorageMethod :database .ProvisionerStorageMethodFile ,
838+ Type :database .ProvisionerJobTypeWorkspaceBuild ,
839+ Input :json .RawMessage ("{}" ),
840+ OrganizationID :org .ID ,
800841})
801842require .NoError (t ,err )
802843err = db .InsertWorkspaceBuild (context .Background (), database.InsertWorkspaceBuildParams {
@@ -806,7 +847,7 @@ func insertRunning(t *testing.T, db database.Store) database.ProvisionerJob {
806847BuildNumber :1 ,
807848Transition :database .WorkspaceTransitionStart ,
808849Reason :database .BuildReasonInitiator ,
809- TemplateVersionID :templateVersion ,
850+ TemplateVersionID :templateVersionID ,
810851})
811852require .NoError (t ,err )
812853// This marks the job as started.
@@ -816,14 +857,15 @@ func insertRunning(t *testing.T, db database.Store) database.ProvisionerJob {
816857Time :dbtime .Now (),
817858Valid :true ,
818859},
819- Types : []database.ProvisionerType {database .ProvisionerTypeEcho },
860+ Types : []database.ProvisionerType {database .ProvisionerTypeEcho },
861+ ProvisionerTags :must (json .Marshal (job .Tags )),
820862})
821863require .NoError (t ,err )
822864return job
823865}
824866
825- func insertCanceled (t * testing.T ,db database.Store ) {
826- job := insertRunning (t ,db )
867+ func insertCanceled (t * testing.T ,db database.Store , u database. User , org database. Organization ) {
868+ job := insertRunning (t ,db , u , org )
827869err := db .UpdateProvisionerJobWithCancelByID (context .Background (), database.UpdateProvisionerJobWithCancelByIDParams {
828870ID :job .ID ,
829871CanceledAt : sql.NullTime {
@@ -842,8 +884,8 @@ func insertCanceled(t *testing.T, db database.Store) {
842884require .NoError (t ,err )
843885}
844886
845- func insertFailed (t * testing.T ,db database.Store ) {
846- job := insertRunning (t ,db )
887+ func insertFailed (t * testing.T ,db database.Store , u database. User , org database. Organization ) {
888+ job := insertRunning (t ,db , u , org )
847889err := db .UpdateProvisionerJobWithCompleteByID (context .Background (), database.UpdateProvisionerJobWithCompleteByIDParams {
848890ID :job .ID ,
849891CompletedAt : sql.NullTime {
@@ -858,8 +900,8 @@ func insertFailed(t *testing.T, db database.Store) {
858900require .NoError (t ,err )
859901}
860902
861- func insertSuccess (t * testing.T ,db database.Store ) {
862- job := insertRunning (t ,db )
903+ func insertSuccess (t * testing.T ,db database.Store , u database. User , org database. Organization ) {
904+ job := insertRunning (t ,db , u , org )
863905err := db .UpdateProvisionerJobWithCompleteByID (context .Background (), database.UpdateProvisionerJobWithCompleteByIDParams {
864906ID :job .ID ,
865907CompletedAt : sql.NullTime {