Assignment 4: tests, interface refactor, e2e suite
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"5803025048/W04/internal/database"
|
||||
"5803025048/W04/internal/models"
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v5"
|
||||
)
|
||||
|
||||
// testConn dipakai bersama oleh seluruh tes di package ini.
|
||||
// Tes berjalan berurutan (tanpa t.Parallel), jadi aman.
|
||||
var testConn *pgx.Conn
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
// Safety guard: tes ini men-TRUNCATE semua tabel.
|
||||
name := os.Getenv("DB_NAME")
|
||||
if !strings.HasSuffix(name, "_test") {
|
||||
log.Fatalf("refusing to run store tests: DB_NAME must end in _test (got %q)", name)
|
||||
}
|
||||
|
||||
// Tidak boleh skip: kalau DB tidak ada / tidak terjangkau, tes GAGAL.
|
||||
conn, err := database.Connect()
|
||||
if err != nil {
|
||||
log.Fatalf("store tests need a reachable PostgreSQL: %v", err)
|
||||
}
|
||||
|
||||
// Skema dibuat lewat kode yang sama dengan yang dipakai server saat startup.
|
||||
if err := database.CreateTables(conn); err != nil {
|
||||
log.Fatalf("could not create schema: %v", err)
|
||||
}
|
||||
|
||||
testConn = conn
|
||||
code := m.Run()
|
||||
_ = conn.Close(context.Background())
|
||||
os.Exit(code)
|
||||
}
|
||||
|
||||
// resetDB mengosongkan semua tabel. Dipanggil di awal setiap tes.
|
||||
func resetDB(t *testing.T) {
|
||||
t.Helper()
|
||||
if _, err := testConn.Exec(context.Background(), `TRUNCATE TABLE sessions, snippets, users CASCADE`); err != nil {
|
||||
t.Fatalf("truncate tables: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func newTestStores() (*UserStore, *SessionStore, *SnippetStore) {
|
||||
mu := &sync.Mutex{}
|
||||
return NewUserStore(testConn, mu), NewSessionStore(testConn, mu), NewSnippetStore(testConn, mu)
|
||||
}
|
||||
|
||||
func mustCreateUser(t *testing.T, us *UserStore, username string) *models.User {
|
||||
t.Helper()
|
||||
u := &models.User{ID: uuid.New().String(), Username: username, PasswordHash: "hash-of-" + username}
|
||||
if err := us.Create(context.Background(), u); err != nil {
|
||||
t.Fatalf("create user %q: %v", username, err)
|
||||
}
|
||||
return u
|
||||
}
|
||||
|
||||
// countRows hanya dipanggil dengan nama tabel konstan dari tes ini.
|
||||
func countRows(t *testing.T, table string) int {
|
||||
t.Helper()
|
||||
var n int
|
||||
if err := testConn.QueryRow(context.Background(), `SELECT COUNT(*) FROM `+table).Scan(&n); err != nil {
|
||||
t.Fatalf("count rows in %s: %v", table, err)
|
||||
}
|
||||
return n
|
||||
}
|
||||
Reference in New Issue
Block a user