Fix: unittests
This commit is contained in:
		| @@ -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) | ||||
| 	} | ||||
|   | ||||
| @@ -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) | ||||
| 	} | ||||
| } | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| 	} | ||||
|   | ||||
| @@ -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 | ||||
| 	} | ||||
|   | ||||
| @@ -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 | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder