From 09aac4dd3e3724cfa78cdfe7c01f0df649e3d1f7 Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 12:08:02 +0400 Subject: [PATCH 1/8] feat(logger): disable logs while testing with jest --silent in dev env --- packages/logger/src/Logger.ts | 23 +++++++++++++++++-- .../src/config/ConfigServiceInterface.ts | 14 +++++------ .../src/config/EnvironmentVariablesService.ts | 22 +++++++++--------- packages/logger/tests/unit/Logger.test.ts | 14 +++++++---- .../EnvironmentVariablesService.test.ts | 10 ++++---- packages/logger/tests/unit/helpers.test.ts | 2 +- .../tests/unit/middleware/middy.test.ts | 2 +- 7 files changed, 55 insertions(+), 32 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index e2198153ae..430c9caf15 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -113,7 +113,8 @@ import type { */ class Logger extends Utility implements ClassThatLogs { - private console = new Console({ stdout: process.stdout, stderr: process.stderr }); + // console is initialized in the constructor in setOptions() + private console!: Console; private customConfigService?: ConfigServiceInterface; @@ -575,6 +576,21 @@ class Logger extends Utility implements ClassThatLogs { return this.powertoolLogData.sampleRateValue; } + /** + * It initializes console property as an instance of the internal version of Console() class (PR #748) + * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. + * + * @private + * @returns {void} + */ + private initConsole(): void { + if (!this.getEnvVarsService().isDevMode()) { + this.console = new Console({ stdout: process.stdout, stderr: process.stderr }); + } else { + this.console = console; + } + } + /** * It returns true if the provided log level is valid. * @@ -699,7 +715,7 @@ class Logger extends Utility implements ClassThatLogs { * @returns {void} */ private setLogIndentation(): void { - if (this.getEnvVarsService().getDevMode()) { + if (this.getEnvVarsService().isDevMode()) { this.logIndentation = LogJsonIndent.PRETTY; } } @@ -766,6 +782,9 @@ class Logger extends Utility implements ClassThatLogs { } = options; this.setEnvVarsService(); + // order is important, it uses EngVarsService() + this.initConsole(); + this.setCustomConfigService(customConfigService); this.setLogLevel(logLevel); this.setSampleRateValue(sampleRateValue); diff --git a/packages/logger/src/config/ConfigServiceInterface.ts b/packages/logger/src/config/ConfigServiceInterface.ts index 43f25d3649..d66d4e9f85 100644 --- a/packages/logger/src/config/ConfigServiceInterface.ts +++ b/packages/logger/src/config/ConfigServiceInterface.ts @@ -22,13 +22,6 @@ interface ConfigServiceInterface { */ getCurrentEnvironment(): string - /** - * It returns the value of the POWERTOOLS_DEV environment variable. - * - * @returns {boolean} - */ - getDevMode(): boolean - /** * It returns the value of the POWERTOOLS_LOGGER_LOG_EVENT environment variable. * @@ -57,6 +50,13 @@ interface ConfigServiceInterface { */ getServiceName(): string + /** + * It returns the value of the POWERTOOLS_DEV environment variable. + * + * @returns {boolean} + */ + isDevMode(): boolean + /** * It returns true if the string value represents a boolean true value. * diff --git a/packages/logger/src/config/EnvironmentVariablesService.ts b/packages/logger/src/config/EnvironmentVariablesService.ts index fab7ec9fc8..52fe910784 100644 --- a/packages/logger/src/config/EnvironmentVariablesService.ts +++ b/packages/logger/src/config/EnvironmentVariablesService.ts @@ -46,17 +46,6 @@ class EnvironmentVariablesService extends CommonEnvironmentVariablesService impl return this.get(this.currentEnvironmentVariable); } - /** - * It returns the value of the POWERTOOLS_DEV environment variable. - * - * @returns {boolean} - */ - public getDevMode(): boolean { - const value = this.get(this.devModeVariable); - - return this.isValueTrue(value); - } - /** * It returns the value of the AWS_LAMBDA_FUNCTION_MEMORY_SIZE environment variable. * @@ -117,6 +106,17 @@ class EnvironmentVariablesService extends CommonEnvironmentVariablesService impl return (value && value.length > 0) ? Number(value) : undefined; } + /** + * It returns true if the POWERTOOLS_DEV environment variable is set to truthy value. + * + * @returns {boolean} + */ + public isDevMode(): boolean { + const value = this.get(this.devModeVariable); + + return this.isValueTrue(value); + } + /** * It returns true if the string value represents a boolean true value. * diff --git a/packages/logger/tests/unit/Logger.test.ts b/packages/logger/tests/unit/Logger.test.ts index 6fbf9a527a..879a64cced 100644 --- a/packages/logger/tests/unit/Logger.test.ts +++ b/packages/logger/tests/unit/Logger.test.ts @@ -1243,6 +1243,7 @@ describe('Class: Logger', () => { test('when called, it returns a DISTINCT clone of the logger instance', () => { // Prepare + const INDENTATION = LogJsonIndent.COMPACT; const parentLogger = new Logger(); // Act @@ -1261,7 +1262,10 @@ describe('Class: Logger', () => { // Assess expect(parentLogger === childLogger).toBe(false); - expect(parentLogger).toEqual(childLogger); + expect(childLogger).toEqual({ + ...parentLogger, + console: expect.any(Console), + }); expect(parentLogger === childLoggerWithPermanentAttributes).toBe(false); expect(parentLogger === childLoggerWithSampleRateEnabled).toBe(false); expect(parentLogger === childLoggerWithErrorLogLevel).toBe(false); @@ -1272,7 +1276,7 @@ describe('Class: Logger', () => { customConfigService: undefined, envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, - logIndentation: 0, + logIndentation: INDENTATION, logFormatter: expect.any(PowertoolLogFormatter), logLevel: 'DEBUG', logLevelThresholds: { @@ -1297,7 +1301,7 @@ describe('Class: Logger', () => { customConfigService: undefined, envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, - logIndentation: 0, + logIndentation: INDENTATION, logFormatter: expect.any(PowertoolLogFormatter), logLevel: 'DEBUG', logLevelThresholds: { @@ -1324,7 +1328,7 @@ describe('Class: Logger', () => { customConfigService: undefined, envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, - logIndentation: 0, + logIndentation: INDENTATION, logFormatter: expect.any(PowertoolLogFormatter), logLevel: 'DEBUG', logLevelThresholds: { @@ -1349,7 +1353,7 @@ describe('Class: Logger', () => { customConfigService: undefined, envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, - logIndentation: 0, + logIndentation: INDENTATION, logFormatter: expect.any(PowertoolLogFormatter), logLevel: 'ERROR', logLevelThresholds: { diff --git a/packages/logger/tests/unit/config/EnvironmentVariablesService.test.ts b/packages/logger/tests/unit/config/EnvironmentVariablesService.test.ts index ccaf0084bf..b9aa387614 100644 --- a/packages/logger/tests/unit/config/EnvironmentVariablesService.test.ts +++ b/packages/logger/tests/unit/config/EnvironmentVariablesService.test.ts @@ -181,7 +181,7 @@ describe('Class: EnvironmentVariablesService', () => { }); - describe('Method: getDevMode', () => { + describe('Method: isDevMode', () => { test('It returns true if the environment variable POWERTOOLS_DEV is "true"', () => { @@ -190,7 +190,7 @@ describe('Class: EnvironmentVariablesService', () => { const service = new EnvironmentVariablesService(); // Act - const value = service.getDevMode(); + const value = service.isDevMode(); // Assess expect(value).toEqual(true); @@ -203,7 +203,7 @@ describe('Class: EnvironmentVariablesService', () => { const service = new EnvironmentVariablesService(); // Act - const value = service.getDevMode(); + const value = service.isDevMode(); // Assess expect(value).toEqual(false); @@ -216,7 +216,7 @@ describe('Class: EnvironmentVariablesService', () => { const service = new EnvironmentVariablesService(); // Act - const value = service.getDevMode(); + const value = service.isDevMode(); // Assess expect(value).toEqual(false); @@ -229,7 +229,7 @@ describe('Class: EnvironmentVariablesService', () => { const service = new EnvironmentVariablesService(); // Act - const value = service.getDevMode(); + const value = service.isDevMode(); // Assess expect(value).toEqual(false); diff --git a/packages/logger/tests/unit/helpers.test.ts b/packages/logger/tests/unit/helpers.test.ts index ab49edd114..0accec3723 100644 --- a/packages/logger/tests/unit/helpers.test.ts +++ b/packages/logger/tests/unit/helpers.test.ts @@ -310,7 +310,7 @@ describe('Helper: createLogger function', () => { getServiceName(): string { return 'my-backend-service'; }, - getDevMode(): boolean { + isDevMode(): boolean { return false; }, isValueTrue(): boolean { diff --git a/packages/logger/tests/unit/middleware/middy.test.ts b/packages/logger/tests/unit/middleware/middy.test.ts index 88e37b9fce..8ec29fb957 100644 --- a/packages/logger/tests/unit/middleware/middy.test.ts +++ b/packages/logger/tests/unit/middleware/middy.test.ts @@ -336,7 +336,7 @@ describe('Middy middleware', () => { getServiceName(): string { return 'my-backend-service'; }, - getDevMode(): boolean { + isDevMode(): boolean { return false; }, isValueTrue(): boolean { From 3f8afe2cd359baf6a01a72ab4b5647e0bb962f1d Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 13:40:23 +0400 Subject: [PATCH 2/8] refactor(logger): rename method --- packages/logger/src/Logger.ts | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 430c9caf15..801c7133e2 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -575,21 +575,6 @@ class Logger extends Utility implements ClassThatLogs { return this.powertoolLogData.sampleRateValue; } - - /** - * It initializes console property as an instance of the internal version of Console() class (PR #748) - * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. - * - * @private - * @returns {void} - */ - private initConsole(): void { - if (!this.getEnvVarsService().isDevMode()) { - this.console = new Console({ stdout: process.stdout, stderr: process.stderr }); - } else { - this.console = console; - } - } /** * It returns true if the provided log level is valid. @@ -658,6 +643,21 @@ class Logger extends Utility implements ClassThatLogs { }; } + /** + * It initializes console property as an instance of the internal version of Console() class (PR #748) + * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. + * + * @private + * @returns {void} + */ + private setConsole(): void { + if (!this.getEnvVarsService().isDevMode()) { + this.console = new Console({ stdout: process.stdout, stderr: process.stderr }); + } else { + this.console = console; + } + } + /** * Sets the Logger's customer config service instance, which will be used * to fetch environment variables. @@ -783,8 +783,7 @@ class Logger extends Utility implements ClassThatLogs { this.setEnvVarsService(); // order is important, it uses EngVarsService() - this.initConsole(); - + this.setConsole(); this.setCustomConfigService(customConfigService); this.setLogLevel(logLevel); this.setSampleRateValue(sampleRateValue); From a686e1ce04c1e7d6e6edeaf26ea53eb52de4ea1f Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 14:40:18 +0400 Subject: [PATCH 3/8] docs(logger): add testing section with jest --silent option, which is also suppresses logs (#1165) --- docs/core/logger.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/core/logger.md b/docs/core/logger.md index 1153edfb3d..de501f73f8 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -971,3 +971,7 @@ This is a Jest sample that provides the minimum information necessary for Logger !!! tip If you don't want to declare your own dummy Lambda Context, you can use [`ContextExamples.helloworldContext`](https://github.com/awslabs/aws-lambda-powertools-typescript/blob/main/packages/commons/src/samples/resources/contexts/hello-world.ts#L3-L16) from [`@aws-lambda-powertools/commons`](https://www.npmjs.com/package/@aws-lambda-powertools/commons). + +### Suppress logs with Jest + +When unit testing your code with the `POWERTOOLS_DEV` environment variable enabled, you could run Jest with the `--silent` CLI option to make the console readable and clean. It prevents printing messages through the console from tests and logs as well. From 2ed2826f77ce71d0364c7903353665d83f4e9480 Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 14:05:31 +0300 Subject: [PATCH 4/8] Update docs/core/logger.md Co-authored-by: Andrea Amorosi --- docs/core/logger.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/logger.md b/docs/core/logger.md index de501f73f8..8b448eecd0 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -974,4 +974,4 @@ This is a Jest sample that provides the minimum information necessary for Logger ### Suppress logs with Jest -When unit testing your code with the `POWERTOOLS_DEV` environment variable enabled, you could run Jest with the `--silent` CLI option to make the console readable and clean. It prevents printing messages through the console from tests and logs as well. +When unit testing your code with [Jest](https://jestjs.io) you can use the `POWERTOOLS_DEV` environment variable in conjunction with the Jest `--silent` CLI option to suppress logs from Logger. From ddf189c13c0e126c7d659bbd78a7bb63a94ad09f Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 17:38:24 +0400 Subject: [PATCH 5/8] test(logger): add test for setConsole() method --- packages/logger/tests/unit/Logger.test.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/logger/tests/unit/Logger.test.ts b/packages/logger/tests/unit/Logger.test.ts index 879a64cced..0bc9a2daab 100644 --- a/packages/logger/tests/unit/Logger.test.ts +++ b/packages/logger/tests/unit/Logger.test.ts @@ -1465,4 +1465,25 @@ describe('Class: Logger', () => { }); }); -}); \ No newline at end of file + describe('Method: setConsole()', () => { + + test('When the `POWERTOOLS_DEV` env var is SET console object is set to the global node console otherwise to the instance of the internal version of console', () => { + + // Prepare + const logger = new Logger(); + process.env.POWERTOOLS_DEV = 'true'; + const devLogger = new Logger(); + + // Assess + expect(devLogger).toEqual({ + ...devLogger, + console: console, + }); + expect(logger).not.toEqual({ + ...logger, + console: console, + }); + }); + }); + +}); From 505a00fcdc3c972956076413708fbbde05f11a1e Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 17:56:40 +0400 Subject: [PATCH 6/8] test(logger): add comment for assertion --- packages/logger/tests/unit/Logger.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/logger/tests/unit/Logger.test.ts b/packages/logger/tests/unit/Logger.test.ts index 0bc9a2daab..acf73f779f 100644 --- a/packages/logger/tests/unit/Logger.test.ts +++ b/packages/logger/tests/unit/Logger.test.ts @@ -1479,6 +1479,8 @@ describe('Class: Logger', () => { ...devLogger, console: console, }); + // since instances of a class are not equal objects, + // we assert the opposite – console is not the global node object expect(logger).not.toEqual({ ...logger, console: console, From 07248deec1f5a68e34301d88c3c4c77180681611 Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Mon, 14 Nov 2022 19:10:14 +0400 Subject: [PATCH 7/8] docs(logger): add an example of using POWERTOOLS_DEV with jest --silent --- docs/core/logger.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/core/logger.md b/docs/core/logger.md index 8b448eecd0..e658881e74 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -975,3 +975,7 @@ This is a Jest sample that provides the minimum information necessary for Logger ### Suppress logs with Jest When unit testing your code with [Jest](https://jestjs.io) you can use the `POWERTOOLS_DEV` environment variable in conjunction with the Jest `--silent` CLI option to suppress logs from Logger. + +```bash title="Disabling logs while testing with Jest" +export POWERTOOLS_DEV=true && npx jest --silent +``` From 27e70205eb442ed4aef029c888620990af1cc426 Mon Sep 17 00:00:00 2001 From: Sergei Cherniaev Date: Tue, 15 Nov 2022 13:26:17 +0300 Subject: [PATCH 8/8] Update packages/logger/src/Logger.ts Co-authored-by: Andrea Amorosi --- packages/logger/src/Logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 801c7133e2..43a7ab8898 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -782,7 +782,7 @@ class Logger extends Utility implements ClassThatLogs { } = options; this.setEnvVarsService(); - // order is important, it uses EngVarsService() + // order is important, it uses EnvVarsService() this.setConsole(); this.setCustomConfigService(customConfigService); this.setLogLevel(logLevel);