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)
 | |
| }
 | 
