mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Rename *PersistorManager to *Persistor
This commit is contained in:
parent
03246041cd
commit
f877f51775
6 changed files with 80 additions and 126 deletions
|
@ -14,10 +14,10 @@ if (!settings.filestore.backend) {
|
||||||
switch (settings.filestore.backend) {
|
switch (settings.filestore.backend) {
|
||||||
case 'aws-sdk':
|
case 'aws-sdk':
|
||||||
case 's3':
|
case 's3':
|
||||||
module.exports = require('./S3PersistorManager')
|
module.exports = require('./S3Persistor')
|
||||||
break
|
break
|
||||||
case 'fs':
|
case 'fs':
|
||||||
module.exports = require('./FSPersistorManager')
|
module.exports = require('./FSPersistor')
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
throw new Error(`unknown filestore backend: ${settings.filestore.backend}`)
|
throw new Error(`unknown filestore backend: ${settings.filestore.backend}`)
|
||||||
|
|
|
@ -7,9 +7,9 @@ const Errors = require('../../../app/js/Errors')
|
||||||
chai.use(require('sinon-chai'))
|
chai.use(require('sinon-chai'))
|
||||||
chai.use(require('chai-as-promised'))
|
chai.use(require('chai-as-promised'))
|
||||||
|
|
||||||
const modulePath = '../../../app/js/FSPersistorManager.js'
|
const modulePath = '../../../app/js/FSPersistor.js'
|
||||||
|
|
||||||
describe('FSPersistorManagerTests', function() {
|
describe('FSPersistorTests', function() {
|
||||||
const stat = { size: 4, isFile: sinon.stub().returns(true) }
|
const stat = { size: 4, isFile: sinon.stub().returns(true) }
|
||||||
const fd = 1234
|
const fd = 1234
|
||||||
const readStream = 'readStream'
|
const readStream = 'readStream'
|
||||||
|
@ -22,7 +22,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
const files = ['animals/wombat.tex', 'vegetables/potato.tex']
|
const files = ['animals/wombat.tex', 'vegetables/potato.tex']
|
||||||
const globs = [`${location}/${files[0]}`, `${location}/${files[1]}`]
|
const globs = [`${location}/${files[0]}`, `${location}/${files[1]}`]
|
||||||
const filteredFilenames = ['animals_wombat.tex', 'vegetables_potato.tex']
|
const filteredFilenames = ['animals_wombat.tex', 'vegetables_potato.tex']
|
||||||
let fs, rimraf, stream, LocalFileWriter, FSPersistorManager, glob
|
let fs, rimraf, stream, LocalFileWriter, FSPersistor, glob
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
fs = {
|
fs = {
|
||||||
|
@ -41,7 +41,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
deleteFile: sinon.stub().resolves()
|
deleteFile: sinon.stub().resolves()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FSPersistorManager = SandboxedModule.require(modulePath, {
|
FSPersistor = SandboxedModule.require(modulePath, {
|
||||||
requires: {
|
requires: {
|
||||||
'./LocalFileWriter': LocalFileWriter,
|
'./LocalFileWriter': LocalFileWriter,
|
||||||
'./Errors': Errors,
|
'./Errors': Errors,
|
||||||
|
@ -57,7 +57,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
describe('sendFile', function() {
|
describe('sendFile', function() {
|
||||||
const localFilesystemPath = '/path/to/local/file'
|
const localFilesystemPath = '/path/to/local/file'
|
||||||
it('should copy the file', async function() {
|
it('should copy the file', async function() {
|
||||||
await FSPersistorManager.promises.sendFile(
|
await FSPersistor.promises.sendFile(
|
||||||
location,
|
location,
|
||||||
files[0],
|
files[0],
|
||||||
localFilesystemPath
|
localFilesystemPath
|
||||||
|
@ -72,33 +72,21 @@ describe('FSPersistorManagerTests', function() {
|
||||||
it('should return an error if the file cannot be stored', async function() {
|
it('should return an error if the file cannot be stored', async function() {
|
||||||
stream.pipeline.yields(error)
|
stream.pipeline.yields(error)
|
||||||
await expect(
|
await expect(
|
||||||
FSPersistorManager.promises.sendFile(
|
FSPersistor.promises.sendFile(location, files[0], localFilesystemPath)
|
||||||
location,
|
|
||||||
files[0],
|
|
||||||
localFilesystemPath
|
|
||||||
)
|
|
||||||
).to.eventually.be.rejected.and.have.property('cause', error)
|
).to.eventually.be.rejected.and.have.property('cause', error)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('sendStream', function() {
|
describe('sendStream', function() {
|
||||||
it('should send the stream to LocalFileWriter', async function() {
|
it('should send the stream to LocalFileWriter', async function() {
|
||||||
await FSPersistorManager.promises.sendStream(
|
await FSPersistor.promises.sendStream(location, files[0], remoteStream)
|
||||||
location,
|
|
||||||
files[0],
|
|
||||||
remoteStream
|
|
||||||
)
|
|
||||||
expect(LocalFileWriter.promises.writeStream).to.have.been.calledWith(
|
expect(LocalFileWriter.promises.writeStream).to.have.been.calledWith(
|
||||||
remoteStream
|
remoteStream
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should delete the temporary file', async function() {
|
it('should delete the temporary file', async function() {
|
||||||
await FSPersistorManager.promises.sendStream(
|
await FSPersistor.promises.sendStream(location, files[0], remoteStream)
|
||||||
location,
|
|
||||||
files[0],
|
|
||||||
remoteStream
|
|
||||||
)
|
|
||||||
expect(LocalFileWriter.promises.deleteFile).to.have.been.calledWith(
|
expect(LocalFileWriter.promises.deleteFile).to.have.been.calledWith(
|
||||||
tempFile
|
tempFile
|
||||||
)
|
)
|
||||||
|
@ -107,30 +95,26 @@ describe('FSPersistorManagerTests', function() {
|
||||||
it('should return the error from LocalFileWriter', async function() {
|
it('should return the error from LocalFileWriter', async function() {
|
||||||
LocalFileWriter.promises.writeStream.rejects(error)
|
LocalFileWriter.promises.writeStream.rejects(error)
|
||||||
await expect(
|
await expect(
|
||||||
FSPersistorManager.promises.sendStream(location, files[0], remoteStream)
|
FSPersistor.promises.sendStream(location, files[0], remoteStream)
|
||||||
).to.eventually.be.rejectedWith(error)
|
).to.eventually.be.rejectedWith(error)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should send the temporary file to the filestore', async function() {
|
it('should send the temporary file to the filestore', async function() {
|
||||||
await FSPersistorManager.promises.sendStream(
|
await FSPersistor.promises.sendStream(location, files[0], remoteStream)
|
||||||
location,
|
|
||||||
files[0],
|
|
||||||
remoteStream
|
|
||||||
)
|
|
||||||
expect(fs.createReadStream).to.have.been.calledWith(tempFile)
|
expect(fs.createReadStream).to.have.been.calledWith(tempFile)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('getFileStream', function() {
|
describe('getFileStream', function() {
|
||||||
it('should use correct file location', async function() {
|
it('should use correct file location', async function() {
|
||||||
await FSPersistorManager.promises.getFileStream(location, files[0], {})
|
await FSPersistor.promises.getFileStream(location, files[0], {})
|
||||||
expect(fs.open).to.have.been.calledWith(
|
expect(fs.open).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}`
|
`${location}/${filteredFilenames[0]}`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should pass the options to createReadStream', async function() {
|
it('should pass the options to createReadStream', async function() {
|
||||||
await FSPersistorManager.promises.getFileStream(location, files[0], {
|
await FSPersistor.promises.getFileStream(location, files[0], {
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 8
|
end: 8
|
||||||
})
|
})
|
||||||
|
@ -146,18 +130,14 @@ describe('FSPersistorManagerTests', function() {
|
||||||
err.code = 'ENOENT'
|
err.code = 'ENOENT'
|
||||||
fs.open.yields(err)
|
fs.open.yields(err)
|
||||||
|
|
||||||
await expect(
|
await expect(FSPersistor.promises.getFileStream(location, files[0], {}))
|
||||||
FSPersistorManager.promises.getFileStream(location, files[0], {})
|
|
||||||
)
|
|
||||||
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.NotFoundError)
|
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.NotFoundError)
|
||||||
.and.have.property('cause', err)
|
.and.have.property('cause', err)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should wrap any other error', async function() {
|
it('should wrap any other error', async function() {
|
||||||
fs.open.yields(error)
|
fs.open.yields(error)
|
||||||
await expect(
|
await expect(FSPersistor.promises.getFileStream(location, files[0], {}))
|
||||||
FSPersistorManager.promises.getFileStream(location, files[0], {})
|
|
||||||
)
|
|
||||||
.to.eventually.be.rejectedWith('failed to open file for streaming')
|
.to.eventually.be.rejectedWith('failed to open file for streaming')
|
||||||
.and.be.an.instanceOf(Errors.ReadError)
|
.and.be.an.instanceOf(Errors.ReadError)
|
||||||
.and.have.property('cause', error)
|
.and.have.property('cause', error)
|
||||||
|
@ -181,18 +161,18 @@ describe('FSPersistorManagerTests', function() {
|
||||||
|
|
||||||
it('should return the file size', async function() {
|
it('should return the file size', async function() {
|
||||||
expect(
|
expect(
|
||||||
await FSPersistorManager.promises.getFileSize(location, files[0])
|
await FSPersistor.promises.getFileSize(location, files[0])
|
||||||
).to.equal(size)
|
).to.equal(size)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should throw a NotFoundError if the file does not exist', async function() {
|
it('should throw a NotFoundError if the file does not exist', async function() {
|
||||||
await expect(
|
await expect(
|
||||||
FSPersistorManager.promises.getFileSize(location, badFilename)
|
FSPersistor.promises.getFileSize(location, badFilename)
|
||||||
).to.eventually.be.rejected.and.be.an.instanceOf(Errors.NotFoundError)
|
).to.eventually.be.rejected.and.be.an.instanceOf(Errors.NotFoundError)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should wrap any other error', async function() {
|
it('should wrap any other error', async function() {
|
||||||
await expect(FSPersistorManager.promises.getFileSize(location, 'raccoon'))
|
await expect(FSPersistor.promises.getFileSize(location, 'raccoon'))
|
||||||
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
||||||
.and.have.property('cause', error)
|
.and.have.property('cause', error)
|
||||||
})
|
})
|
||||||
|
@ -200,28 +180,28 @@ describe('FSPersistorManagerTests', function() {
|
||||||
|
|
||||||
describe('copyFile', function() {
|
describe('copyFile', function() {
|
||||||
it('Should open the source for reading', async function() {
|
it('Should open the source for reading', async function() {
|
||||||
await FSPersistorManager.promises.copyFile(location, files[0], files[1])
|
await FSPersistor.promises.copyFile(location, files[0], files[1])
|
||||||
expect(fs.createReadStream).to.have.been.calledWith(
|
expect(fs.createReadStream).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}`
|
`${location}/${filteredFilenames[0]}`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should open the target for writing', async function() {
|
it('Should open the target for writing', async function() {
|
||||||
await FSPersistorManager.promises.copyFile(location, files[0], files[1])
|
await FSPersistor.promises.copyFile(location, files[0], files[1])
|
||||||
expect(fs.createWriteStream).to.have.been.calledWith(
|
expect(fs.createWriteStream).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[1]}`
|
`${location}/${filteredFilenames[1]}`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should pipe the source to the target', async function() {
|
it('Should pipe the source to the target', async function() {
|
||||||
await FSPersistorManager.promises.copyFile(location, files[0], files[1])
|
await FSPersistor.promises.copyFile(location, files[0], files[1])
|
||||||
expect(stream.pipeline).to.have.been.calledWith(readStream, writeStream)
|
expect(stream.pipeline).to.have.been.calledWith(readStream, writeStream)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('deleteFile', function() {
|
describe('deleteFile', function() {
|
||||||
it('Should call unlink with correct options', async function() {
|
it('Should call unlink with correct options', async function() {
|
||||||
await FSPersistorManager.promises.deleteFile(location, files[0])
|
await FSPersistor.promises.deleteFile(location, files[0])
|
||||||
expect(fs.unlink).to.have.been.calledWith(
|
expect(fs.unlink).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}`
|
`${location}/${filteredFilenames[0]}`
|
||||||
)
|
)
|
||||||
|
@ -230,14 +210,14 @@ describe('FSPersistorManagerTests', function() {
|
||||||
it('Should propagate the error', async function() {
|
it('Should propagate the error', async function() {
|
||||||
fs.unlink.yields(error)
|
fs.unlink.yields(error)
|
||||||
await expect(
|
await expect(
|
||||||
FSPersistorManager.promises.deleteFile(location, files[0])
|
FSPersistor.promises.deleteFile(location, files[0])
|
||||||
).to.eventually.be.rejected.and.have.property('cause', error)
|
).to.eventually.be.rejected.and.have.property('cause', error)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('deleteDirectory', function() {
|
describe('deleteDirectory', function() {
|
||||||
it('Should call rmdir(rimraf) with correct options', async function() {
|
it('Should call rmdir(rimraf) with correct options', async function() {
|
||||||
await FSPersistorManager.promises.deleteDirectory(location, files[0])
|
await FSPersistor.promises.deleteDirectory(location, files[0])
|
||||||
expect(rimraf).to.have.been.calledWith(
|
expect(rimraf).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}`
|
`${location}/${filteredFilenames[0]}`
|
||||||
)
|
)
|
||||||
|
@ -246,7 +226,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
it('Should propagate the error', async function() {
|
it('Should propagate the error', async function() {
|
||||||
rimraf.yields(error)
|
rimraf.yields(error)
|
||||||
await expect(
|
await expect(
|
||||||
FSPersistorManager.promises.deleteDirectory(location, files[0])
|
FSPersistor.promises.deleteDirectory(location, files[0])
|
||||||
).to.eventually.be.rejected.and.have.property('cause', error)
|
).to.eventually.be.rejected.and.have.property('cause', error)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -266,7 +246,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should call stat with correct options', async function() {
|
it('Should call stat with correct options', async function() {
|
||||||
await FSPersistorManager.promises.checkIfFileExists(location, files[0])
|
await FSPersistor.promises.checkIfFileExists(location, files[0])
|
||||||
expect(fs.stat).to.have.been.calledWith(
|
expect(fs.stat).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}`
|
`${location}/${filteredFilenames[0]}`
|
||||||
)
|
)
|
||||||
|
@ -274,23 +254,18 @@ describe('FSPersistorManagerTests', function() {
|
||||||
|
|
||||||
it('Should return true for existing files', async function() {
|
it('Should return true for existing files', async function() {
|
||||||
expect(
|
expect(
|
||||||
await FSPersistorManager.promises.checkIfFileExists(location, files[0])
|
await FSPersistor.promises.checkIfFileExists(location, files[0])
|
||||||
).to.equal(true)
|
).to.equal(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should return false for non-existing files', async function() {
|
it('Should return false for non-existing files', async function() {
|
||||||
expect(
|
expect(
|
||||||
await FSPersistorManager.promises.checkIfFileExists(
|
await FSPersistor.promises.checkIfFileExists(location, badFilename)
|
||||||
location,
|
|
||||||
badFilename
|
|
||||||
)
|
|
||||||
).to.equal(false)
|
).to.equal(false)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should wrap the error if there is a problem', async function() {
|
it('should wrap the error if there is a problem', async function() {
|
||||||
await expect(
|
await expect(FSPersistor.promises.checkIfFileExists(location, 'llama'))
|
||||||
FSPersistorManager.promises.checkIfFileExists(location, 'llama')
|
|
||||||
)
|
|
||||||
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
||||||
.and.have.property('cause', error)
|
.and.have.property('cause', error)
|
||||||
})
|
})
|
||||||
|
@ -299,9 +274,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
describe('directorySize', function() {
|
describe('directorySize', function() {
|
||||||
it('should wrap the error', async function() {
|
it('should wrap the error', async function() {
|
||||||
glob.yields(error)
|
glob.yields(error)
|
||||||
await expect(
|
await expect(FSPersistor.promises.directorySize(location, files[0]))
|
||||||
FSPersistorManager.promises.directorySize(location, files[0])
|
|
||||||
)
|
|
||||||
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
.to.eventually.be.rejected.and.be.an.instanceOf(Errors.ReadError)
|
||||||
.and.include({ cause: error })
|
.and.include({ cause: error })
|
||||||
.and.have.property('info')
|
.and.have.property('info')
|
||||||
|
@ -309,7 +282,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should filter the directory name', async function() {
|
it('should filter the directory name', async function() {
|
||||||
await FSPersistorManager.promises.directorySize(location, files[0])
|
await FSPersistor.promises.directorySize(location, files[0])
|
||||||
expect(glob).to.have.been.calledWith(
|
expect(glob).to.have.been.calledWith(
|
||||||
`${location}/${filteredFilenames[0]}_*`
|
`${location}/${filteredFilenames[0]}_*`
|
||||||
)
|
)
|
||||||
|
@ -317,7 +290,7 @@ describe('FSPersistorManagerTests', function() {
|
||||||
|
|
||||||
it('should sum directory files size', async function() {
|
it('should sum directory files size', async function() {
|
||||||
expect(
|
expect(
|
||||||
await FSPersistorManager.promises.directorySize(location, files[0])
|
await FSPersistor.promises.directorySize(location, files[0])
|
||||||
).to.equal(stat.size * files.length)
|
).to.equal(stat.size * files.length)
|
||||||
})
|
})
|
||||||
})
|
})
|
|
@ -6,18 +6,14 @@ const SandboxedModule = require('sandboxed-module')
|
||||||
const modulePath = '../../../app/js/PersistorManager.js'
|
const modulePath = '../../../app/js/PersistorManager.js'
|
||||||
|
|
||||||
describe('PersistorManager', function() {
|
describe('PersistorManager', function() {
|
||||||
let PersistorManager,
|
let PersistorManager, FSPersistor, S3Persistor, settings, requires
|
||||||
FSPersistorManager,
|
|
||||||
S3PersistorManager,
|
|
||||||
settings,
|
|
||||||
requires
|
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
FSPersistorManager = {
|
FSPersistor = {
|
||||||
wrappedMethod: sinon.stub().returns('FSPersistorManager')
|
wrappedMethod: sinon.stub().returns('FSPersistor')
|
||||||
}
|
}
|
||||||
S3PersistorManager = {
|
S3Persistor = {
|
||||||
wrappedMethod: sinon.stub().returns('S3PersistorManager')
|
wrappedMethod: sinon.stub().returns('S3Persistor')
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
|
@ -25,8 +21,8 @@ describe('PersistorManager', function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
requires = {
|
requires = {
|
||||||
'./S3PersistorManager': S3PersistorManager,
|
'./S3Persistor': S3Persistor,
|
||||||
'./FSPersistorManager': FSPersistorManager,
|
'./FSPersistor': FSPersistor,
|
||||||
'settings-sharelatex': settings,
|
'settings-sharelatex': settings,
|
||||||
'logger-sharelatex': {
|
'logger-sharelatex': {
|
||||||
log() {},
|
log() {},
|
||||||
|
@ -40,7 +36,7 @@ describe('PersistorManager', function() {
|
||||||
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
||||||
|
|
||||||
expect(PersistorManager).to.respondTo('wrappedMethod')
|
expect(PersistorManager).to.respondTo('wrappedMethod')
|
||||||
expect(PersistorManager.wrappedMethod()).to.equal('S3PersistorManager')
|
expect(PersistorManager.wrappedMethod()).to.equal('S3Persistor')
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should implement the S3 wrapped method when 'aws-sdk' is configured", function() {
|
it("should implement the S3 wrapped method when 'aws-sdk' is configured", function() {
|
||||||
|
@ -48,7 +44,7 @@ describe('PersistorManager', function() {
|
||||||
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
||||||
|
|
||||||
expect(PersistorManager).to.respondTo('wrappedMethod')
|
expect(PersistorManager).to.respondTo('wrappedMethod')
|
||||||
expect(PersistorManager.wrappedMethod()).to.equal('S3PersistorManager')
|
expect(PersistorManager.wrappedMethod()).to.equal('S3Persistor')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should implement the FS wrapped method when FS is configured', function() {
|
it('should implement the FS wrapped method when FS is configured', function() {
|
||||||
|
@ -56,7 +52,7 @@ describe('PersistorManager', function() {
|
||||||
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
PersistorManager = SandboxedModule.require(modulePath, { requires })
|
||||||
|
|
||||||
expect(PersistorManager).to.respondTo('wrappedMethod')
|
expect(PersistorManager).to.respondTo('wrappedMethod')
|
||||||
expect(PersistorManager.wrappedMethod()).to.equal('FSPersistorManager')
|
expect(PersistorManager.wrappedMethod()).to.equal('FSPersistor')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should throw an error when the backend is not configured', function() {
|
it('should throw an error when the backend is not configured', function() {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
const chai = require('chai')
|
const chai = require('chai')
|
||||||
const { expect } = chai
|
const { expect } = chai
|
||||||
const modulePath = '../../../app/js/S3PersistorManager.js'
|
const modulePath = '../../../app/js/S3Persistor.js'
|
||||||
const SandboxedModule = require('sandboxed-module')
|
const SandboxedModule = require('sandboxed-module')
|
||||||
|
|
||||||
const Errors = require('../../../app/js/Errors')
|
const Errors = require('../../../app/js/Errors')
|
||||||
|
|
||||||
describe('S3PersistorManagerTests', function() {
|
describe('S3PersistorTests', function() {
|
||||||
const defaultS3Key = 'frog'
|
const defaultS3Key = 'frog'
|
||||||
const defaultS3Secret = 'prince'
|
const defaultS3Secret = 'prince'
|
||||||
const defaultS3Credentials = {
|
const defaultS3Credentials = {
|
||||||
|
@ -33,7 +33,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
Meter,
|
Meter,
|
||||||
MeteredStream,
|
MeteredStream,
|
||||||
ReadStream,
|
ReadStream,
|
||||||
S3PersistorManager,
|
S3Persistor,
|
||||||
S3Client,
|
S3Client,
|
||||||
S3ReadStream,
|
S3ReadStream,
|
||||||
S3NotFoundError,
|
S3NotFoundError,
|
||||||
|
@ -115,7 +115,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
}
|
}
|
||||||
S3 = sinon.stub().returns(S3Client)
|
S3 = sinon.stub().returns(S3Client)
|
||||||
|
|
||||||
S3PersistorManager = SandboxedModule.require(modulePath, {
|
S3Persistor = SandboxedModule.require(modulePath, {
|
||||||
requires: {
|
requires: {
|
||||||
'aws-sdk/clients/s3': S3,
|
'aws-sdk/clients/s3': S3,
|
||||||
'settings-sharelatex': settings,
|
'settings-sharelatex': settings,
|
||||||
|
@ -133,7 +133,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
let stream
|
let stream
|
||||||
|
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns a stream', function() {
|
it('returns a stream', function() {
|
||||||
|
@ -164,7 +164,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
let stream
|
let stream
|
||||||
|
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key, {
|
stream = await S3Persistor.promises.getFileStream(bucket, key, {
|
||||||
start: 5,
|
start: 5,
|
||||||
end: 10
|
end: 10
|
||||||
})
|
})
|
||||||
|
@ -201,7 +201,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
auth_secret: alternativeSecret
|
auth_secret: alternativeSecret
|
||||||
}
|
}
|
||||||
|
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns a stream', function() {
|
it('returns a stream', function() {
|
||||||
|
@ -220,16 +220,13 @@ describe('S3PersistorManagerTests', function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('caches the credentials', async function() {
|
it('caches the credentials', async function() {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
|
|
||||||
expect(S3).to.have.been.calledOnceWith(alternativeS3Credentials)
|
expect(S3).to.have.been.calledOnceWith(alternativeS3Credentials)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('uses the default credentials for an unknown bucket', async function() {
|
it('uses the default credentials for an unknown bucket', async function() {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(
|
stream = await S3Persistor.promises.getFileStream('anotherBucket', key)
|
||||||
'anotherBucket',
|
|
||||||
key
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(S3).to.have.been.calledTwice
|
expect(S3).to.have.been.calledTwice
|
||||||
expect(S3.firstCall).to.have.been.calledWith(alternativeS3Credentials)
|
expect(S3.firstCall).to.have.been.calledWith(alternativeS3Credentials)
|
||||||
|
@ -237,14 +234,8 @@ describe('S3PersistorManagerTests', function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('caches the default credentials', async function() {
|
it('caches the default credentials', async function() {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(
|
stream = await S3Persistor.promises.getFileStream('anotherBucket', key)
|
||||||
'anotherBucket',
|
stream = await S3Persistor.promises.getFileStream('anotherBucket', key)
|
||||||
key
|
|
||||||
)
|
|
||||||
stream = await S3PersistorManager.promises.getFileStream(
|
|
||||||
'anotherBucket',
|
|
||||||
key
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(S3).to.have.been.calledTwice
|
expect(S3).to.have.been.calledTwice
|
||||||
expect(S3.firstCall).to.have.been.calledWith(alternativeS3Credentials)
|
expect(S3.firstCall).to.have.been.calledWith(alternativeS3Credentials)
|
||||||
|
@ -256,7 +247,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
delete settings.filestore.s3.secret
|
delete settings.filestore.s3.secret
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
S3PersistorManager.promises.getFileStream('anotherBucket', key)
|
S3Persistor.promises.getFileStream('anotherBucket', key)
|
||||||
).to.eventually.be.rejected.and.be.an.instanceOf(Errors.SettingsError)
|
).to.eventually.be.rejected.and.be.an.instanceOf(Errors.SettingsError)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -268,7 +259,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3ReadStream.on = sinon.stub()
|
S3ReadStream.on = sinon.stub()
|
||||||
S3ReadStream.on.withArgs('error').yields(S3NotFoundError)
|
S3ReadStream.on.withArgs('error').yields(S3NotFoundError)
|
||||||
try {
|
try {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -298,7 +289,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3ReadStream.on = sinon.stub()
|
S3ReadStream.on = sinon.stub()
|
||||||
S3ReadStream.on.withArgs('error').yields(S3AccessDeniedError)
|
S3ReadStream.on.withArgs('error').yields(S3AccessDeniedError)
|
||||||
try {
|
try {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -328,7 +319,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3ReadStream.on = sinon.stub()
|
S3ReadStream.on = sinon.stub()
|
||||||
S3ReadStream.on.withArgs('error').yields(genericError)
|
S3ReadStream.on.withArgs('error').yields(genericError)
|
||||||
try {
|
try {
|
||||||
stream = await S3PersistorManager.promises.getFileStream(bucket, key)
|
stream = await S3Persistor.promises.getFileStream(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -357,7 +348,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
let size
|
let size
|
||||||
|
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
size = await S3PersistorManager.promises.getFileSize(bucket, key)
|
size = await S3Persistor.promises.getFileSize(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should return the object size', function() {
|
it('should return the object size', function() {
|
||||||
|
@ -380,7 +371,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
promise: sinon.stub().rejects(S3NotFoundError)
|
promise: sinon.stub().rejects(S3NotFoundError)
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.getFileSize(bucket, key)
|
await S3Persistor.promises.getFileSize(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -403,7 +394,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
promise: sinon.stub().rejects(genericError)
|
promise: sinon.stub().rejects(genericError)
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.getFileSize(bucket, key)
|
await S3Persistor.promises.getFileSize(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -422,7 +413,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
describe('sendStream', function() {
|
describe('sendStream', function() {
|
||||||
describe('with valid parameters', function() {
|
describe('with valid parameters', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
return S3PersistorManager.promises.sendStream(bucket, key, ReadStream)
|
return S3Persistor.promises.sendStream(bucket, key, ReadStream)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should upload the stream', function() {
|
it('should upload the stream', function() {
|
||||||
|
@ -449,7 +440,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
promise: sinon.stub().rejects(genericError)
|
promise: sinon.stub().rejects(genericError)
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.sendStream(bucket, key, ReadStream)
|
await S3Persistor.promises.sendStream(bucket, key, ReadStream)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -464,7 +455,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
describe('sendFile', function() {
|
describe('sendFile', function() {
|
||||||
describe('with valid parameters', function() {
|
describe('with valid parameters', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
return S3PersistorManager.promises.sendFile(bucket, key, filename)
|
return S3Persistor.promises.sendFile(bucket, key, filename)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should create a read stream for the file', function() {
|
it('should create a read stream for the file', function() {
|
||||||
|
@ -486,7 +477,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
Fs.createReadStream = sinon.stub().throws(FileNotFoundError)
|
Fs.createReadStream = sinon.stub().throws(FileNotFoundError)
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.sendFile(bucket, key, filename)
|
await S3Persistor.promises.sendFile(bucket, key, filename)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -507,7 +498,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
Fs.createReadStream = sinon.stub().throws(genericError)
|
Fs.createReadStream = sinon.stub().throws(genericError)
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.sendFile(bucket, key, filename)
|
await S3Persistor.promises.sendFile(bucket, key, filename)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -526,7 +517,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
describe('copyFile', function() {
|
describe('copyFile', function() {
|
||||||
describe('with valid parameters', function() {
|
describe('with valid parameters', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
return S3PersistorManager.promises.copyFile(bucket, key, destKey)
|
return S3Persistor.promises.copyFile(bucket, key, destKey)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should copy the object', function() {
|
it('should copy the object', function() {
|
||||||
|
@ -546,7 +537,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
promise: sinon.stub().rejects(S3NotFoundError)
|
promise: sinon.stub().rejects(S3NotFoundError)
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.copyFile(bucket, key, destKey)
|
await S3Persistor.promises.copyFile(bucket, key, destKey)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -561,7 +552,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
describe('deleteFile', function() {
|
describe('deleteFile', function() {
|
||||||
describe('with valid parameters', function() {
|
describe('with valid parameters', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
return S3PersistorManager.promises.deleteFile(bucket, key)
|
return S3Persistor.promises.deleteFile(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should delete the object', function() {
|
it('should delete the object', function() {
|
||||||
|
@ -580,7 +571,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
promise: sinon.stub().rejects(S3NotFoundError)
|
promise: sinon.stub().rejects(S3NotFoundError)
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.deleteFile(bucket, key)
|
await S3Persistor.promises.deleteFile(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -595,7 +586,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
describe('deleteDirectory', function() {
|
describe('deleteDirectory', function() {
|
||||||
describe('with valid parameters', function() {
|
describe('with valid parameters', function() {
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
return S3PersistorManager.promises.deleteDirectory(bucket, key)
|
return S3Persistor.promises.deleteDirectory(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should list the objects in the directory', function() {
|
it('should list the objects in the directory', function() {
|
||||||
|
@ -621,7 +612,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3Client.listObjects = sinon
|
S3Client.listObjects = sinon
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().resolves({ Contents: [] }) })
|
.returns({ promise: sinon.stub().resolves({ Contents: [] }) })
|
||||||
return S3PersistorManager.promises.deleteDirectory(bucket, key)
|
return S3Persistor.promises.deleteDirectory(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should list the objects in the directory', function() {
|
it('should list the objects in the directory', function() {
|
||||||
|
@ -644,7 +635,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().rejects(genericError) })
|
.returns({ promise: sinon.stub().rejects(genericError) })
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.deleteDirectory(bucket, key)
|
await S3Persistor.promises.deleteDirectory(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -671,7 +662,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().rejects(genericError) })
|
.returns({ promise: sinon.stub().rejects(genericError) })
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.deleteDirectory(bucket, key)
|
await S3Persistor.promises.deleteDirectory(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -692,7 +683,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
let size
|
let size
|
||||||
|
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
size = await S3PersistorManager.promises.directorySize(bucket, key)
|
size = await S3Persistor.promises.directorySize(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should list the objects in the directory', function() {
|
it('should list the objects in the directory', function() {
|
||||||
|
@ -714,7 +705,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3Client.listObjects = sinon
|
S3Client.listObjects = sinon
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().resolves({ Contents: [] }) })
|
.returns({ promise: sinon.stub().resolves({ Contents: [] }) })
|
||||||
size = await S3PersistorManager.promises.directorySize(bucket, key)
|
size = await S3Persistor.promises.directorySize(bucket, key)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should list the objects in the directory', function() {
|
it('should list the objects in the directory', function() {
|
||||||
|
@ -737,7 +728,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().rejects(genericError) })
|
.returns({ promise: sinon.stub().rejects(genericError) })
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.directorySize(bucket, key)
|
await S3Persistor.promises.directorySize(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
||||||
|
@ -758,10 +749,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
let exists
|
let exists
|
||||||
|
|
||||||
beforeEach(async function() {
|
beforeEach(async function() {
|
||||||
exists = await S3PersistorManager.promises.checkIfFileExists(
|
exists = await S3Persistor.promises.checkIfFileExists(bucket, key)
|
||||||
bucket,
|
|
||||||
key
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should get the object header', function() {
|
it('should get the object header', function() {
|
||||||
|
@ -783,10 +771,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
S3Client.headObject = sinon
|
S3Client.headObject = sinon
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().rejects(S3NotFoundError) })
|
.returns({ promise: sinon.stub().rejects(S3NotFoundError) })
|
||||||
exists = await S3PersistorManager.promises.checkIfFileExists(
|
exists = await S3Persistor.promises.checkIfFileExists(bucket, key)
|
||||||
bucket,
|
|
||||||
key
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should get the object header', function() {
|
it('should get the object header', function() {
|
||||||
|
@ -809,7 +794,7 @@ describe('S3PersistorManagerTests', function() {
|
||||||
.stub()
|
.stub()
|
||||||
.returns({ promise: sinon.stub().rejects(genericError) })
|
.returns({ promise: sinon.stub().rejects(genericError) })
|
||||||
try {
|
try {
|
||||||
await S3PersistorManager.promises.checkIfFileExists(bucket, key)
|
await S3Persistor.promises.checkIfFileExists(bucket, key)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err
|
error = err
|
||||||
}
|
}
|
Loading…
Reference in a new issue