var logfmt = require('../logfmt'),
    assert = require('assert');

var OutStream = require('./outstream');

suite('logfmt.namespace', function() {
  test('returns a logfmt', function(){
    var logger1 = logfmt.namespace();
    var logfmt2 = new logfmt();

    for(var prop in logfmt2){
      assert(logger1[prop]);
    }
  })

  test("does not modify data passed in", function(){
    var logfmt2 = logfmt.namespace({ns: 'logfmt'});
    var mock_sink = new OutStream;
    var data = {foo: 'bar', a: 14}
    logfmt2.log(data, mock_sink);
    assert.deepEqual(data, {foo: 'bar', a: 14});
  })

  test("includes data passed in on all log lines", function(){
    var logfmt2 = logfmt.namespace({ns: 'logfmt'});
    var mock_sink = new OutStream;
    var data = {foo: 'bar', a: 14}
    logfmt2.log(data, mock_sink);
    assert.equal("ns=logfmt foo=bar a=14\n", mock_sink.logline)
    logfmt2.log({}, mock_sink);
    assert.equal("ns=logfmt\n", mock_sink.logline)
    logfmt2.log(data, mock_sink);
    assert.equal("ns=logfmt foo=bar a=14\n", mock_sink.logline)
  })

  test("can chain namespace calls", function(){
    var logfmt2 = logfmt.namespace({ns: 'logfmt'})
                        .namespace({thing: 'data'});

    var logger = logfmt2.time();
    var mock_sink = new OutStream;
    logger.log({}, mock_sink);
    var actual = mock_sink.logline;
    assert(/^ns=logfmt thing=data elapsed=\dms\n$/.test(actual), actual)
  })
})