Cypress - How can I add assertion for downloaded file contains name that is dynamic?

Viewed 22

In cypress, the xlsx file I am downloading always starts with lets say "ABC" and then some dynamic IDs like ABC86520837.xlsx. How can I verify and add assertion that if the file is downloaded successfully and also contains that dynamic name?

2 Answers

You'll need to create a task to search within file directory of your machine and then return a list of matching downloads to assert. You'll also need globby to make it easier.

In your plugins/index.js

async findFiles (mask) {
          if (!mask) {
            throw new Error('Missing a file mask to search')
          }

          console.log('searching for files %s', mask)
          const list = await globby(mask)

          if (!list.length) {
            console.log('found no files')

            return null
          }

          console.log('found %d files, first one %s', list.length, list[0])

          return list[0]
        },

In your spec file:

const downloadsFolder = Cypress.config('downloadsFolder')
const mask = `${downloadsFolder}/ABC*.xlsx`

cy.task('findFiles', mask).then((foundImage) => {
  expect(foundImage).to.be.a('string')
  cy.log(`found image ${foundImage}`)
})

Cypress example

Assuming you are running a recent version of Cypress,

Add a task to read the downloads folder in /cypress.config.js

const { defineConfig } = require('cypress')
const fs = require('fs')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        filesInDownload (folderName) {
          return fs.readdirSync(folderName)
        },
      })
    }
  }
})

In the test

const downloadsFolder = Cypress.config('downloadsFolder')

cy.task('filesInDownload', downloadsFolder).then(files => {
  const abcFile = files.find(file => file.startsWith('ABC'))
  expect(abcFile).to.not.be.undefined
})

I recommend you set the downloadsFolder configuration, as this will remove files between test runs.

Related