aboutsummaryrefslogtreecommitdiff
path: root/src/config.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.test.ts')
-rw-r--r--src/config.test.ts258
1 files changed, 53 insertions, 205 deletions
diff --git a/src/config.test.ts b/src/config.test.ts
index b7c869f..456a6e3 100644
--- a/src/config.test.ts
+++ b/src/config.test.ts
@@ -2,177 +2,34 @@ const exit = jest
.spyOn(process, "exit")
.mockImplementation(() => undefined as never);
-import { Writable } from "stream";
import winston from "winston";
-import loggerConfig from "./util/logger";
-
-let output = "";
-const logger = winston.createLogger(loggerConfig("TEST", "debug"));
-
-jest.mock("./util/logger", () => {
- const stream = new Writable();
- stream._write = (chunk, _encoding, next) => {
- output = output += chunk.toString();
- next();
- };
- const streamTransport = new winston.transports.Stream({ stream });
-
- return {
- __esModule: true,
- default: () => ({
- format: winston.format.combine(
- winston.format.splat(),
- winston.format.simple()
- ),
- transports: [streamTransport],
- }),
- };
-});
-
import {
configOrError,
persistTemplate,
handleStartup,
handleShutdown,
- initializeToken,
} from "./config";
-import {
- Logger,
- MongoClient,
- MongoError,
- ReadConcern,
- ReadPreference,
- WriteConcern,
-} from "mongodb";
+import { MongoClient, MongoError } from "mongodb";
import { Server } from "http";
import path from "path";
import fs from "fs";
+
+import loggerConfig from "./util/logger";
import * as templates from "./templates";
-import { EnvConfig } from "./metadata";
-
-const CommonMocks = {
- connect: jest.fn(),
- isConnected: jest.fn(),
- logout: jest.fn(),
- watch: jest.fn(),
- startSession: jest.fn(),
- withSession: jest.fn(),
- addListener: jest.fn(),
- on: jest.fn(),
- once: jest.fn(),
- prependListener: jest.fn(),
- prependOnceListener: jest.fn(),
- removeAllListeners: jest.fn(),
- removeListener: jest.fn(),
- off: jest.fn(),
- setMaxListeners: jest.fn(),
- getMaxListeners: jest.fn(),
- listeners: jest.fn(),
- listenerCount: jest.fn(),
- rawListeners: jest.fn(),
- emit: jest.fn(),
- eventNames: jest.fn(),
-};
-
-const MongoMock = (p: Promise<void>): jest.Mock<MongoClient, void[]> =>
- jest.fn<MongoClient, void[]>(() => ({
- ...CommonMocks,
- close: jest.fn(() => p),
- readPreference: ReadPreference.nearest,
- bsonOptions: {},
- logger: new Logger("a"),
- getLogger: jest.fn(),
- options: {
- hosts: [],
- readPreference: ReadPreference.nearest,
- readConcern: new ReadConcern("local"),
- loadBalanced: true,
- serverApi: { version: "1" },
- compressors: [],
- writeConcern: new WriteConcern(),
- dbName: "",
- metadata: {
- driver: { name: "", version: "" },
- os: { type: "", name: "linux", architecture: "", version: "" },
- platform: "linx",
- },
- tls: true,
- toURI: jest.fn(),
- autoEncryption: {},
- connectTimeoutMS: 0,
- directConnection: true,
- driverInfo: {},
- forceServerObjectId: true,
- minHeartbeatFrequencyMS: 0,
- heartbeatFrequencyMS: 0,
- keepAlive: false,
- keepAliveInitialDelay: 0,
- localThresholdMS: 0,
- logger: new Logger("a"),
- maxIdleTimeMS: 0,
- maxPoolSize: 0,
- minPoolSize: 0,
- monitorCommands: true,
- noDelay: true,
- pkFactory: { createPk: jest.fn() },
- promiseLibrary: {},
- raw: true,
- replicaSet: "",
- retryReads: true,
- retryWrites: true,
- serverSelectionTimeoutMS: 0,
- socketTimeoutMS: 0,
- tlsAllowInvalidCertificates: true,
- tlsAllowInvalidHostnames: true,
- tlsInsecure: false,
- waitQueueTimeoutMS: 0,
- zlibCompressionLevel: 0,
- srvMaxHosts: 1,
- srvServiceName: "",
- },
- serverApi: { version: "1" },
- autoEncrypter: undefined,
- readConcern: new ReadConcern("local"),
- writeConcern: new WriteConcern(),
- db: jest.fn(),
- }));
-const ServerMock = (mockErr: Error | undefined): jest.Mock<Server, void[]> =>
- jest.fn<Server, void[]>(() => ({
- ...CommonMocks,
- connections: 0,
- setTimeout: jest.fn(),
- timeout: 0,
- headersTimeout: 0,
- keepAliveTimeout: 0,
- close: function (c: (err?: Error | undefined) => void): Server {
- c(mockErr);
- return this;
- },
- maxHeadersCount: 0,
- maxConnections: 0,
- maxRequestsPerSocket: 0,
- listen: jest.fn(),
- listening: true,
- address: jest.fn(),
- getConnections: jest.fn(),
- ref: jest.fn(),
- requestTimeout: 3600,
- unref: jest.fn(),
- }));
-
-describe("initializeToken", () => {
- it("Should generate a UUID", () => {
- // Arrange
- output = "";
+import Metadata, { EnvConfig } from "./metadata";
- // Act
- const result = initializeToken(logger);
+jest.mock("./util/logger", () => ({
+ __esModule: true,
+ default: () => ({
+ format: winston.format.combine(
+ winston.format.splat(),
+ winston.format.simple()
+ ),
+ transports: [new winston.transports.Console({ silent: true })],
+ }),
+}));
- // Assert
- expect(result).toMatch(/([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})/);
- expect(output).toContain(result);
- });
-});
+const LOGGER = winston.createLogger(loggerConfig("TEST", "debug"));
describe("configOrError", () => {
beforeEach(() => {
@@ -185,7 +42,7 @@ describe("configOrError", () => {
// Act
let result;
try {
- result = configOrError("APPLESAUCE", logger);
+ result = configOrError("APPLESAUCE", LOGGER);
} catch (err) {
//
}
@@ -200,7 +57,7 @@ describe("configOrError", () => {
process.env.CHRYSANTHEMUM = "hello";
// Act
- const result = configOrError("CHRYSANTHEMUM", logger);
+ const result = configOrError("CHRYSANTHEMUM", LOGGER);
// Assert
expect(result).toEqual(process.env.CHRYSANTHEMUM);
@@ -226,7 +83,7 @@ describe("persistTemplate", () => {
);
const fsAccess = jest.spyOn(fs.promises, "access").mockResolvedValue();
- await persistTemplate(template, logger);
+ await persistTemplate(template, LOGGER);
expect(processTemplate).toHaveBeenCalledWith(template);
expect(fsAccess).not.toHaveBeenCalled();
@@ -246,7 +103,7 @@ describe("persistTemplate", () => {
.mockRejectedValue("baa");
const fsAccess = jest.spyOn(fs.promises, "access").mockResolvedValue();
- await persistTemplate(template, logger);
+ await persistTemplate(template, LOGGER);
expect(processTemplate).toHaveBeenCalledWith(template);
expect(fsAccess).toHaveBeenCalledWith(
@@ -269,7 +126,7 @@ describe("persistTemplate", () => {
.mockRejectedValue("baz");
const fsAccess = jest.spyOn(fs.promises, "access").mockRejectedValue("bar");
- await persistTemplate(template, logger);
+ await persistTemplate(template, LOGGER);
expect(processTemplate).toHaveBeenCalledWith(template);
expect(fsAccess).toHaveBeenCalledWith(
@@ -290,40 +147,13 @@ describe("handleStartup", () => {
const config = {
hostDir: "/apple",
publicDir: "/public",
+ dbUri: "localhost:27017",
+ dbName: "bongo",
targetUrl: "localhost",
+ logLevel: "trace",
} as EnvConfig;
- const confStartup = (): Promise<MongoClient> => handleStartup(config, logger);
-
- it("should pass back MongoClient", async () => {
- const superClient = {} as MongoClient;
- const fsAccess = jest.spyOn(fs.promises, "access").mockResolvedValue();
- const pathAbsolute = jest.spyOn(path, "isAbsolute").mockReturnValue(true);
- const pathJoin = jest.spyOn(path, "join").mockReturnValue("path");
- const mongoClient = jest
- .spyOn(MongoClient, "connect")
- .mockImplementation(
- () => new Promise<MongoClient>((res) => res(superClient))
- );
- const processTemplate = jest
- .spyOn(templates, "default")
- .mockImplementation(
- (template: templates.Template) => new Promise((res) => res(template))
- );
-
- const result = await confStartup();
-
- expect(fsAccess).toHaveBeenCalledTimes(1);
- expect(pathAbsolute).toHaveBeenCalledTimes(1);
- expect(mongoClient).toHaveBeenCalledTimes(1);
- expect(processTemplate).toHaveBeenCalledTimes(2);
- expect(exit).not.toHaveBeenCalled();
- expect(result).toEqual(superClient);
- processTemplate.mockRestore();
- mongoClient.mockRestore();
- pathAbsolute.mockRestore();
- pathJoin.mockRestore();
- fsAccess.mockRestore();
- });
+ const confStartup = (): Promise<Metadata> =>
+ handleStartup(config, undefined, LOGGER);
it("should exit if HOST_DIR is not read/write accessible", async () => {
const superClient = {} as MongoClient;
@@ -426,12 +256,18 @@ describe("handleShutdown", () => {
it("should exit gracefully without error", async () => {
// Arrange
- const mongo = MongoMock(new Promise((r) => r()))();
- const server = ServerMock(undefined)();
+ const metadata = {
+ close: () => Promise.resolve(),
+ } as Metadata;
+ const server = {
+ close: (callback?: ((err?: Error | undefined) => void) | undefined) => {
+ callback !== undefined && callback();
+ },
+ } as Server;
// Act
try {
- await handleShutdown(mongo, server, logger)("SIGINT");
+ await handleShutdown(metadata, server, LOGGER)("SIGINT");
} catch (err) {
//
}
@@ -440,14 +276,20 @@ describe("handleShutdown", () => {
expect(exit).toHaveBeenCalledWith(0);
});
- it("should exit with error with Mongo error", async () => {
+ it("should exit with error with Metadata error", async () => {
// Arrange
- const mongo = MongoMock(new Promise((_, r) => r()))();
- const server = ServerMock(undefined)();
+ const metadata = {
+ close: () => Promise.reject(),
+ } as Metadata;
+ const server = {
+ close: (callback?: ((err?: Error | undefined) => void) | undefined) => {
+ callback !== undefined && callback();
+ },
+ } as Server;
// Act
try {
- await handleShutdown(mongo, server, logger)("SIGINT");
+ await handleShutdown(metadata, server, LOGGER)("SIGINT");
} catch (err) {
//
}
@@ -458,12 +300,18 @@ describe("handleShutdown", () => {
it("should exit with error with Server error", async () => {
// Arrange
- const mongo = MongoMock(new Promise((r) => r()))();
- const server = ServerMock(Error("oh noooo"))();
+ const metadata = {
+ close: () => Promise.resolve(),
+ } as Metadata;
+ const server = {
+ close: (callback?: ((err?: Error | undefined) => void) | undefined) => {
+ callback !== undefined && callback(Error("NOOO"));
+ },
+ } as Server;
// Act
try {
- await handleShutdown(mongo, server, logger)("SIGINT");
+ await handleShutdown(metadata, server, LOGGER)("SIGINT");
} catch (err) {
//
}