@storyous/test-utils 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,32 +1,32 @@
1
- # `testUtils`
2
-
3
- Package for help with testing you app.
4
- Creates api for test requesting, creates test database collection and mocked mailer.
5
-
6
- ## Usage
7
-
8
- ``` typescript
9
- import * as assert from 'assert';
10
- import Koa from 'koa';
11
- import { describe, it } from 'mocha';
12
- import mailer from '@storyous/mailer';
13
- import testUtils from '@storyous/test-utils';
14
-
15
- testUtils.init(
16
- () => new Koa(),
17
- testUtils.uniqueDatabase('mongodb://127.0.0.0:27017/test'),
18
- mailer,
19
- );
20
-
21
- describe('some test', async () => {
22
-
23
- it('should do some request', async () => {
24
- await testUtils.request().get('/').expect(200);
25
- });
26
-
27
- it('should getSent emails', async () => {
28
- await mailer.sendMail({});
29
- assert.deepStrictEqual(testUtils.getSentMails(), []);
30
- });
31
- };
32
- ```
1
+ # `testUtils`
2
+
3
+ Package for help with testing you app.
4
+ Creates api for test requesting, creates test database collection and mocked mailer.
5
+
6
+ ## Usage
7
+
8
+ ``` typescript
9
+ import * as assert from 'assert';
10
+ import Koa from 'koa';
11
+ import { describe, it } from 'mocha';
12
+ import mailer from '@storyous/mailer';
13
+ import testUtils from '@storyous/test-utils';
14
+
15
+ testUtils.init(
16
+ () => new Koa(),
17
+ testUtils.uniqueDatabase('mongodb://127.0.0.0:27017/test'),
18
+ mailer,
19
+ );
20
+
21
+ describe('some test', async () => {
22
+
23
+ it('should do some request', async () => {
24
+ await testUtils.request().get('/').expect(200);
25
+ });
26
+
27
+ it('should getSent emails', async () => {
28
+ await mailer.sendMail({});
29
+ assert.deepStrictEqual(testUtils.getSentMails(), []);
30
+ });
31
+ };
32
+ ```
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const assert = __importStar(require("assert"));
30
+ const koa_1 = __importDefault(require("koa"));
31
+ const mocha_1 = __importStar(require("mocha"));
32
+ const testUtils_1 = __importDefault(require("../lib/testUtils"));
33
+ testUtils_1.default.init({ mocha: mocha_1.default, app: () => new koa_1.default(), cleanDatabaseUrl: 'mongodb://127.0.0.1/testing' });
34
+ (0, mocha_1.describe)('packages/testUtils', async () => {
35
+ (0, mocha_1.it)('should do some request', async () => {
36
+ await testUtils_1.default.request().get('/').expect(404);
37
+ });
38
+ (0, mocha_1.it)('should getSent emails', async () => {
39
+ assert.deepStrictEqual(testUtils_1.default.getSentMails(), []);
40
+ });
41
+ (0, mocha_1.it)('should generate uniqueDatabase', () => {
42
+ testUtils_1.default.init({ mocha: mocha_1.default, app: () => new koa_1.default() });
43
+ assert.deepStrictEqual(testUtils_1.default.uniqueDatabase(), null);
44
+ assert.deepStrictEqual(testUtils_1.default.uniqueDatabase('mongodb://127.0.0.0:27017/test')?.startsWith('mongodb://127.0.0.0:27017/test___'), true);
45
+ });
46
+ });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXN0VXRpbHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQWlDO0FBQ2pDLDhDQUFzQjtBQUN0QiwrQ0FBNEM7QUFDNUMsaUVBQXlDO0FBRXpDLG1CQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFMLGVBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxhQUFHLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBRSxDQUFDLENBQUM7QUFFakcsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO0lBRXRDLElBQUEsVUFBRSxFQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BDLE1BQU0sbUJBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxVQUFFLEVBQUMsdUJBQXVCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxtQkFBUyxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxVQUFFLEVBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3RDLG1CQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFMLGVBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxhQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxtQkFBUyxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxlQUFlLENBQ2xCLG1CQUFTLENBQUMsY0FBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLEVBQzNHLElBQUksQ0FDUCxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyJ9
@@ -1,26 +1,26 @@
1
- import * as assert from 'assert';
2
- import Koa from 'koa';
3
- import mocha, { describe, it } from 'mocha';
4
- import testUtils from '../lib/testUtils';
5
-
6
- testUtils.init({ mocha, app: () => new Koa(), cleanDatabaseUrl: 'mongodb://127.0.0.1/testing' });
7
-
8
- describe('packages/testUtils', async () => {
9
-
10
- it('should do some request', async () => {
11
- await testUtils.request().get('/').expect(404);
12
- });
13
-
14
- it('should getSent emails', async () => {
15
- assert.deepStrictEqual(testUtils.getSentMails(), []);
16
- });
17
-
18
- it('should generate uniqueDatabase', () => {
19
- testUtils.init({ mocha, app: () => new Koa() });
20
- assert.deepStrictEqual(testUtils.uniqueDatabase(), null);
21
- assert.deepStrictEqual(
22
- testUtils.uniqueDatabase('mongodb://127.0.0.0:27017/test')?.startsWith('mongodb://127.0.0.0:27017/test___'),
23
- true,
24
- );
25
- });
26
- });
1
+ import * as assert from 'assert';
2
+ import Koa from 'koa';
3
+ import mocha, { describe, it } from 'mocha';
4
+ import testUtils from '../lib/testUtils';
5
+
6
+ testUtils.init({ mocha, app: () => new Koa(), cleanDatabaseUrl: 'mongodb://127.0.0.1/testing' });
7
+
8
+ describe('packages/testUtils', async () => {
9
+
10
+ it('should do some request', async () => {
11
+ await testUtils.request().get('/').expect(404);
12
+ });
13
+
14
+ it('should getSent emails', async () => {
15
+ assert.deepStrictEqual(testUtils.getSentMails(), []);
16
+ });
17
+
18
+ it('should generate uniqueDatabase', () => {
19
+ testUtils.init({ mocha, app: () => new Koa() });
20
+ assert.deepStrictEqual(testUtils.uniqueDatabase(), null);
21
+ assert.deepStrictEqual(
22
+ testUtils.uniqueDatabase('mongodb://127.0.0.0:27017/test')?.startsWith('mongodb://127.0.0.0:27017/test___'),
23
+ true,
24
+ );
25
+ });
26
+ });
@@ -0,0 +1,10 @@
1
+ import { Transport } from 'nodemailer';
2
+ import MailMessage from 'nodemailer/lib/mailer/mail-message';
3
+ export default class MockTransport implements Transport {
4
+ private _sentMail;
5
+ readonly name: 'Mock';
6
+ readonly version: '1.0.0';
7
+ getSentMail(): MailMessage<any>[];
8
+ send(mail: MailMessage<any>, callback: (err: Error | null, info?: any) => void): void;
9
+ private _validate;
10
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class MockTransport {
4
+ constructor() {
5
+ this._sentMail = [];
6
+ this._validate = (address) => {
7
+ if (!address) {
8
+ return new Error('Error validating address.');
9
+ }
10
+ if (typeof address !== 'string') {
11
+ address = address.address;
12
+ }
13
+ if (address.length > 254) {
14
+ return new Error('Error validating address.');
15
+ }
16
+ if (!address.match(/^[^@]+@.+\..+$/)) {
17
+ return new Error('Error validating address.');
18
+ }
19
+ return null;
20
+ };
21
+ }
22
+ getSentMail() {
23
+ return this._sentMail;
24
+ }
25
+ send(mail, callback) {
26
+ let err;
27
+ if (!mail.data.to) {
28
+ callback(new Error('I need to know who this email is being sent to :-('));
29
+ return;
30
+ }
31
+ if (Array.isArray(mail.data.to)) {
32
+ for (let i = 0; i < mail.data.to.length; i++) {
33
+ const address = mail.data.to[i];
34
+ err = this._validate(address);
35
+ if (err !== null) {
36
+ callback(err);
37
+ return;
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ err = this._validate(mail.data.to);
43
+ if (err !== null) {
44
+ callback(err);
45
+ return;
46
+ }
47
+ }
48
+ this._sentMail.push(mail);
49
+ callback(null, { accepted: [mail.data.to] });
50
+ }
51
+ }
52
+ exports.default = MockTransport;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja1RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vY2tUcmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxNQUFxQixhQUFhO0lBQWxDO1FBQ1ksY0FBUyxHQUF1QixFQUFFLENBQUM7UUF1Q25DLGNBQVMsR0FBRyxDQUFDLE9BQTBCLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE9BQU8sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUNqRDtZQUVELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUM3QixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUM3QjtZQUVELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ3RCLE9BQU8sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUNqRDtZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUNqRDtZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFwREcsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRU0sSUFBSSxDQUFFLElBQXNCLEVBQUUsUUFBaUQ7UUFDbEYsSUFBSSxHQUFHLENBQUM7UUFFUixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDZixRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQyxDQUFDO1lBQzFFLE9BQU87U0FDVjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO29CQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxPQUFPO2lCQUNWO2FBQ0o7U0FDSjthQUFNO1lBQ0gsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ2QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLE9BQU87YUFDVjtTQUNKO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FxQko7QUEzREQsZ0NBMkRDIn0=
@@ -1,64 +1,64 @@
1
- import { Transport } from 'nodemailer';
2
- import { Address } from 'nodemailer/lib/mailer';
3
- import MailMessage from 'nodemailer/lib/mailer/mail-message';
4
-
5
- export default class MockTransport implements Transport {
6
- private _sentMail: MailMessage<any>[] = [];
7
-
8
- public readonly name: 'Mock';
9
-
10
- public readonly version: '1.0.0';
11
-
12
- getSentMail () {
13
- return this._sentMail;
14
- }
15
-
16
- public send (mail: MailMessage<any>, callback: (err: Error | null, info?: any) => void): void {
17
- let err;
18
-
19
- if (!mail.data.to) {
20
- callback(new Error('I need to know who this email is being sent to :-('));
21
- return;
22
- }
23
-
24
- if (Array.isArray(mail.data.to)) {
25
- for (let i = 0; i < mail.data.to.length; i++) {
26
- const address = mail.data.to[i];
27
- err = this._validate(address);
28
- if (err !== null) {
29
- callback(err);
30
- return;
31
- }
32
- }
33
- } else {
34
- err = this._validate(mail.data.to);
35
- if (err !== null) {
36
- callback(err);
37
- return;
38
- }
39
- }
40
-
41
- this._sentMail.push(mail);
42
- callback(null, { accepted: [mail.data.to] });
43
- }
44
-
45
- private _validate = (address?: string | Address) => {
46
- if (!address) {
47
- return new Error('Error validating address.');
48
- }
49
-
50
- if (typeof address !== 'string') {
51
- address = address.address;
52
- }
53
-
54
- if (address.length > 254) {
55
- return new Error('Error validating address.');
56
- }
57
-
58
- if (!address.match(/^[^@]+@.+\..+$/)) {
59
- return new Error('Error validating address.');
60
- }
61
-
62
- return null;
63
- };
64
- }
1
+ import { Transport } from 'nodemailer';
2
+ import { Address } from 'nodemailer/lib/mailer';
3
+ import MailMessage from 'nodemailer/lib/mailer/mail-message';
4
+
5
+ export default class MockTransport implements Transport {
6
+ private _sentMail: MailMessage<any>[] = [];
7
+
8
+ public readonly name: 'Mock';
9
+
10
+ public readonly version: '1.0.0';
11
+
12
+ getSentMail () {
13
+ return this._sentMail;
14
+ }
15
+
16
+ public send (mail: MailMessage<any>, callback: (err: Error | null, info?: any) => void): void {
17
+ let err;
18
+
19
+ if (!mail.data.to) {
20
+ callback(new Error('I need to know who this email is being sent to :-('));
21
+ return;
22
+ }
23
+
24
+ if (Array.isArray(mail.data.to)) {
25
+ for (let i = 0; i < mail.data.to.length; i++) {
26
+ const address = mail.data.to[i];
27
+ err = this._validate(address);
28
+ if (err !== null) {
29
+ callback(err);
30
+ return;
31
+ }
32
+ }
33
+ } else {
34
+ err = this._validate(mail.data.to);
35
+ if (err !== null) {
36
+ callback(err);
37
+ return;
38
+ }
39
+ }
40
+
41
+ this._sentMail.push(mail);
42
+ callback(null, { accepted: [mail.data.to] });
43
+ }
44
+
45
+ private _validate = (address?: string | Address) => {
46
+ if (!address) {
47
+ return new Error('Error validating address.');
48
+ }
49
+
50
+ if (typeof address !== 'string') {
51
+ address = address.address;
52
+ }
53
+
54
+ if (address.length > 254) {
55
+ return new Error('Error validating address.');
56
+ }
57
+
58
+ if (!address.match(/^[^@]+@.+\..+$/)) {
59
+ return new Error('Error validating address.');
60
+ }
61
+
62
+ return null;
63
+ };
64
+ }
@@ -0,0 +1,29 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="koa-bodyparser" />
3
+ import http from 'http';
4
+ import Koa from 'koa';
5
+ import { MongoClientOptions } from 'mongodb';
6
+ import nodemailer from 'nodemailer';
7
+ import MailMessage from 'nodemailer/lib/mailer/mail-message';
8
+ import { SuperAgentTest } from 'supertest';
9
+ import MockTransport from './mockTransport';
10
+ interface TypeParams {
11
+ mocha: any;
12
+ app?: () => Koa | Promise<Koa>;
13
+ cleanDatabaseUrl?: string;
14
+ mailer?: {
15
+ _transporter: any;
16
+ };
17
+ cleanDatabaseOptions?: MongoClientOptions;
18
+ }
19
+ declare const testUtils: {
20
+ _app: http.Server | null;
21
+ _originalTransporter: nodemailer.Transporter<any> | undefined;
22
+ _mockTransporter: MockTransport | undefined;
23
+ init({ mocha, app, cleanDatabaseUrl, mailer, cleanDatabaseOptions, }: TypeParams): void;
24
+ getSentMails(): MailMessage<any>[];
25
+ request(): SuperAgentTest;
26
+ uniqueDatabase(mongodbUrl?: string | undefined): string | null;
27
+ cleanTestingDatabases(mongodbUrl: string, options?: MongoClientOptions): Promise<void>;
28
+ };
29
+ export default testUtils;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const http_1 = __importDefault(require("http"));
7
+ const mongodb_1 = require("mongodb");
8
+ const nodemailer_1 = __importDefault(require("nodemailer"));
9
+ const supertest_1 = __importDefault(require("supertest"));
10
+ const mockTransport_1 = __importDefault(require("./mockTransport"));
11
+ const testUtils = {
12
+ _app: null,
13
+ _originalTransporter: undefined,
14
+ _mockTransporter: undefined,
15
+ init({ mocha, app, cleanDatabaseUrl, mailer, cleanDatabaseOptions, }) {
16
+ const { afterEach, before, beforeEach } = mocha;
17
+ before(async () => {
18
+ if (cleanDatabaseUrl) {
19
+ await this.cleanTestingDatabases(cleanDatabaseUrl, cleanDatabaseOptions);
20
+ }
21
+ if (app) {
22
+ this._app = http_1.default.createServer((await app()).callback());
23
+ }
24
+ });
25
+ beforeEach(() => {
26
+ if (mailer) {
27
+ this._originalTransporter = mailer._transporter;
28
+ this._mockTransporter = new mockTransport_1.default();
29
+ mailer._transporter = nodemailer_1.default.createTransport(this._mockTransporter);
30
+ }
31
+ });
32
+ afterEach(() => {
33
+ if (mailer) {
34
+ mailer._transporter = this._originalTransporter;
35
+ }
36
+ });
37
+ },
38
+ getSentMails() {
39
+ if (!this._mockTransporter) {
40
+ throw new Error('The Email Transporter is not initialized yet!');
41
+ }
42
+ return this._mockTransporter.getSentMail();
43
+ },
44
+ request() {
45
+ if (!this._app) {
46
+ throw new Error('The app is not initialized yet!');
47
+ }
48
+ return supertest_1.default.agent(this._app);
49
+ },
50
+ uniqueDatabase(mongodbUrl) {
51
+ if (!mongodbUrl) {
52
+ return null;
53
+ }
54
+ const parsed = new URL(mongodbUrl);
55
+ parsed.pathname = `${parsed.pathname}___${Date.now()}`;
56
+ return parsed.toString();
57
+ },
58
+ async cleanTestingDatabases(mongodbUrl, options = {}) {
59
+ const client = new mongodb_1.MongoClient(mongodbUrl, options);
60
+ await client.connect();
61
+ const db = client.db();
62
+ const { databaseName } = db;
63
+ if (!/testing/i.test(databaseName)) {
64
+ throw new Error('The database name has to contains the "testing" keyword.');
65
+ }
66
+ const postfixMatcher = /___([0-9]{12,})/;
67
+ const baseName = databaseName.replace(postfixMatcher, '');
68
+ const matcher = new RegExp(`^${baseName}(${postfixMatcher.source})?$`);
69
+ const adminDb = db.admin();
70
+ const { databases } = await adminDb.listDatabases({ nameOnly: true });
71
+ const maxAgeDate = new Date();
72
+ maxAgeDate.setMinutes(maxAgeDate.getMinutes() - 15);
73
+ await Promise.all(databases.map(async ({ name }) => {
74
+ const [match, , timestamp] = name.match(matcher) || [];
75
+ if (match && (!timestamp || new Date(parseInt(timestamp, 10)) < maxAgeDate)) {
76
+ // eslint-disable-next-line no-console
77
+ console.log(`DROPPING OLD TESTING database ${name}`);
78
+ await client.db(name).dropDatabase();
79
+ }
80
+ }));
81
+ await client.close();
82
+ },
83
+ };
84
+ exports.default = testUtils;
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdFV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQW9DO0FBRXBDLHFDQUEwRDtBQUMxRCw0REFBcUQ7QUFFckQsMERBQXNEO0FBQ3RELG9FQUE0QztBQVc1QyxNQUFNLFNBQVMsR0FBRztJQUNkLElBQUksRUFBaUIsSUFBSTtJQUN6QixvQkFBb0IsRUFBMkIsU0FBUztJQUN4RCxnQkFBZ0IsRUFBNkIsU0FBUztJQUV0RCxJQUFJLENBQUUsRUFDRixLQUFLLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxvQkFBb0IsR0FDakQ7UUFDVCxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDbEIsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzthQUM1RTtZQUVELElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHVCQUFhLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLFlBQVksR0FBRyxvQkFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUMzRTtRQUNMLENBQUMsQ0FBQyxD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
package/lib/testUtils.ts CHANGED
@@ -1,111 +1,111 @@
1
- import http, { Server } from 'http';
2
- import Koa from 'koa';
3
- import { MongoClient, MongoClientOptions } from 'mongodb';
4
- import nodemailer, { Transporter } from 'nodemailer';
5
- import MailMessage from 'nodemailer/lib/mailer/mail-message';
6
- import supertest, { SuperAgentTest } from 'supertest';
7
- import MockTransport from './mockTransport';
8
-
9
- interface TypeParams {
10
- mocha: any,
11
- app?: () => Koa | Promise<Koa>,
12
- cleanDatabaseUrl?: string,
13
- mailer?: { _transporter: any },
14
-
15
- cleanDatabaseOptions?:MongoClientOptions
16
- }
17
-
18
- const testUtils = {
19
- _app: <Server | null>null,
20
- _originalTransporter: <Transporter | undefined>undefined,
21
- _mockTransporter: <MockTransport | undefined>undefined,
22
-
23
- init ({
24
- mocha, app, cleanDatabaseUrl, mailer, cleanDatabaseOptions,
25
- }: TypeParams) {
26
- const { afterEach, before, beforeEach } = mocha;
27
- before(async () => {
28
- if (cleanDatabaseUrl) {
29
- await this.cleanTestingDatabases(cleanDatabaseUrl, cleanDatabaseOptions);
30
- }
31
-
32
- if (app) {
33
- this._app = http.createServer((await app()).callback());
34
- }
35
- });
36
-
37
- beforeEach(() => {
38
- if (mailer) {
39
- this._originalTransporter = mailer._transporter;
40
- this._mockTransporter = new MockTransport();
41
- mailer._transporter = nodemailer.createTransport(this._mockTransporter);
42
- }
43
- });
44
-
45
- afterEach(() => {
46
- if (mailer) {
47
- mailer._transporter = this._originalTransporter;
48
- }
49
- });
50
- },
51
-
52
- getSentMails (): MailMessage<any>[] {
53
- if (!this._mockTransporter) {
54
- throw new Error('The Email Transporter is not initialized yet!');
55
- }
56
-
57
- return this._mockTransporter.getSentMail();
58
- },
59
-
60
- request (): SuperAgentTest {
61
- if (!this._app) {
62
- throw new Error('The app is not initialized yet!');
63
- }
64
- return supertest.agent(this._app);
65
- },
66
-
67
- uniqueDatabase (mongodbUrl?: string): string | null {
68
-
69
- if (!mongodbUrl) {
70
- return null;
71
- }
72
-
73
- const parsed = new URL(mongodbUrl);
74
- parsed.pathname = `${parsed.pathname}___${Date.now()}`;
75
- return parsed.toString();
76
- },
77
-
78
- async cleanTestingDatabases (mongodbUrl: string, options:MongoClientOptions = {}): Promise<void> {
79
- const client = new MongoClient(mongodbUrl, options);
80
- await client.connect();
81
- const db = client.db();
82
- const { databaseName } = db;
83
-
84
- if (!/testing/i.test(databaseName)) {
85
- throw new Error('The database name has to contains the "testing" keyword.');
86
- }
87
-
88
- const postfixMatcher = /___([0-9]{12,})/;
89
- const baseName = databaseName.replace(postfixMatcher, '');
90
-
91
- const matcher = new RegExp(`^${baseName}(${postfixMatcher.source})?$`);
92
- const adminDb = db.admin();
93
- const { databases } = await adminDb.listDatabases({ nameOnly: true });
94
-
95
- const maxAgeDate = new Date();
96
- maxAgeDate.setMinutes(maxAgeDate.getMinutes() - 15);
97
-
98
- await Promise.all(databases.map(async ({ name }) => {
99
- const [match, , timestamp] = name.match(matcher) || [];
100
- if (match && (!timestamp || new Date(parseInt(timestamp, 10)) < maxAgeDate)) {
101
- // eslint-disable-next-line no-console
102
- console.log(`DROPPING OLD TESTING database ${name}`);
103
- await client.db(name).dropDatabase();
104
- }
105
- }));
106
-
107
- await client.close();
108
- },
109
- };
110
-
111
- export default testUtils;
1
+ import http, { Server } from 'http';
2
+ import Koa from 'koa';
3
+ import { MongoClient, MongoClientOptions } from 'mongodb';
4
+ import nodemailer, { Transporter } from 'nodemailer';
5
+ import MailMessage from 'nodemailer/lib/mailer/mail-message';
6
+ import supertest, { SuperAgentTest } from 'supertest';
7
+ import MockTransport from './mockTransport';
8
+
9
+ interface TypeParams {
10
+ mocha: any,
11
+ app?: () => Koa | Promise<Koa>,
12
+ cleanDatabaseUrl?: string,
13
+ mailer?: { _transporter: any },
14
+
15
+ cleanDatabaseOptions?:MongoClientOptions
16
+ }
17
+
18
+ const testUtils = {
19
+ _app: <Server | null>null,
20
+ _originalTransporter: <Transporter | undefined>undefined,
21
+ _mockTransporter: <MockTransport | undefined>undefined,
22
+
23
+ init ({
24
+ mocha, app, cleanDatabaseUrl, mailer, cleanDatabaseOptions,
25
+ }: TypeParams) {
26
+ const { afterEach, before, beforeEach } = mocha;
27
+ before(async () => {
28
+ if (cleanDatabaseUrl) {
29
+ await this.cleanTestingDatabases(cleanDatabaseUrl, cleanDatabaseOptions);
30
+ }
31
+
32
+ if (app) {
33
+ this._app = http.createServer((await app()).callback());
34
+ }
35
+ });
36
+
37
+ beforeEach(() => {
38
+ if (mailer) {
39
+ this._originalTransporter = mailer._transporter;
40
+ this._mockTransporter = new MockTransport();
41
+ mailer._transporter = nodemailer.createTransport(this._mockTransporter);
42
+ }
43
+ });
44
+
45
+ afterEach(() => {
46
+ if (mailer) {
47
+ mailer._transporter = this._originalTransporter;
48
+ }
49
+ });
50
+ },
51
+
52
+ getSentMails (): MailMessage<any>[] {
53
+ if (!this._mockTransporter) {
54
+ throw new Error('The Email Transporter is not initialized yet!');
55
+ }
56
+
57
+ return this._mockTransporter.getSentMail();
58
+ },
59
+
60
+ request (): SuperAgentTest {
61
+ if (!this._app) {
62
+ throw new Error('The app is not initialized yet!');
63
+ }
64
+ return supertest.agent(this._app);
65
+ },
66
+
67
+ uniqueDatabase (mongodbUrl?: string): string | null {
68
+
69
+ if (!mongodbUrl) {
70
+ return null;
71
+ }
72
+
73
+ const parsed = new URL(mongodbUrl);
74
+ parsed.pathname = `${parsed.pathname}___${Date.now()}`;
75
+ return parsed.toString();
76
+ },
77
+
78
+ async cleanTestingDatabases (mongodbUrl: string, options:MongoClientOptions = {}): Promise<void> {
79
+ const client = new MongoClient(mongodbUrl, options);
80
+ await client.connect();
81
+ const db = client.db();
82
+ const { databaseName } = db;
83
+
84
+ if (!/testing/i.test(databaseName)) {
85
+ throw new Error('The database name has to contains the "testing" keyword.');
86
+ }
87
+
88
+ const postfixMatcher = /___([0-9]{12,})/;
89
+ const baseName = databaseName.replace(postfixMatcher, '');
90
+
91
+ const matcher = new RegExp(`^${baseName}(${postfixMatcher.source})?$`);
92
+ const adminDb = db.admin();
93
+ const { databases } = await adminDb.listDatabases({ nameOnly: true });
94
+
95
+ const maxAgeDate = new Date();
96
+ maxAgeDate.setMinutes(maxAgeDate.getMinutes() - 15);
97
+
98
+ await Promise.all(databases.map(async ({ name }) => {
99
+ const [match, , timestamp] = name.match(matcher) || [];
100
+ if (match && (!timestamp || new Date(parseInt(timestamp, 10)) < maxAgeDate)) {
101
+ // eslint-disable-next-line no-console
102
+ console.log(`DROPPING OLD TESTING database ${name}`);
103
+ await client.db(name).dropDatabase();
104
+ }
105
+ }));
106
+
107
+ await client.close();
108
+ },
109
+ };
110
+
111
+ export default testUtils;
package/package.json CHANGED
@@ -1,42 +1,45 @@
1
- {
2
- "name": "@storyous/test-utils",
3
- "version": "2.2.0",
4
- "description": "",
5
- "homepage": "https://github.com/Storyous/mono-utils#readme",
6
- "license": "ISC",
7
- "main": "lib/testUtils",
8
- "scripts": {
9
- "start": "tsc"
10
- },
11
- "mocha": {
12
- "recursive": true,
13
- "timeout": 15000,
14
- "extension": [
15
- "ts"
16
- ],
17
- "exit": true,
18
- "require": "ts-node/register"
19
- },
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/Storyous/mono-utils.git"
23
- },
24
- "bugs": {
25
- "url": "https://github.com/Storyous/mono-utils/issues"
26
- },
27
- "publishConfig": {
28
- "access": "public",
29
- "registry": "https://registry.npmjs.org/"
30
- },
31
- "dependencies": {
32
- "@types/koa": "^2.13.4",
33
- "@types/lodash": "^4.14.182",
34
- "@types/mocha": "^9.1.1",
35
- "@types/nodemailer": "^6.4.4",
36
- "@types/supertest": "^2.0.12",
37
- "koa": "^2.13.4",
38
- "mongodb": "^4.5.0",
39
- "nodemailer": "^6.7.3",
40
- "supertest": "^6.2.2"
41
- }
42
- }
1
+ {
2
+ "name": "@storyous/test-utils",
3
+ "version": "2.3.0",
4
+ "description": "",
5
+ "homepage": "https://github.com/Storyous/mono-utils#readme",
6
+ "license": "ISC",
7
+ "main": "lib/testUtils",
8
+ "scripts": {
9
+ "start": "tsc"
10
+ },
11
+ "mocha": {
12
+ "recursive": true,
13
+ "timeout": 15000,
14
+ "extension": [
15
+ "ts"
16
+ ],
17
+ "exit": true,
18
+ "require": "ts-node/register"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Storyous/mono-utils.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/Storyous/mono-utils/issues"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "registry": "https://registry.npmjs.org/"
30
+ },
31
+ "dependencies": {
32
+ "@types/koa": "^2.13.4",
33
+ "@types/lodash": "^4.14.182",
34
+ "@types/mocha": "^9.1.1",
35
+ "@types/nodemailer": "^6.4.4",
36
+ "@types/supertest": "^2.0.12",
37
+ "koa": "^2.13.4",
38
+ "nodemailer": "^6.7.3",
39
+ "supertest": "^6.2.2"
40
+ },
41
+ "peerDependencies": {
42
+ "mongodb": "^6.8.0"
43
+ },
44
+ "gitHead": "ebb317129687bc1e9619bf312b41598680fdd2c3"
45
+ }
package/tsconfig.json CHANGED
@@ -1,8 +1,8 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
-
4
- "include": [
5
- "lib",
6
- "__tests__"
7
- ]
8
- }
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+
4
+ "include": [
5
+ "lib",
6
+ "__tests__"
7
+ ]
8
+ }