'use strict';

var vows = require('vows')
, fs = require('fs')
, assert = require('assert')
, EOL = require('os').EOL || '\n';

function remove(filename) {
  try {
    fs.unlinkSync(filename);
  } catch (e) {
    //doesn't really matter if it failed
  }
}

vows.describe('log4js categoryFilter').addBatch({
  'appender': {
    topic: function() {
      
      var log4js = require('../lib/log4js'), logEvents = [], webLogger, appLogger;
      log4js.clearAppenders();
      var appender = require('../lib/appenders/categoryFilter')
        .appender(
          ['app'], 
          function(evt) { logEvents.push(evt); }
        );
      log4js.addAppender(appender, ["app","web"]);
      
      webLogger = log4js.getLogger("web");
      appLogger = log4js.getLogger("app");
      
      webLogger.debug('This should get logged');
      appLogger.debug('This should not');
      webLogger.debug('Hello again');
      log4js.getLogger('db').debug('This shouldn\'t be included by the appender anyway');
      
      return logEvents;
    },
    'should only pass matching category' : function(logEvents) {
      assert.equal(logEvents.length, 2);
      assert.equal(logEvents[0].data[0], 'This should get logged');
      assert.equal(logEvents[1].data[0], 'Hello again');
    }
  },
  
  'configure': {
    topic: function() {
      var log4js = require('../lib/log4js')
      , logger, weblogger;
      
      remove(__dirname + '/categoryFilter-web.log');
      remove(__dirname + '/categoryFilter-noweb.log');
      
      log4js.configure('test/with-categoryFilter.json');
      logger = log4js.getLogger("app");
      weblogger = log4js.getLogger("web");
      
      logger.info('Loading app');
      logger.debug('Initialising indexes');
      weblogger.info('00:00:00 GET / 200');
      weblogger.warn('00:00:00 GET / 500');
      //wait for the file system to catch up
      setTimeout(this.callback, 100);
    },
    'tmp-tests.log': {
      topic: function() {
        fs.readFile(__dirname + '/categoryFilter-noweb.log', 'utf8', this.callback);
      },
      'should contain all log messages': function(contents) {
        var messages = contents.trim().split(EOL);
        assert.deepEqual(messages, ['Loading app','Initialising indexes']);
      }
    },
    'tmp-tests-web.log': {
      topic: function() {
        fs.readFile(__dirname + '/categoryFilter-web.log','utf8',this.callback);
      },
      'should contain only error and warning log messages': function(contents) {
        var messages = contents.trim().split(EOL);
        assert.deepEqual(messages, ['00:00:00 GET / 200','00:00:00 GET / 500']);
      }
    }
  }
}).export(module);
