Files
OpenFrontIO/tests/StatsSchema.test.ts
T
Scott Anderson 13f0c2303e bug: StatsSchema zod validation error (#1267)
## Description:

Fix a bug in the StatsSchema zod validation logic. In zod v4, the
`record` function has been renamed to `partialRecord`, and the new
`record` function requires that all keys are present. We intentionally
omit empty stats, so this causes a zod validation error.

Example error:

```
Connection error!
 game id: VSEtmKpJ, client id: 0UMrA84F
Error: ✖ Invalid input: expected array, received undefined
  → at allPlayersStats.0UMrA84F.units.wshp
✖ Invalid input: expected array, received undefined
  → at allPlayersStats.0UMrA84F.units.saml
Stack: 
```

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [x] I have added relevant tests to the test directory
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced
- [x] I understand that submitting code with bugs that could have been
caught through manual testing blocks releases and new features for all
contributors
2025-06-24 13:50:36 -07:00

49 lines
1.1 KiB
TypeScript

import { PlayerStatsSchema } from "../src/core/StatsSchemas";
function testPlayerSchema(
json: string,
expectSuccess = true,
expectThrow = false,
): void {
const parse = () => {
const raw = JSON.parse(json);
const result = PlayerStatsSchema.safeParse(raw);
return result.success;
};
if (expectSuccess) {
// Expect success
expect(parse()).toBeTruthy();
} else if (!expectThrow) {
// Expect failure
expect(parse()).toBeFalsy();
} else {
// Expect throw
expect(parse).toThrow();
}
}
describe("StatsSchema", () => {
test("Parse empty", () => {
testPlayerSchema("{}");
});
test("Parse partial", () => {
testPlayerSchema('{"units":{"port":["0","0","0","1"]}}');
});
test("Parse invalid", () => {
testPlayerSchema("[]", false);
testPlayerSchema("null", false);
testPlayerSchema('"null"', false);
testPlayerSchema('"undefined"', false);
});
test("Parse failure", () => {
testPlayerSchema("", false, true);
testPlayerSchema("undefined", false, true);
testPlayerSchema("{", false, true);
testPlayerSchema("{}}", false, true);
});
});