SandboxedModule = require('sandboxed-module')
sinon = require('sinon')
require('chai').should()
modulePath = require('path').join __dirname, '../../../app/js/OutputFileFinder'
path = require "path"
expect = require("chai").expect
EventEmitter = require("events").EventEmitter

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

	describe "findOutputFiles", ->
		beforeEach ->
			@resource_path = "resource/path.tex"
			@output_paths   = ["output.pdf", "extra/file.tex"]
			@all_paths = @output_paths.concat [@resource_path]
			@resources = [
				path: @resource_path = "resource/path.tex"
			]
			@OutputFileFinder._getAllFiles = sinon.stub().callsArgWith(1, null, @all_paths)
			@OutputFileFinder.findOutputFiles @resources, @directory, (error, @outputFiles) =>

		it "should only return the output files, not directories or resource paths", ->
			expect(@outputFiles).to.deep.equal [{
				path: "output.pdf"
				type: "pdf"
			}, {
				path: "extra/file.tex",
				type: "tex"
			}]
			
	describe "_getAllFiles", ->
		beforeEach ->
			@proc = new EventEmitter()
			@proc.stdout = new EventEmitter()
			@spawn.returns @proc
			@directory = "/base/dir"
			@OutputFileFinder._getAllFiles @directory, @callback
			
		describe "successfully", ->
			beforeEach ->
				@proc.stdout.emit(
					"data",
					["/base/dir/main.tex", "/base/dir/chapters/chapter1.tex"].join("\n") + "\n"
				)
				@proc.emit "close", 0
				
			it "should call the callback with the relative file paths", ->
				@callback.calledWith(
					null,
					["main.tex", "chapters/chapter1.tex"]
				).should.equal true

		describe "when the directory doesn't exist", ->
			beforeEach ->
				@proc.emit "close", 1
				
			it "should call the callback with a blank array", ->
				@callback.calledWith(
					null,
					[]
				).should.equal true
