From fe9ac35a650dfeea9168fc1cbbbf323b5689fc3b Mon Sep 17 00:00:00 2001 From: uki00a Date: Mon, 24 Feb 2020 22:31:40 +0900 Subject: [PATCH] fix(std/examples): add tests for examples (#4094) --- std/examples/catj.ts | 6 +- std/examples/chat/server_test.ts | 9 +- std/examples/testdata/cat/hello.txt | 1 + std/examples/testdata/cat/world.txt | 1 + std/examples/testdata/catj/array.json | 5 ++ std/examples/testdata/catj/object.json | 6 ++ std/examples/testdata/catj/simple-array.json | 1 + std/examples/testdata/catj/simple-object.json | 1 + std/examples/tests/cat_test.ts | 25 ++++++ std/examples/tests/catj_test.ts | 83 +++++++++++++++++++ std/examples/tests/colors_test.ts | 19 +++++ std/examples/tests/curl_test.ts | 41 +++++++++ std/examples/tests/echo_server_test.ts | 43 ++++++++++ std/examples/tests/test_test.ts | 2 + std/examples/tests/welcome_test.ts | 19 +++++ std/examples/tests/xeval_test.ts | 1 + 16 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 std/examples/testdata/cat/hello.txt create mode 100644 std/examples/testdata/cat/world.txt create mode 100644 std/examples/testdata/catj/array.json create mode 100644 std/examples/testdata/catj/object.json create mode 100644 std/examples/testdata/catj/simple-array.json create mode 100644 std/examples/testdata/catj/simple-object.json create mode 100644 std/examples/tests/cat_test.ts create mode 100644 std/examples/tests/catj_test.ts create mode 100644 std/examples/tests/colors_test.ts create mode 100644 std/examples/tests/curl_test.ts create mode 100644 std/examples/tests/echo_server_test.ts create mode 100644 std/examples/tests/test_test.ts create mode 100644 std/examples/tests/welcome_test.ts diff --git a/std/examples/catj.ts b/std/examples/catj.ts index 7951eeeb0f..4329d27b13 100644 --- a/std/examples/catj.ts +++ b/std/examples/catj.ts @@ -12,7 +12,8 @@ import * as colors from "../fmt/colors.ts"; const decoder = new TextDecoder(); -function isObject(arg): arg is object { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isObject(arg: any): arg is object { return !!arg && arg.constructor === Object; } @@ -35,7 +36,8 @@ function printValue(value: unknown, path: string): void { console.log(path + " = " + value); } -function printObject(obj: object, path: string): void { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function printObject(obj: { [key: string]: any }, path: string): void { for (const key of Object.keys(obj)) { const value = obj[key]; let nodePath = path + colors.cyan(".") + key; diff --git a/std/examples/chat/server_test.ts b/std/examples/chat/server_test.ts index d43e41693e..0b44e5bce9 100644 --- a/std/examples/chat/server_test.ts +++ b/std/examples/chat/server_test.ts @@ -1,3 +1,4 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { assert, assertEquals } from "../../testing/asserts.ts"; import { TextProtoReader } from "../../textproto/mod.ts"; import { BufReader } from "../../io/bufio.ts"; @@ -22,10 +23,12 @@ async function startServer(): Promise { const { test } = Deno; -await startServer(); +test("beforeAll", async () => { + await startServer(); +}); test("GET / should serve html", async () => { - const resp = await fetch("http://0.0.0.0:8080/"); + const resp = await fetch("http://127.0.0.1:8080/"); assertEquals(resp.status, 200); assertEquals(resp.headers.get("content-type"), "text/html"); const html = await resp.body.text(); @@ -34,7 +37,7 @@ test("GET / should serve html", async () => { let ws: WebSocket | undefined; test("GET /ws should upgrade conn to ws", async () => { - ws = await connectWebSocket("http://0.0.0.0:8080/ws"); + ws = await connectWebSocket("http://127.0.0.1:8080/ws"); const it = ws.receive(); assertEquals((await it.next()).value, "Connected: [1]"); ws.send("Hello"); diff --git a/std/examples/testdata/cat/hello.txt b/std/examples/testdata/cat/hello.txt new file mode 100644 index 0000000000..e965047ad7 --- /dev/null +++ b/std/examples/testdata/cat/hello.txt @@ -0,0 +1 @@ +Hello diff --git a/std/examples/testdata/cat/world.txt b/std/examples/testdata/cat/world.txt new file mode 100644 index 0000000000..216e97ce08 --- /dev/null +++ b/std/examples/testdata/cat/world.txt @@ -0,0 +1 @@ +World diff --git a/std/examples/testdata/catj/array.json b/std/examples/testdata/catj/array.json new file mode 100644 index 0000000000..6dac876a08 --- /dev/null +++ b/std/examples/testdata/catj/array.json @@ -0,0 +1,5 @@ +[ + "string", + 100, + { "key": "value", "array": ["foo", "bar"] } +] diff --git a/std/examples/testdata/catj/object.json b/std/examples/testdata/catj/object.json new file mode 100644 index 0000000000..290c008fff --- /dev/null +++ b/std/examples/testdata/catj/object.json @@ -0,0 +1,6 @@ +{ + "string": "foobar", + "number": 123, + "array": [{ "message": "hello" }] +} + diff --git a/std/examples/testdata/catj/simple-array.json b/std/examples/testdata/catj/simple-array.json new file mode 100644 index 0000000000..44e2ace7e5 --- /dev/null +++ b/std/examples/testdata/catj/simple-array.json @@ -0,0 +1 @@ +[1, 2] diff --git a/std/examples/testdata/catj/simple-object.json b/std/examples/testdata/catj/simple-object.json new file mode 100644 index 0000000000..52bb626d82 --- /dev/null +++ b/std/examples/testdata/catj/simple-object.json @@ -0,0 +1 @@ +{ "message": "hello" } diff --git a/std/examples/tests/cat_test.ts b/std/examples/tests/cat_test.ts new file mode 100644 index 0000000000..93e884f611 --- /dev/null +++ b/std/examples/tests/cat_test.ts @@ -0,0 +1,25 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { assertStrictEq } from "../../testing/asserts.ts"; + +Deno.test("[examples/cat] print multiple files", async () => { + const decoder = new TextDecoder(); + const process = Deno.run({ + args: [ + Deno.execPath(), + "--allow-read", + "cat.ts", + "testdata/cat/hello.txt", + "testdata/cat/world.txt" + ], + cwd: "examples", + stdout: "piped" + }); + + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + assertStrictEq(actual, "Hello\nWorld"); + } finally { + process.close(); + } +}); diff --git a/std/examples/tests/catj_test.ts b/std/examples/tests/catj_test.ts new file mode 100644 index 0000000000..9267f532bb --- /dev/null +++ b/std/examples/tests/catj_test.ts @@ -0,0 +1,83 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { assertStrictEq } from "../../testing/asserts.ts"; + +Deno.test("[examples/catj] print an array", async () => { + const decoder = new TextDecoder(); + const process = catj("testdata/catj/array.json"); + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = [ + '.[0] = "string"', + ".[1] = 100", + '.[2].key = "value"', + '.[2].array[0] = "foo"', + '.[2].array[1] = "bar"' + ].join("\n"); + + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); + +Deno.test("[examples/catj] print an object", async () => { + const decoder = new TextDecoder(); + const process = catj("testdata/catj/object.json"); + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = [ + '.string = "foobar"', + ".number = 123", + '.array[0].message = "hello"' + ].join("\n"); + + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); + +Deno.test("[examples/catj] print multiple files", async () => { + const decoder = new TextDecoder(); + const process = catj( + "testdata/catj/simple-object.json", + "testdata/catj/simple-array.json" + ); + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = ['.message = "hello"', ".[0] = 1", ".[1] = 2"].join("\n"); + + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); + +Deno.test("[examples/catj] read from stdin", async () => { + const decoder = new TextDecoder(); + const process = catj("-"); + const input = `{ "foo": "bar" }`; + try { + await process.stdin!.write(new TextEncoder().encode(input)); + process.stdin!.close(); + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + + assertStrictEq(actual, '.foo = "bar"'); + } finally { + process.close(); + } +}); + +function catj(...files: string[]): Deno.Process { + return Deno.run({ + args: [Deno.execPath(), "--allow-read", "catj.ts", ...files], + cwd: "examples", + stdin: "piped", + stdout: "piped", + env: { NO_COLOR: "true" } + }); +} diff --git a/std/examples/tests/colors_test.ts b/std/examples/tests/colors_test.ts new file mode 100644 index 0000000000..dcb485f6ce --- /dev/null +++ b/std/examples/tests/colors_test.ts @@ -0,0 +1,19 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { assertStrictEq } from "../../testing/asserts.ts"; + +Deno.test("[examples/colors] print a colored text", async () => { + const decoder = new TextDecoder(); + const process = Deno.run({ + args: [Deno.execPath(), "colors.ts"], + cwd: "examples", + stdout: "piped" + }); + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = "Hello world!"; + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); diff --git a/std/examples/tests/curl_test.ts b/std/examples/tests/curl_test.ts new file mode 100644 index 0000000000..71a0fe67f7 --- /dev/null +++ b/std/examples/tests/curl_test.ts @@ -0,0 +1,41 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { Server, serve } from "../../http/server.ts"; +import { assertStrictEq } from "../../testing/asserts.ts"; + +let server: Server | undefined; + +async function startTestServer(): Promise { + server = await serve({ port: 8080 }); + (async (): Promise => { + for await (const req of server) { + req.respond({ body: "Hello world" }); + } + })(); +} + +Deno.test("[examples/curl] beforeAll", async () => { + await startTestServer(); +}); + +Deno.test("[examples/curl] send a request to a specified url", async () => { + const decoder = new TextDecoder(); + const process = Deno.run({ + args: [Deno.execPath(), "--allow-net", "curl.ts", "http://localhost:8080"], + cwd: "examples", + stdout: "piped" + }); + + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = "Hello world"; + + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); + +Deno.test("[examples/curl] afterAll", () => { + server?.close(); +}); diff --git a/std/examples/tests/echo_server_test.ts b/std/examples/tests/echo_server_test.ts new file mode 100644 index 0000000000..49a1feb317 --- /dev/null +++ b/std/examples/tests/echo_server_test.ts @@ -0,0 +1,43 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { assertStrictEq, assertNotEquals } from "../../testing/asserts.ts"; +import { BufReader, ReadLineResult } from "../../io/bufio.ts"; + +Deno.test("[examples/echo_server]", async () => { + const encoder = new TextEncoder(); + const decoder = new TextDecoder(); + const process = Deno.run({ + args: [Deno.execPath(), "--allow-net", "echo_server.ts"], + cwd: "examples", + stdout: "piped" + }); + + let conn: Deno.Conn | undefined; + try { + const processReader = new BufReader(process.stdout!); + const message = await processReader.readLine(); + + assertNotEquals(message, Deno.EOF); + assertStrictEq( + decoder.decode((message as ReadLineResult).line).trim(), + "Listening on 0.0.0.0:8080" + ); + + conn = await Deno.connect({ hostname: "127.0.0.1", port: 8080 }); + const connReader = new BufReader(conn); + + await conn.write(encoder.encode("Hello echo_server\n")); + const result = await connReader.readLine(); + + assertNotEquals(result, Deno.EOF); + + const actualResponse = decoder + .decode((result as ReadLineResult).line) + .trim(); + const expectedResponse = "Hello echo_server"; + + assertStrictEq(actualResponse, expectedResponse); + } finally { + conn?.close(); + process.close(); + } +}); diff --git a/std/examples/tests/test_test.ts b/std/examples/tests/test_test.ts new file mode 100644 index 0000000000..7c95270600 --- /dev/null +++ b/std/examples/tests/test_test.ts @@ -0,0 +1,2 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import "../test.ts"; diff --git a/std/examples/tests/welcome_test.ts b/std/examples/tests/welcome_test.ts new file mode 100644 index 0000000000..76209cfad1 --- /dev/null +++ b/std/examples/tests/welcome_test.ts @@ -0,0 +1,19 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { assertStrictEq } from "../../testing/asserts.ts"; + +Deno.test("[examples/welcome] print a welcome message", async () => { + const decoder = new TextDecoder(); + const process = Deno.run({ + args: [Deno.execPath(), "welcome.ts"], + cwd: "examples", + stdout: "piped" + }); + try { + const output = await Deno.readAll(process.stdout!); + const actual = decoder.decode(output).trim(); + const expected = "Welcome to Deno 🦕"; + assertStrictEq(actual, expected); + } finally { + process.close(); + } +}); diff --git a/std/examples/tests/xeval_test.ts b/std/examples/tests/xeval_test.ts index 3df11c8afd..870a00acff 100644 --- a/std/examples/tests/xeval_test.ts +++ b/std/examples/tests/xeval_test.ts @@ -1,3 +1,4 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { xeval } from "../xeval.ts"; import { stringsReader } from "../../io/util.ts"; import { decode, encode } from "../../strings/mod.ts";