Files
gralias/repos/actions_test.go
2025-07-01 16:00:17 +03:00

177 lines
5.6 KiB
Go

package repos
import (
"context"
"gralias/models"
"testing"
"time"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
_ "github.com/mattn/go-sqlite3"
)
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 INTEGER
);
`
_, 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.UnixNano())
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.UnixNano())
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.UnixNano())
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.UnixNano())
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.UnixNano())
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.UnixNano())
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)
}