package sdkserver import ( "encoding/json" "net/http" "net/http/httptest" "os" "strings" "testing" ) func TestMaxCommandPreservesUnknownData(t *testing.T) { chdirRepoRootSDK(t) raw, err := os.ReadFile("freesr-data.json") if err != nil { t.Fatal(err) } var root map[string]json.RawMessage if err = json.Unmarshal(raw, &root); err != nil { t.Fatal(err) } root["future_root"] = json.RawMessage(`{"keep":true}`) var avatars map[string]json.RawMessage if err = json.Unmarshal(root["avatars"], &avatars); err != nil { t.Fatal(err) } var avatar map[string]json.RawMessage if err = json.Unmarshal(avatars["1204"], &avatar); err != nil { t.Fatal(err) } avatar["future_avatar"] = json.RawMessage(`"preserved"`) avatars["1204"], _ = json.Marshal(avatar) root["avatars"], _ = json.Marshal(avatars) raw, _ = json.Marshal(root) if err = os.WriteFile("freesr-data.json", raw, 0600); err != nil { t.Fatal(err) } beforePersistent, err := os.ReadFile("persistent") if err != nil { t.Fatal(err) } w := httptest.NewRecorder() apiCommand(w, httptest.NewRequest(http.MethodPost, "/api/command", strings.NewReader(`{"command":"/max"}`))) var result struct { Success bool `json:"success"` } if err = json.Unmarshal(w.Body.Bytes(), &result); err != nil || !result.Success { t.Fatalf("command failed: %s (%v)", w.Body.String(), err) } raw, _ = os.ReadFile("freesr-data.json") if err = json.Unmarshal(raw, &root); err != nil { t.Fatal(err) } var futureRoot struct { Keep bool `json:"keep"` } if err = json.Unmarshal(root["future_root"], &futureRoot); err != nil || !futureRoot.Keep { t.Fatal("root data lost") } if err = json.Unmarshal(root["avatars"], &avatars); err != nil { t.Fatal(err) } if err = json.Unmarshal(avatars["1204"], &avatar); err != nil { t.Fatal(err) } var data struct { Rank int `json:"rank"` } if err = json.Unmarshal(avatar["data"], &data); err != nil { t.Fatal(err) } if string(avatar["future_avatar"]) != `"preserved"` || string(avatar["level"]) != "80" || string(avatar["promotion"]) != "6" || data.Rank != 6 { t.Fatal("avatar fields lost or not updated") } afterPersistent, err := os.ReadFile("persistent") if err != nil || string(beforePersistent) != string(afterPersistent) { t.Fatal("persistent data was rewritten") } }