import { Request, Startup } from "@halsp/core";
import { HttpMethods } from "@halsp/http";
import "@halsp/testing";
import "../src";
import { readStream } from "./utils";
describe("method", () => {
it("should match with GET", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.get))
.useStatic({
dir: "test/static",
useIndex: true,
})
.test();
expect(result.status).toBe(200);
});
it("should be 404 when method is POST and use405 is undefined", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post))
.useStatic({
dir: "test/static",
useIndex: true,
method: HttpMethods.get,
})
.test();
expect(result.status).toBe(404);
});
it("should be 200 and ignore use405 when path exist", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.get))
.useStatic({
dir: "test/static",
useIndex: true,
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(200);
});
it("should return default 405.html when method is POST and use405 is true", async () => {
{
const result = await new Startup()
.useHttp()
.setContext(
new Request().setMethod(HttpMethods.post).setPath("index.html"),
)
.useStatic({
dir: "test/static/dir",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(405);
expect((result.body as string).includes("405")).toBeTruthy();
}
{
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post).setPath("index"))
.useStatic({
file: "test/static/index.html",
reqPath: "index",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(405);
expect((result.body as string).includes("405")).toBeTruthy();
}
{
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post).setPath("index"))
.useStatic({
file: "test/static/index.html",
reqPath: "index",
method: HttpMethods.get,
})
.test();
expect(result.status).toBe(404);
}
});
it("should return 405.html in dir when method is POST and use405 is true", async () => {
const result = await new Startup()
.useHttp()
.setContext(
new Request().setMethod(HttpMethods.post).setPath("index.html"),
)
.useStatic({
dir: "test/static",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(405);
expect(await readStream(result.body)).toBe("405 page");
});
it("should use custom 405 page", async () => {
{
const result = await new Startup()
.useHttp()
.setContext(
new Request().setMethod(HttpMethods.post).setPath("index.html"),
)
.useStatic({
dir: "test/static/dir",
method: HttpMethods.get,
use405: "../405.html",
})
.test();
expect(result.status).toBe(405);
expect(await readStream(result.body)).toBe("405 page");
}
{
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post).setPath("index"))
.useStatic({
file: "test/static/index.html",
reqPath: "index",
method: HttpMethods.get,
use405: "test/static/405.html",
})
.test();
expect(result.status).toBe(405);
expect(await readStream(result.body)).toBe("405 page");
}
});
it("should be 405 when method is POST and use405 is true with useIndex = true", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post))
.useStatic({
dir: "test/static",
method: HttpMethods.get,
use405: true,
useIndex: true,
})
.test();
expect(result.status).toBe(405);
});
it("should be 405 when method is POST and use405 is true with single file", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post).setPath("ind"))
.useStatic({
file: "test/static/index.html",
reqPath: "ind",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(405);
});
it("should be 404 when file is not exist and use405 is true", async () => {
{
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post))
.useStatic({
dir: "test/static",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(404);
}
{
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post))
.useStatic({
file: "test/static/not-exist",
method: HttpMethods.get,
use405: true,
})
.test();
expect(result.status).toBe(404);
}
});
it("should be 405 when file is not exist and strictMethod is true", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod(HttpMethods.post))
.useStatic({
dir: "test/static",
method: HttpMethods.get,
use405: true,
strictMethod: true,
})
.test();
expect(result.status).toBe(405);
});
it("should match with custom methods", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod("PUT"))
.useStatic({
dir: "test/static",
method: "PUT",
useIndex: true,
})
.test();
expect(result.status).toBe(200);
});
it("should match with custom methods with reqPath", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod("put").setPath("ind"))
.useStatic({
file: "test/static/index.html",
reqPath: "ind",
method: "PUT",
})
.test();
expect(result.status).toBe(200);
});
it("should match with array methods", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod("PUT"))
.useStatic({
dir: "test/static",
method: ["PUT"],
useIndex: true,
})
.test();
expect(result.status).toBe(200);
});
it("should match with array methods with reqPath", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod("put").setPath("ind"))
.useStatic({
file: "test/static/index.html",
reqPath: ["ind"],
method: ["PUT"],
})
.test();
expect(result.status).toBe(200);
});
it("should match with any methods", async () => {
const result = await new Startup()
.useHttp()
.setContext(new Request().setMethod("PUT"))
.useStatic({
dir: "test/static",
method: "ANY",
useIndex: true,
})
.test();
expect(result.status).toBe(200);
});
});