const sinon = require('sinon')
const chai = require('chai')
const { expect } = chai
const modulePath = '../../../app/js/ImageOptimiser.js'
const { FailedCommandError } = require('../../../app/js/Errors')
const SandboxedModule = require('sandboxed-module')

describe('ImageOptimiser', function() {
  let ImageOptimiser, SafeExec, logger
  const sourcePath = '/wombat/potato.eps'

  beforeEach(function() {
    SafeExec = {
      promises: sinon.stub().resolves()
    }
    logger = {
      warn: sinon.stub()
    }
    ImageOptimiser = SandboxedModule.require(modulePath, {
      requires: {
        './SafeExec': SafeExec,
        'logger-sharelatex': logger,
        'metrics-sharelatex': {
          Timer: sinon.stub().returns({ done: sinon.stub() })
        }
      }
    })
  })

  describe('compressPng', function() {
    it('should convert the file', function(done) {
      ImageOptimiser.compressPng(sourcePath, err => {
        expect(err).not.to.exist
        expect(SafeExec.promises).to.have.been.calledWith([
          'optipng',
          sourcePath
        ])
        done()
      })
    })

    it('should return the error', function(done) {
      SafeExec.promises.rejects('wombat herding failure')
      ImageOptimiser.compressPng(sourcePath, err => {
        expect(err.toString()).to.equal('wombat herding failure')
        done()
      })
    })
  })

  describe('when optimiser is sigkilled', function() {
    const expectedError = new FailedCommandError('', 'SIGKILL', '', '')
    let error

    beforeEach(function(done) {
      SafeExec.promises.rejects(expectedError)
      ImageOptimiser.compressPng(sourcePath, err => {
        error = err
        done()
      })
    })

    it('should not produce an error', function() {
      expect(error).not.to.exist
    })

    it('should log a warning', function() {
      expect(logger.warn).to.have.been.calledOnce
    })
  })
})
