overleaf/services/docstore/test/unit/coffee/DocArchiveManager.coffee

185 lines
6.4 KiB
CoffeeScript
Raw Normal View History

2015-06-02 16:12:11 -04:00
assert = require("chai").assert
sinon = require('sinon')
chai = require('chai')
should = chai.should()
expect = chai.expect
modulePath = "../../../app/js/DocArchiveManager.js"
SandboxedModule = require('sandboxed-module')
ObjectId = require("mongojs").ObjectId
Errors = require "../../../app/js/Errors"
2015-06-03 11:00:08 -04:00
crypto = require("crypto")
2015-06-02 16:12:11 -04:00
describe "DocArchiveManager", ->
beforeEach ->
@settings =
filestore:
backend: "s3"
s3:
secret: "secret"
key: "this_key"
stores:
user_files:"sl_user_files"
@request =
2015-06-02 17:13:16 -04:00
put: {}
get: {}
2015-06-02 16:12:11 -04:00
@docs = [{
_id: ObjectId()
lines: ["one", "two", "three"]
rev: 2
2015-06-02 17:13:16 -04:00
inS3: true
2015-06-02 16:12:11 -04:00
}, {
_id: ObjectId()
lines: ["aaa", "bbb", "ccc"]
rev: 4
2015-06-02 17:13:16 -04:00
inS3: true
2015-06-02 16:12:11 -04:00
}, {
_id: ObjectId()
lines: ["111", "222", "333"]
rev: 6
2015-06-02 17:13:16 -04:00
inS3: true
2015-06-02 16:12:11 -04:00
}]
2015-06-02 17:13:16 -04:00
@MongoManager =
markDocAsArchived: sinon.stub().callsArgWith(2, null)
upsertIntoDocCollection: sinon.stub().callsArgWith(3, null)
getProjectsDocs: sinon.stub().callsArgWith(1, null, @docs)
getArchivedProjectDocs: sinon.stub().callsArgWith(1, null, @docs)
@requires =
"settings-sharelatex": @settings
"./MongoManager": @MongoManager
"request": @request
"logger-sharelatex":
log:->
err:->
@error = "my errror"
2015-06-02 16:12:11 -04:00
@project_id = ObjectId().toString()
2015-06-03 11:00:08 -04:00
@stubbedError = new Errors.NotFoundError("Error in S3 request")
2015-06-02 16:12:11 -04:00
describe "archiveDoc", ->
it "should use correct options", (done)->
2015-06-03 11:00:08 -04:00
@request.put = sinon.stub().callsArgWith(1, null, {statusCode:200,headers:{etag:""}})
2015-06-02 17:13:16 -04:00
@requires["request"] = @request
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
2015-06-02 16:12:11 -04:00
@DocArchiveManager.archiveDoc @project_id, @docs[0], (err)=>
opts = @request.put.args[0][0]
assert.deepEqual(opts.aws, {key:@settings.filestore.s3.key, secret:@settings.filestore.s3.secret, bucket:@settings.filestore.stores.user_files})
opts.json.should.equal @docs[0].lines
opts.timeout.should.equal (30*1000)
opts.uri.should.equal "https://#{@settings.filestore.stores.user_files}.s3.amazonaws.com/#{@project_id}/#{@docs[0]._id}"
2015-06-02 17:13:16 -04:00
done()
2015-06-03 11:00:08 -04:00
it "should return no md5 error", (done)->
@md5 = crypto.createHash("md5").update(JSON.stringify(@docs[0].lines)).digest("hex")
@request.put = sinon.stub().callsArgWith(1, null, {statusCode:200,headers:{etag:@md5}})
@requires["request"] = @request
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.archiveDoc @project_id, @docs[0], (err)=>
should.not.exist err
done()
2015-06-02 17:13:16 -04:00
it "should return the error", (done)->
2015-06-03 11:00:08 -04:00
@request.put = sinon.stub().callsArgWith(1, @stubbedError, {statusCode:400,headers:{etag:""}})
2015-06-02 17:13:16 -04:00
@requires["request"] = @request
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.archiveDoc @project_id, @docs[0], (err)=>
2015-06-03 11:00:08 -04:00
should.exist err
2015-06-02 17:13:16 -04:00
done()
describe "unarchiveDoc", ->
it "should use correct options", (done)->
@request.get = sinon.stub().callsArgWith(1, null, statusCode:200, @docs[0].lines)
@requires["request"] = @request
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.unarchiveDoc @project_id, @docs[0]._id, (err)=>
opts = @request.get.args[0][0]
assert.deepEqual(opts.aws, {key:@settings.filestore.s3.key, secret:@settings.filestore.s3.secret, bucket:@settings.filestore.stores.user_files})
opts.json.should.equal true
opts.timeout.should.equal (30*1000)
opts.uri.should.equal "https://#{@settings.filestore.stores.user_files}.s3.amazonaws.com/#{@project_id}/#{@docs[0]._id}"
done()
it "should return the error", (done)->
2015-06-03 11:00:08 -04:00
@request.get = sinon.stub().callsArgWith(1, @stubbedError, {}, {})
2015-06-02 17:13:16 -04:00
@requires["request"] = @request
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.unarchiveDoc @project_id, @docs[0], (err)=>
2015-06-03 11:00:08 -04:00
should.exist err
2015-06-02 17:13:16 -04:00
done()
describe "archiveAllDocs", ->
it "should archive all project docs", (done)->
@MongoManager.getProjectsDocs = sinon.stub().callsArgWith(1, null, @docs)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.archiveDoc = sinon.stub().callsArgWith(2, null)
@DocArchiveManager.archiveAllDocs @project_id, (err)=>
for doc in @docs
@DocArchiveManager.archiveDoc.calledWith(@project_id, doc).should.equal true
should.not.exist err
done()
it "should return error if have no docs", (done)->
@MongoManager.getProjectsDocs = sinon.stub().callsArgWith(1, null, null)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.archiveAllDocs @project_id, (err)=>
should.exist err
done()
it "should return the error", (done)->
@MongoManager.getProjectsDocs = sinon.stub().callsArgWith(1, @error, null)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.archiveAllDocs @project_id, (err)=>
err.should.equal @error
done()
describe "unArchiveAllDocs", ->
it "should unarchive all inS3 docs", (done)->
@MongoManager.getArchivedProjectDocs = sinon.stub().callsArgWith(1, null, @docs)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.unarchiveDoc = sinon.stub().callsArgWith(2, null)
@DocArchiveManager.unArchiveAllDocs @project_id, (err)=>
for doc in @docs
@DocArchiveManager.unarchiveDoc.calledWith(@project_id, doc._id).should.equal true
should.not.exist err
done()
it "should return error if have no docs", (done)->
@MongoManager.getArchivedProjectDocs = sinon.stub().callsArgWith(1, null, null)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.unArchiveAllDocs @project_id, (err)=>
should.exist err
done()
it "should return the error", (done)->
@MongoManager.getArchivedProjectDocs = sinon.stub().callsArgWith(1, @error, null)
@requires["./MongoManager"] = @MongoManager
@DocArchiveManager = SandboxedModule.require modulePath, requires: @requires
@DocArchiveManager.unArchiveAllDocs @project_id, (err)=>
err.should.equal @error
done()