127 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package repos
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"gralias/models"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/jmoiron/sqlx"
 | |
| 	_ "github.com/mattn/go-sqlite3"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func setupPlayersTestDB(t *testing.T) (*sqlx.DB, func()) {
 | |
| 	db, err := sqlx.Connect("sqlite3", ":memory:")
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	schema := `
 | |
| 	CREATE TABLE IF NOT EXISTS players (
 | |
| 		id INTEGER PRIMARY KEY AUTOINCREMENT,
 | |
| 		room_id TEXT,
 | |
| 		username TEXT,
 | |
| 		password TEXT NOT NULL DEFAULT '',
 | |
| 		team TEXT,
 | |
| 		role TEXT,
 | |
| 		is_bot BOOLEAN
 | |
| 	);
 | |
| 
 | |
| 	CREATE TABLE player_stats (
 | |
|     id INTEGER PRIMARY KEY AUTOINCREMENT,
 | |
|     username TEXT NOT NULL UNIQUE,
 | |
|     games_played INTEGER NOT NULL DEFAULT 0,
 | |
|     games_won INTEGER NOT NULL DEFAULT 0,
 | |
|     games_lost INTEGER NOT NULL DEFAULT 0,
 | |
|     opened_opposite_words INTEGER NOT NULL DEFAULT 0,
 | |
|     opened_white_words INTEGER NOT NULL DEFAULT 0,
 | |
|     opened_black_words INTEGER NOT NULL DEFAULT 0,
 | |
|     mime_winrate REAL NOT NULL DEFAULT 0.0,
 | |
|     guesser_winrate REAL NOT NULL DEFAULT 0.0,
 | |
|     played_as_mime INTEGER NOT NULL DEFAULT 0,
 | |
|     played_as_guesser INTEGER NOT NULL DEFAULT 0,
 | |
|     FOREIGN KEY (username) REFERENCES players(username) ON DELETE CASCADE
 | |
| );
 | |
| 
 | |
| 	`
 | |
| 	_, err = db.Exec(schema)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	return db, func() {
 | |
| 		db.Close()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestPlayersRepo_AddPlayer(t *testing.T) {
 | |
| 	db, teardown := setupPlayersTestDB(t)
 | |
| 	defer teardown()
 | |
| 
 | |
| 	repo := &RepoProvider{DB: db}
 | |
| 
 | |
| 	roomID := "test_room_player_1"
 | |
| 	player := &models.Player{
 | |
| 		RoomID:   &roomID,
 | |
| 		Username: "test_player_1",
 | |
| 		Team:     "blue",
 | |
| 		Role:     "player",
 | |
| 		IsBot:    false,
 | |
| 	}
 | |
| 
 | |
| 	err := repo.PlayerAdd(context.Background(), player)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	var retrievedPlayer models.Player
 | |
| 	err = db.Get(&retrievedPlayer, "SELECT * FROM players WHERE room_id = ? AND username = ?", player.RoomID, player.Username)
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, player.Username, retrievedPlayer.Username)
 | |
| }
 | |
| 
 | |
| func TestPlayersRepo_GetPlayer(t *testing.T) {
 | |
| 	db, teardown := setupPlayersTestDB(t)
 | |
| 	defer teardown()
 | |
| 
 | |
| 	repo := &RepoProvider{DB: db}
 | |
| 
 | |
| 	roomID := "test_room_player_2"
 | |
| 	player := &models.Player{
 | |
| 		RoomID:   &roomID,
 | |
| 		Username: "test_player_2",
 | |
| 		Team:     "red",
 | |
| 		Role:     "player",
 | |
| 		IsBot:    false,
 | |
| 	}
 | |
| 
 | |
| 	_, err := db.Exec(`INSERT INTO players (room_id, username, team, role, is_bot) VALUES (?, ?, ?, ?, ?)`, player.RoomID, player.Username, player.Team, player.Role, player.IsBot)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	retrievedPlayer, err := repo.PlayerGetByName(context.Background(), player.Username)
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.NotNil(t, retrievedPlayer)
 | |
| 	assert.Equal(t, player.Username, retrievedPlayer.Username)
 | |
| }
 | |
| 
 | |
| func TestPlayersRepo_DeletePlayer(t *testing.T) {
 | |
| 	db, teardown := setupPlayersTestDB(t)
 | |
| 	defer teardown()
 | |
| 
 | |
| 	repo := &RepoProvider{DB: db}
 | |
| 
 | |
| 	roomID := "test_room_player_3"
 | |
| 	player := &models.Player{
 | |
| 		RoomID:   &roomID,
 | |
| 		Username: "test_player_3",
 | |
| 		Team:     "blue",
 | |
| 		Role:     "player",
 | |
| 		IsBot:    false,
 | |
| 	}
 | |
| 
 | |
| 	_, err := db.Exec(`INSERT INTO players (room_id, username, team, role, is_bot) VALUES (?, ?, ?, ?, ?)`, player.RoomID, player.Username, player.Team, player.Role, player.IsBot)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	err = repo.PlayerDelete(context.Background(), player.Username)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	var count int
 | |
| 	err = db.Get(&count, "SELECT COUNT(*) FROM players WHERE room_id = ? AND username = ?", player.RoomID, player.Username)
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, 0, count)
 | |
| }
 | 
