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