SandboxedModule = require('sandboxed-module')
sinon = require('sinon')
require('chai').should()
modulePath = require('path').join __dirname, '../../../app/js/TikzManager'

describe 'TikzManager', ->
	beforeEach ->
		@TikzManager = SandboxedModule.require modulePath, requires:
			"./ResourceWriter": @ResourceWriter = {}
			"./SafeReader": @SafeReader = {}
			"fs": @fs = {}
			"logger-sharelatex": @logger = {log: () ->}

	describe "checkMainFile", ->
		beforeEach ->
				@compileDir = "compile-dir"
				@mainFile = "main.tex"
				@callback = sinon.stub()

		describe "if there is already an output.tex file in the resources", ->
			beforeEach ->
				@resources = [{path:"main.tex"},{path:"output.tex"}]
				@TikzManager.checkMainFile @compileDir, @mainFile, @resources, @callback

			it "should call the callback with false ", ->
				@callback.calledWithExactly(null, false)
				.should.equal true

		describe "if there is no output.tex file in the resources", ->
			beforeEach ->
				@resources = [{path:"main.tex"}]
				@ResourceWriter.checkPath = sinon.stub()
					.withArgs(@compileDir, @mainFile)
					.callsArgWith(2, null, "#{@compileDir}/#{@mainFile}")

			describe "and the main file contains tikzexternalize", ->
				beforeEach ->
					@SafeReader.readFile = sinon.stub()
						.withArgs("#{@compileDir}/#{@mainFile}")
						.callsArgWith(3, null, "hello \\tikzexternalize")
					@TikzManager.checkMainFile @compileDir, @mainFile, @resources, @callback

				it "should look at the file on disk", ->
					@SafeReader.readFile
					.calledWith("#{@compileDir}/#{@mainFile}")
					.should.equal true

				it "should call the callback with true ", ->
					@callback.calledWithExactly(null, true)
					.should.equal true

			describe "and the main file does not contain tikzexternalize", ->
				beforeEach ->
					@SafeReader.readFile = sinon.stub()
						.withArgs("#{@compileDir}/#{@mainFile}")
						.callsArgWith(3, null, "hello")
					@TikzManager.checkMainFile @compileDir, @mainFile, @resources, @callback

				it "should look at the file on disk", ->
					@SafeReader.readFile
					.calledWith("#{@compileDir}/#{@mainFile}")
					.should.equal true

				it "should call the callback with false", ->
					@callback.calledWithExactly(null, false)
					.should.equal true

	describe "injectOutputFile", ->
		beforeEach ->
			@rootDir = "/mock"
			@filename = "filename.tex"
			@callback = sinon.stub()
			@content = '''
				\\documentclass{article}
				\\usepackage{tikz}
				\\tikzexternalize
				\\begin{document}
				Hello world
				\\end{document}
			'''
			@fs.readFile = sinon.stub().callsArgWith(2, null, @content)
			@fs.writeFile = sinon.stub().callsArg(3)
			@ResourceWriter.checkPath = sinon.stub().callsArgWith(2, null, "#{@rootDir}/#{@filename}")
			@TikzManager.injectOutputFile @rootDir, @filename, @callback

		it "sould check the path", ->
			@ResourceWriter.checkPath.calledWith(@rootDir, @filename)
			.should.equal true

		it "should read the file", ->
			@fs.readFile
				.calledWith("#{@rootDir}/#{@filename}", "utf8")
				.should.equal true

		it "should write out the same file as output.tex", ->
			@fs.writeFile
				.calledWith("#{@rootDir}/output.tex", @content, {flag: 'wx'})
				.should.equal true

		it "should call the callback", ->
			@callback.called.should.equal true
