branch: main
request.spec.ts
6777 bytesRaw
import { expect, test } from "vitest";
import { FormData } from "miniflare";

import { mf, mfUrl } from "./mf";

test("basic sync request", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}request`);
  expect(resp.status).toBe(200);
});

test("basic async request", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}async-request`);
  expect(resp.status).toBe(200);
});

test("test data", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}test-data`);
  expect(await resp.text()).toBe("data ok");
});

test("headers", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}headers`, {
    method: "POST",
    headers: {
      A: "B",
    },
  });

  expect(resp.headers.get("A")).toBe("B");
});

test("secret", async () => {
  const formData = new FormData();
  formData.append("secret", "EXAMPLE_SECRET");

  const resp = await mf.dispatchFetch(`${mfUrl}is-secret`, {
    method: "POST",
    body: formData,
  });

  expect(await resp.text()).toBe("example");
});

test("form data", async () => {
  const formData = new FormData();
  formData.append("file", new Blob(["workers-rs is cool"]), "file");

  let resp = await mf.dispatchFetch(`${mfUrl}formdata-file-size`, {
    method: "POST",
    body: formData,
  });
  expect(resp.status).toBe(200);

  const hashes = (await resp.json()) as { name: string }[];

  resp = await mf.dispatchFetch(
    `${mfUrl}formdata-file-size/${hashes[0].name}`
  );
  expect(resp.status).toBe(200);
});

test("user id", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}user/example/test`);
  expect(await resp.text()).toBe("TEST user id: example");
});

test("user", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}user/example`);
  expect(await resp.json()).toMatchObject({ id: "example" });
});

test("post account id zones", async () => {
  const resp = await mf.dispatchFetch(
    `${mfUrl}account/example/zones`,
    {
      method: "POST",
    }
  );
  expect(await resp.text()).toBe("Create new zone for Account: example");
});

test("get account id zones", async () => {
  const resp = await mf.dispatchFetch(
    `${mfUrl}account/example/zones`
  );
  expect(await resp.text()).toBe(
    "Account id: example..... You get a zone, you get a zone!"
  );
});

test("async text echo", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}async-text-echo`, {
    method: "POST",
    body: "Example text!",
  });
  expect(await resp.text()).toBe("Example text!");
});

test("fetch", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}fetch`);
  expect(resp.status).toBe(200);
});

test("fetch json", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}fetch_json`);
  expect(resp.status).toBe(200);
});

test("proxy request", async () => {
  const resp = await mf.dispatchFetch(
    `${mfUrl}proxy_request/https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Encoding/contributors.txt`
  );
  expect(resp.status).toBe(200);
});

test("durable id", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}durable/example`);
  expect(await resp.text()).toContain("[durable_object]");
});

test("some secret", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}secret`);
  expect(await resp.text()).toBe("secret!");
});

test("some var", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}var`);
  expect(await resp.text()).toBe("some value");
});

test("some object var", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}object-var`);
  expect(await resp.json()).toStrictEqual({ foo: 42, bar: "string" });
});

test("kv key value", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}kv/a/b`, {
    method: "POST",
  });

  const keys = (await resp.json()) as { keys: unknown[] };
  expect(keys.keys).toHaveLength(1);
});

test("bytes", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}bytes`);
  expect(await resp.arrayBuffer()).toStrictEqual(
    new Uint8Array([1, 2, 3, 4, 5, 6, 7]).buffer
  );
});

test("api data", async () => {
  const data = { userId: 0, title: "Hi!", completed: true };
  const resp = await mf.dispatchFetch(`${mfUrl}api-data`, {
    method: "POST",
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify(data),
  });

  expect(await resp.json()).toMatchObject({
    ...data,
    title: [...data.title].reverse().join(""),
  });
});

test("nonsense repeat", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}nonsense-repeat`, {
    method: "POST",
  });

  expect(await resp.text()).toBe("data ok");
});

test("status code", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}status/418`);
  expect(resp.status).toBe(418);
});

test("root", async () => {
  const resp = await mf.dispatchFetch(mfUrl, {
    method: "PUT",
  });

  expect(resp.headers.get("x-testing")).toBe("123");
});

test("async", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}async`, {
    method: "PUT",
  });

  expect(resp.headers.get("x-testing")).toBe("123");
});

test("catchall", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}hello-world`, {
    method: "OPTIONS",
  });

  expect(await resp.text()).toBe("/hello-world");
});

test("redirect default", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}redirect-default`, {
    redirect: "manual",
  });
  expect(resp.headers.get("location")).toBe("https://example.com/");
});

test("redirect 307", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}redirect-307`, {
    redirect: "manual",
  });
  expect(resp.headers.get("location")).toBe("https://example.com/");
  expect(resp.status).toBe(307);
});

test("now", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}now`);
  expect(resp.status).toBe(200);
});

test("wait", async () => {
  const then = Date.now();
  const resp = await mf.dispatchFetch(`${mfUrl}wait/100`);
  expect(resp.status).toBe(200);
  expect(Date.now() - then).toBeGreaterThan(100);
});

test("custom response body", async () => {
  const then = Date.now();
  const resp = await mf.dispatchFetch(`${mfUrl}wait/100`);
  expect(resp.status).toBe(200);
  expect(Date.now() - then).toBeGreaterThan(100);
});

test("init called", async () => {
  const resp = await mf.dispatchFetch(`${mfUrl}init-called`);
  expect(await resp.text()).toBe("true");
});

test("xor", async () => {
  async function* generator() {
    for (let i = 0; i < 255; i++) {
      yield new Uint8Array([i]);
    }
  }

  const resp = await mf.dispatchFetch(`${mfUrl}xor/10`, {
    method: "POST",
    body: generator(),
    duplex: "half",
  });

  const buffer = await resp.arrayBuffer();
  const bytes = new Uint8Array(buffer);

  for (let i = 0; i < 255; i++) {
    expect(bytes[i]).toBe(i ^ 10);
  }
});