From 5841c4d9ad560803d2caba6dc67404655735944b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 02:15:51 +0000 Subject: [PATCH 1/3] Initial plan From c73122fb0fca95fd3bbcddee9a81c71c6602e021 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 02:24:42 +0000 Subject: [PATCH 2/3] fix: use numeric float comparison in duration mockapi for query and header params Co-authored-by: weidongxu-microsoft <53292327+weidongxu-microsoft@users.noreply.github.com> --- .../specs/encode/duration/mockapi.ts | 98 +++++++++++++------ 1 file changed, 70 insertions(+), 28 deletions(-) diff --git a/packages/http-specs/specs/encode/duration/mockapi.ts b/packages/http-specs/specs/encode/duration/mockapi.ts index 9349baf1405..fa7d4447bce 100644 --- a/packages/http-specs/specs/encode/duration/mockapi.ts +++ b/packages/http-specs/specs/encode/duration/mockapi.ts @@ -4,6 +4,7 @@ import { MockRequest, passOnSuccess, ScenarioMockApi, + ValidationError, } from "@typespec/spec-api"; export const Scenarios: Record = {}; @@ -146,6 +147,34 @@ function createQueryServerTests( kind: "MockApiDefinition", }); } + +function createQueryFloatServerTests(uri: string, paramData: any, value: number) { + return passOnSuccess({ + uri, + method: "get", + request: { + query: paramData, + }, + response: { + status: 204, + }, + handler: (req: MockRequest) => { + const actual = req.query["input"] as string; + const actualNum = parseFloat(actual); + if (actualNum !== value) { + throw new ValidationError( + `Expected query param input=${value} but got ${actual}`, + String(value), + actual, + ); + } + return { + status: 204, + }; + }, + kind: "MockApiDefinition", + }); +} Scenarios.Encode_Duration_Query_default = createQueryServerTests( "/encode/duration/query/default", { @@ -197,19 +226,19 @@ Scenarios.Encode_Duration_Query_int32Milliseconds = createQueryServerTests( }, "36000", ); -Scenarios.Encode_Duration_Query_floatMilliseconds = createQueryServerTests( +Scenarios.Encode_Duration_Query_floatMilliseconds = createQueryFloatServerTests( "/encode/duration/query/float-milliseconds", { input: 35625, }, - "35625", + 35625, ); -Scenarios.Encode_Duration_Query_float64Milliseconds = createQueryServerTests( +Scenarios.Encode_Duration_Query_float64Milliseconds = createQueryFloatServerTests( "/encode/duration/query/float64-milliseconds", { input: 35625, }, - "35625", + 35625, ); Scenarios.Encode_Duration_Query_int32MillisecondsArray = createQueryServerTests( "/encode/duration/query/int32-milliseconds-array", @@ -226,12 +255,12 @@ Scenarios.Encode_Duration_Query_int32SecondsLargerUnit = createQueryServerTests( }, "120", ); -Scenarios.Encode_Duration_Query_floatSecondsLargerUnit = createQueryServerTests( +Scenarios.Encode_Duration_Query_floatSecondsLargerUnit = createQueryFloatServerTests( "/encode/duration/query/float-seconds-larger-unit", { input: 150, }, - "150", + 150, ); Scenarios.Encode_Duration_Query_int32MillisecondsLargerUnit = createQueryServerTests( "/encode/duration/query/int32-milliseconds-larger-unit", @@ -240,12 +269,12 @@ Scenarios.Encode_Duration_Query_int32MillisecondsLargerUnit = createQueryServerT }, "180000", ); -Scenarios.Encode_Duration_Query_floatMillisecondsLargerUnit = createQueryServerTests( +Scenarios.Encode_Duration_Query_floatMillisecondsLargerUnit = createQueryFloatServerTests( "/encode/duration/query/float-milliseconds-larger-unit", { input: 210000, }, - "210000", + 210000, ); function createHeaderServerTests(uri: string, headersData: any, value: any) { @@ -262,6 +291,31 @@ function createHeaderServerTests(uri: string, headersData: any, value: any) { }); } +function createHeaderFloatServerTests(uri: string, value: number) { + return passOnSuccess({ + uri, + method: "get", + response: { + status: 204, + }, + handler: (req: MockRequest) => { + const actual = req.headers["duration"]; + const actualNum = parseFloat(actual); + if (actualNum !== value) { + throw new ValidationError( + `Expected header duration=${value} but got ${actual}`, + String(value), + actual, + ); + } + return { + status: 204, + }; + }, + kind: "MockApiDefinition", + }); +} + Scenarios.Encode_Duration_Header_default = createHeaderServerTests( "/encode/duration/header/default", { @@ -312,19 +366,13 @@ Scenarios.Encode_Duration_Header_int32Milliseconds = createHeaderServerTests( }, "36000", ); -Scenarios.Encode_Duration_Header_floatMilliseconds = createHeaderServerTests( +Scenarios.Encode_Duration_Header_floatMilliseconds = createHeaderFloatServerTests( "/encode/duration/header/float-milliseconds", - { - duration: "35625", - }, - "35625", + 35625, ); -Scenarios.Encode_Duration_Header_float64Milliseconds = createHeaderServerTests( +Scenarios.Encode_Duration_Header_float64Milliseconds = createHeaderFloatServerTests( "/encode/duration/header/float64-milliseconds", - { - duration: "35625", - }, - "35625", + 35625, ); Scenarios.Encode_Duration_Header_int32MillisecondsArray = createHeaderServerTests( "/encode/duration/header/int32-milliseconds-array", @@ -340,12 +388,9 @@ Scenarios.Encode_Duration_Header_int32SecondsLargerUnit = createHeaderServerTest }, "120", ); -Scenarios.Encode_Duration_Header_floatSecondsLargerUnit = createHeaderServerTests( +Scenarios.Encode_Duration_Header_floatSecondsLargerUnit = createHeaderFloatServerTests( "/encode/duration/header/float-seconds-larger-unit", - { - duration: "150", - }, - "150", + 150, ); Scenarios.Encode_Duration_Header_int32MillisecondsLargerUnit = createHeaderServerTests( "/encode/duration/header/int32-milliseconds-larger-unit", @@ -354,10 +399,7 @@ Scenarios.Encode_Duration_Header_int32MillisecondsLargerUnit = createHeaderServe }, "180000", ); -Scenarios.Encode_Duration_Header_floatMillisecondsLargerUnit = createHeaderServerTests( +Scenarios.Encode_Duration_Header_floatMillisecondsLargerUnit = createHeaderFloatServerTests( "/encode/duration/header/float-milliseconds-larger-unit", - { - duration: "210000", - }, - "210000", + 210000, ); From 9fb4e2154dbf4c514eb8a3dcd1cf609e036d52ea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 02:28:20 +0000 Subject: [PATCH 3/3] fix: add isNaN check in float comparison handlers per code review Co-authored-by: weidongxu-microsoft <53292327+weidongxu-microsoft@users.noreply.github.com> --- ...lot-fix-float-comparison-in-mockapi-2026-2-6-2-25-28.md | 7 +++++++ packages/http-specs/specs/encode/duration/mockapi.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .chronus/changes/copilot-fix-float-comparison-in-mockapi-2026-2-6-2-25-28.md diff --git a/.chronus/changes/copilot-fix-float-comparison-in-mockapi-2026-2-6-2-25-28.md b/.chronus/changes/copilot-fix-float-comparison-in-mockapi-2026-2-6-2-25-28.md new file mode 100644 index 00000000000..5d6b60064d3 --- /dev/null +++ b/.chronus/changes/copilot-fix-float-comparison-in-mockapi-2026-2-6-2-25-28.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-specs" +--- + +Fix float comparison in duration encode mockapi for query and header params to use numeric comparison instead of string comparison, allowing values like `35625.0` to match `35625` \ No newline at end of file diff --git a/packages/http-specs/specs/encode/duration/mockapi.ts b/packages/http-specs/specs/encode/duration/mockapi.ts index fa7d4447bce..6a722fff8ff 100644 --- a/packages/http-specs/specs/encode/duration/mockapi.ts +++ b/packages/http-specs/specs/encode/duration/mockapi.ts @@ -161,7 +161,7 @@ function createQueryFloatServerTests(uri: string, paramData: any, value: number) handler: (req: MockRequest) => { const actual = req.query["input"] as string; const actualNum = parseFloat(actual); - if (actualNum !== value) { + if (isNaN(actualNum) || actualNum !== value) { throw new ValidationError( `Expected query param input=${value} but got ${actual}`, String(value), @@ -301,7 +301,7 @@ function createHeaderFloatServerTests(uri: string, value: number) { handler: (req: MockRequest) => { const actual = req.headers["duration"]; const actualNum = parseFloat(actual); - if (actualNum !== value) { + if (isNaN(actualNum) || actualNum !== value) { throw new ValidationError( `Expected header duration=${value} but got ${actual}`, String(value),