Extremely Popular
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448// Copyright 2018-2022 the oak authors. All rights reserved. MIT license.
import { Status } from "./deps.ts";import { assert, assertEquals, assertThrows } from "./test_deps.ts";import type { Request } from "./request.ts";import { REDIRECT_BACK, Response } from "./response.ts";
const { test } = Deno;
function createMockRequest({ headers, accepts = (_contentType: string) => { return true; },}: { headers?: [string, string][]; accepts?: (contentType: string) => boolean;} = {}): Request { // deno-lint-ignore no-explicit-any return { accepts, headers: new Headers(headers) } as any;}
test({ name: "response empty", async fn() { const response = new Response(createMockRequest()); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.body, null); assertEquals(nativeResponse.status, 404); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); assertEquals(nativeResponse.headers.get("Content-Length"), "0"); },});
test({ name: "response.status set", async fn() { const response = new Response(createMockRequest()); response.status = 302; const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.body, null); assertEquals(nativeResponse.status, 302); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); assertEquals(nativeResponse.headers.get("Content-Length"), "0"); },});
test({ name: "response.body as text", async fn() { const response = new Response(createMockRequest()); response.body = "Hello world!"; const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "Hello world!"); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "text/plain; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.body as HTML", async fn() { const response = new Response(createMockRequest()); response.body = "<!DOCTYPE html><html><body>Hello world!</body></html>"; const nativeResponse = await response.toDomResponse(); assertEquals( await nativeResponse.text(), "<!DOCTYPE html><html><body>Hello world!</body></html>", ); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "text/html; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.body as JSON", async fn() { const response = new Response(createMockRequest()); response.body = { foo: "bar" }; const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), `{"foo":"bar"}`); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "application/json; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.body as symbol", async fn() { const response = new Response(createMockRequest()); response.body = Symbol("foo"); const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "Symbol(foo)"); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "text/plain; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.body as Uint8Array", async fn() { const response = new Response(createMockRequest()); response.body = new TextEncoder().encode("Hello world!"); const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "Hello world!"); assertEquals(nativeResponse.status, 200); assertEquals(Array.from(nativeResponse.headers.entries()).length, 0); },});
test({ name: "response.body as function", async fn() { const response = new Response(createMockRequest()); response.body = () => "Hello world!"; const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "Hello world!"); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "text/plain; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.body as readable stream", async fn() { const response = new Response(createMockRequest()); response.body = new ReadableStream<string>({ start(controller) { controller.enqueue("hello "); controller.enqueue("deno"); controller.close(); }, }); const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "hello deno"); assertEquals(nativeResponse.status, 200); },});
test({ name: "response.body as async iterable", async fn() { const response = new Response(createMockRequest()); response.body = { async *[Symbol.asyncIterator]() { yield "hello "; yield "deno"; return; }, }; const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "hello deno"); assertEquals(nativeResponse.status, 200); },});
test({ name: "response.body as async function", async fn() { const response = new Response(createMockRequest()); response.body = () => Promise.resolve("Hello world!"); const nativeResponse = await response.toDomResponse(); assertEquals(await nativeResponse.text(), "Hello world!"); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "text/plain; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.type", async fn() { const response = new Response(createMockRequest()); response.type = "js"; response.body = "console.log('hello world');"; const nativeResponse = await response.toDomResponse(); assertEquals( await nativeResponse.text(), "console.log('hello world');", ); assertEquals(nativeResponse.status, 200); assertEquals( nativeResponse.headers.get("content-type"), "application/javascript; charset=utf-8", ); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "response.type does not overwrite", async fn() { const response = new Response(createMockRequest()); response.type = "js"; response.body = "console.log('hello world');"; response.headers.set("content-type", "text/plain"); const nativeResponse = await response.toDomResponse(); assertEquals( await nativeResponse.text(), "console.log('hello world');", ); assertEquals(nativeResponse.status, 200); assertEquals(nativeResponse.headers.get("Content-Type"), "text/plain"); assertEquals(Array.from(nativeResponse.headers.entries()).length, 1); },});
test({ name: "empty response sets contentLength to 0", async fn() { const response = new Response(createMockRequest()); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.headers.get("Content-Length"), "0"); },});
test({ name: "response.redirect('./foo')", async fn() { const response = new Response(createMockRequest()); response.redirect("./foo"); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to <a href="./foo">./foo</a>.`, ); assertEquals(nativeResponse.headers.get("Location"), "./foo"); assertEquals( nativeResponse.headers.get("Content-Type"), "text/html; charset=utf-8", ); },});
test({ name: "response.redirect(URL)", async fn() { const response = new Response(createMockRequest()); const url = new URL("https://example.com/foo"); response.redirect(url); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to <a href="https://example.com/foo">https://example.com/foo</a>.`, ); assertEquals( nativeResponse.headers.get("Location"), "https://example.com/foo", ); },});
test({ name: "response.redirect(REDIRECT_BACK)", async fn() { const response = new Response( createMockRequest({ headers: [["referer", "https://example.com/foo"]] }), ); response.redirect(REDIRECT_BACK); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to <a href="https://example.com/foo">https://example.com/foo</a>.`, ); assertEquals( nativeResponse.headers.get("Location"), "https://example.com/foo", ); },});
test({ name: "response.redirect(REDIRECT_BACK) no referrer, but alt", async fn() { const response = new Response(createMockRequest()); response.redirect(REDIRECT_BACK, new URL("https://example.com/foo")); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to <a href="https://example.com/foo">https://example.com/foo</a>.`, ); assertEquals( nativeResponse.headers.get("Location"), "https://example.com/foo", ); },});
test({ name: "response.redirect(REDIRECT_BACK) no referrer, no alt", async fn() { const response = new Response(createMockRequest()); response.redirect(REDIRECT_BACK); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to <a href="/">/</a>.`, ); assertEquals(nativeResponse.headers.get("Location"), "/"); },});
test({ name: "response.redirect() no html", async fn() { const response = new Response(createMockRequest({ accepts(value) { return value === "html" ? false : true; }, })); response.redirect("https://example.com/foo"); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( await nativeResponse.text(), `Redirecting to https://example.com/foo.`, ); assertEquals( nativeResponse.headers.get("Location"), "https://example.com/foo", ); assertEquals( nativeResponse.headers.get("Content-Type"), "text/plain; charset=utf-8", ); },});
test({ name: "response.redirect() with url on query string", async fn() { const response = new Response(createMockRequest()); response.redirect( "https://example.com/foo?redirect=https%3A%2F%2Fdeno.land", ); const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.Found); assertEquals( nativeResponse.headers.get("Location"), "https://example.com/foo?redirect=https%3A%2F%2Fdeno.land", ); },});
test({ name: "response.status reflects body state", fn() { const response = new Response(createMockRequest()); assertEquals(response.status, Status.NotFound); response.body = "hello"; assertEquals(response.status, Status.OK); response.body = null; assertEquals(response.status, Status.NoContent); response.status = Status.PartialContent; assertEquals(response.status, Status.PartialContent); },});
test({ name: "response.toDomResponse() is a memo", async fn() { const response = new Response(createMockRequest()); const sr1 = await response.toDomResponse(); const sr2 = await response.toDomResponse(); assert(sr1 === sr2); },});
test({ name: "response.body cannot be set after server response", async fn() { const response = new Response(createMockRequest()); await response.toDomResponse(); assertThrows(() => { response.body = ""; }, Error); },});
test({ name: "response.status cannot be set after server response", async fn() { const response = new Response(createMockRequest()); await response.toDomResponse(); assertThrows(() => { response.status = Status.Found; }, Error); },});
test({ name: "response.body handles null", async fn() { const response = new Response(createMockRequest()); response.body = null; const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.NoContent); },});
test({ name: "response.body handles falsy values", async fn() { const response = new Response(createMockRequest()); response.body = 0; const nativeResponse = await response.toDomResponse(); assertEquals(nativeResponse.status, Status.OK); },});
test({ name: "Response - inspecting", fn() { assertEquals( Deno.inspect(new Response(createMockRequest())), `Response { body: undefined, headers: Headers {}, status: 404, type: undefined, writable: true }`, ); },});