package repos import ( "context" "gralias/models" "testing" "time" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/assert" ) func setupActionsTestDB(t *testing.T) (*sqlx.DB, func()) { db, err := sqlx.Connect("sqlite3", ":memory:") assert.NoError(t, err) schema := ` CREATE TABLE IF NOT EXISTS actions ( room_id TEXT, actor TEXT, actor_color TEXT, action_type TEXT, word TEXT, word_color TEXT, number_associated TEXT, created_at TIMESTAMP ); ` _, err = db.Exec(schema) assert.NoError(t, err) return db, func() { db.Close() } } func TestActionsRepo_CreateAction(t *testing.T) { db, teardown := setupActionsTestDB(t) defer teardown() repo := &RepoProvider{DB: db} roomID := "test_room_actions_1" action := &models.Action{ Actor: "player1", ActorColor: "blue", Action: "gave_clue", Word: "apple", WordColor: "red", Number: "3", CreatedAt: time.Now(), } err := repo.CreateAction(context.Background(), roomID, action) assert.NoError(t, err) var retrievedAction models.Action err = db.Get(&retrievedAction, "SELECT * FROM actions WHERE room_id = ? AND actor = ?", roomID, action.Actor) assert.NoError(t, err) assert.Equal(t, action.Word, retrievedAction.Word) } func TestActionsRepo_ListActions(t *testing.T) { db, teardown := setupActionsTestDB(t) defer teardown() repo := &RepoProvider{DB: db} roomID := "test_room_actions_2" action1 := &models.Action{ Actor: "player1", ActorColor: "blue", Action: "gave_clue", Word: "apple", WordColor: "red", Number: "3", CreatedAt: time.Now().Add(-2 * time.Second), } action2 := &models.Action{ Actor: "player2", ActorColor: "red", Action: "guessed", Word: "banana", WordColor: "blue", Number: "0", CreatedAt: time.Now().Add(-1 * time.Second), } _, err := db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action1.Actor, action1.ActorColor, action1.Action, action1.Word, action1.WordColor, action1.Number, action1.CreatedAt) assert.NoError(t, err) _, err = db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action2.Actor, action2.ActorColor, action2.Action, action2.Word, action2.WordColor, action2.Number, action2.CreatedAt) assert.NoError(t, err) actions, err := repo.ListActions(context.Background(), roomID) assert.NoError(t, err) assert.Len(t, actions, 2) assert.Equal(t, action1.Word, actions[0].Word) assert.Equal(t, action2.Word, actions[1].Word) } func TestActionsRepo_GetLastClue(t *testing.T) { db, teardown := setupActionsTestDB(t) defer teardown() repo := &RepoProvider{DB: db} roomID := "test_room_actions_3" action1 := &models.Action{ Actor: "player1", ActorColor: "blue", Action: "gave_clue", Word: "apple", WordColor: "red", Number: "3", CreatedAt: time.Now().Add(-3 * time.Second), } action2 := &models.Action{ Actor: "player2", ActorColor: "red", Action: "gave_clue", Word: "banana", WordColor: "blue", Number: "2", CreatedAt: time.Now().Add(-2 * time.Second), } // Non-clue action action3 := &models.Action{ Actor: "player3", ActorColor: "blue", Action: "guessed", Word: "orange", WordColor: "blue", Number: "0", CreatedAt: time.Now().Add(-1 * time.Second), } _, err := db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action1.Actor, action1.ActorColor, action1.Action, action1.Word, action1.WordColor, action1.Number, action1.CreatedAt) assert.NoError(t, err) _, err = db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action2.Actor, action2.ActorColor, action2.Action, action2.Word, action2.WordColor, action2.Number, action2.CreatedAt) assert.NoError(t, err) _, err = db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action3.Actor, action3.ActorColor, action3.Action, action3.Word, action3.WordColor, action3.Number, action3.CreatedAt) assert.NoError(t, err) lastClue, err := repo.GetLastClue(context.Background(), roomID) assert.NoError(t, err) assert.NotNil(t, lastClue) assert.Equal(t, action2.Word, lastClue.Word) } func TestActionsRepo_DeleteActionsByRoomID(t *testing.T) { db, teardown := setupActionsTestDB(t) defer teardown() repo := &RepoProvider{DB: db} roomID := "test_room_actions_4" action1 := &models.Action{ Actor: "player1", ActorColor: "blue", Action: "gave_clue", Word: "apple", WordColor: "red", Number: "3", CreatedAt: time.Now(), } _, err := db.Exec(`INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, roomID, action1.Actor, action1.ActorColor, action1.Action, action1.Word, action1.WordColor, action1.Number, action1.CreatedAt) assert.NoError(t, err) err = repo.DeleteActionsByRoomID(context.Background(), roomID) assert.NoError(t, err) var count int err = db.Get(&count, "SELECT COUNT(*) FROM actions WHERE room_id = ?", roomID) assert.NoError(t, err) assert.Equal(t, 0, count) }