hapiest-s3-storage
Version:
A simple s3 storage service that's flexible and allows mocking of s3 locally
290 lines (245 loc) • 10.7 kB
JavaScript
'use strict';
const Should = require('should');
const Path = require('path');
const NodeConfig = require('config-uncached');
const S3StorageServiceFactory = require('../../lib/s3StorageServiceFactory');
const LoggerConfigFactory = require('hapiest-logger/lib/loggerConfigFactory');
const LoggerFactory = require('hapiest-logger/lib/loggerFactory');
const loggerConfig = LoggerConfigFactory.createFromJsObj({enabled: false});
const logger = LoggerFactory.createLogger(loggerConfig);
const basePath = Path.join(__dirname, '../unit-helper/s3StorageServiceFactory/localstorage');
describe('S3StorageServiceFactory', function() {
describe('create', function() {
it('Should create a localstorage s3Service', function() {
const s3Service = S3StorageServiceFactory.create({
type: 'localstorage',
bucket: 'mybucket',
localConfig: {
path: './'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('localstorage');
s3Service.getBaseEndpointUrl().should.eql(Path.resolve(basePath, 'mybucket'));
s3Service.getUrl('mykey').should.eql(Path.resolve(basePath, 'mybucket', 'mykey'));
});
it('Should permit bucket to be optional for localstorage', function() {
const s3Service = S3StorageServiceFactory.create({
type: 'localstorage',
localConfig: {
path: Path.join(__dirname,'../unit-helper/s3StorageServiceFactory'),
baseUrl: 'http://localhost:3000/localstorage'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('localstorage');
s3Service.getBaseEndpointUrl('mybucket').should.eql('http://localhost:3000/localstorage/mybucket');
s3Service.getUrl('mynewkey', 'anotherbucket').should.eql('http://localhost:3000/localstorage/anotherbucket/mynewkey');
});
it('Should permit readOnly:true for localstorage', function() {
const s3Service = S3StorageServiceFactory.create({
type: 'localstorage',
readOnly: true,
localConfig: {
path: Path.join(__dirname,'../unit-helper/s3StorageServiceFactory'),
baseUrl: 'http://localhost:3000/localstorage'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('localstorage');
s3Service.getBaseEndpointUrl('mybucket').should.eql('http://localhost:3000/localstorage/mybucket');
s3Service.getUrl('mynewkey', 'anotherbucket').should.eql('http://localhost:3000/localstorage/anotherbucket/mynewkey');
});
it('Should create an s3 s3Service', function() {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
bucket: 'mybucket',
maxRetriesOnTimeout: 10,
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
s3Service.getBaseEndpointUrl().should.eql('https://s3.amazonaws.com/mybucket');
s3Service.getUrl('mykey').should.eql('https://s3.amazonaws.com/mybucket/mykey');
});
it('Should permit bucket to be optional for s3 storage', function() {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
s3Service.getBaseEndpointUrl('somebucket').should.eql('https://s3.amazonaws.com/somebucket');
s3Service.getUrl('anotherkey', 'somebucket').should.eql('https://s3.amazonaws.com/somebucket/anotherkey');
});
it('Should allow readOnly for s3 storage', function() {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
readOnly: true,
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
s3Service.getBaseEndpointUrl('somebucket').should.eql('https://s3.amazonaws.com/somebucket');
s3Service.getUrl('anotherkey', 'somebucket').should.eql('https://s3.amazonaws.com/somebucket/anotherkey');
});
it('Should allow httpTimeoutMs parameter for s3 storage', function() {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey',
httpTimeoutMs: 15000
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
s3Service.getBaseEndpointUrl('somebucket').should.eql('https://s3.amazonaws.com/somebucket');
s3Service.getUrl('anotherkey', 'somebucket').should.eql('https://s3.amazonaws.com/somebucket/anotherkey');
});
it('Should permit both s3Config and localConfig to be present for s3 type', function() {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
bucket: 'myUbcket',
localConfig: {
path: './'
},
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
});
it('Should permit both s3Config and localConfig to be present for localstorage type', function() {
const s3Service = S3StorageServiceFactory.create({
type: 'localstorage',
bucket: 'myUbcket',
maxRetriesOnTimeout: 2,
localConfig: {
path: './'
},
s3Config: {
awsAccessKey: 'awsAccessKey',
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('localstorage');
});
it('Should throw an error if the type is invalid', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 'invalid',
bucket: 'mybucket',
localConfig: {
path: Path.join(__dirname, '../unit-helper/s3StorageServiceFactory')
}
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
err.isJoi.should.be.True();
});
it('Should throw an error if config.path is not provided for localstorage', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 'invalid',
bucket: 'mybucket',
localConfig: {}
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
err.isJoi.should.be.True();
});
it('Should throw an error if localConfig is not provided for localstorage', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 'invalid',
bucket: 'mybucket'
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
err.isJoi.should.be.True();
});
it('Should throw an error if s3Config.awsAccessKey is not provided for s3', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
s3Config: {
awsSecretKey: 'awsSecretKey'
}
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
err.isJoi.should.be.True();
});
it('Should throw an error if s3Config.awsSecretKey is not provided for s3', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 's3',
bucket: 'bucket',
s3Config: {
awsAccessKey: 'awsAccessKey'
}
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
err.isJoi.should.be.True();
});
it('Should throw an error if s3Config is not provided for s3', function() {
let err = null;
try {
const s3Service = S3StorageServiceFactory.create({
type: 's3'
}, logger, basePath);
} catch (e) {
err = e;
}
Should.exist(err);
});
});
describe('createFromNodeConfig', function() {
it('Should create localstorage from config-1', function() {
const nodeConfig = getNodeConfig('config-1');
const s3Service = S3StorageServiceFactory.createFromNodeConfig(nodeConfig, 'storage', logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('localstorage');
});
it('Should create s3 from config-2', function() {
const nodeConfig = getNodeConfig('config-2');
const s3Service = S3StorageServiceFactory.createFromNodeConfig(nodeConfig, 'storage', logger, basePath);
Should.exist(s3Service);
s3Service.getType().should.eql('s3');
});
});
});
function getNodeConfig(configFolder) {
const configDir = Path.join(__dirname, '../unit-helper/s3StorageServiceFactory', configFolder);
process.env.NODE_CONFIG_DIR = configDir;
return NodeConfig(true);
}