package sdkserver import ( "encoding/json" "net/http" "net/http/httptest" "os" "strings" "testing" ) func TestTeleportPersistsLocationAndReportsWriteFailure(t *testing.T) { chdirRepoRootSDK(t) body := `{"plane_id":20411,"floor_id":20411001,"entry_id":2041101,"x":123,"y":-456,"z":789,"rot_y":321}` invoke := func() map[string]any { t.Helper() w := httptest.NewRecorder() apiTeleport(w, httptest.NewRequest(http.MethodPost, "/api/teleport", strings.NewReader(body))) var result map[string]any if err := json.Unmarshal(w.Body.Bytes(), &result); err != nil { t.Fatal(err) } return result } if result := invoke(); result["status"] != float64(200) { t.Fatalf("save response: %v", result) } raw, err := os.ReadFile("persistent") if err != nil { t.Fatal(err) } var saved struct { Scene struct { FloorID uint32 `json:"floor_id"` } Position struct { X int32 `json:"x"` Y int32 `json:"y"` } } if err := json.Unmarshal(raw, &saved); err != nil { t.Fatal(err) } if saved.Scene.FloorID != 20411001 || saved.Position.X != 123 || saved.Position.Y != -456 { t.Fatalf("saved location: %+v", saved) } if err := os.WriteFile("persistent", []byte("invalid json"), 0600); err != nil { t.Fatal(err) } if result := invoke(); result["status"] != float64(500) { t.Fatalf("expected save failure, got %v", result) } raw, _ = os.ReadFile("persistent") if string(raw) != "invalid json" { t.Fatalf("invalid save was overwritten: %q", raw) } }