/*
 * logger-test.js: Tests for instances of the winston Logger
 *
 * (C) 2010 Charlie Robbins
 * MIT LICENSE
 *
 */

var fs = require('fs'),
    path = require('path'),
    vows = require('vows'),
    http = require('http'),
    assert = require('assert'),
    winston = require('../lib/winston'),
    helpers = require('./helpers');

vows.describe('winston').addBatch({
  "The winston module": {
    topic: function () {
      winston.default.transports.console.level = 'silly';
      return null;
    },
    "should have the correct methods defined": function () {
      assert.isObject(winston.transports);
      assert.isFunction(winston.Transport);
      assert.isTrue(!winston.transports.Transport);
      assert.isFunction(winston.transports.Console);
      assert.isFunction(winston.transports.File);
      assert.isFunction(winston.transports.Webhook);
      assert.isObject(winston.default.transports.console);
      assert.isFalse(winston.emitErrs);
      assert.isObject(winston.config);
      ['Logger', 'add', 'remove', 'extend', 'clear']
        .concat(Object.keys(winston.config.npm.levels))
        .forEach(function (key) {
          assert.isFunction(winston[key]);
        });
    },
    "it should": {
      topic: function () {
        fs.readFile(path.join(__dirname, '..', 'package.json'), this.callback);
      },
      "have the correct version set": function (err, data) {
        assert.isNull(err);
        data = JSON.parse(data.toString());
        assert.equal(winston.version, data.version);
      }
    },
    "the log() method": helpers.testNpmLevels(winston, "should respond without an error", function (err) {
      assert.isNull(err);
    }),
    "the extend() method called on an empty object": {
      topic: function (logger) {
        var empty = {};
        winston.extend(empty);
        return empty;
      },
      "should define the appropriate methods": function (extended) {
        ['log', 'profile', 'startTimer'].concat(Object.keys(winston.config.npm.levels)).forEach(function (method) {
          assert.isFunction(extended[method]);
        });
      }
    }
  }
}).addBatch({
  "The winston module": {
    "the setLevels() method": {
      topic: function () {
        winston.setLevels(winston.config.syslog.levels);
        return null;
      },
      "should have the proper methods defined": function () {
        assert.isObject(winston.transports);
        assert.isFunction(winston.transports.Console);
        assert.isFunction(winston.transports.Webhook);
        assert.isObject(winston.default.transports.console);
        assert.isFalse(winston.emitErrs);
        assert.isObject(winston.config);

        var newLevels = Object.keys(winston.config.syslog.levels);
        ['Logger', 'add', 'remove', 'extend', 'clear']
          .concat(newLevels)
          .forEach(function (key) {
            assert.isFunction(winston[key]);
          });


        Object.keys(winston.config.npm.levels)
          .filter(function (key) {
            return newLevels.indexOf(key) === -1;
          })
          .forEach(function (key) {
            assert.isTrue(typeof winston[key] === 'undefined');
          });
      }
    }
  }
}).export(module);

@@ -3167,32 +3167,990 @@
     %7D);%0A      %7D%0A
+    %7D,%0A    %22the clone() method%22: %7B%0A      %22with Error object%22: %7B%0A        topic: function () %7B%0A          var original = new Error(%22foo%22);%0A          original.name = %22bar%22;%0A%0A          var copy = winston.clone(original);%0A%0A          return %7B original: original, copy: copy %7D;%0A        %7D,%0A        %22should clone the value%22: function (result) %7B%0A          assert.notEqual(result.original, result.copy);%0A          assert.equal(result.original.message, result.copy.message);%0A          assert.equal(result.original.name, result.copy.name);%0A        %7D%0A      %7D,%0A      %22with Date object%22: %7B%0A        topic: function () %7B%0A          var original = new Date(1000);%0A%0A          var copy = winston.clone(original);%0A%0A          return %7B original: original, copy: copy %7D;%0A        %7D,%0A        %22should clone the value%22: function (result) %7B%0A          assert.notEqual(result.original, result.copy);%0A          assert.equal(result.original.getTime(), result.copy.getTime());%0A        %7D%0A      %7D%0A
     %7D%0A  %7D%0A%7D).exp

Add some unit tests for clone()