Skip to content

Commit

Permalink
feat(testing): Create TestingLogger
Browse files Browse the repository at this point in the history
Useful for testing logging output from e2e tests or unit tests
  • Loading branch information
michaelbromley committed Dec 11, 2020
1 parent 4d806f9 commit c4bed2d
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/testing/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ export * from './initializers/test-db-initializer';
export * from './initializers/mysql-initializer';
export * from './initializers/postgres-initializer';
export * from './initializers/sqljs-initializer';
export * from './testing-logger';
export * from './types';
89 changes: 89 additions & 0 deletions packages/testing/src/testing-logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { VendureLogger } from '@vendure/core';

/**
* @description
* The TestingLogger can be used in unit tests or e2e tests to make assertions on whether the various
* Logger methods have been called, and which which arguments.
*
* Here's some examples of how to use it in e2e tests and unit tests. In both cases we are using
* the Jest testing framework, but the TestingLogger should work with other similar frameworks
* (e.g. replacing `jest.fn()` with `jasmine.createSpy()`).
*
* @example
* ```TypeScript
* // e2e test example
* import { createTestEnvironment, TestingLogger } from '\@vendure/testing';
*
* const testingLogger = new TestingLogger(() => jest.fn());
*
* const { server, adminClient, shopClient } = createTestEnvironment({
* ...testConfig,
* logger: testingLogger,
* });
*
* // e2e testing setup omitted
*
* it('should log an error', async () => {
* // The `errorSpy` property exposes the Jest mock function
* testingLogger.errorSpy.mockClear();
*
* await doSomethingThatErrors();
*
* expect(testingLogger.errorSpy).toHaveBeenCalled();
* });
* ```
*
* @example
* ```TypeScript
* // unit test example
* import { Test } from '\@nestjs/testing';
* import { Logger } from '\@vendure/core';
* import { TestingLogger } from '\@vendure/testing';
*
* beforeEach(async () => {
* const moduleRef = await Test.createTestingModule({
* // Nest testing setup omitted
* }).compile();
*
* Logger.useLogger(testingLogger);
* moduleRef.useLogger(new Logger());
* }
* ```
*
* @docsCategory testing
*/
export class TestingLogger<Spy extends (...args: any[]) => any> implements VendureLogger {
constructor(private createSpyFn: () => Spy) {
this.debugSpy = createSpyFn();
this.errorSpy = createSpyFn();
this.infoSpy = createSpyFn();
this.verboseSpy = createSpyFn();
this.warnSpy = createSpyFn();
}

debugSpy: Spy;
errorSpy: Spy;
infoSpy: Spy;
verboseSpy: Spy;
warnSpy: Spy;

debug(message: string, context?: string): void {
this.debugSpy(message, context);
}

error(message: string, context?: string, trace?: string): void {
this.errorSpy(message, context, trace);
}

info(message: string, context?: string): void {
this.infoSpy(message, context);
}

verbose(message: string, context?: string): void {
this.verboseSpy(message, context);
}

warn(message: string, context?: string): void {
this.warnSpy(message, context);
}
}

0 comments on commit c4bed2d

Please sign in to comment.