overleaf/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee
2014-05-06 12:54:26 +01:00

167 lines
4.6 KiB
CoffeeScript

sinon = require('sinon')
chai = require('chai')
should = chai.should()
expect = chai.expect
modulePath = "../../../../app/js/Features/Compile/ClsiManager.js"
SandboxedModule = require('sandboxed-module')
describe "ClsiManager", ->
beforeEach ->
@ClsiManager = SandboxedModule.require modulePath, requires:
"settings-sharelatex": @settings =
apis:
filestore:
url: "filestore.example.com"
secret: "secret"
clsi:
url: "http://clsi.example.com"
"../../models/Project": Project: @Project = {}
"../Project/ProjectEntityHandler": @ProjectEntityHandler = {}
"logger-sharelatex": @logger = { log: sinon.stub() }
@project_id = "project-id"
@callback = sinon.stub()
describe "sendRequest", ->
beforeEach ->
@ClsiManager._buildRequest = sinon.stub().callsArgWith(1, null, @request = "mock-request")
describe "with a successful compile", ->
beforeEach ->
@ClsiManager._postToClsi = sinon.stub().callsArgWith(2, null, {
compile:
status: "success"
outputFiles: [{
url: "#{@settings.apis.clsi.url}/project/#{@project_id}/output/output.pdf"
type: "pdf"
},{
url: "#{@settings.apis.clsi.url}/project/#{@project_id}/output/output.log"
type: "log"
}]
})
@ClsiManager.sendRequest @project_id, @callback
it "should build the request", ->
@ClsiManager._buildRequest
.calledWith(@project_id)
.should.equal true
it "should send the request to the CLSI", ->
@ClsiManager._postToClsi
.calledWith(@project_id, @request)
.should.equal true
it "should call the callback with the status and output files", ->
outputFiles = [{
path: "output.pdf"
type: "pdf"
},{
path: "output.log"
type: "log"
}]
@callback.calledWith(null, true, outputFiles).should.equal true
describe "with a failed compile", ->
beforeEach ->
@ClsiManager._postToClsi = sinon.stub().callsArgWith(2, null, {
compile:
status: "failure"
})
@ClsiManager.sendRequest @project_id, @callback
it "should call the callback with a failure statue", ->
@callback.calledWith(null, false).should.equal true
describe "_buildRequest", ->
beforeEach ->
@project =
_id: @project_id
compiler: @compiler = "latex"
rootDoc_id: "mock-doc-id-1"
@docs = {
"/main.tex": @doc_1 = {
name: "main.tex"
_id: "mock-doc-id-1"
lines: ["Hello", "world"]
},
"/chapters/chapter1.tex": @doc_2 = {
name: "chapter1.tex"
_id: "mock-doc-id-2"
lines: [
"Chapter 1"
]
}
}
@files = {
"/images/image.png": @file_1 = {
name: "image.png"
_id: "mock-file-id-1"
created: new Date()
}
}
@Project.findById = sinon.stub().callsArgWith(2, null, @project)
@ProjectEntityHandler.getAllDocs = sinon.stub().callsArgWith(1, null, @docs)
@ProjectEntityHandler.getAllFiles = sinon.stub().callsArgWith(1, null, @files)
describe "with a valid project", ->
beforeEach (done) ->
@ClsiManager._buildRequest @project_id, (error, request) =>
@request = request
done()
it "should get the project with the required fields", ->
@Project.findById
.calledWith(@project_id, {compiler:1, rootDoc_id: 1})
.should.equal true
it "should get all the docs", ->
@ProjectEntityHandler.getAllDocs
.calledWith(@project_id)
.should.equal true
it "should get all the files", ->
@ProjectEntityHandler.getAllFiles
.calledWith(@project_id)
.should.equal true
it "should build up the CLSI request", ->
expect(@request).to.deep.equal(
compile:
options:
compiler: @compiler
rootResourcePath: "main.tex"
resources: [{
path: "main.tex"
content: @doc_1.lines.join("\n")
}, {
path: "chapters/chapter1.tex"
content: @doc_2.lines.join("\n")
}, {
path: "images/image.png"
url: "#{@settings.apis.filestore.url}/project/#{@project_id}/file/#{@file_1._id}"
modified: @file_1.created.getTime()
}]
)
describe "when the project has an invalid compiler", ->
beforeEach (done) ->
@project.compiler = "context"
@ClsiManager._buildRequest @project, (error, request) =>
@request = request
done()
it "should set the compiler to pdflatex", ->
@request.compile.options.compiler.should.equal "pdflatex"
describe "when there is no valid root document", ->
beforeEach (done) ->
@project.rootDoc_id = "not-valid"
@ClsiManager._buildRequest @project, (@error, @request) =>
done()
it "should return an error", ->
expect(@error).to.exist