181 lines
5.6 KiB
Go
181 lines
5.6 KiB
Go
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_ActionCreate(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(),
|
|
RoomID: roomID,
|
|
}
|
|
|
|
err := repo.ActionCreate(context.Background(), 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",
|
|
RoomID: roomID,
|
|
CreatedAt: time.Now().Add(-2 * time.Second),
|
|
}
|
|
action2 := &models.Action{
|
|
Actor: "player2",
|
|
ActorColor: "red",
|
|
Action: "guessed",
|
|
Word: "banana",
|
|
WordColor: "blue",
|
|
Number: "0",
|
|
RoomID: roomID,
|
|
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.ActionList(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.ActionGetLastClue(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.ActionDeleteByRoomID(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)
|
|
}
|