Browse Source

Refactor Deno Test Cases (#6437)

* Update standard library version from `v0.50.0` to `0.87.0`

* Update standard library version from `v0.50.0` to `0.87.0`

* Refactor Deno test cases (1)

* Refactor Deno test cases(2)

* Refactor Deno test cases (3)

* Fix Dockerfile

* Update Deno `mongo` to 0.22.0

* Fix Deno `dockerfile`

* Update Deno Docker

* Fix Deno `dyn_date`

* Fix Deno `dyn_date`

* Fix Deno  `dyn_date`

* Fix Deno `export`

* Fix Deno `dyn_date`
Oxygen 4 years ago
parent
commit
9a5ae6b32f

+ 6 - 0
frameworks/TypeScript/deno/config.toml

@@ -4,10 +4,16 @@ name = "deno"
 [main]
 [main]
 urls.plaintext = "/plaintext"
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.json = "/json"
+urls.db = "/db"
+urls.query = "/query?queries="
+urls.update = "/update?queries="
+urls.fortune = "/fortunes"
 approach = "Realistic"
 approach = "Realistic"
 classification = "Platform"
 classification = "Platform"
 database_os = "Linux"
 database_os = "Linux"
+database = "MongoDB"
 os = "Linux"
 os = "Linux"
+orm = "Raw"
 platform = "deno"
 platform = "deno"
 webserver = "None"
 webserver = "None"
 versus = "nodejs"
 versus = "nodejs"

+ 2 - 1
frameworks/TypeScript/deno/deno.dockerfile

@@ -1,10 +1,11 @@
-FROM hayd/alpine-deno:1.0.0
+FROM hayd/alpine-deno:1.8.1
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
 WORKDIR /app
 WORKDIR /app
 
 
 USER deno
 USER deno
+ENV DATABASE mongodb
 
 
 COPY ./src .
 COPY ./src .
 
 

+ 16 - 0
frameworks/TypeScript/deno/src/_handlers/json.ts

@@ -0,0 +1,16 @@
+import { ServerRequest, SERVER, dyn_date, MIME_JSON } from "../depends.ts";
+
+export const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_JSON],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  const HELLO_OBJ = { message: "Hello, World!" };
+  headers.set("date", dyn_date());
+  req.respond({
+    headers,
+    body: JSON.stringify(HELLO_OBJ),
+  });
+  return;
+};

+ 87 - 0
frameworks/TypeScript/deno/src/_handlers/mongodb-raw/_db_helpers.ts

@@ -0,0 +1,87 @@
+import { MongoClient } from "../../depends.ts";
+
+const mongoUrl = "mongodb://tfb-database:27017";
+const dbName = "hello_world";
+
+export const client: MongoClient = new MongoClient();
+await client.connect(mongoUrl);
+export let World = client.database(dbName).collection("world");
+export let Fortune = client.database(dbName).collection("fortune");
+
+export const randomNumber = (): number => Math.floor(Math.random() * 10000) + 1;
+
+export const fillArray = async <T = any>(v: T, l: number) => {
+  let o = [];
+  for (let i = 0; i < l; i += 1) o.push(v);
+  return o;
+};
+
+export interface FortuneData {
+  id: number;
+  message: string;
+  _id?: unknown;
+}
+export const _fortunes_head = [
+  "<!DOCTYPE html>",
+  "<html>",
+  "<head><title>Fortunes</title></head>",
+  "<body>",
+  "<table>",
+  "<tr>",
+  "<th>id</th>",
+  "<th>message</th>",
+  "</tr>",
+].join("");
+export const _fortunes_end = ["</table>", "</body>", "</html>"].join("");
+export const _fortunes_com = ["<tr>", "</tr>", "<td>", "</td>"];
+export const generateFortunes = (input: FortuneData[]): string => {
+  let f = input
+    .map(
+      (v) =>
+        _fortunes_com[0] +
+        +_fortunes_com[2] +
+        v.id +
+        _fortunes_com[3] +
+        _fortunes_com[2] +
+        v.message +
+        _fortunes_com[3] +
+        _fortunes_com[1]
+    )
+    .join("");
+
+  return _fortunes_head + f + _fortunes_end;
+};
+
+export const randomWorld = async () => {
+  let world = (await World.findOne({
+    id: randomNumber(),
+  })) as FortuneData;
+  world._id = undefined;
+  return world;
+};
+
+export const getAllFortunes = async () => {
+  return await Fortune.find().toArray();
+};
+
+export const updateQuery = async () => {
+  const one = (await World.findOne({
+    id: randomNumber(),
+  })) as any;
+  one.randomNumber = randomNumber();
+  await World.updateOne(
+    {
+      id: one.id,
+    },
+    one
+  );
+  return {
+    id: one.id,
+    randomNumber: one.randomNumber,
+  };
+};
+
+export const additionalFortune = {
+  id: 0,
+  message: "Additional fortune added at request time.",
+};

