From 5feed29df7b85c0aa3ecc97d7b16f78604dbfa85 Mon Sep 17 00:00:00 2001 From: Sung Date: Sat, 25 Oct 2025 18:16:20 -0700 Subject: [PATCH] Simplify CLI test db teardown --- Makefile | 2 +- pkg/cli/cmd/sync/sync_test.go | 37 ++------ pkg/cli/context/testutils.go | 43 ++++----- .../generate-schema.go => schema/main.go} | 2 +- .../main_test.go} | 0 pkg/cli/database/testutils.go | 18 +--- pkg/cli/main_test.go | 7 -- pkg/cli/migrate/legacy_test.go | 1 - pkg/cli/migrate/migrate_test.go | 93 +++++-------------- pkg/cli/ui/editor_test.go | 21 +---- pkg/clock/clock.go | 8 +- pkg/server/app/notes_test.go | 6 +- 12 files changed, 71 insertions(+), 167 deletions(-) rename pkg/cli/database/{cmd/generate-schema.go => schema/main.go} (98%) rename pkg/cli/database/{cmd/generate-schema_test.go => schema/main_test.go} (100%) diff --git a/Makefile b/Makefile index 75d50f41..c38819c0 100644 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ generate-cli-schema: @echo "==> generating CLI database schema" @mkdir -p pkg/cli/database @touch pkg/cli/database/schema.sql - @go run -tags fts5 pkg/cli/database/cmd/generate-schema.go + @go run -tags fts5 ./pkg/cli/database/schema .PHONY: generate-cli-schema build-cli: generate-cli-schema diff --git a/pkg/cli/cmd/sync/sync_test.go b/pkg/cli/cmd/sync/sync_test.go index aff1ae5e..828179f5 100644 --- a/pkg/cli/cmd/sync/sync_test.go +++ b/pkg/cli/cmd/sync/sync_test.go @@ -36,16 +36,6 @@ import ( "github.com/pkg/errors" ) -// getTestPaths creates unique test paths for parallel test execution -func getTestPaths(t *testing.T) context.Paths { - testDir := t.TempDir() - return context.Paths{ - Home: testDir, - Cache: testDir, - Config: testDir, - Data: testDir, - } -} func TestProcessFragments(t *testing.T) { fragments := []client.SyncFragment{ @@ -1848,8 +1838,7 @@ func TestSaveServerState(t *testing.T) { // are updated accordingly based on the server response. func TestSendBooks(t *testing.T) { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) db := ctx.DB @@ -2081,9 +2070,8 @@ func TestSendBooks_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) + ctx := context.InitTestCtx(t) ctx.APIEndpoint = ts.URL - defer context.TeardownTestCtx(t, ctx) testutils.Login(t, &ctx) db := ctx.DB @@ -2129,9 +2117,8 @@ func TestSendBooks_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) + ctx := context.InitTestCtx(t) ctx.APIEndpoint = ts.URL - defer context.TeardownTestCtx(t, ctx) testutils.Login(t, &ctx) db := ctx.DB @@ -2177,9 +2164,8 @@ func TestSendBooks_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) + ctx := context.InitTestCtx(t) ctx.APIEndpoint = ts.URL - defer context.TeardownTestCtx(t, ctx) testutils.Login(t, &ctx) db := ctx.DB @@ -2212,8 +2198,7 @@ func TestSendBooks_isBehind(t *testing.T) { // uuid from the incoming data. func TestSendNotes(t *testing.T) { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) db := ctx.DB @@ -2365,8 +2350,7 @@ func TestSendNotes(t *testing.T) { func TestSendNotes_addedOn(t *testing.T) { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) db := ctx.DB @@ -2497,8 +2481,7 @@ func TestSendNotes_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) ctx.APIEndpoint = ts.URL @@ -2546,8 +2529,7 @@ func TestSendNotes_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) ctx.APIEndpoint = ts.URL @@ -2595,8 +2577,7 @@ func TestSendNotes_isBehind(t *testing.T) { for idx, tc := range testCases { func() { // set up - ctx := context.InitTestCtx(t, getTestPaths(t)) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) testutils.Login(t, &ctx) ctx.APIEndpoint = ts.URL diff --git a/pkg/cli/context/testutils.go b/pkg/cli/context/testutils.go index b7b99fd0..17d11847 100644 --- a/pkg/cli/context/testutils.go +++ b/pkg/cli/context/testutils.go @@ -29,6 +29,17 @@ import ( "github.com/pkg/errors" ) +// getDefaultTestPaths creates default test paths with all paths pointing to a temp directory +func getDefaultTestPaths(t *testing.T) Paths { + tmpDir := t.TempDir() + return Paths{ + Home: tmpDir, + Cache: tmpDir, + Config: tmpDir, + Data: tmpDir, + } +} + // createTestDirectories creates test directories for the given paths func createTestDirectories(t *testing.T, paths Paths) { if paths.Config != "" { @@ -52,7 +63,9 @@ func createTestDirectories(t *testing.T, paths Paths) { } // InitTestCtx initializes a test context with an in-memory database -func InitTestCtx(t *testing.T, paths Paths) DnoteCtx { +// and a temporary directory for all paths +func InitTestCtx(t *testing.T) DnoteCtx { + paths := getDefaultTestPaths(t) db := database.InitTestMemoryDB(t) createTestDirectories(t, paths) @@ -63,9 +76,11 @@ func InitTestCtx(t *testing.T, paths Paths) DnoteCtx { } } -// InitTestCtxWithDB initializes a test context with the provided database. +// InitTestCtxWithDB initializes a test context with the provided database +// and a temporary directory for all paths. // Used when you need full control over database initialization (e.g. migration tests). -func InitTestCtxWithDB(t *testing.T, paths Paths, db *database.DB) DnoteCtx { +func InitTestCtxWithDB(t *testing.T, db *database.DB) DnoteCtx { + paths := getDefaultTestPaths(t) createTestDirectories(t, paths) return DnoteCtx{ @@ -76,9 +91,9 @@ func InitTestCtxWithDB(t *testing.T, paths Paths, db *database.DB) DnoteCtx { } // InitTestCtxWithFileDB initializes a test context with a file-based database -// at the expected XDG path. This is used for e2e tests that spawn CLI processes -// which need to access the database file. -func InitTestCtxWithFileDB(t *testing.T, paths Paths) DnoteCtx { +// at the expected path. +func InitTestCtxWithFileDB(t *testing.T) DnoteCtx { + paths := getDefaultTestPaths(t) createTestDirectories(t, paths) dbPath := filepath.Join(paths.Data, consts.DnoteDirName, consts.DnoteDBFileName) @@ -92,6 +107,7 @@ func InitTestCtxWithFileDB(t *testing.T, paths Paths) DnoteCtx { } database.MarkMigrationComplete(t, db) + t.Cleanup(func() { db.Close() }) return DnoteCtx{ DB: db, @@ -99,18 +115,3 @@ func InitTestCtxWithFileDB(t *testing.T, paths Paths) DnoteCtx { Clock: clock.NewMock(), // Use a mock clock to test times } } - -// TeardownTestCtx cleans up the test context -func TeardownTestCtx(t *testing.T, ctx DnoteCtx) { - database.TeardownTestDB(t, ctx.DB) - - if err := os.RemoveAll(ctx.Paths.Data); err != nil { - t.Fatal(errors.Wrap(err, "removing test data directory")) - } - if err := os.RemoveAll(ctx.Paths.Config); err != nil { - t.Fatal(errors.Wrap(err, "removing test config directory")) - } - if err := os.RemoveAll(ctx.Paths.Cache); err != nil { - t.Fatal(errors.Wrap(err, "removing test cache directory")) - } -} diff --git a/pkg/cli/database/cmd/generate-schema.go b/pkg/cli/database/schema/main.go similarity index 98% rename from pkg/cli/database/cmd/generate-schema.go rename to pkg/cli/database/schema/main.go index 4bedaeaa..e4e219de 100644 --- a/pkg/cli/database/cmd/generate-schema.go +++ b/pkg/cli/database/schema/main.go @@ -16,7 +16,7 @@ * along with Dnote. If not, see . */ -// generate-schema creates a schema.sql file +// Command schema generates the CLI database schema.sql file. package main import ( diff --git a/pkg/cli/database/cmd/generate-schema_test.go b/pkg/cli/database/schema/main_test.go similarity index 100% rename from pkg/cli/database/cmd/generate-schema_test.go rename to pkg/cli/database/schema/main_test.go diff --git a/pkg/cli/database/testutils.go b/pkg/cli/database/testutils.go index fb631c62..602a48ba 100644 --- a/pkg/cli/database/testutils.go +++ b/pkg/cli/database/testutils.go @@ -22,7 +22,6 @@ import ( "database/sql" _ "embed" "fmt" - "os" "path/filepath" "testing" @@ -67,8 +66,8 @@ func InitTestMemoryDB(t *testing.T) *DB { // InitTestFileDB initializes a file-based test database with the default schema. func InitTestFileDB(t *testing.T) (*DB, string) { dbPath := filepath.Join(t.TempDir(), "dnote.db") - - return InitTestFileDBRaw(t, dbPath), dbPath + db := InitTestFileDBRaw(t, dbPath) + return db, dbPath } // InitTestFileDBRaw initializes a file-based test database at the specified path with the default schema. @@ -84,6 +83,7 @@ func InitTestFileDBRaw(t *testing.T, dbPath string) *DB { MarkMigrationComplete(t, db) + t.Cleanup(func() { db.Close() }) return db } @@ -109,20 +109,10 @@ func InitTestMemoryDBRaw(t *testing.T, schemaPath string) *DB { t.Fatal(errors.Wrap(err, "running schema sql")) } + t.Cleanup(func() { db.Close() }) return db } -// TeardownTestDB closes the test database and removes the its file -func TeardownTestDB(t *testing.T, db *DB) { - if err := db.Close(); err != nil { - t.Fatal(errors.Wrap(err, "closing database")) - } - - if err := os.RemoveAll(db.Filepath); err != nil { - t.Fatal(errors.Wrap(err, "removing database file")) - } -} - // OpenTestDB opens the database connection to a test database // without initializing any schema func OpenTestDB(t *testing.T, dnoteDir string) *DB { diff --git a/pkg/cli/main_test.go b/pkg/cli/main_test.go index 660a5e35..0d9ad71a 100644 --- a/pkg/cli/main_test.go +++ b/pkg/cli/main_test.go @@ -146,7 +146,6 @@ func TestAddNote(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup3(t, db) // Execute @@ -189,7 +188,6 @@ func TestEditNote(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup4(t, db) // Execute @@ -224,7 +222,6 @@ func TestEditNote(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup5(t, db) // Execute @@ -260,7 +257,6 @@ func TestEditNote(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup5(t, db) // Execute @@ -298,7 +294,6 @@ func TestEditBook(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup1(t, db) // Execute @@ -359,7 +354,6 @@ func TestRemoveNote(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup2(t, db) // Execute @@ -448,7 +442,6 @@ func TestRemoveBook(t *testing.T) { // Setup db, dbPath := database.InitTestFileDB(t) - defer database.TeardownTestDB(t, db) testutils.Setup2(t, db) // Execute diff --git a/pkg/cli/migrate/legacy_test.go b/pkg/cli/migrate/legacy_test.go index cdc5baf5..4d1a1dc6 100644 --- a/pkg/cli/migrate/legacy_test.go +++ b/pkg/cli/migrate/legacy_test.go @@ -360,7 +360,6 @@ func TestMigrateToV8(t *testing.T) { } db := database.InitTestMemoryDBRaw(t, "./fixtures/local-1-pre-schema.sql") - defer database.TeardownTestDB(t, db) ctx := context.DnoteCtx{ Paths: context.Paths{ diff --git a/pkg/cli/migrate/migrate_test.go b/pkg/cli/migrate/migrate_test.go index 315530de..4bb66057 100644 --- a/pkg/cli/migrate/migrate_test.go +++ b/pkg/cli/migrate/migrate_test.go @@ -38,18 +38,8 @@ import ( "github.com/pkg/errors" ) -func getTestPaths(t *testing.T) context.Paths { - tmpDir := t.TempDir() - return context.Paths{ - Home: tmpDir, - Cache: tmpDir, - Config: tmpDir, - Data: tmpDir, - } -} func TestExecute_bump_schema(t *testing.T) { - paths := getTestPaths(t) testCases := []struct { schemaKey string }{ @@ -65,8 +55,7 @@ func TestExecute_bump_schema(t *testing.T) { func() { // set up db := database.InitTestMemoryDBRaw(t, "") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) database.MustExec(t, "inserting a schema", db, "INSERT INTO system (key, value) VALUES (?, ?)", tc.schemaKey, 8) @@ -102,7 +91,6 @@ func TestExecute_bump_schema(t *testing.T) { } func TestRun_nonfresh(t *testing.T) { - paths := getTestPaths(t) testCases := []struct { mode int schemaKey string @@ -121,8 +109,7 @@ func TestRun_nonfresh(t *testing.T) { func() { // set up db := database.InitTestMemoryDBRaw(t, "") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) database.MustExec(t, "inserting a schema", db, "INSERT INTO system (key, value) VALUES (?, ?)", tc.schemaKey, 2) database.MustExec(t, "creating a temporary table for testing", db, "CREATE TABLE migrate_run_test ( name string )") @@ -181,7 +168,6 @@ func TestRun_nonfresh(t *testing.T) { } func TestRun_fresh(t *testing.T) { - paths := getTestPaths(t) testCases := []struct { mode int schemaKey string @@ -200,8 +186,7 @@ func TestRun_fresh(t *testing.T) { func() { // set up db := database.InitTestMemoryDBRaw(t, "") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) database.MustExec(t, "creating a temporary table for testing", db, "CREATE TABLE migrate_run_test ( name string )") @@ -254,7 +239,6 @@ func TestRun_fresh(t *testing.T) { } func TestRun_up_to_date(t *testing.T) { - paths := getTestPaths(t) testCases := []struct { mode int schemaKey string @@ -273,8 +257,7 @@ func TestRun_up_to_date(t *testing.T) { func() { // set up db := database.InitTestMemoryDBRaw(t, "") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) database.MustExec(t, "creating a temporary table for testing", db, "CREATE TABLE migrate_run_test ( name string )") @@ -324,11 +307,9 @@ func TestRun_up_to_date(t *testing.T) { } func TestLocalMigration1(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-1-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) data := testutils.MustMarshalJSON(t, actions.AddBookDataV1{BookName: "js"}) a1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting action", db, @@ -401,11 +382,9 @@ func TestLocalMigration1(t *testing.T) { } func TestLocalMigration2(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-1-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) c1 := "note 1 - v1" c2 := "note 1 - v2" css := "css" @@ -487,11 +466,9 @@ func TestLocalMigration2(t *testing.T) { } func TestLocalMigration3(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-1-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) data := testutils.MustMarshalJSON(t, actions.AddNoteDataV2{NoteUUID: "note-1-uuid", BookName: "js", Content: "note 1", Public: false}) a1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting action", db, @@ -561,11 +538,9 @@ func TestLocalMigration3(t *testing.T) { } func TestLocalMigration4(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-1-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting css book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "css") @@ -604,11 +579,9 @@ func TestLocalMigration4(t *testing.T) { } func TestLocalMigration5(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-5-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting css book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "css") @@ -665,11 +638,9 @@ func TestLocalMigration5(t *testing.T) { } func TestLocalMigration6(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-5-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) data := testutils.MustMarshalJSON(t, actions.AddBookDataV1{BookName: "js"}) a1UUID := testutils.MustGenerateUUID(t) @@ -697,11 +668,9 @@ func TestLocalMigration6(t *testing.T) { } func TestLocalMigration7_trash(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-7-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting trash book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "trash") @@ -729,11 +698,9 @@ func TestLocalMigration7_trash(t *testing.T) { } func TestLocalMigration7_conflicts(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-7-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "conflicts") @@ -761,11 +728,9 @@ func TestLocalMigration7_conflicts(t *testing.T) { } func TestLocalMigration7_conflicts_dup(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-7-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "conflicts") @@ -798,11 +763,9 @@ func TestLocalMigration7_conflicts_dup(t *testing.T) { } func TestLocalMigration8(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-8-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book 1", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "b1") @@ -863,11 +826,9 @@ func TestLocalMigration8(t *testing.T) { } func TestLocalMigration9(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-9-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book 1", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "b1") @@ -908,11 +869,9 @@ func TestLocalMigration9(t *testing.T) { } func TestLocalMigration10(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-10-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book ", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "123") @@ -979,11 +938,9 @@ func TestLocalMigration10(t *testing.T) { } func TestLocalMigration11(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-11-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book 1", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "foo") @@ -1058,11 +1015,9 @@ func TestLocalMigration11(t *testing.T) { } func TestLocalMigration12(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-12-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) data := []byte("editor: vim") path := fmt.Sprintf("%s/%s/dnoterc", ctx.Paths.Config, consts.DnoteDirName) @@ -1096,11 +1051,9 @@ func TestLocalMigration12(t *testing.T) { } func TestLocalMigration13(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-12-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) data := []byte("editor: vim\napiEndpoint: https://test.com/api") @@ -1139,11 +1092,9 @@ func TestLocalMigration13(t *testing.T) { } func TestLocalMigration14(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/local-14-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) b1UUID := testutils.MustGenerateUUID(t) database.MustExec(t, "inserting book", db, "INSERT INTO books (uuid, label) VALUES (?, ?)", b1UUID, "b1") @@ -1188,11 +1139,9 @@ func TestLocalMigration14(t *testing.T) { } func TestRemoteMigration1(t *testing.T) { - paths := getTestPaths(t) // set up db := database.InitTestMemoryDBRaw(t, "./fixtures/remote-1-pre-schema.sql") - ctx := context.InitTestCtxWithDB(t, paths, db) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtxWithDB(t, db) testutils.Login(t, &ctx) JSBookUUID := "existing-js-book-uuid" diff --git a/pkg/cli/ui/editor_test.go b/pkg/cli/ui/editor_test.go index f359e1ee..718c5337 100644 --- a/pkg/cli/ui/editor_test.go +++ b/pkg/cli/ui/editor_test.go @@ -30,12 +30,7 @@ import ( func TestGetTmpContentPath(t *testing.T) { t.Run("no collision", func(t *testing.T) { - tmpDir := t.TempDir() - ctx := context.InitTestCtx(t, context.Paths{ - Data: tmpDir, - Cache: tmpDir, - }) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) res, err := GetTmpContentPath(ctx) if err != nil { @@ -48,12 +43,7 @@ func TestGetTmpContentPath(t *testing.T) { t.Run("one existing session", func(t *testing.T) { // set up - tmpDir := t.TempDir() - ctx := context.InitTestCtx(t, context.Paths{ - Data: tmpDir, - Cache: tmpDir, - }) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) p := fmt.Sprintf("%s/%s", ctx.Paths.Cache, "DNOTE_TMPCONTENT_0.md") if _, err := os.Create(p); err != nil { @@ -73,12 +63,7 @@ func TestGetTmpContentPath(t *testing.T) { t.Run("two existing sessions", func(t *testing.T) { // set up - tmpDir := t.TempDir() - ctx := context.InitTestCtx(t, context.Paths{ - Data: tmpDir, - Cache: tmpDir, - }) - defer context.TeardownTestCtx(t, ctx) + ctx := context.InitTestCtx(t) p1 := fmt.Sprintf("%s/%s", ctx.Paths.Cache, "DNOTE_TMPCONTENT_0.md") if _, err := os.Create(p1); err != nil { diff --git a/pkg/clock/clock.go b/pkg/clock/clock.go index f421d428..dda84b74 100644 --- a/pkg/clock/clock.go +++ b/pkg/clock/clock.go @@ -20,11 +20,10 @@ package clock import ( + "sync" "time" ) -//TODO: use mutex to avoid race - // Clock is an interface to the standard library time. // It is used to implement a real or a mock clock. The latter is used in tests. type Clock interface { @@ -39,16 +38,21 @@ func (c *clock) Now() time.Time { // Mock is a mock instance of clock type Mock struct { + mu sync.RWMutex currentTime time.Time } // SetNow sets the current time for the mock clock func (c *Mock) SetNow(t time.Time) { + c.mu.Lock() + defer c.mu.Unlock() c.currentTime = t } // Now returns the current time func (c *Mock) Now() time.Time { + c.mu.RLock() + defer c.mu.RUnlock() return c.currentTime } diff --git a/pkg/server/app/notes_test.go b/pkg/server/app/notes_test.go index 38195079..6ee55b8f 100644 --- a/pkg/server/app/notes_test.go +++ b/pkg/server/app/notes_test.go @@ -33,8 +33,6 @@ import ( func TestCreateNote(t *testing.T) { serverTime := time.Date(2017, time.March, 14, 21, 15, 0, 0, time.UTC) - mockClock := clock.NewMock() - mockClock.SetNow(serverTime) ts1 := time.Date(2018, time.November, 12, 10, 11, 0, 0, time.UTC).UnixNano() ts2 := time.Date(2018, time.November, 15, 0, 1, 10, 0, time.UTC).UnixNano() @@ -75,6 +73,10 @@ func TestCreateNote(t *testing.T) { for idx, tc := range testCases { func() { + // Create a new clock for each test case to avoid race conditions in parallel tests + mockClock := clock.NewMock() + mockClock.SetNow(serverTime) + db := testutils.InitMemoryDB(t) user := testutils.SetupUserData(db, "user@test.com", "password123")