Fix: unittests

This commit is contained in:
Grail Finder
2025-07-02 19:00:39 +03:00
parent a438d5b665
commit 130ed3763b
15 changed files with 227 additions and 245 deletions

View File

@ -75,13 +75,13 @@ func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error)
// repo.CreateRoom()
// }
func saveFullInfo(fi *models.FullInfo) error {
func saveFullInfo(ctx context.Context, fi *models.FullInfo) error {
// INFO: no transactions; so case is possible where first object is updated but the second is not
if err := repo.PlayerUpdate(fi.State); err != nil {
if err := repo.PlayerUpdate(ctx, fi.State); err != nil {
return err
}
log.Debug("saved user state", "state", fi.State)
if err := repo.RoomUpdate(context.Background(), fi.Room); err != nil {
if err := repo.RoomUpdate(ctx, fi.Room); err != nil {
return err
}
return nil
@ -155,7 +155,7 @@ func getPlayerByCtx(ctx context.Context) (*models.Player, error) {
log.Debug("no username in ctx")
return &models.Player{}, errors.New("no username in ctx")
}
return repo.PlayerGetByName(username)
return repo.PlayerGetByName(ctx, username)
}
// // DEPRECATED
@ -219,7 +219,7 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error)
err := errors.New("uknown role:" + role)
return nil, err
}
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(ctx, fi); err != nil {
return nil, err
}
return fi, nil
@ -247,7 +247,7 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error)
// get bots
func listBots() []models.Player {
bots, err := repo.PlayerList(true)
bots, err := repo.PlayerList(context.Background(), true)
if err != nil {
log.Error("failed to fetch bots from db", "error", err)
}

View File

@ -1,107 +0,0 @@
package handlers
import (
"encoding/json"
"gralias/models"
"os"
"testing"
)
func TestSaveState(t *testing.T) {
// Create test state
state := &models.UserState{
Username: "testuser",
RoomID: "testroom",
Team: models.UserTeamBlue,
Role: models.UserRoleMime,
}
// Save state
err := saveState(state.Username, state)
if err != nil {
t.Fatalf("saveState failed: %v", err)
}
// Load state
loadedState, err := loadState(state.Username)
if err != nil {
t.Fatalf("loadState failed: %v", err)
}
// Verify loaded state matches original
if loadedState.Username != state.Username {
t.Errorf("Username mismatch: got %s, want %s", loadedState.Username, state.Username)
}
if loadedState.RoomID != state.RoomID {
t.Errorf("RoomID mismatch: got %s, want %s", loadedState.RoomID, state.RoomID)
}
if loadedState.Team != state.Team {
t.Errorf("Team mismatch: got %s, want %s", loadedState.Team, state.Team)
}
if loadedState.Role != state.Role {
t.Errorf("Role mismatch: got %s, want %s", loadedState.Role, state.Role)
}
// Test JSON serialization/deserialization
data, err := json.Marshal(state)
if err != nil {
t.Fatalf("marshal failed: %v", err)
}
testMap := make(map[string][]byte)
testMap["testkey"] = data
// Create a temporary file
tmpFile, err := os.CreateTemp("", "test_store_*.json")
if err != nil {
t.Fatalf("failed to create temp file: %v", err)
}
tmpFileName := tmpFile.Name()
// defer os.Remove(tmpFileName)
// Write testMap to the temp file
fileData, err := json.Marshal(testMap)
if err != nil {
t.Fatalf("failed to marshal testMap: %v", err)
}
if err := os.WriteFile(tmpFileName, fileData, 0644); err != nil {
t.Fatalf("failed to write to temp file: %v", err)
}
// Read the temp file
readData, err := os.ReadFile(tmpFileName)
if err != nil {
t.Fatalf("failed to read temp file: %v", err)
}
// Unmarshal the data
var testMapRead map[string][]byte
if err := json.Unmarshal(readData, &testMapRead); err != nil {
t.Fatalf("failed to unmarshal testMap: %v", err)
}
// Get the state bytes from the map
stateBytes, ok := testMapRead["testkey"]
if !ok {
t.Fatalf("key 'testkey' not found in testMapRead")
}
// Unmarshal the state bytes
stateRead := &models.UserState{}
if err := json.Unmarshal(stateBytes, stateRead); err != nil {
t.Fatalf("failed to unmarshal state: %v", err)
}
// Compare the state
if stateRead.Username != state.Username {
t.Errorf("Username mismatch from file: got %s, want %s", stateRead.Username, state.Username)
}
if stateRead.RoomID != state.RoomID {
t.Errorf("RoomID mismatch from file: got %s, want %s", stateRead.RoomID, state.RoomID)
}
if stateRead.Team != state.Team {
t.Errorf("Team mismatch from file: got %s, want %s", stateRead.Team, state.Team)
}
if stateRead.Role != state.Role {
t.Errorf("Role mismatch from file: got %s, want %s", stateRead.Role, state.Role)
}
}

View File

@ -37,7 +37,7 @@ func HandleNameCheck(w http.ResponseWriter, r *http.Request) {
}
cleanName := utils.RemoveSpacesFromStr(username)
// allNames := getAllNames()
allNames, err := repo.PlayerListNames()
allNames, err := repo.PlayerListNames(r.Context())
if err != nil {
abortWithError(w, err.Error())
return
@ -86,7 +86,7 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
http.SetCookie(w, cookie)
// check if that user was already in db
// userstate, err := loadState(cleanName)
userstate, err := repo.PlayerGetByName(cleanName)
userstate, err := repo.PlayerGetByName(r.Context(), cleanName)
if err != nil || userstate == nil {
userstate = models.InitPlayer(cleanName)
}
@ -106,10 +106,10 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
fi.Room = room
fi.List = nil
fi.State.RoomID = room.ID
repo.PlayerSetRoomID(fi.State.Username, room.ID)
repo.PlayerSetRoomID(r.Context(), fi.State.Username, room.ID)
// repo.RoomUpdate()
// save full info instead
// if err := saveFullInfo(fi); err != nil {
// if err := saveFullInfo(r.Context(), fi); err != nil {
// abortWithError(w, err.Error())
// return
// }
@ -123,8 +123,8 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
}
// save state to cache
// if err := saveState(cleanName, userstate); err != nil {
if err := repo.PlayerUpdate(userstate); err != nil {
// if err := saveFullInfo(fi); err != nil {
if err := repo.PlayerUpdate(r.Context(), userstate); err != nil {
// if err := saveFullInfo(r.Context(), fi); err != nil {
log.Error("failed to save state", "error", err)
abortWithError(w, err.Error())
return

View File

@ -157,7 +157,7 @@ func HandleShowColor(w http.ResponseWriter, r *http.Request) {
fi.Room.ClearMarks()
}
}
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}
@ -221,7 +221,7 @@ func HandleMarkCard(w http.ResponseWriter, r *http.Request) {
fi.Room.Cards[i].Mark = newMarks
cardword = fi.Room.Cards[i]
}
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}

