/* eslint-disable
    handle-callback-err,
    no-return-assign,
    no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
require('chai').should()
const modulePath = require('path').join(
  __dirname,
  '../../../app/js/OutputFileFinder'
)
const path = require('path')
const { expect } = require('chai')
const { EventEmitter } = require('events')

describe('OutputFileFinder', function () {
  beforeEach(function () {
    this.OutputFileFinder = SandboxedModule.require(modulePath, {
      requires: {
        fs: (this.fs = {}),
        child_process: { spawn: (this.spawn = sinon.stub()) },
        'logger-sharelatex': { log: sinon.stub(), warn: sinon.stub() }
      }
    })
    this.directory = '/test/dir'
    return (this.callback = sinon.stub())
  })

  describe('findOutputFiles', function () {
    beforeEach(function () {
      this.resource_path = 'resource/path.tex'
      this.output_paths = ['output.pdf', 'extra/file.tex']
      this.all_paths = this.output_paths.concat([this.resource_path])
      this.resources = [{ path: (this.resource_path = 'resource/path.tex') }]
      this.OutputFileFinder._getAllFiles = sinon
        .stub()
        .callsArgWith(1, null, this.all_paths)
      return this.OutputFileFinder.findOutputFiles(
        this.resources,
        this.directory,
        (error, outputFiles) => {
          this.outputFiles = outputFiles
        }
      )
    })

    return it('should only return the output files, not directories or resource paths', function () {
      return expect(this.outputFiles).to.deep.equal([
        {
          path: 'output.pdf',
          type: 'pdf'
        },
        {
          path: 'extra/file.tex',
          type: 'tex'
        }
      ])
    })
  })

  return describe('_getAllFiles', function () {
    beforeEach(function () {
      this.proc = new EventEmitter()
      this.proc.stdout = new EventEmitter()
      this.proc.stdout.setEncoding = sinon.stub().returns(this.proc.stdout)
      this.spawn.returns(this.proc)
      this.directory = '/base/dir'
      return this.OutputFileFinder._getAllFiles(this.directory, this.callback)
    })

    describe('successfully', function () {
      beforeEach(function () {
        this.proc.stdout.emit(
          'data',
          ['/base/dir/main.tex', '/base/dir/chapters/chapter1.tex'].join('\n') +
            '\n'
        )
        return this.proc.emit('close', 0)
      })

      return it('should call the callback with the relative file paths', function () {
        return this.callback
          .calledWith(null, ['main.tex', 'chapters/chapter1.tex'])
          .should.equal(true)
      })
    })

    return describe("when the directory doesn't exist", function () {
      beforeEach(function () {
        return this.proc.emit('close', 1)
      })

      return it('should call the callback with a blank array', function () {
        return this.callback.calledWith(null, []).should.equal(true)
      })
    })
  })
})
