import fileUpload from '.'

describe('fileUpload', () => {
  let params
  let uploadCallback

  beforeEach(() => {
    params = {
      uploadAttribute: {
        filename: 'avatar.jpg',
        mimetype: 'image/jpeg',
        encoding: '7bit',
        createReadStream: jest.fn(),
      },
    }
    uploadCallback = jest.fn()
  })

  it('calls uploadCallback', async () => {
    await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
    expect(uploadCallback).toHaveBeenCalled()
  })

  describe('file name', () => {
    it('saves the upload url in params[url]', async () => {
      await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
      expect(params.attribute).toMatch(/^\/uploads\/\d+-avatar$/)
    })

    it('uses the name without file ending', async () => {
      params.uploadAttribute.filename = 'somePng.png'
      await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
      expect(params.attribute).toMatch(/^\/uploads\/\d+-somePng/)
    })

    it('creates a url safe name', async () => {
      params.uploadAttribute.filename =
        '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg?foo- bar'
      await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
      expect(params.attribute).toMatch(/^\/uploads\/\d+-foo-bar-avatar$/)
    })

    describe('in case of duplicates', () => {
      it('creates unique names to avoid overwriting existing files', async () => {
        const { attribute: first } = await fileUpload(
          {
            ...params,
          },
          { file: 'uploadAttribute', url: 'attribute' },
          uploadCallback,
        )

        await new Promise(resolve => setTimeout(resolve, 1000))
        const { attribute: second } = await fileUpload(
          {
            ...params,
          },
          { file: 'uploadAttribute', url: 'attribute' },
          uploadCallback,
        )
        expect(first).not.toEqual(second)
      })
    })
  })
})
