From e353b115d1a2f581e829602f1d03ec7fa71900f6 Mon Sep 17 00:00:00 2001 From: m0t0k1ch1 Date: Wed, 20 Aug 2025 17:32:23 +0900 Subject: [PATCH 1/2] test: should not use ExecFile in TestTransact --- sqlutil_test.go | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/sqlutil_test.go b/sqlutil_test.go index e46ca62..0815b36 100644 --- a/sqlutil_test.go +++ b/sqlutil_test.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "os" - "path/filepath" "testing" _ "github.com/go-sql-driver/mysql" @@ -140,12 +139,6 @@ func failMain(err error) int { } func TestTransact(t *testing.T) { - fixturePath, err := filepath.Abs("./testdata/fixture.sql") - require.NoError(t, err) - - cleanerPath, err := filepath.Abs("./testdata/cleaner.sql") - require.NoError(t, err) - tcs := []struct { name string db *sql.DB @@ -166,16 +159,15 @@ func TestTransact(t *testing.T) { // should not use t.Context() ctx := context.Background() - err = sqlutil.ExecFile(ctx, tc.db, cleanerPath) - require.NoError(t, err) + truncateTask(t, ctx, tc.db) require.Zero(t, countAllTasks(t, ctx, tc.db)) }) ctx := t.Context() - err = sqlutil.ExecFile(ctx, tc.db, fixturePath) - require.NoError(t, err) + createTask(t, ctx, tc.db, 1, "task1.title") + createTask(t, ctx, tc.db, 2, "task2.title") require.Equal(t, 2, countAllTasks(t, ctx, tc.db)) @@ -228,6 +220,13 @@ func TestTransact(t *testing.T) { } } +func createTask(t *testing.T, ctx context.Context, dbtx DBTX, id int, title string) { + t.Helper() + + _, err := dbtx.ExecContext(ctx, fmt.Sprintf(`INSERT INTO task (id, title) VALUES (%d, '%s')`, id, title)) + require.NoError(t, err) +} + func countAllTasks(t *testing.T, ctx context.Context, dbtx DBTX) (cnt int) { t.Helper() @@ -252,3 +251,10 @@ func completeTask(t *testing.T, ctx context.Context, dbtx DBTX, taskID int) { _, err := dbtx.ExecContext(ctx, fmt.Sprintf(`UPDATE task SET is_completed = true WHERE id = %d`, taskID)) require.NoError(t, err) } + +func truncateTask(t *testing.T, ctx context.Context, dbtx DBTX) { + t.Helper() + + _, err := dbtx.ExecContext(ctx, `TRUNCATE task`) + require.NoError(t, err) +} From de373198a9c3ce637dffd710a0a789fe024a6df6 Mon Sep 17 00:00:00 2001 From: m0t0k1ch1 Date: Wed, 20 Aug 2025 17:40:48 +0900 Subject: [PATCH 2/2] test: add test for ExecFile --- sqlutil_test.go | 50 ++++++++++++++++++++++++++++++++++++++++---- testdata/cleaner.sql | 1 - testdata/fixture.sql | 4 ++-- 3 files changed, 48 insertions(+), 7 deletions(-) delete mode 100644 testdata/cleaner.sql diff --git a/sqlutil_test.go b/sqlutil_test.go index 0815b36..7dea07a 100644 --- a/sqlutil_test.go +++ b/sqlutil_test.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "os" + "path/filepath" "testing" _ "github.com/go-sql-driver/mysql" @@ -178,8 +179,8 @@ func TestTransact(t *testing.T) { ctx := t.Context() require.PanicsWithError(t, errPanic.Error(), func() { - sqlutil.Transact(ctx, tc.db, func(txCtx context.Context, tx *sql.Tx) error { - completeTask(t, txCtx, tx, 1) + sqlutil.Transact(ctx, tc.db, func(ctx context.Context, tx *sql.Tx) error { + completeTask(t, ctx, tx, 1) panic(errPanic) }) @@ -192,8 +193,8 @@ func TestTransact(t *testing.T) { t.Run("failure: rollback on error", func(t *testing.T) { ctx := t.Context() - err := sqlutil.Transact(ctx, tc.db, func(txCtx context.Context, tx *sql.Tx) error { - completeTask(t, txCtx, tx, 1) + err := sqlutil.Transact(ctx, tc.db, func(ctx context.Context, tx *sql.Tx) error { + completeTask(t, ctx, tx, 1) return errSomethingWentWrong }) @@ -220,6 +221,47 @@ func TestTransact(t *testing.T) { } } +func TestExecFile(t *testing.T) { + tcs := []struct { + name string + db *sql.DB + }{ + { + "mysql", + mysqlDB, + }, + { + "postgresql", + psqlDB, + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(t *testing.T) { + t.Run("failure: path must be absolute", func(t *testing.T) { + ctx := t.Context() + + err := sqlutil.ExecFile(ctx, tc.db, "./testdata/fixture.sql") + require.ErrorContains(t, err, "path must be absolute") + + require.Zero(t, countAllTasks(t, ctx, tc.db)) + }) + + t.Run("success", func(t *testing.T) { + ctx := t.Context() + + fPath, err := filepath.Abs("./testdata/fixture.sql") + require.NoError(t, err) + + err = sqlutil.ExecFile(ctx, tc.db, fPath) + require.NoError(t, err) + + require.Equal(t, 2, countAllTasks(t, ctx, tc.db)) + }) + }) + } +} + func createTask(t *testing.T, ctx context.Context, dbtx DBTX, id int, title string) { t.Helper() diff --git a/testdata/cleaner.sql b/testdata/cleaner.sql deleted file mode 100644 index cd78580..0000000 --- a/testdata/cleaner.sql +++ /dev/null @@ -1 +0,0 @@ -TRUNCATE task; diff --git a/testdata/fixture.sql b/testdata/fixture.sql index 9467be8..e7b6039 100644 --- a/testdata/fixture.sql +++ b/testdata/fixture.sql @@ -1,2 +1,2 @@ -INSERT INTO task (id, title) VALUES (1, 'Ask questions'); -INSERT INTO task (id, title) VALUES (2, 'Brainstorm ideas'); +INSERT INTO task (id, title) VALUES (1, 'task1.title'); +INSERT INTO task (id, title) VALUES (2, 'task2.title');