diff --git a/packages/server/__snapshots__/5_screenshots_spec.js b/packages/server/__snapshots__/5_screenshots_spec.js index 123a64036d63..e9fcb36a960f 100644 --- a/packages/server/__snapshots__/5_screenshots_spec.js +++ b/packages/server/__snapshots__/5_screenshots_spec.js @@ -147,11 +147,11 @@ Because this error occurred during a \`after each\` hook we are skipping the rem - /XXX/XXX/XXX/cypress/screenshots/screenshots_spec.js/taking screenshots -- reall (1000x660) y long test title aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png - /XXX/XXX/XXX/cypress/screenshots/screenshots_spec.js/taking screenshots -- reall (1000x660) y long test title aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (1).png + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (1).png (Video) diff --git a/packages/server/lib/screenshots.js b/packages/server/lib/screenshots.js index f149731d5798..99489e3b37ed 100644 --- a/packages/server/lib/screenshots.js +++ b/packages/server/lib/screenshots.js @@ -23,7 +23,7 @@ let __ID__ = null // errors are encountered, `maxSafeBytes` will be decremented to at most `MIN_PREFIX_BYTES`, at // which point the latest ENAMTOOLONG error will be emitted. // @see https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits -let maxSafeBytes = 255 +let maxSafeBytes = Number(process.env.CYPRESS_MAX_SAFE_FILENAME_BYTES) || 254 const MIN_PREFIX_BYTES = 64 // TODO: when we parallelize these builds we'll need diff --git a/packages/server/test/support/helpers/e2e.ts b/packages/server/test/support/helpers/e2e.ts index 2630569b8dc2..45098c044214 100644 --- a/packages/server/test/support/helpers/e2e.ts +++ b/packages/server/test/support/helpers/e2e.ts @@ -697,6 +697,8 @@ const e2e = { LINES: 24, }) .defaults({ + // match CircleCI's filesystem limits, so screenshot names in snapshots match + CYPRESS_MAX_SAFE_FILENAME_BYTES: 242, FAKE_CWD_PATH: '/XXX/XXX/XXX', DEBUG_COLORS: '1', // prevent any Compression progress diff --git a/packages/server/test/unit/screenshots_spec.js b/packages/server/test/unit/screenshots_spec.js index 8864bc5fd655..ef193f0ed030 100644 --- a/packages/server/test/unit/screenshots_spec.js +++ b/packages/server/test/unit/screenshots_spec.js @@ -577,6 +577,10 @@ describe('lib/screenshots', () => { }) context('.getPath', () => { + beforeEach(() => { + sinon.stub(fs, 'outputFileAsync').resolves() + }) + it('concats spec name, screenshotsFolder, and name', () => { return screenshots.getPath({ specName: 'examples/user/list.js', @@ -624,7 +628,7 @@ describe('lib/screenshots', () => { titles: [ 'WMED: [STORY] Тестовые сценарии для CI', 'Сценарии:', - 'Сценарий 2: Создание обращения, создание медзаписи, привязка обращения к медзаписи', + 'Сценарий 2: Создание обращения, создание медзаписи, привязкапривязка обращения к медзаписи', '- Сценарий 2', ], testFailure: true, @@ -636,6 +640,34 @@ describe('lib/screenshots', () => { expect(Buffer.from(basename).byteLength).to.be.lessThan(255) }) + it('reacts to ENAMETOOLONG errors and tries to shorten the filename', async () => { + const err = new Error('enametoolong') + + err.code = 'ENAMETOOLONG' + + _.times(50, (i) => fs.outputFileAsync.onCall(i).rejects(err)) + + const fullPath = await screenshots.getPath({ + specName: 'foo.js', + name: 'a'.repeat(256), + }, 'png', '/tmp') + + expect(path.basename(fullPath)).to.have.length(204) + }) + + it('rejects with ENAMETOOLONG errors if name goes below MIN_PREFIX_LENGTH', async () => { + const err = new Error('enametoolong') + + err.code = 'ENAMETOOLONG' + + _.times(150, (i) => fs.outputFileAsync.onCall(i).rejects(err)) + + await expect(screenshots.getPath({ + specName: 'foo.js', + name: 'a'.repeat(256), + }, 'png', '/tmp')).to.be.rejectedWith(err) + }) + _.each([Infinity, 0 / 0, [], {}, 1, false], (value) => { it(`doesn't err and stringifies non-string test title: ${value}`, () => { return screenshots.getPath({