diff --git a/test/Logger.spec.ts b/test/Logger.spec.ts deleted file mode 100644 index 68c657c0..00000000 --- a/test/Logger.spec.ts +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2018, 2019 StApps - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - */ -import * as chai from 'chai'; -import {expect} from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {slow, suite, test, timeout} from 'mocha-typescript'; -import * as sinon from 'sinon'; -import {Logger} from '../src/Logger'; -import {DummyTransport} from './Transport.spec'; - -chai.should(); -chai.use(chaiAsPromised); - -@suite(timeout(2000), slow(1000)) -export class LoggerSpec { - @test - async error() { - const stub = sinon.stub(console, 'error'); - - await Logger.error('Foobar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[ERROR]'); - expect(stub.args[0][0]).contains('Foobar'); - } - - @test - async errorInProductiveEnvironment() { - const errorStub = sinon.stub(console, 'error'); - - const nodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'production'; - - await Logger.error('Foobar').should.be.rejectedWith(Error); - expect(errorStub.callCount).to.be.equal(1); - - process.env.ALLOW_NO_TRANSPORT = 'true'; - - await Logger.error('Foobar').should.not.be.rejectedWith(Error); - expect(errorStub.callCount).to.be.equal(2); - - delete process.env.ALLOW_NO_TRANSPORT; - - Logger.setTransport(new DummyTransport()); - - await Logger.error('Foobar').should.not.be.rejectedWith(Error); - expect(errorStub.callCount).to.be.equal(3); - - Logger.setTransport(); - - process.env.NODE_ENV = nodeEnv; - - errorStub.restore(); - } - - @test - async errorNoOutput() { - const stub = sinon.stub(console, 'error'); - - process.env.STAPPS_LOG_LEVEL = '0'; - - await Logger.error('Foobar'); - - stub.restore(); - - delete process.env.STAPPS_LOG_LEVEL; - - return expect(stub.called).to.be.false; - } - - @test - async errorWithError() { - const e = new Error(); - const stub = sinon.stub(console, 'error'); - - await Logger.error(e); - - stub.restore(); - - expect(stub.args[0][0]).contains('Error').contains('at').contains(process.cwd()); - } - - @test - getLogLevel() { - const savedProcess = process; - - // @ts-ignore - process = undefined; - - (global as any).window = { - STAPPS_LOG_LEVEL: 0, - }; - - const stub = sinon.stub(console, 'info'); - - Logger.info('Foobar'); - - stub.restore(); - - process = savedProcess; - - delete (global as any).window; - - return expect(stub.called).to.be.false; - } - - @test - info() { - const stub = sinon.stub(console, 'info'); - - Logger.info('Foobar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[INFO]'); - expect(stub.args[0][0]).contains('Foobar'); - } - - @test - infoNoOutput() { - const stub = sinon.stub(console, 'info'); - - process.env.STAPPS_LOG_LEVEL = '0'; - - Logger.info('Foobar'); - - stub.restore(); - - delete process.env.STAPPS_LOG_LEVEL; - - return expect(stub.called).to.be.false; - } - - @test - initialized() { - Logger.setTransport(new DummyTransport()); - - expect(() => { - Logger.initialized(); - }).not.to.throw(); - - Logger.setTransport(); - } - - @test - initializedInProductiveEnvironment() { - const nodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'production'; - - Logger.setTransport(new DummyTransport()); - - expect(() => { - Logger.initialized(); - }).not.to.throw(); - - Logger.setTransport(); - - expect(() => { - Logger.initialized(); - }).to.throw(); - - const stub = sinon.stub(console, 'warn'); - - process.env.ALLOW_NO_TRANSPORT = 'true'; - - expect(() => { - Logger.initialized(); - }).not.to.throw(); - - delete process.env.ALLOW_NO_TRANSPORT; - - expect(stub.called).to.be.equal(true); - - stub.restore(); - - process.env.NODE_ENV = nodeEnv; - } - - @test - log() { - const stub = sinon.stub(console, 'log'); - - Logger.log('Foobar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[LOG]'); - expect(stub.args[0][0]).contains('Foobar'); - } - - @test - logNoOutput() { - const stub = sinon.stub(console, 'log'); - - process.env.STAPPS_LOG_LEVEL = '0'; - - Logger.log('Foobar'); - - stub.restore(); - - delete process.env.STAPPS_LOG_LEVEL; - - return expect(stub.called).to.be.false; - } - - @test - ok() { - const stub = sinon.stub(console, 'log'); - - Logger.ok('Foobar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[OK]'); - expect(stub.args[0][0]).contains('Foobar'); - } - - @test - okNoOutput() { - const stub = sinon.stub(console, 'log'); - - process.env.STAPPS_LOG_LEVEL = '0'; - - Logger.ok('Foobar'); - - stub.restore(); - - delete process.env.STAPPS_LOG_LEVEL; - - return expect(stub.called).to.be.false; - } - - @test - setTransport() { - expect(() => { - Logger.setTransport(new DummyTransport()); - Logger.setTransport(); - }).not.to.throw(); - } - - @test - stringifyArguments() { - const stub = sinon.stub(console, 'log'); - - Logger.log('foo', 'bar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[LOG]'); - expect(stub.args[0][0]).contains('foo'); - expect(stub.args[0][0]).contains('bar'); - } - - @test - warn() { - const stub = sinon.stub(console, 'warn'); - - Logger.warn('Foobar'); - - stub.restore(); - - expect(stub.args[0][0]).contains('[WARN]'); - expect(stub.args[0][0]).contains('Foobar'); - } - - @test - warnNoOutput() { - const stub = sinon.stub(console, 'warn'); - - process.env.STAPPS_LOG_LEVEL = '0'; - - Logger.warn('Foobar'); - - stub.restore(); - - delete process.env.STAPPS_LOG_LEVEL; - - return expect(stub.called).to.be.false; - } -} diff --git a/test/Common.spec.ts b/test/common.spec.ts similarity index 100% rename from test/Common.spec.ts rename to test/common.spec.ts diff --git a/test/dummyTransport.ts b/test/dummyTransport.ts new file mode 100644 index 00000000..8eb042ab --- /dev/null +++ b/test/dummyTransport.ts @@ -0,0 +1,35 @@ +import {Transport, VerifiableTransport} from '../src/transport'; + +export class DummyTransport extends Transport { + send(subject: string, message: string): Promise { + return new Promise((resolve, reject) => { + if (0 === 0) { + resolve(subject); + } + + reject(message); + }); + } +} + +export class VerifiableDummyTransport extends VerifiableTransport { + isVerified(): boolean { + return false; + } + + send(subject: string, message: string): Promise { + return new Promise((resolve, reject) => { + if (0 === 0) { + resolve(subject); + } + + reject(message); + }); + } + + verify(): Promise { + return new Promise((resolve) => { + resolve(true); + }); + } +} diff --git a/test/logger.spec.ts b/test/logger.spec.ts new file mode 100644 index 00000000..a85aeeaa --- /dev/null +++ b/test/logger.spec.ts @@ -0,0 +1,314 @@ +/* + * Copyright (C) 2018, 2019 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import * as chai from 'chai'; +import {expect} from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import * as chaiSpies from 'chai-spies'; +import {slow, suite, timeout} from 'mocha-typescript'; +import {Logger} from '../src/logger'; +import {DummyTransport} from './dummyTransport'; + +chai.should(); +chai.use(chaiSpies); +chai.use(chaiAsPromised); + +@suite(timeout(2000), slow(1000)) +export class LoggerSpec { + static sandbox: any; + + static before() { + LoggerSpec.sandbox = chai.spy.sandbox(); + } + + before() { + LoggerSpec.sandbox.restore(); + } + + @test + async 'default log level'() { + expect((Logger as any).getLogLevel()).to.be.equal(31); + } + + @test + async error() { + const spy = LoggerSpec.sandbox.on(console, 'error', () => { + }); + + await Logger.error('Foobar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('[ERROR]'); + expect(spy.__spy.calls[0][0]).to.contain('Foobar'); + } + + @test + async 'error in productive environment'() { + const spy = LoggerSpec.sandbox.on(console, 'error', () => { + }); + + const nodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = 'production'; + + await Logger.error('Foobar').should.be.rejectedWith(Error); + expect(spy).to.have.been.called.exactly(1); + + process.env.ALLOW_NO_TRANSPORT = 'true'; + + await Logger.error('Foobar').should.not.be.rejectedWith(Error); + expect(spy).to.have.been.called.exactly(2); + + delete process.env.ALLOW_NO_TRANSPORT; + + Logger.setTransport(new DummyTransport()); + + await Logger.error('Foobar').should.not.be.rejectedWith(Error); + expect(spy).to.have.been.called.exactly(3); + + Logger.setTransport(); + + process.env.NODE_ENV = nodeEnv; + } + + @test + async 'error without output'() { + const spy = LoggerSpec.sandbox.on(console, 'error', () => { + }); + + process.env.STAPPS_LOG_LEVEL = '0'; + + await Logger.error('Foobar'); + + delete process.env.STAPPS_LOG_LEVEL; + + expect(spy).not.to.have.been.called(); + } + + @test + async 'error with Error'() { + const spy = LoggerSpec.sandbox.on(console, 'error', () => { + }); + + await Logger.error(new Error()); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('Error'); + expect(spy.__spy.calls[0][0]).to.contain(process.cwd()); + } + + @test + info() { + const spy = LoggerSpec.sandbox.on(console, 'info', () => { + }); + + Logger.info('Foobar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('[INFO]'); + expect(spy.__spy.calls[0][0]).to.contain('Foobar'); + } + + @test + 'info without output'() { + const spy = LoggerSpec.sandbox.on(console, 'info', () => { + }); + + process.env.STAPPS_LOG_LEVEL = '0'; + + Logger.info('Foobar'); + + delete process.env.STAPPS_LOG_LEVEL; + + expect(spy).not.to.have.been.called; + } + + @test + initialized() { + Logger.setTransport(new DummyTransport()); + + expect(() => { + Logger.initialized(); + }).not.to.throw(); + + Logger.setTransport(); + } + + @test + 'initialized in productive environment'() { + const nodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = 'production'; + + Logger.setTransport(new DummyTransport()); + + expect(() => { + Logger.initialized(); + }).not.to.throw(); + + Logger.setTransport(); + + expect(() => { + Logger.initialized(); + }).to.throw(); + + const spy = LoggerSpec.sandbox.on(console, 'warn', () => { + }); + + process.env.ALLOW_NO_TRANSPORT = 'true'; + + expect(() => { + Logger.initialized(); + }).not.to.throw(); + + delete process.env.ALLOW_NO_TRANSPORT; + + expect(spy).to.have.been.called(); + + process.env.NODE_ENV = nodeEnv; + } + + @test + log() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + Logger.log('Foobar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('[LOG]'); + expect(spy.__spy.calls[0][0]).to.contain('Foobar'); + } + + @test + 'log without output'() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + process.env.STAPPS_LOG_LEVEL = '0'; + + Logger.log('Foobar'); + + delete process.env.STAPPS_LOG_LEVEL; + + expect(spy).to.not.have.been.called(); + } + + @test + ok() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + Logger.ok('Foobar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('[OK]'); + expect(spy.__spy.calls[0][0]).to.contain('Foobar'); + } + + @test + 'ok without output'() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + process.env.STAPPS_LOG_LEVEL = '0'; + + Logger.ok('Foobar'); + + delete process.env.STAPPS_LOG_LEVEL; + + expect(spy).not.to.have.been.called() + } + + @test + setTransport() { + expect(() => { + Logger.setTransport(new DummyTransport()); + Logger.setTransport(); + }).not.to.throw(); + } + + @test + 'stringify'() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + Logger.log('foo', 'bar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('foo'); + expect(spy.__spy.calls[0][0]).to.contain('bar'); + } + + @test + 'stringify object'() { + const spy = LoggerSpec.sandbox.on(console, 'log', () => { + }); + + Logger.log({ + foo: 'bar' + }); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('foo'); + expect(spy.__spy.calls[0][0]).to.contain('bar'); + } + + @test + warn() { + const spy = LoggerSpec.sandbox.on(console, 'warn', () => { + }); + + Logger.warn('Foobar'); + + expect(spy).to.have.been.called(); + expect(spy.__spy.calls[0][0]).to.contain('[WARN]'); + expect(spy.__spy.calls[0][0]).to.contain('Foobar'); + } + + @test + 'warn without output'() { + const spy = LoggerSpec.sandbox.on(console, 'warn', () => { + }); + + process.env.STAPPS_LOG_LEVEL = '0'; + + Logger.warn('Foobar'); + + delete process.env.STAPPS_LOG_LEVEL; + + expect(spy).not.to.have.been.called(); + } + + @test + getLogLevel() { + const savedProcess = process; + + // @ts-ignore + process = undefined; + + (global as any).window = { + STAPPS_LOG_LEVEL: 0, + }; + + const stub = LoggerSpec.sandbox.on(console, 'info', () => { + }); + + Logger.info('Foobar'); + + process = savedProcess; + + delete (global as any).window; + + expect(stub).not.to.have.been.called(); + } +} diff --git a/test/SMTP.spec.ts b/test/smtp.spec.ts similarity index 97% rename from test/SMTP.spec.ts rename to test/smtp.spec.ts index cb6c9a6d..bc6e6e23 100644 --- a/test/SMTP.spec.ts +++ b/test/smtp.spec.ts @@ -14,9 +14,7 @@ */ import {expect} from 'chai'; import {slow, suite, test, timeout} from 'mocha-typescript'; -import {SMTP} from '../src/SMTP'; - -// tslint:disable:no-unused-expression +import {SMTP} from '../src/smtp'; @suite(timeout(2000), slow(1000)) export class SMTPSpec { diff --git a/test/Transport.spec.ts b/test/transport.spec.ts similarity index 60% rename from test/Transport.spec.ts rename to test/transport.spec.ts index 5d5500ec..c79fd96f 100644 --- a/test/Transport.spec.ts +++ b/test/transport.spec.ts @@ -15,41 +15,7 @@ import {expect} from 'chai'; import {slow, suite, test, timeout} from 'mocha-typescript'; import {isTransportWithVerification} from '../src/common'; -import {Transport, VerifiableTransport} from '../src/Transport'; - -export class DummyTransport extends Transport { - send(subject: string, message: string): Promise { - return new Promise((resolve, reject) => { - if (0 === 0) { - resolve(subject); - } - - reject(message); - }); - } -} - -export class VerifiableDummyTransport extends VerifiableTransport { - isVerified(): boolean { - return false; - } - - send(subject: string, message: string): Promise { - return new Promise((resolve, reject) => { - if (0 === 0) { - resolve(subject); - } - - reject(message); - }); - } - - verify(): Promise { - return new Promise((resolve) => { - resolve(true); - }); - } -} +import {DummyTransport, VerifiableDummyTransport} from './dummyTransport'; @suite(timeout(2000), slow(1000)) export class TransportSpec {