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