diff options
Diffstat (limited to 'src/config.test.ts')
| -rw-r--r-- | src/config.test.ts | 258 |
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) { // } |