View File

@ -46,11 +46,11 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) {
abortWithError(w, err.Error())
return
}
if err := repo.PlayerSetRoomID(fi.State.Username, room.ID); err != nil {
if err := repo.PlayerSetRoomID(r.Context(), fi.State.Username, room.ID); err != nil {
abortWithError(w, err.Error())
return
}
// if err := saveFullInfo(fi); err != nil {
// if err := saveFullInfo(r.Context(), fi); err != nil {
// msg := "failed to set current room to session"
// log.Error(msg, "error", err)
// abortWithError(w, msg)
@ -131,7 +131,7 @@ func HandleEndTurn(w http.ResponseWriter, r *http.Request) {
fi.Room.ChangeTurn()
fi.Room.MimeDone = false
StopTurnTimer(fi.Room.ID)
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}
@ -174,7 +174,7 @@ func HandleStartGame(w http.ResponseWriter, r *http.Request) {
Action: models.ActionTypeGameStarted,
}
fi.Room.ActionHistory = append(fi.Room.ActionHistory, action)
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}
@ -226,7 +226,7 @@ func HandleJoinRoom(w http.ResponseWriter, r *http.Request) {
fi.State.RoomID = room.ID
fi.Room = room
fi.List = nil
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}
@ -297,7 +297,7 @@ func HandleGiveClue(w http.ResponseWriter, r *http.Request) {
log.Debug("given clue", "clue", clue, "limit", fi.Room.ThisTurnLimit)
notify(models.NotifyBacklogPrefix+fi.Room.ID, clue+num)
notifyBotIfNeeded(fi.Room)
if err := saveFullInfo(fi); err != nil {
if err := saveFullInfo(r.Context(), fi); err != nil {
abortWithError(w, err.Error())
return
}

View File

@ -103,11 +103,14 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
notify(models.NotifyRoomListUpdate, "")
}
// scary to update the whole room
if err := repo.RoomUpdate(r.Context(), exitedRoom); err != nil {
fiToSave := &models.FullInfo{
Room: exitedRoom,
}
if err := saveFullInfo(r.Context(), fiToSave); err != nil {
abortWithError(w, err.Error())
return
}
if err := repo.PlayerExitRoom(fi.State.Username); err != nil {
if err := repo.PlayerExitRoom(r.Context(), fi.State.Username); err != nil {
abortWithError(w, err.Error())
return
}