winston-azuretable
Version:
Azure Table Storage transport for Winston
236 lines (199 loc) • 9.76 kB
JavaScript
/* eslint-env mocha */
/* eslint-disable no-unused-vars */
const expect = require('chai').expect,
chai = require('chai'),
azure = require('azure-storage'),
winston = require('winston'),
azureLogger = require("../lib/winston-azuretable.js").AzureLogger;
chai.config.includeStack = true;
const account_name = process.env.AZURE_STORAGE_ACCOUNT || '';
const account_key = process.env.AZURE_STORAGE_ACCESS_KEY || '';
const useDevStorage = (!account_name && !account_key) ? true : false;
describe('azure logger', function() {
const table_name_prefix = "winstontest";
let tableService = azure.createTableService('UseDevelopmentStorage=true');
if (account_name && account_key) {
tableService = azure.createTableService(account_name, account_key);
}
afterEach(function(done) {
var deleteTable = function(tableService, tableName) {
return new Promise((resolve, reject) => {
tableService.deleteTableIfExists(tableName, error => {
if (error) {
reject(error);
}
resolve();
});
});
}
tableService.listTablesSegmented(null, async (error, result) => {
expect(error).to.be.null;
if (result.entries && result.entries.length > 0) {
for (var index = 0; index < result.entries.length; index++) {
var tableName = result.entries[index];
if (tableName.startsWith(table_name_prefix)) {
await deleteTable(tableService, tableName);
}
}
}
done();
});
});
describe('ctor', function() {
it('storage name required', function() {
expect(function() {
new winston.transports.AzureLogger({});
}).to.throw('azure storage account name required.');
});
it('storage key required', function() {
expect(function() {
new winston.transports.AzureLogger({
account: 'some account'
});
}).to.throw('azure storage account key required.');
});
it('happy path', function(done) {
var tableName = table_name_prefix + Math.random().toString(36).substring(2, 15);
new winston.transports.AzureLogger({
useDevStorage: useDevStorage,
account: account_name,
key: account_key,
tableName: tableName,
callback: function() {
tableService.listTablesSegmented(null, function(error, result) {
expect(result.entries).to.include(tableName);
});
done();
}
});
});
});
describe('log', function() {
it('happy path', function(done) {
var expectedTableName = table_name_prefix + Math.random().toString(36).substring(2, 15);
var expectedPartitionKey = Math.random().toString(36).substring(2, 15);
var expectedLevel = Math.random().toString(36).replace(/[^a-z]+/g, '');
var expectedMsg = Math.random().toString(36).replace(/[^a-z]+/g, '');
var logger = new winston.transports.AzureLogger({
useDevStorage: useDevStorage,
account: account_name,
key: account_key,
tableName: expectedTableName,
partitionKey: expectedPartitionKey,
callback: function() {
logger.log(expectedLevel, expectedMsg, { propName1: 'propValue1', propName2: 'propValue2' }, function(error) {
expect(error).to.be.null;
var query = new azure.TableQuery()
.where('PartitionKey eq ?', expectedPartitionKey);
tableService.queryEntities(expectedTableName, query, null, function(error, result) {
expect(result.entries).to.have.length('1');
var actualPartitionKey = result.entries[0].PartitionKey._;
var actualHostname = result.entries[0].hostname._;
var actualPid = result.entries[0].pid._;
var actualLevel = result.entries[0].level._;
var actualMsg = result.entries[0].msg._;
var actualPropName1 = result.entries[0].propName1_._;
var actualPropName2 = result.entries[0].propName2_._;
expect(actualPartitionKey).to.equal(expectedPartitionKey);
expect(actualHostname).to.exist;
expect(actualPid).to.exist;
expect(actualLevel).to.equal(expectedLevel);
expect(actualMsg).to.equal(expectedMsg);
expect(actualPropName1).to.equal('propValue1');
expect(actualPropName2).to.equal('propValue2');
done();
});
});
}
});
});
it('nested metadata', function(done) {
var tableName = table_name_prefix + Math.random().toString(36).substring(2, 15);
var partitionKey = Math.random().toString(36).substring(2, 15);
var level = 'info';
var msg = 'testing';
var expectedMeta = {
propName1: 'propValue1',
propName2: 'propValue2'
};
var logger = new winston.transports.AzureLogger({
useDevStorage: useDevStorage,
account: account_name,
key: account_key,
tableName: tableName,
partitionKey: partitionKey,
nestedMeta: true,
callback: function() {
logger.log(level, msg, expectedMeta, function(error) {
expect(error).to.be.null;
var query = new azure.TableQuery()
.where('PartitionKey eq ?', partitionKey);
tableService.queryEntities(tableName, query, null, function(error, result) {
expect(result.entries).to.have.length('1');
var actualMeta = JSON.parse(result.entries[0].meta._);
var actualPropValue1 = actualMeta.propName1;
var actualPropValue2 = actualMeta.propName2;
expect(actualPropValue1).to.equal('propValue1');
expect(actualPropValue2).to.equal('propValue2');
done();
});
});
}
});
});
});
describe('query', function() {
it('happy path', function (done) {
var tableName = table_name_prefix + Math.random().toString(36).slice(2);
var partitionKey = Math.random().toString(36).substring(2, 15);
var logger = new winston.transports.AzureLogger({
useDevStorage: useDevStorage,
account: account_name,
key: account_key,
tableName: tableName,
partitionKey: partitionKey,
callback: function () {
var expectedLevel = Math.random().toString(36).replace(/[^a-z]+/g, '');
var expectedMsg = Math.random().toString(36).replace(/[^a-z]+/g, '');
logger.log(expectedLevel, expectedMsg, function (error) {
expect(error).to.be.null;
logger.query(null, function (error, result) {
expect(error).to.be.null;
expect(result).to.have.length('1');
expect(result[0].level).to.be.equal(expectedLevel);
expect(result[0].msg).to.be.equal(expectedMsg);
done();
});
});
}
});
});
it('expectedFields', function (done) {
var tableName = table_name_prefix + Math.random().toString(36).slice(2);
var partitionKey = Math.random().toString(36).substring(2, 15);
var logger = new winston.transports.AzureLogger({
useDevStorage: useDevStorage,
account: account_name,
key: account_key,
tableName: tableName,
partitionKey: partitionKey,
callback: function () {
var expectedMsg = Math.random().toString(36).replace(/[^a-z]+/g, '');
logger.log(null, expectedMsg, function (error) {
expect(error).to.be.null;
var options = {
fields: ['msg']
};
logger.query(options, function (error, result) {
expect(error).to.be.null;
expect(result).to.have.length('1');
expect(Object.keys(result[0])).to.have.length('1');
expect(result[0].msg).to.be.equal(expectedMsg);
done();
});
});
}
});
});
});
});