+ 23 - 0
frameworks/TypeScript/deno/src/_handlers/mongodb-raw/fortunes.ts

@@ -0,0 +1,23 @@
+import { ServerRequest, SERVER, dyn_date, MIME_HTML } from "../../depends.ts";
+import {
+  getAllFortunes,
+  additionalFortune,
+  generateFortunes,
+  FortuneData,
+} from "./_db_helpers.ts";
+
+export const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_HTML],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  let fortunes = await getAllFortunes();
+  fortunes.push(additionalFortune);
+  fortunes.sort((a: any, b: any) => a.message.localeCompare(b.message));
+  headers.set("date", dyn_date());
+  req.respond({
+    headers,
+    body: generateFortunes(fortunes as FortuneData[]),
+  });
+};

+ 18 - 0
frameworks/TypeScript/deno/src/_handlers/mongodb-raw/multiple-queries.ts

@@ -0,0 +1,18 @@
+import { ServerRequest, SERVER, dyn_date, MIME_JSON } from "../../depends.ts";
+import { randomWorld, fillArray } from "./_db_helpers.ts";
+
+export const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_JSON],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  const u = new URL(req.url, "http://deno");
+  const l = Number(u.searchParams.get("queries"));
+  const rnd = await Promise.all(await fillArray(randomWorld(), l));
+  headers.set("date", dyn_date());
+  req.respond({
+    headers,
+    body: JSON.stringify(rnd),
+  });
+};

+ 16 - 0
frameworks/TypeScript/deno/src/_handlers/mongodb-raw/single-query.ts

@@ -0,0 +1,16 @@
+import { ServerRequest, SERVER, dyn_date, MIME_JSON } from "../../depends.ts";
+import { randomWorld } from "./_db_helpers.ts";
+
+export const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_JSON],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  const rnd = await randomWorld();
+  headers.set("date", dyn_date());
+  req.respond({
+    headers,
+    body: JSON.stringify(rnd),
+  });
+};

+ 18 - 0
frameworks/TypeScript/deno/src/_handlers/mongodb-raw/updates.ts

@@ -0,0 +1,18 @@
+import { ServerRequest, SERVER, dyn_date, MIME_JSON } from "../../depends.ts";
+import { updateQuery, fillArray } from "./_db_helpers.ts";
+
+export const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_JSON],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  const u = new URL(req.url, "http://deno");
+  const l = Number(u.searchParams.get("queries"));
+  const rnd = await Promise.all(await fillArray(updateQuery(), l));
+  headers.set("date", dyn_date());
+  req.respond({
+    headers,
+    body: JSON.stringify(rnd),
+  });
+};

+ 17 - 0
frameworks/TypeScript/deno/src/_handlers/plaintext.ts

