Model integration testing
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
4986095aaa
commit
b18003ed20
@ -0,0 +1,9 @@
|
||||
INSERT INTO users VALUES(
|
||||
1337,
|
||||
'tester',
|
||||
'tester@example.com',
|
||||
/* thisisinsecure */
|
||||
'$2a$12$M51w5lWkveAOhwoanoCxO.hJe3s1m8qJuCzbzdETt0SThjpq4BPRq',
|
||||
'2025-02-25 18:58:44',
|
||||
'2025-02-25 18:58:44'
|
||||
);
|
@ -0,0 +1,52 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"git.runcible.io/learning/ratchet/migrations"
|
||||
)
|
||||
|
||||
const testerPasswd = "thisisinsecure"
|
||||
|
||||
func newTestDB(t *testing.T) *sql.DB {
|
||||
dbFile, err := os.CreateTemp("", "ratchet-*.db")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
db, err := sql.Open("sqlite3", dbFile.Name())
|
||||
if err != nil {
|
||||
db.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = migrations.Migrate(db)
|
||||
if err != nil {
|
||||
db.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
script, err := os.ReadFile("./testdata/seed.sql")
|
||||
if err != nil {
|
||||
db.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, err = db.Exec(string(script))
|
||||
if err != nil {
|
||||
db.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Cleanup(func() {
|
||||
db.Close()
|
||||
err := os.Remove(dbFile.Name())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
return db
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.runcible.io/learning/ratchet/internal/assert"
|
||||
"git.runcible.io/learning/ratchet/internal/model"
|
||||
)
|
||||
|
||||
func TestUserModelExists(t *testing.T) {
|
||||
// Skip the test if the "-short" flag is provided when running the test.
|
||||
if testing.Short() {
|
||||
t.Skip("models: skipping model integration test")
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
userID int
|
||||
want bool
|
||||
}{{
|
||||
name: "Valid ID",
|
||||
userID: 1337,
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "Zero ID",
|
||||
userID: 0,
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "Zero ID",
|
||||
userID: 2,
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
db := newTestDB(t)
|
||||
|
||||
userService := model.UserService{db}
|
||||
|
||||
exists, err := userService.Exists(test.userID)
|
||||
|
||||
assert.Equal(t, exists, test.want)
|
||||
assert.NilError(t, err)
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"embed"
|
||||
"fmt"
|
||||
|
||||
"github.com/golang-migrate/migrate/v4"
|
||||
"github.com/golang-migrate/migrate/v4/database/sqlite3"
|
||||
_ "github.com/golang-migrate/migrate/v4/source/file"
|
||||
"github.com/golang-migrate/migrate/v4/source/iofs"
|
||||
)
|
||||
|
||||
//go:embed *.sql
|
||||
var migrationFiles embed.FS
|
||||
|
||||
func Migrate(db *sql.DB) error {
|
||||
// Create a database driver for the specific database type
|
||||
driver, err := sqlite3.WithInstance(db, &sqlite3.Config{})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create database driver: %w", err)
|
||||
}
|
||||
|
||||
// Create an IFS source from the embedded files
|
||||
source, err := iofs.New(migrationFiles, ".")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create migration source: %w", err)
|
||||
}
|
||||
|
||||
// Create a new migrate instance
|
||||
m, err := migrate.NewWithInstance("iofs", source, "sqlite3", driver)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create migrate instance: %w", err)
|
||||
}
|
||||
|
||||
// Run migrations
|
||||
if err := m.Up(); err != nil && err != migrate.ErrNoChange {
|
||||
return fmt.Errorf("failed to run migrations: %w", err)
|
||||
}
|
||||
|
||||
// set WAL mode
|
||||
_, err = db.Exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to set wall mode: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue