Mock stream finish on jest

Viewed 3312

I have a function that downloads a file using got and uses fs.createWritableStream to write file on disk. The code is working smooth but the unit test are being a pain:

download(twilioPath, destFile) {
  return new Promise(function(resolve, reject) {
    const uri = `${TWILIO_BASE_URL}${twilioPath}`.replace('json', 'mp3')
    let file = fs.createWriteStream(`/tmp/${destFile}`)
    console.log(got)
    let str = got.stream(uri)
    console.log(uri)
    str.on('error', function(err) {
      console.log('Error dl', err)
      reject(err)
    })
    str.pipe(file)

    file.on('finish', function() {
      console.log('banana')
      let cb = function() {
        console.log('Download completed')
        resolve(file)
      }
      file.close(cb)
    })
  })

My resolve or reject is not being called and I don't know how to fix that:

const Recording = require('./Recording')
const Readable = require('stream')

var mockedStream = new Readable();
var mockedWrite = new Readable.Writable()

jest.mock('fs', () => ({
  createWriteStream: jest.fn((file_name) => {
      return mockedWrite;
  })
}));

jest.mock('got', () => {
  return {
    stream: () => {
      return mockedStream
    }
  }
})

describe('Recording', () => {
  test('should download a file from twilio', async () => {
    ...
    mockedStream.emit('error')
    mockedWrite.emit('finish')
    console.log(result)
    ....
  })
})

I've tried to force emit events but no lucky.

1 Answers
Related