@@ -0,0 +1,17 @@
+import {
+  ServerRequest,
+  SERVER,
+  dyn_date,
+  MIME_TEXT,
+  HELLO_WORLD,
+} from "../depends.ts";
+
+const headers = new Headers([
+  ["server", SERVER],
+  ["content-type", MIME_TEXT],
+]);
+
+export default async (req: ServerRequest): Promise<void> => {
+  headers.set("date", dyn_date());
+  req.respond({ headers, body: HELLO_WORLD });
+};

+ 23 - 0
frameworks/TypeScript/deno/src/depends.ts

@@ -0,0 +1,23 @@
+export type { Response } from "https://deno.land/[email protected]/http/server.ts";
+
+export {
+  ServerRequest,
+  serve,
+} from "https://deno.land/[email protected]/http/server.ts";
+
+export { MongoClient, Bson } from "https://deno.land/x/[email protected]/mod.ts";
+
+export const SERVER: string = "Deno";
+
+let date = new Date().toUTCString();
+setInterval(() => (date = new Date().toUTCString()), 850);
+export const dyn_date = () => date;
+
+export const MIME_JSON = "application/json";
+export const MIME_HTML = "text/html; charset=utf-8";
+
+export const HELLO_WORLD: Uint8Array = new TextEncoder().encode(
+  "Hello, World!"
+);
+
+export const MIME_TEXT = "text/plain; charset=UTF-8";

+ 10 - 40
frameworks/TypeScript/deno/src/handlers.ts

@@ -1,46 +1,16 @@
-import {
-  ServerRequest,
-  Response
-} from "https://deno.land/[email protected]/http/server.ts";
+import type { ServerRequest } from "./depends.ts";
+import JSONHandler from "./_handlers/json.ts";
+import PlaintextHandler from "./_handlers/plaintext.ts";
 
 
 interface Handler {
 interface Handler {
-  (request: ServerRequest): Promise<void>
+  (request: ServerRequest): Promise<void>;
 }
 }
 
 
-const SERVER: string = "Deno";
-const HELLO_WORLD: Uint8Array = new TextEncoder().encode("Hello, World!");
-
-let date: string = new Date().toUTCString();
-setInterval(() => { date = new Date().toUTCString(); }, 1000);
-
-const json: Handler = async (req: ServerRequest): Promise<void> => {
-  const headers = new Headers([
-    ["server", SERVER],
-    ["content-type", "application/json"],
-    ["date", date]
-  ]);
-
-  req.respond({
-    headers,
-    body: JSON.stringify({ message: "Hello, World!" })
-  } as Response);
-};
-
-const plaintext: Handler = async (req: ServerRequest): Promise<void> => {
-  const headers = new Headers([
-    ["server", SERVER],
-    ["content-type", "text/plain; charset=UTF-8"],
-    ["date", date]
-  ]);
-
-  req.respond({ headers, body: HELLO_WORLD } as Response);
-};
-
-const handlers: { [Key: string]: Handler } = {};
-
-handlers["/json"] = json;
-handlers["/plaintext"] = plaintext;
+interface Handlers {
+  [index: string]: Handler;
+}
 
 
-export {
-  handlers
+export const handlers: Handlers = {
+  "/json": JSONHandler,
+  "/plaintext": PlaintextHandler,
 };
 };

+ 11 - 3
frameworks/TypeScript/deno/src/main.ts

@@ -1,7 +1,15 @@
 import { serve } from "https://deno.land/[email protected]/http/server.ts";
 import { serve } from "https://deno.land/[email protected]/http/server.ts";
-
 import { handlers } from "./handlers.ts";
 import { handlers } from "./handlers.ts";
-
 for await (const req of serve("0.0.0.0:8080")) {
 for await (const req of serve("0.0.0.0:8080")) {
-  handlers[req.url](req);
+  if (handlers[req.url] != undefined) {
+    handlers[req.url](req).catch((e) => {
+      console.error(e);
+      Deno.exit(9);
+    });
+  } else {
+    req.respond({
+      body: "404 Not Found",
+    });
+  }
+  continue;
 }
 }