mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Merge branch 'doc-collection-only'
Conflicts: app/coffee/DocManager.coffee
This commit is contained in:
commit
9e91d31abb
10 changed files with 119 additions and 360 deletions
|
@ -5,97 +5,56 @@ _ = require "underscore"
|
|||
async = require "async"
|
||||
|
||||
module.exports = DocManager =
|
||||
getDoc: (project_id, doc_id, callback = (error, doc, mongoPath) ->) ->
|
||||
MongoManager.findDoc doc_id, (err, docFromDocCollection)->
|
||||
return callback(err) if err?
|
||||
MongoManager.findProject project_id, (error, project) ->
|
||||
return callback(error) if error?
|
||||
return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
|
||||
DocManager.findDocInProject project, doc_id, (error, doc, mongoPath) ->
|
||||
return callback(error) if error?
|
||||
if docFromDocCollection?
|
||||
return callback null, docFromDocCollection, mongoPath
|
||||
else if doc?
|
||||
if doc?.lines?.length > 0
|
||||
logger.warn project_id:project_id, doc_id:doc_id, "doc just used from project collection, why?"
|
||||
return callback null, doc, mongoPath
|
||||
else
|
||||
return callback new Errors.NotFoundError("No such doc: #{project_id}")
|
||||
|
||||
getDoc: (project_id, doc_id, callback = (error, doc) ->) ->
|
||||
MongoManager.findDoc doc_id, (err, doc)->
|
||||
if err?
|
||||
return callback(err)
|
||||
else if !doc?
|
||||
return callback new Errors.NotFoundError("No such doc: #{doc_id} in project #{project_id}")
|
||||
callback null, doc
|
||||
|
||||
getAllDocs: (project_id, callback = (error, docs) ->) ->
|
||||
MongoManager.findProject project_id, (error, project) ->
|
||||
return callback(error) if error?
|
||||
return callback new Errors.NotFoundError("No such project: #{project_id}") if !project?
|
||||
DocManager.findAllDocsInProject project, (error, docs) ->
|
||||
return callback(error) if error?
|
||||
return callback null, docs
|
||||
MongoManager.getProjectsDocs project_id, (error, docs) ->
|
||||
if err?
|
||||
return callback(error)
|
||||
else if !docs?
|
||||
return callback new Errors.NotFoundError("No docs for project #{project_id}")
|
||||
else
|
||||
return callback(null, docs)
|
||||
|
||||
updateDoc: (project_id, doc_id, lines, callback = (error, modified, rev) ->) ->
|
||||
DocManager.getDoc project_id, doc_id, (error, doc, mongoPath) ->
|
||||
return callback(error) if error?
|
||||
return callback new Errors.NotFoundError("No such project/doc to update: #{project_id}/#{doc_id}") if !doc? or !mongoPath?
|
||||
MongoManager.findDoc doc_id, (err, doc)->
|
||||
if err?
|
||||
logger.err project_id: project_id, doc_id: doc_id, err:err, "error getting document for update"
|
||||
return callback(err)
|
||||
|
||||
isNewDoc = lines.length == 0
|
||||
linesAreSame = _.isEqual(doc.lines, lines)
|
||||
linesAreSame = _.isEqual(doc?.lines, lines)
|
||||
|
||||
if linesAreSame and !isNewDoc
|
||||
logger.log {
|
||||
project_id: project_id, doc_id: doc_id, rev: doc.rev
|
||||
}, "doc lines have not changed"
|
||||
return callback null, false, doc.rev
|
||||
logger.log project_id: project_id, doc_id: doc_id, rev: doc?.rev, "doc lines have not changed - not updating"
|
||||
return callback null, false, doc?.rev
|
||||
else
|
||||
oldRev = doc?.rev || 0
|
||||
logger.log {
|
||||
project_id: project_id
|
||||
doc_id: doc_id,
|
||||
oldDocLines: doc.lines
|
||||
oldDocLines: doc?.lines
|
||||
newDocLines: lines
|
||||
rev: doc.rev
|
||||
rev: oldRev
|
||||
}, "updating doc lines"
|
||||
async.series [
|
||||
(cb)->
|
||||
MongoManager.upsertIntoDocCollection project_id, doc_id, lines, doc.rev, cb
|
||||
(cb)->
|
||||
MongoManager.updateDoc project_id, mongoPath, lines, cb
|
||||
], (error)->
|
||||
return callback(error) if error?
|
||||
callback null, true, doc.rev + 1 # rev will have been incremented in mongo by MongoManager.updateDoc
|
||||
MongoManager.upsertIntoDocCollection project_id, doc_id, lines, (error)->
|
||||
return callback(callback) if error?
|
||||
callback null, true, oldRev + 1 # rev will have been incremented in mongo by MongoManager.updateDoc
|
||||
|
||||
deleteDoc: (project_id, doc_id, callback = (error) ->) ->
|
||||
DocManager.getDoc project_id, doc_id, (error, doc) ->
|
||||
return callback(error) if error?
|
||||
return callback new Errors.NotFoundError("No such project/doc to delete: #{project_id}/#{doc_id}") if !doc?
|
||||
MongoManager.upsertIntoDocCollection project_id, doc_id, doc.lines, doc.rev, (error) ->
|
||||
MongoManager.upsertIntoDocCollection project_id, doc_id, doc.lines, (error) ->
|
||||
return callback(error) if error?
|
||||
MongoManager.markDocAsDeleted doc_id, (error) ->
|
||||
return callback(error) if error?
|
||||
callback()
|
||||
|
||||
findAllDocsInProject: (project, callback = (error, docs) ->) ->
|
||||
callback null, @_findAllDocsInFolder project.rootFolder[0]
|
||||
|
||||
findDocInProject: (project, doc_id, callback = (error, doc, mongoPath) ->) ->
|
||||
result = @_findDocInFolder project.rootFolder[0], doc_id, "rootFolder.0"
|
||||
if result?
|
||||
callback null, result.doc, result.mongoPath
|
||||
else
|
||||
callback null, null, null
|
||||
|
||||
_findDocInFolder: (folder = {}, doc_id, currentPath) ->
|
||||
for doc, i in folder.docs or []
|
||||
if doc?._id? and doc._id.toString() == doc_id.toString()
|
||||
return {
|
||||
doc: doc
|
||||
mongoPath: "#{currentPath}.docs.#{i}"
|
||||
}
|
||||
|
||||
for childFolder, i in folder.folders or []
|
||||
result = @_findDocInFolder childFolder, doc_id, "#{currentPath}.folders.#{i}"
|
||||
return result if result?
|
||||
|
||||
return null
|
||||
|
||||
_findAllDocsInFolder: (folder = {}) ->
|
||||
docs = folder.docs or []
|
||||
for childFolder in folder.folders or []
|
||||
docs = docs.concat @_findAllDocsInFolder childFolder
|
||||
return docs
|
||||
|
||||
|
|
|
@ -1,29 +1,21 @@
|
|||
{db, ObjectId} = require "./mongojs"
|
||||
|
||||
module.exports = MongoManager =
|
||||
findProject: (project_id, callback = (error, project) ->) ->
|
||||
db.projects.find _id: ObjectId(project_id.toString()), {}, (error, projects = []) ->
|
||||
callback error, projects[0]
|
||||
|
||||
findDoc: (doc_id, callback = (error, doc) ->) ->
|
||||
db.docs.find _id: ObjectId(doc_id.toString()), {}, (error, docs = []) ->
|
||||
callback error, docs[0]
|
||||
|
||||
updateDoc: (project_id, docPath, lines, callback = (error) ->) ->
|
||||
getProjectsDocs: (project_id, callback)->
|
||||
db.docs.find project_id: ObjectId(project_id.toString()), {}, callback
|
||||
|
||||
upsertIntoDocCollection: (project_id, doc_id, lines, callback)->
|
||||
update =
|
||||
$set:{}
|
||||
$inc:{}
|
||||
update.$set["#{docPath}.lines"] = lines
|
||||
update.$inc["#{docPath}.rev"] = 1
|
||||
|
||||
db.projects.update _id: ObjectId(project_id), update, callback
|
||||
|
||||
upsertIntoDocCollection: (project_id, doc_id, lines, oldRev, callback)->
|
||||
update =
|
||||
$set:{}
|
||||
update.$set["lines"] = lines
|
||||
update.$set["project_id"] = ObjectId(project_id)
|
||||
update.$set["rev"] = oldRev + 1
|
||||
update.$inc["rev"] = 1 #on new docs being created this will set the rev to 1
|
||||
db.docs.update _id: ObjectId(doc_id), update, {upsert: true}, callback
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Settings = require "settings-sharelatex"
|
||||
mongojs = require "mongojs"
|
||||
db = mongojs.connect(Settings.mongo.url, ["projects", "docs"])
|
||||
db = mongojs.connect(Settings.mongo.url, ["docs"])
|
||||
module.exports =
|
||||
db: db
|
||||
ObjectId: mongojs.ObjectId
|
||||
|
|
|
@ -11,15 +11,10 @@ describe "Deleting a doc", ->
|
|||
@doc_id = ObjectId()
|
||||
@lines = ["original", "lines"]
|
||||
@version = 42
|
||||
DocstoreClient.createProject @project_id, (error) =>
|
||||
throw error if error?
|
||||
DocstoreClient.createDoc @project_id, @doc_id, @lines, (error) =>
|
||||
throw error if error?
|
||||
done()
|
||||
|
||||
afterEach (done) ->
|
||||
DocstoreClient.deleteProject @project_id, done
|
||||
|
||||
describe "when the doc exists", ->
|
||||
beforeEach (done) ->
|
||||
DocstoreClient.deleteDoc @project_id, @doc_id, (error, @res, doc) =>
|
||||
|
|
|
@ -22,8 +22,6 @@ describe "Getting all docs", ->
|
|||
lines: ["111", "222", "333"]
|
||||
rev: 6
|
||||
}]
|
||||
DocstoreClient.createProject @project_id, (error) =>
|
||||
throw error if error?
|
||||
jobs = for doc in @docs
|
||||
do (doc) =>
|
||||
(callback) =>
|
||||
|
@ -32,9 +30,6 @@ describe "Getting all docs", ->
|
|||
DocstoreClient.updateDoc @project_id, doc._id, doc.lines, callback
|
||||
async.series jobs, done
|
||||
|
||||
afterEach (done) ->
|
||||
DocstoreClient.deleteProject @project_id, done
|
||||
|
||||
it "should return all the docs", (done) ->
|
||||
DocstoreClient.getAllDocs @project_id, (error, res, docs) =>
|
||||
throw error if error?
|
||||
|
|
|
@ -10,15 +10,10 @@ describe "Getting a doc", ->
|
|||
@project_id = ObjectId()
|
||||
@doc_id = ObjectId()
|
||||
@lines = ["original", "lines"]
|
||||
DocstoreClient.createProject @project_id, (error) =>
|
||||
throw error if error?
|
||||
DocstoreClient.createDoc @project_id, @doc_id, @lines, (error) =>
|
||||
throw error if error?
|
||||
done()
|
||||
|
||||
afterEach (done) ->
|
||||
DocstoreClient.deleteProject @project_id, done
|
||||
|
||||
describe "when the doc exists", ->
|
||||
it "should get the doc lines and version", (done) ->
|
||||
DocstoreClient.getDoc @project_id, @doc_id, {}, (error, res, doc) =>
|
||||
|
|
|
@ -11,15 +11,10 @@ describe "Applying updates to a doc", ->
|
|||
@doc_id = ObjectId()
|
||||
@originalLines = ["original", "lines"]
|
||||
@newLines = ["new", "lines"]
|
||||
DocstoreClient.createProject @project_id, (error) =>
|
||||
throw error if error?
|
||||
DocstoreClient.createDoc @project_id, @doc_id, @lines, (error) =>
|
||||
throw error if error?
|
||||
done()
|
||||
|
||||
afterEach (done) ->
|
||||
DocstoreClient.deleteProject @project_id, done
|
||||
|
||||
describe "when the content has changed", ->
|
||||
beforeEach (done) ->
|
||||
DocstoreClient.updateDoc @project_id, @doc_id, @newLines, (error, res, @body) =>
|
||||
|
@ -28,6 +23,9 @@ describe "Applying updates to a doc", ->
|
|||
it "should return modified = true", ->
|
||||
@body.modified.should.equal true
|
||||
|
||||
it "should return the rev", ->
|
||||
@body.rev.should.equal 2
|
||||
|
||||
it "should update the doc in the API", (done) ->
|
||||
DocstoreClient.getDoc @project_id, @doc_id, {}, (error, res, doc) =>
|
||||
doc.lines.should.deep.equal @newLines
|
||||
|
@ -48,22 +46,18 @@ describe "Applying updates to a doc", ->
|
|||
|
||||
describe "when the doc does not exist", ->
|
||||
beforeEach (done) ->
|
||||
missing_doc_id = ObjectId()
|
||||
DocstoreClient.updateDoc @project_id, missing_doc_id, @originalLines, (error, @res, @body) =>
|
||||
@missing_doc_id = ObjectId()
|
||||
DocstoreClient.updateDoc @project_id, @missing_doc_id, @originalLines, (error, @res, @body) =>
|
||||
done()
|
||||
|
||||
it "should return a 404", ->
|
||||
@res.statusCode.should.equal 404
|
||||
it "should create the doc", ->
|
||||
@body.rev.should.equal 1
|
||||
|
||||
describe "when the project does not exist", ->
|
||||
beforeEach (done) ->
|
||||
missing_project_id = ObjectId()
|
||||
DocstoreClient.updateDoc missing_project_id, @doc_id, @originalLines, (error, @res, @body) =>
|
||||
it "should be retreivable", (done)->
|
||||
DocstoreClient.getDoc @project_id, @missing_doc_id, {}, (error, res, doc) =>
|
||||
doc.lines.should.deep.equal @originalLines
|
||||
done()
|
||||
|
||||
it "should return a 404", ->
|
||||
@res.statusCode.should.equal 404
|
||||
|
||||
describe "when malformed doc lines are provided", ->
|
||||
describe "when the lines are not an array", ->
|
||||
beforeEach (done) ->
|
||||
|
|
|
@ -2,23 +2,9 @@ request = require("request").defaults(jar: false)
|
|||
{db, ObjectId} = require("../../../../app/js/mongojs")
|
||||
|
||||
module.exports = DocstoreClient =
|
||||
createProject: (project_id, callback = (error) ->) ->
|
||||
db.projects.insert {
|
||||
_id: project_id
|
||||
rootFolder: [{ docs: [] }]
|
||||
}, callback
|
||||
|
||||
createDoc: (project_id, doc_id, lines, callback = (error) ->) ->
|
||||
db.projects.update {
|
||||
_id: project_id
|
||||
}, {
|
||||
$push: {
|
||||
"rootFolder.0.docs": {
|
||||
_id: doc_id
|
||||
lines: lines
|
||||
}
|
||||
}
|
||||
}, callback
|
||||
db.docs.save({_id: doc_id, project_id:project_id, lines: lines, rev:1}, callback)
|
||||
|
||||
createDeletedDoc: (project_id, doc_id, lines, callback = (error) ->) ->
|
||||
db.docs.insert {
|
||||
|
@ -28,9 +14,6 @@ module.exports = DocstoreClient =
|
|||
deleted: true
|
||||
}, callback
|
||||
|
||||
deleteProject: (project_id, callback = (error, res, body) ->) ->
|
||||
db.projects.remove _id: project_id, callback
|
||||
|
||||
getDoc: (project_id, doc_id, qs, callback = (error, res, body) ->) ->
|
||||
request.get {
|
||||
url: "http://localhost:3016/project/#{project_id}/doc/#{doc_id}"
|
||||
|
|
|
@ -11,7 +11,10 @@ describe "DocManager", ->
|
|||
beforeEach ->
|
||||
@DocManager = SandboxedModule.require modulePath, requires:
|
||||
"./MongoManager": @MongoManager = {}
|
||||
"logger-sharelatex": @logger = {log: sinon.stub(), warn:->}
|
||||
"logger-sharelatex": @logger =
|
||||
log: sinon.stub()
|
||||
warn:->
|
||||
err:->
|
||||
@doc_id = ObjectId().toString()
|
||||
@project_id = ObjectId().toString()
|
||||
@callback = sinon.stub()
|
||||
|
@ -27,8 +30,6 @@ describe "DocManager", ->
|
|||
|
||||
beforeEach ->
|
||||
@MongoManager.findDoc = sinon.stub()
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, @project)
|
||||
@DocManager.findDocInProject = sinon.stub().callsArgWith(2, null, @doc, @mongoPath)
|
||||
|
||||
it "should get the doc from the doc collection when it is present there", (done)->
|
||||
@MongoManager.findDoc.callsArgWith(1, null, @docCollectionDoc)
|
||||
|
@ -42,46 +43,8 @@ describe "DocManager", ->
|
|||
err.should.equal @stubbedError
|
||||
done()
|
||||
|
||||
describe "when the project exists and the doc is in it", ->
|
||||
beforeEach ->
|
||||
@mongoPath = "mock.mongo.path"
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, @project)
|
||||
@MongoManager.findDoc = sinon.stub().callsArg(1)
|
||||
@DocManager.findDocInProject = sinon.stub().callsArgWith(2, null, @doc, @mongoPath)
|
||||
@DocManager.getDoc @project_id, @doc_id, @callback
|
||||
|
||||
it "should get the project from the database", ->
|
||||
@MongoManager.findProject
|
||||
.calledWith(@project_id)
|
||||
.should.equal true
|
||||
|
||||
it "should find the doc in the project", ->
|
||||
@DocManager.findDocInProject
|
||||
.calledWith(@project, @doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should return the doc", ->
|
||||
@callback.calledWith(null, @doc, @mongoPath).should.equal true
|
||||
|
||||
describe "when the project does not exist", ->
|
||||
beforeEach ->
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, null)
|
||||
@MongoManager.findDoc = sinon.stub().callsArg(1)
|
||||
@DocManager.findDocInProject = sinon.stub()
|
||||
@DocManager.getDoc @project_id, @doc_id, @callback
|
||||
|
||||
it "should not try to find the doc in the project", ->
|
||||
@DocManager.findDocInProject.called.should.equal false
|
||||
|
||||
it "should return a NotFoundError", ->
|
||||
@callback
|
||||
.calledWith(new Errors.NotFoundError("No such project: #{@project_id}"))
|
||||
.should.equal true
|
||||
|
||||
describe "when the doc is deleted", ->
|
||||
beforeEach ->
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, @project)
|
||||
@DocManager.findDocInProject = sinon.stub().callsArgWith(2, null, null, null)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, @doc)
|
||||
|
||||
@DocManager.getDoc @project_id, @doc_id, @callback
|
||||
|
@ -96,55 +59,39 @@ describe "DocManager", ->
|
|||
.calledWith(null, @doc)
|
||||
.should.equal true
|
||||
|
||||
|
||||
|
||||
describe "when the doc does not exist anywhere", ->
|
||||
beforeEach ->
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, @project)
|
||||
@DocManager.findDocInProject = sinon.stub().callsArgWith(2, null, null, null)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, null)
|
||||
@DocManager.getDoc @project_id, @doc_id, @callback
|
||||
|
||||
it "should return a NotFoundError", ->
|
||||
@callback
|
||||
.calledWith(new Errors.NotFoundError("No such doc: #{@doc_id}"))
|
||||
.calledWith(new Errors.NotFoundError("No such doc: #{@doc_id} in project #{@project_id}"))
|
||||
.should.equal true
|
||||
|
||||
describe "getAllDocs", ->
|
||||
describe "when the project exists", ->
|
||||
beforeEach ->
|
||||
@project = { name: "mock-project" }
|
||||
@docs = [{ _id: @doc_id, lines: ["mock-lines"] }]
|
||||
@mongoPath = "mock.mongo.path"
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, @project)
|
||||
@DocManager.findAllDocsInProject = sinon.stub().callsArgWith(1, null, @docs)
|
||||
@MongoManager.getProjectsDocs = sinon.stub().callsArgWith(1, null, @docs)
|
||||
@DocManager.getAllDocs @project_id, @callback
|
||||
|
||||
it "should get the project from the database", ->
|
||||
@MongoManager.findProject
|
||||
@MongoManager.getProjectsDocs
|
||||
.calledWith(@project_id)
|
||||
.should.equal true
|
||||
|
||||
it "should find all the docs in the project", ->
|
||||
@DocManager.findAllDocsInProject
|
||||
.calledWith(@project)
|
||||
.should.equal true
|
||||
|
||||
it "should return the docs", ->
|
||||
@callback.calledWith(null, @docs).should.equal true
|
||||
|
||||
describe "when the project does not exist", ->
|
||||
describe "when there are no docs for the project", ->
|
||||
beforeEach ->
|
||||
@MongoManager.findProject = sinon.stub().callsArgWith(1, null, null)
|
||||
@DocManager.findAllDocsInProject = sinon.stub()
|
||||
@MongoManager.getProjectsDocs = sinon.stub().callsArgWith(1, null, null)
|
||||
@DocManager.getAllDocs @project_id, @callback
|
||||
|
||||
it "should not try to find the doc in the project", ->
|
||||
@DocManager.findAllDocsInProject.called.should.equal false
|
||||
|
||||
it "should return a NotFoundError", ->
|
||||
@callback
|
||||
.calledWith(new Errors.NotFoundError("No such project: #{@project_id}"))
|
||||
.calledWith(new Errors.NotFoundError("No such docs for project #{@project_id}"))
|
||||
.should.equal true
|
||||
|
||||
describe "deleteDoc", ->
|
||||
|
@ -153,7 +100,7 @@ describe "DocManager", ->
|
|||
@lines = ["mock", "doc", "lines"]
|
||||
@rev = 77
|
||||
@DocManager.getDoc = sinon.stub().callsArgWith(2, null, {lines: @lines, rev:@rev})
|
||||
@MongoManager.upsertIntoDocCollection = sinon.stub().callsArg(4)
|
||||
@MongoManager.upsertIntoDocCollection = sinon.stub().callsArg(3)
|
||||
@MongoManager.markDocAsDeleted = sinon.stub().callsArg(1)
|
||||
@DocManager.deleteDoc @project_id, @doc_id, @callback
|
||||
|
||||
|
@ -164,7 +111,7 @@ describe "DocManager", ->
|
|||
|
||||
it "should update the doc lines", ->
|
||||
@MongoManager.upsertIntoDocCollection
|
||||
.calledWith(@project_id, @doc_id, @lines, @rev)
|
||||
.calledWith(@project_id, @doc_id, @lines)
|
||||
.should.equal true
|
||||
|
||||
it "should mark doc as deleted", ->
|
||||
|
@ -194,29 +141,23 @@ describe "DocManager", ->
|
|||
@oldDocLines = ["old", "doc", "lines"]
|
||||
@newDocLines = ["new", "doc", "lines"]
|
||||
@doc = { _id: @doc_id, lines: @oldDocLines, rev: @rev = 5 }
|
||||
@mongoPath = "mock.mongo.path"
|
||||
|
||||
@MongoManager.updateDoc = sinon.stub().callsArg(3)
|
||||
@MongoManager.upsertIntoDocCollection = sinon.stub().callsArg(4)
|
||||
@MongoManager.upsertIntoDocCollection = sinon.stub().callsArg(3)
|
||||
@MongoManager.findDoc = sinon.stub()
|
||||
|
||||
describe "when the doc lines have changed", ->
|
||||
beforeEach ->
|
||||
@DocManager.getDoc = sinon.stub().callsArgWith(2, null, @doc, @mongoPath)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, @doc)
|
||||
@DocManager.updateDoc @project_id, @doc_id, @newDocLines, @callback
|
||||
|
||||
it "should get the existing doc", ->
|
||||
@DocManager.getDoc
|
||||
.calledWith(@project_id, @doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should update the doc with the new doc lines", ->
|
||||
@MongoManager.updateDoc
|
||||
.calledWith(@project_id, @mongoPath, @newDocLines)
|
||||
@MongoManager.findDoc
|
||||
.calledWith(@doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should upsert the document to the doc collection", ->
|
||||
@MongoManager.upsertIntoDocCollection
|
||||
.calledWith(@project_id, @doc_id, @newDocLines, @rev)
|
||||
.calledWith(@project_id, @doc_id, @newDocLines)
|
||||
.should.equal true
|
||||
|
||||
it "should log out the old and new doc lines", ->
|
||||
|
@ -234,13 +175,25 @@ describe "DocManager", ->
|
|||
it "should return the callback with the new rev", ->
|
||||
@callback.calledWith(null, true, @rev + 1).should.equal true
|
||||
|
||||
describe "when there is a generic error getting the doc", ->
|
||||
|
||||
beforeEach ->
|
||||
@error = new Error("doc could not be found")
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, @error, null, null)
|
||||
@DocManager.updateDoc @project_id, @doc_id, @newDocLines, @callback
|
||||
|
||||
it "should not upsert the document to the doc collection", ->
|
||||
@MongoManager.upsertIntoDocCollection.called.should.equal false
|
||||
|
||||
it "should return the callback with the error", ->
|
||||
@callback.calledWith(@error).should.equal true
|
||||
|
||||
describe "when the doc lines have not changed", ->
|
||||
beforeEach ->
|
||||
@DocManager.getDoc = sinon.stub().callsArgWith(2, null, @doc, @mongoPath)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, @doc)
|
||||
@DocManager.updateDoc @project_id, @doc_id, @oldDocLines.slice(), @callback
|
||||
|
||||
it "should not update the doc", ->
|
||||
@MongoManager.updateDoc.called.should.equal false
|
||||
@MongoManager.upsertIntoDocCollection.called.should.equal false
|
||||
|
||||
it "should return the callback with the existing rev", ->
|
||||
|
@ -251,114 +204,27 @@ describe "DocManager", ->
|
|||
beforeEach ->
|
||||
|
||||
@doc.lines = []
|
||||
@DocManager.getDoc = sinon.stub().callsArgWith(2, null, @doc, @mongoPath)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, @doc)
|
||||
@DocManager.updateDoc @project_id, @doc_id, @doc.lines, @callback
|
||||
|
||||
it "should still upsert the doc even though the lines are the same", ->
|
||||
@MongoManager.updateDoc
|
||||
.calledWith(@project_id, @mongoPath, [])
|
||||
.should.equal true
|
||||
|
||||
it "should upsert the document to the doc collection", ->
|
||||
@MongoManager.upsertIntoDocCollection
|
||||
.calledWith(@project_id, @doc_id, [], @rev)
|
||||
.calledWith(@project_id, @doc_id, @doc.lines)
|
||||
.should.equal true
|
||||
|
||||
|
||||
describe "when the doc does not exist", ->
|
||||
beforeEach ->
|
||||
@DocManager.getDoc = sinon.stub().callsArgWith(2, null, null, null)
|
||||
@MongoManager.findDoc = sinon.stub().callsArgWith(1, null, null, null)
|
||||
@DocManager.updateDoc @project_id, @doc_id, @newDocLines, @callback
|
||||
|
||||
it "should not try to update the doc", ->
|
||||
@MongoManager.updateDoc.called.should.equal false
|
||||
@MongoManager.upsertIntoDocCollection.called.should.equal false
|
||||
|
||||
it "should return a NotFoundError", ->
|
||||
@callback
|
||||
.calledWith(new Errors.NotFoundError("No such project/doc: #{@project_id}/#{@doc_id}"))
|
||||
it "should upsert the document to the doc collection", ->
|
||||
@MongoManager.upsertIntoDocCollection
|
||||
.calledWith(@project_id, @doc_id, @newDocLines)
|
||||
.should.equal true
|
||||
|
||||
describe "findDocInProject", ->
|
||||
it "should find the doc when it is in the root folder", (done) ->
|
||||
@DocManager.findDocInProject {
|
||||
rootFolder: [{
|
||||
docs: [{
|
||||
_id: ObjectId(@doc_id)
|
||||
}]
|
||||
}]
|
||||
}, @doc_id, (error, doc, mongoPath) =>
|
||||
expect(doc).to.deep.equal { _id: ObjectId(@doc_id) }
|
||||
mongoPath.should.equal "rootFolder.0.docs.0"
|
||||
done()
|
||||
it "should return the callback with the new rev", ->
|
||||
@callback.calledWith(null, true, 1).should.equal true
|
||||
|
||||
it "should find the doc when it is in a sub folder", (done) ->
|
||||
@DocManager.findDocInProject {
|
||||
rootFolder: [{
|
||||
folders: [{
|
||||
docs: [{
|
||||
_id: ObjectId(@doc_id)
|
||||
}]
|
||||
}]
|
||||
}]
|
||||
}, @doc_id, (error, doc, mongoPath) =>
|
||||
expect(doc).to.deep.equal { _id: ObjectId(@doc_id) }
|
||||
mongoPath.should.equal "rootFolder.0.folders.0.docs.0"
|
||||
done()
|
||||
|
||||
it "should find the doc when it there are other docs", (done) ->
|
||||
@DocManager.findDocInProject {
|
||||
rootFolder: [{
|
||||
folders: [{
|
||||
docs: [{
|
||||
_id: ObjectId()
|
||||
}]
|
||||
}, {
|
||||
docs: [{
|
||||
_id: ObjectId()
|
||||
}, {
|
||||
_id: ObjectId(@doc_id)
|
||||
}]
|
||||
}],
|
||||
docs: [{
|
||||
_id: ObjectId()
|
||||
}]
|
||||
}]
|
||||
}, @doc_id, (error, doc, mongoPath) =>
|
||||
expect(doc).to.deep.equal { _id: ObjectId(@doc_id) }
|
||||
mongoPath.should.equal "rootFolder.0.folders.1.docs.1"
|
||||
done()
|
||||
|
||||
it "should return null when the doc doesn't exist", (done) ->
|
||||
@DocManager.findDocInProject {
|
||||
rootFolder: [{
|
||||
folders: [{
|
||||
docs: []
|
||||
}]
|
||||
}]
|
||||
}, @doc_id, (error, doc, mongoPath) =>
|
||||
expect(doc).to.be.null
|
||||
expect(mongoPath).to.be.null
|
||||
done()
|
||||
|
||||
describe "findAllDocsInProject", ->
|
||||
it "should return all the docs", (done) ->
|
||||
@DocManager.findAllDocsInProject {
|
||||
rootFolder: [{
|
||||
docs: [
|
||||
@doc1 = { _id: ObjectId() }
|
||||
],
|
||||
folders: [{
|
||||
docs: [
|
||||
@doc2 = { _id: ObjectId() }
|
||||
]
|
||||
}, {
|
||||
docs: [
|
||||
@doc3 = { _id: ObjectId() }
|
||||
@doc4 = { _id: ObjectId() }
|
||||
]
|
||||
}]
|
||||
}]
|
||||
}, (error, docs) =>
|
||||
expect(docs).to.deep.equal [@doc1, @doc2, @doc3, @doc4]
|
||||
done()
|
||||
|
|
|
@ -9,29 +9,13 @@ describe "MongoManager", ->
|
|||
beforeEach ->
|
||||
@MongoManager = SandboxedModule.require modulePath, requires:
|
||||
"./mongojs":
|
||||
db: @db = { projects: {}, docs: {} }
|
||||
db: @db = { docs: {} }
|
||||
ObjectId: ObjectId
|
||||
@project_id = ObjectId().toString()
|
||||
@doc_id = ObjectId().toString()
|
||||
@callback = sinon.stub()
|
||||
@stubbedErr = new Error("hello world")
|
||||
|
||||
describe "findProject", ->
|
||||
beforeEach ->
|
||||
@project = { name: "mock-project" }
|
||||
@db.projects.find = sinon.stub().callsArgWith(2, null, [@project])
|
||||
@MongoManager.findProject @project_id, @callback
|
||||
|
||||
it "should find the project", ->
|
||||
@db.projects.find
|
||||
.calledWith({
|
||||
_id: ObjectId(@project_id)
|
||||
}, {})
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback with the project", ->
|
||||
@callback.calledWith(null, @project).should.equal true
|
||||
|
||||
describe "findDoc", ->
|
||||
beforeEach ->
|
||||
@doc = { name: "mock-doc" }
|
||||
|
@ -48,28 +32,24 @@ describe "MongoManager", ->
|
|||
it "should call the callback with the doc", ->
|
||||
@callback.calledWith(null, @doc).should.equal true
|
||||
|
||||
describe "updateDoc", ->
|
||||
describe "getProjectsDocs", ->
|
||||
beforeEach ->
|
||||
@lines = ["mock-lines"]
|
||||
@docPath = "rootFolder.0.folders.1.docs.0"
|
||||
@db.projects.update = sinon.stub().callsArg(2)
|
||||
@MongoManager.updateDoc @project_id, @docPath, @lines, @callback
|
||||
@doc1 = { name: "mock-doc1" }
|
||||
@doc2 = { name: "mock-doc2" }
|
||||
@doc3 = { name: "mock-doc3" }
|
||||
@doc4 = { name: "mock-doc4" }
|
||||
@db.docs.find = sinon.stub().callsArgWith(2, null, [@doc, @doc3, @doc4])
|
||||
@MongoManager.getProjectsDocs @project_id, @callback
|
||||
|
||||
it "should update the doc lines and increment the TPDS rev", ->
|
||||
@db.projects.update
|
||||
it "should find the docs via the project_id", ->
|
||||
@db.docs.find
|
||||
.calledWith({
|
||||
_id: ObjectId(@project_id)
|
||||
}, {
|
||||
$set:
|
||||
"rootFolder.0.folders.1.docs.0.lines": @lines
|
||||
$inc:
|
||||
"rootFolder.0.folders.1.docs.0.rev": 1
|
||||
})
|
||||
project_id: ObjectId(@project_id)
|
||||
}, {})
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback with the project", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
it "should call the callback with the docs", ->
|
||||
@callback.calledWith(null, [@doc, @doc3, @doc4]).should.equal true
|
||||
|
||||
describe "upsertIntoDocCollection", ->
|
||||
beforeEach ->
|
||||
|
@ -77,16 +57,16 @@ describe "MongoManager", ->
|
|||
@oldRev = 77
|
||||
|
||||
it "should upsert the document", (done)->
|
||||
@MongoManager.upsertIntoDocCollection @project_id, @doc_id, @lines, @oldRev, (err)=>
|
||||
@MongoManager.upsertIntoDocCollection @project_id, @doc_id, @lines, (err)=>
|
||||
args = @db.docs.update.args[0]
|
||||
assert.deepEqual args[0], {_id: ObjectId(@doc_id)}
|
||||
assert.equal args[1]["$set"]["lines"], @lines
|
||||
assert.equal args[1]["$set"]["rev"], 78
|
||||
assert.equal args[1]["$inc"]["rev"], 1
|
||||
assert.deepEqual args[1]["$set"]["project_id"], ObjectId(@project_id)
|
||||
done()
|
||||
|
||||
it "should return the error", (done)->
|
||||
@MongoManager.upsertIntoDocCollection @project_id, @doc_id, @lines, @oldRev, (err)=>
|
||||
@MongoManager.upsertIntoDocCollection @project_id, @doc_id, @lines, (err)=>
|
||||
err.should.equal @stubbedErr
|
||||
done()
|
||||
|
||||
|
|
Loading…
Reference in a new issue