diff --git a/.chronus/changes/spec-api-xml-declaration-fix-2026-7-20.md b/.chronus/changes/spec-api-xml-declaration-fix-2026-7-20.md new file mode 100644 index 00000000000..96ecd21c04f --- /dev/null +++ b/.chronus/changes/spec-api-xml-declaration-fix-2026-7-20.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/spec-api" +--- + +XML declarations no longer affect semantic body equality in `validateXmlBodyEquals`; both actual and expected XML declarations are ignored during comparison. diff --git a/packages/spec-api/src/request-validations.ts b/packages/spec-api/src/request-validations.ts index da170b07aed..1b18b9a65e8 100644 --- a/packages/spec-api/src/request-validations.ts +++ b/packages/spec-api/src/request-validations.ts @@ -64,7 +64,7 @@ export const validateXmlBodyEquals = ( throw new ValidationError(BODY_EMPTY_ERROR_MESSAGE, expectedXml, request.rawBody); } - const parser = new XMLParser({ parseTagValue: false }); + const parser = new XMLParser({ parseTagValue: false, ignoreDeclaration: true }); const actualParsed: unknown = parser.parse(request.rawBody); let expectedParsed: unknown = parser.parse(expectedXml); diff --git a/packages/spector/test/xml-validation.test.ts b/packages/spector/test/xml-validation.test.ts index 93e3579506f..a990772368f 100644 --- a/packages/spector/test/xml-validation.test.ts +++ b/packages/spector/test/xml-validation.test.ts @@ -35,6 +35,12 @@ describe("with plain string (no matchers)", () => { ).toThrow("Body provided doesn't match expected body"); }); + it("should accept matching XML when actual has no declaration", () => { + expect(() => + validateXmlBodyEquals(makeRequest("1"), "1"), + ).not.toThrow(); + }); + it("should reject empty body", () => { expect(() => validateXmlBodyEquals(makeRequest(""), "")).toThrow("Body should exists"); });