/*
 * helpers.js: Test helpers for nconf.
 *
 * (C) 2011, Charlie Robbins and the Contributors.
 *
 */

var assert = require('assert'),
    spawn = require('child_process').spawn,
    fs = require('fs'),
    path = require('path'),
    nconf = require('../lib/nconf');

exports.assertMerged = function (err, merged) {
  merged = merged instanceof nconf.Provider
    ? merged.store.store
    : merged;

  assert.isNull(err);
  assert.isObject(merged);
  assert.isTrue(merged.apples);
  assert.isTrue(merged.bananas);
  assert.isObject(merged.candy);
  assert.isTrue(merged.candy.something1);
  assert.isTrue(merged.candy.something2);
  assert.isTrue(merged.candy.something3);
  assert.isTrue(merged.candy.something4);
  assert.isTrue(merged.dates);
  assert.isTrue(merged.elderberries);
};

exports.assertSystemConf = function (options) {
  return {
    topic: function () {
      var env = null;

      if (options.env) {
        env = {}
        Object.keys(process.env).forEach(function (key) {
          env[key] = process.env[key];
        });

        Object.keys(options.env).forEach(function (key) {
          env[key] = options.env[key];
        });
      }

      var child = spawn('node', [options.script].concat(options.argv), { env: env });
      child.stdout.once('data', this.callback.bind(this, null));
    },
    "should respond with the value passed into the script": function (_, data) {
      assert.equal(data.toString(), 'foobar');
    }
  }
}

// copy a file
exports.cp = function (from, to, callback) {
  fs.readFile(from, function (err, data) {
    if (err) return callback(err);
    fs.writeFile(to, data, callback);
  });
};

exports.fixture = function (file) {
  return path.join(__dirname, 'fixtures', file);
};
