alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
143 lines (113 loc) • 3.88 kB
text/typescript
import { Alepha } from "alepha";
import { HttpClient, ServerProvider } from "alepha/server";
import { describe, it } from "vitest";
import { ssrManifestAtom } from "../atoms/ssrManifestAtom.ts";
import { $page } from "../index.ts";
describe("ReactPreloadProvider", () => {
class App {
home = $page({
path: "/",
component: () => "Hello World",
});
}
it("should add Link header with entry assets to HTML responses", async ({
expect,
}) => {
const alepha = Alepha.create({
env: { LOG_LEVEL: "error", SERVER_PORT: 0 },
}).with(App);
// Set up mock SSR manifest with entry assets
alepha.store.set(ssrManifestAtom, {
client: {
"src/entry.tsx": {
file: "assets/entry.abc123.js",
isEntry: true,
css: ["assets/style.def456.css"],
},
},
});
await alepha.start();
const server = alepha.inject(ServerProvider);
const http = alepha.inject(HttpClient);
const response = await http.fetch(`${server.hostname}/`);
// Check that the Link header is present
const linkHeader = response.headers.get("link");
expect(linkHeader).toBeTruthy();
expect(linkHeader).toContain(
"</assets/style.def456.css>; rel=preload; as=style",
);
expect(linkHeader).toContain(
"</assets/entry.abc123.js>; rel=modulepreload",
);
await alepha.stop();
});
it("should not add Link header when no SSR manifest is available", async ({
expect,
}) => {
const alepha = Alepha.create({
env: { LOG_LEVEL: "error", SERVER_PORT: 0 },
}).with(App);
// No SSR manifest set
await alepha.start();
const server = alepha.inject(ServerProvider);
const http = alepha.inject(HttpClient);
const response = await http.fetch(`${server.hostname}/`);
// Link header should not be present (or empty)
const linkHeader = response.headers.get("link");
expect(linkHeader).toBeNull();
await alepha.stop();
});
it("should handle base path in manifest", async ({ expect }) => {
const alepha = Alepha.create({
env: { LOG_LEVEL: "error", SERVER_PORT: 0 },
}).with(App);
// Set up mock SSR manifest with base path
alepha.store.set(ssrManifestAtom, {
base: "/app",
client: {
"src/entry.tsx": {
file: "assets/entry.abc123.js",
isEntry: true,
css: ["assets/style.def456.css"],
},
},
});
await alepha.start();
const server = alepha.inject(ServerProvider);
const http = alepha.inject(HttpClient);
const response = await http.fetch(`${server.hostname}/`);
// Check that the Link header includes base path
const linkHeader = response.headers.get("link");
expect(linkHeader).toBeTruthy();
expect(linkHeader).toContain(
"</app/assets/style.def456.css>; rel=preload; as=style",
);
expect(linkHeader).toContain(
"</app/assets/entry.abc123.js>; rel=modulepreload",
);
await alepha.stop();
});
it("should handle entry with only JS (no CSS)", async ({ expect }) => {
const alepha = Alepha.create({
env: { LOG_LEVEL: "error", SERVER_PORT: 0 },
}).with(App);
// Set up mock SSR manifest with only JS entry
alepha.store.set(ssrManifestAtom, {
client: {
"src/entry.tsx": {
file: "assets/entry.abc123.js",
isEntry: true,
},
},
});
await alepha.start();
const server = alepha.inject(ServerProvider);
const http = alepha.inject(HttpClient);
const response = await http.fetch(`${server.hostname}/`);
// Check that the Link header contains only JS modulepreload
const linkHeader = response.headers.get("link");
expect(linkHeader).toBeTruthy();
expect(linkHeader).toBe("</assets/entry.abc123.js>; rel=modulepreload");
await alepha.stop();
});
});