Express API
.
βββ app.ts
βββ index.ts
βββ routers
Β Β βββ Emoji
| βββ index.spec.ts
| βββ index.ts
βββ index.tsLast updated
.
βββ app.ts
βββ index.ts
βββ routers
Β Β βββ Emoji
| βββ index.spec.ts
| βββ index.ts
βββ index.tsLast updated
$ yarn add express @types/expressimport { Router, Request, Response } from "express";
import { getFetch } from "../../containers";
export class EmojiRouter {
public readonly router = Router();
private readonly _fetch = getFetch();
constructor() {
this.router.get("/:emoji", this.get);
}
get = async (request: Request, response: Response) => {
const { emoji } = request.params;
const jsonResponse = await this._fetch("https://api.github.com/emojis");
const data = await jsonResponse.json();
if (!data[emoji]) {
return response.status(404).json({ error: "emoji not found" });
}
return response.json({ emoji: data[emoji] });
};
}export * from "./emoji";import fetch from "node-fetch";
import { EmojiRouter } from "./index";
import { setFetch } from "../../containers";
import { Request, Response } from "express";
describe("routes/emoji", () => {
describe("/get/:emoji", () => {
it("should fetch and return emoji passed as a param", async () => {
// setup everything we need
const computer = "mocked url";
const data = { computer };
const json = jest.fn().mockResolvedValue(data);
const fetchMock = jest.fn(() => ({ json }));
setFetch((fetchMock as unknown) as typeof fetch);
const router = new EmojiRouter();
// execute the code we want to test
const request = ({ params: { emoji: "computer" } } as unknown) as Request;
const response = ({} as unknown) as Response;
response.json = jest.fn().mockReturnValue(response);
await router.get(request, response);
// assert the result
expect(response.json).toHaveBeenCalledWith({ emoji: computer });
});
it("should return an error if not found", async () => {
// setup everything we need
const computer = "mocked url";
const data = { computer };
const json = jest.fn().mockResolvedValue(data);
const fetchMock = jest.fn(() => ({ json }));
setFetch((fetchMock as unknown) as typeof fetch);
const router = new EmojiRouter();
// execute the code we want to test
const request = ({
params: { emoji: "inexistent" }
} as unknown) as Request;
const response = ({} as unknown) as Response;
response.status = jest.fn().mockReturnValue(response);
response.json = jest.fn().mockReturnValue(response);
await router.get(request, response);
// assert the result
expect(response.status).toHaveBeenCalledWith(404);
expect(response.json).toHaveBeenCalledWith({ error: "emoji not found" });
});
});
});import * as express from "express";
import fetch from "node-fetch";
import { setFetch } from "./containers";
import { EmojiRouter } from "./routers";
export const bootstrap = async () => {
setFetch(fetch);
// connect to db here later...
};
export const createApp = () => {
const app = express();
app.use("/emoji", new EmojiRouter().router);
return { app };
};require("dotenv").config();
import { bootstrap, createApp } from "./app";
import { config } from "./config";
(async () => {
await bootstrap();
const { app } = createApp();
app.listen(config.port, () => {
console.info("Server listing on port " + config.port);
});
})();export interface SharedConfig {
logLevel: string;
port: number;
}
export const sharedConfig = {
logLevel: process.env.LOG_LEVEL || "info", // we will come back to logs later
port: parseInt(process.env.PORT || "1234")
};
CONFIG_ENV=local
LOG_LEVEL=debug
PORT=3000