From 7a4c59a12cf3c4c4ac64dbbf5896f7931118fc43 Mon Sep 17 00:00:00 2001 From: cbolgiano Date: Mon, 11 Oct 2021 13:47:30 -0400 Subject: [PATCH] fix: do not attempt to trim objects when printing to console (#18341) --- packages/runner-shared/src/logger.js | 3 +- packages/runner-shared/src/logger.spec.js | 39 +++++++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/packages/runner-shared/src/logger.js b/packages/runner-shared/src/logger.js index dd146ff7cdad..fd97f7d2c4e6 100644 --- a/packages/runner-shared/src/logger.js +++ b/packages/runner-shared/src/logger.js @@ -30,7 +30,8 @@ export const logger = { _.each(formattedLog, (value, key) => { // don't log empty strings // _.trim([]) returns '' but we want to log empty arrays, so account for that - if (_.trim(value) === '' && !_.isArray(value)) return + // Skip trim if we know value is an object + if (typeof value !== 'object' && _.trim(value) === '' && !_.isArray(value)) return this.log(`%c${key}`, 'font-weight: bold', value) }) diff --git a/packages/runner-shared/src/logger.spec.js b/packages/runner-shared/src/logger.spec.js index bde1f34237d2..fe5d88b8ac0a 100644 --- a/packages/runner-shared/src/logger.spec.js +++ b/packages/runner-shared/src/logger.spec.js @@ -1,16 +1,43 @@ const sinon = require('sinon') const { logger } = require('./logger') +import _ from 'lodash' describe('logger', () => { + let spyLog = sinon.spy(logger, 'log') + + afterEach(() => { + // reset after each unit test + spyLog.resetHistory() + }) + // https://github.com/cypress-io/cypress/issues/17542 it('cy.log() shows all arguments in each line when there are multiple args', () => { - const spy = sinon.spy(logger, 'log') - logger.logFormatted({ args: [1, 2, 3] }) - expect(spy).to.have.been.calledWith(`%cArgs:`, 'font-weight: bold') - expect(spy).to.have.been.calledWith(`%c [0]:`, 'font-weight: bold', 1) - expect(spy).to.have.been.calledWith(`%c [1]:`, 'font-weight: bold', 2) - expect(spy).to.have.been.calledWith(`%c [2]:`, 'font-weight: bold', 3) + expect(spyLog).to.have.been.calledWith(`%cArgs:`, 'font-weight: bold') + expect(spyLog).to.have.been.calledWith(`%c [0]:`, 'font-weight: bold', 1) + expect(spyLog).to.have.been.calledWith(`%c [1]:`, 'font-weight: bold', 2) + expect(spyLog).to.have.been.calledWith(`%c [2]:`, 'font-weight: bold', 3) + }) + + describe('_logValues', () => { + let spyTrim = sinon.spy(_, 'trim') + + afterEach(() => { + // reset after each unit test + spyTrim.resetHistory() + }) + + it('should not call trim', () => { + logger._logValues({}) + logger._logValues({ test: {} }) + logger._logValues(null) + logger._logValues(undefined) + + expect(spyTrim.getCalls()).to.have.length(0) + }) + + // The positive unit tests to capture if log has been called are already written in + // the 'cy.log() shows all arguments in each line when there are multiple args' unit test. }) })