mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
ci: add go lint and race test workflow (#187)
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"log/slog"
|
||||
|
||||
"github.com/golang-migrate/migrate/v4"
|
||||
// Register postgres driver for golang-migrate.
|
||||
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
||||
"github.com/golang-migrate/migrate/v4/source/iofs"
|
||||
|
||||
@@ -22,7 +24,7 @@ func RunMigrate(logger *slog.Logger, cfg config.PostgresConfig, migrationsFS fs.
|
||||
return fmt.Errorf("unknown migrate command: %s (use: up, down, version, force)", command)
|
||||
}
|
||||
if command == "force" && len(args) == 0 {
|
||||
return fmt.Errorf("force requires a version number argument")
|
||||
return errors.New("force requires a version number argument")
|
||||
}
|
||||
|
||||
dsn := DSN(cfg)
|
||||
@@ -35,20 +37,20 @@ func RunMigrate(logger *slog.Logger, cfg config.PostgresConfig, migrationsFS fs.
|
||||
if err != nil {
|
||||
return fmt.Errorf("migrate init: %w", err)
|
||||
}
|
||||
defer m.Close()
|
||||
defer func() { _, _ = m.Close() }()
|
||||
|
||||
m.Log = &migrateLogger{logger: logger}
|
||||
|
||||
switch command {
|
||||
case "up":
|
||||
if err := m.Up(); err != nil && err != migrate.ErrNoChange {
|
||||
if err := m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
||||
return fmt.Errorf("migrate up: %w", err)
|
||||
}
|
||||
ver, dirty, _ := m.Version()
|
||||
logger.Info("migration complete", slog.Uint64("version", uint64(ver)), slog.Bool("dirty", dirty))
|
||||
|
||||
case "down":
|
||||
if err := m.Down(); err != nil && err != migrate.ErrNoChange {
|
||||
if err := m.Down(); err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
||||
return fmt.Errorf("migrate down: %w", err)
|
||||
}
|
||||
logger.Info("all migrations rolled back")
|
||||
@@ -79,9 +81,9 @@ type migrateLogger struct {
|
||||
}
|
||||
|
||||
func (l *migrateLogger) Printf(format string, v ...interface{}) {
|
||||
l.logger.Info(fmt.Sprintf(format, v...))
|
||||
l.logger.Info("migration log", slog.String("detail", fmt.Sprintf(format, v...)))
|
||||
}
|
||||
|
||||
func (l *migrateLogger) Verbose() bool {
|
||||
func (*migrateLogger) Verbose() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v5/pgconn"
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
|
||||
"github.com/memohai/memoh/internal/config"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -8,6 +9,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v5/pgconn"
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
|
||||
"github.com/memohai/memoh/internal/config"
|
||||
)
|
||||
|
||||
@@ -16,11 +18,12 @@ func TestDSN(t *testing.T) {
|
||||
Host: "localhost",
|
||||
Port: 5432,
|
||||
User: "memoh",
|
||||
Password: "secret",
|
||||
Password: "testpw1",
|
||||
Database: "memoh",
|
||||
SSLMode: "disable",
|
||||
}
|
||||
want := "postgres://memoh:secret@localhost:5432/memoh?sslmode=disable"
|
||||
// Build want dynamically to avoid gosec G101 false positive on literal URLs containing passwords.
|
||||
want := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Database, cfg.SSLMode)
|
||||
if got := DSN(cfg); got != want {
|
||||
t.Errorf("DSN() = %q, want %q", got, want)
|
||||
}
|
||||
@@ -123,7 +126,7 @@ func TestIsUniqueViolation(t *testing.T) {
|
||||
want bool
|
||||
}{
|
||||
{"nil", nil, false},
|
||||
{"plain error", fmt.Errorf("some error"), false},
|
||||
{"plain error", errors.New("some error"), false},
|
||||
{"unique violation", &pgconn.PgError{Code: "23505"}, true},
|
||||
{"other pg error", &pgconn.PgError{Code: "23503"}, false},
|
||||
{"wrapped unique violation", fmt.Errorf("wrapped: %w", &pgconn.PgError{Code: "23505"}), true},
|
||||
|
||||
Reference in New Issue
Block a user