Skip to content

Commit db6e852

Browse files
authored
test: add test for NonceProvider and useNonce; handle case-insensitive Set-Cookie keys (#44)
1 parent c2c34aa commit db6e852

File tree

11 files changed

+231
-16
lines changed

11 files changed

+231
-16
lines changed

.changeset/eleven-toes-appear.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@mcansh/http-helmet": patch
3+
---
4+
5+
explicitly handle case-insensitive Set-Cookie keys. may have already been fine, but added happy-dom to add a test for NonceProvider/useNonce and it popped up

packages/http-helmet/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,16 @@
6464
},
6565
"devDependencies": {
6666
"@arethetypeswrong/cli": "catalog:",
67+
"@testing-library/dom": "^10.4.0",
68+
"@testing-library/jest-dom": "^6.6.3",
69+
"@testing-library/react": "^16.3.0",
6770
"@total-typescript/tsconfig": "catalog:",
6871
"@types/node": "catalog:",
6972
"@types/react": "^19.1.8",
7073
"@types/react-dom": "^19.1.6",
7174
"@vitest/coverage-v8": "catalog:",
7275
"content-security-policy-parser": "^0.6.0",
76+
"happy-dom": "^18.0.1",
7377
"react": "^19.1.0",
7478
"react-dom": "^19.1.0",
7579
"tsdown": "catalog:",

packages/http-helmet/src/index.spec.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,17 @@ describe("mergeHeaders", () => {
211211

212212
let merged = mergeHeaders(headers1, headers2);
213213

214-
expect(merged.get("Set-Cookie")).toBe("foo=bar, baz=qux");
215214
expect(merged.getSetCookie()).toStrictEqual(["foo=bar", "baz=qux"]);
216215
});
216+
217+
it('merged different cased "Set-Cookie" headers"', () => {
218+
let headers1 = new Headers({ "set-cookie": "foo=bar" });
219+
let headers2 = new Headers({ "Set-Cookie": "baz=qux" });
220+
221+
let merged = mergeHeaders(headers1, headers2);
222+
223+
expect(merged.getSetCookie()).toStrictEqual(["foo=bar", "baz=qux"]);
224+
})
217225
});
218226

219227
it("allows mixing camel and kebab case for CSP keys", () => {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { render, screen } from "@testing-library/react";
2+
import { describe, expect, it } from "vitest";
3+
import { NonceProvider, useNonce } from "./react";
4+
5+
describe("NonceProvider", () => {
6+
it("pass and receive nonce", () => {
7+
function Parent() {
8+
return (
9+
<NonceProvider nonce="test-nonce">
10+
<Child />
11+
</NonceProvider>
12+
);
13+
}
14+
15+
function Child() {
16+
const nonce = useNonce();
17+
return <div data-testid="nonce">{nonce}</div>;
18+
}
19+
20+
render(<Parent />);
21+
22+
expect(screen.getByTestId("nonce")).toHaveTextContent("test-nonce");
23+
});
24+
});

packages/http-helmet/src/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,10 @@ export function mergeHeaders(...sources: HeadersInit[]): Headers {
4848
let headers = new Headers(source);
4949

5050
for (let [key, value] of headers.entries()) {
51+
let lowerKey = key.toLowerCase();
5152
if (value === undefined || value === "undefined") {
5253
result.delete(key);
53-
} else if (key === "set-cookie") {
54+
} else if (lowerKey === "set-cookie") {
5455
result.append(key, value);
5556
} else {
5657
result.set(key, value);

packages/http-helmet/tsconfig.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
{
22
"extends": "@total-typescript/tsconfig/bundler/dom",
3-
"include": ["src/**/*"],
3+
"include": ["./src/**/*", "./vitest.setup.ts"],
44
"compilerOptions": {
55
"allowImportingTsExtensions": true,
66
"moduleResolution": "Bundler",
77
"forceConsistentCasingInFileNames": true,
8-
"jsx": "react-jsx"
8+
"jsx": "react-jsx",
9+
"types": ["vitest/globals", "@testing-library/jest-dom"]
910
}
1011
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { defineConfig } from "vitest/config";
2+
3+
export default defineConfig({
4+
test: {
5+
setupFiles: ["./vitest.setup.ts"],
6+
environment: "happy-dom",
7+
coverage: {
8+
provider: "v8",
9+
reporter: ["text", "json", "html"],
10+
include: ["./src/**/*.{ts,tsx}"],
11+
},
12+
},
13+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import * as matchers from "@testing-library/jest-dom/matchers";
2+
import { expect } from "vitest";
3+
4+
expect.extend(matchers);

packages/url/tsconfig.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
22
"extends": "@total-typescript/tsconfig/bundler/dom",
3-
"include": ["src/**/*"],
3+
"include": ["./src/**/*"],
44
"compilerOptions": {
55
"allowImportingTsExtensions": true,
66
"moduleResolution": "Bundler",
7-
"forceConsistentCasingInFileNames": true
7+
"forceConsistentCasingInFileNames": true,
8+
"types": ["vitest/globals"]
89
}
910
}

0 commit comments

Comments
 (0)