runTestScenariosWithPostAssertion = (postAssertion) => {
    describe('when file at target path does not exist', () => {
      it('should move file to target destination', async () => {
        await safeMoveFile(sourceFile, destinationFile)

        const sourceExists = fs.existsSync(sourceFile)
        const destinationExists = fs.existsSync(destinationFile)

        expect(sourceExists).to.be.false
        expect(destinationExists).to.be.true

        postAssertion()
      })
    })

    describe('when file at target path already exists', () => {
      beforeEach(async () => {
        // Create an existing file that is at the destination
        fse.ensureFileSync(destinationFile)
        fse.writeFileSync(destinationFile, 'existing destination data')
      })

      it('should overwrite the file at the target destination', async () => {
        await safeMoveFile(sourceFile, destinationFile)

        // Check that the file was actually overwritten
        const cachedData = fse.readFileSync(destinationFile).toString()
        expect(cachedData).not.to.eq('existing destination data')

        const sourceExists = await fs.existsSync(sourceFile)
        expect(sourceExists).to.be.false

        postAssertion()
      })
    })
  }
Run the test suite with the provided post assertion function.
The post assertion function will be called after each test scenario is executed
so that the test scenarios can be reused.

@param {*} postAssertion the function that is called after every test scenario