Skip to content

Commit

Permalink
feat(responses): add overload types to equalsResponse
Browse files Browse the repository at this point in the history
  • Loading branch information
TomokiMiyauci committed Mar 1, 2023
1 parent 44a025c commit 7af961b
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 25 deletions.
24 changes: 17 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,18 +145,28 @@ Check two `Response` fields equality.

```ts
import { equalsResponse } from "https://deno.land/x/http_utils@$VERSION/mod.ts";
import { assertEquals } from "https://deno.land/std@$VERSION/testing/asserts.ts";
import { assert } from "https://deno.land/std@$VERSION/testing/asserts.ts";

assertEquals(
await equalsResponse(
assert(
equalsResponse(
new Response(null, { status: 204, headers: { "content-length": "0" } }),
new Response(null, { status: 204, headers: { "content-length": "0" } }),
),
true,
);
assertEquals(
await equalsResponse(new Response(), new Response(null, { status: 500 })),
false,
```

If you also want to check the equivalence of the body, set the mode to strict.

```ts
import { equalsResponse } from "https://deno.land/x/http_utils@$VERSION/mod.ts";
import { assert } from "https://deno.land/std@$VERSION/testing/asserts.ts";

assert(
await equalsResponse(
new Response("test1", { status: 200, headers: { "content-length": "5" } }),
new Response("test2", { status: 200, headers: { "content-length": "5" } }),
false,
),
);
```

Expand Down
50 changes: 38 additions & 12 deletions responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,40 +43,66 @@ export async function safeResponse(

/** Check two `Response` fields equality.
*
* @example
* ```ts
* import { equalsResponse } from "https://deno.land/x/http_utils@$VERSION/mod.ts";
* import { assertEquals } from "https://deno.land/std@$VERSION/testing/asserts.ts";
* import { assert } from "https://deno.land/std@$VERSION/testing/asserts.ts";
*
* assertEquals(
* await equalsResponse(
* assert(
* equalsResponse(
* new Response(null, { status: 204, headers: { "content-length": "0" } }),
* new Response(null, { status: 204, headers: { "content-length": "0" } }),
* ),
* true,
* );
* assertEquals(
* await equalsResponse(new Response("test"), new Response("test2")),
* false,
* ```
*/
export function equalsResponse(left: Response, right: Response): boolean;
/** Strict check two `Response` fields equality.
*
* @example
* ```ts
* import { equalsResponse } from "https://deno.land/x/http_utils@$VERSION/mod.ts";
* import { assert } from "https://deno.land/std@$VERSION/testing/asserts.ts";
*
* assert(
* await equalsResponse(
* new Response("test1", { status: 200, headers: { "content-length": "5" } }),
* new Response("test2", { status: 200, headers: { "content-length": "5" } }),
* false,
* ),
* );
* ```
*/
export async function equalsResponse(
export function equalsResponse(
left: Response,
right: Response,
strict: boolean,
): boolean | Promise<boolean>;
export function equalsResponse(
left: Response,
right: Response,
): Promise<boolean> {
strict?: boolean,
): boolean | Promise<boolean> {
strict ??= false;

try {
left = left.clone();
right = right.clone();

return left.ok === right.ok &&
const staticResult = left.ok === right.ok &&
left.bodyUsed === right.bodyUsed &&
left.redirected === right.redirected &&
left.status === right.status &&
left.statusText === right.statusText &&
left.type === right.type &&
left.url === right.url &&
equalsHeaders(left.headers, right.headers) &&
await left.text() === await right.text();
equalsHeaders(left.headers, right.headers);

if (!staticResult || !strict) return staticResult;

return Promise.all([left.text(), right.text()]).then(([left, right]) =>
Object.is(left, right)
);
} catch {
return false;
}
Expand Down
24 changes: 18 additions & 6 deletions responses_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { equalsResponse, isResponse, safeResponse } from "./responses.ts";
import { assertEqualsResponse, describe, expect, fn, it } from "./dev_deps.ts";

describe("equalsResponse", () => {
it("should pass", async () => {
const table: [...Parameters<typeof equalsResponse>, boolean][] = [
it("should pass cases", () => {
const table: [Response, Response, boolean][] = [
[new Response(), new Response(), true],
[new Response(null), new Response(), true],
[new Response(undefined), new Response(), true],
Expand Down Expand Up @@ -38,7 +38,6 @@ describe("equalsResponse", () => {
}),
true,
],

[
new Response(null, {
headers: {
Expand Down Expand Up @@ -79,12 +78,25 @@ describe("equalsResponse", () => {
],
[new Response("test"), new Response(), false],
[new Response(""), new Response(""), true],
[new Response("a"), new Response(""), false],
[new Response("a"), new Response(""), true],
[new Response("a"), new Response("a"), true],
];

await Promise.all(table.map(async ([a, b, result]) => {
expect(await equalsResponse(a, b)).toEqual(result);
Promise.all(table.map(([left, right, result]) => {
expect(equalsResponse(left, right)).toEqual(result);
}));
});

it("should pass if strict mode", async () => {
const table: [Response, Response, boolean][] = [
[new Response(""), new Response(""), true],
[new Response("a"), new Response("a"), true],
[new Response("test"), new Response(), false],
[new Response("a"), new Response(""), false],
];

await Promise.all(table.map(async ([left, right, result]) => {
expect(await equalsResponse(left, right, true)).toEqual(result);
}));
});

Expand Down

0 comments on commit 7af961b

Please sign in to comment.