'use strict';

var helpers = require('../../helpers/integration');
var harness = helpers.harness(__filename);
var nano = harness.locals.nano;
var Nano = helpers.Nano;

var it = harness.it;

it('should serve the root when no path is specified', function(assert) {
  nano.dinosaur('', function(err, response) {
    assert.equal(err, null, 'failed to get root');
    assert.ok(response.version, 'version is defined');
    nano.relax(function(err, response) {
      assert.equal(err, null, 'relax');
      assert.ok(response.version, 'had version');
      assert.end();
    });
  });
});

it('should be able to parse urls', function(assert) {
  var baseUrl = 'http://someurl.com';
  assert.equal(
    Nano(baseUrl).config.url,
    baseUrl,
    'simple url');

  assert.equal(
    Nano(baseUrl + '/').config.url,
    baseUrl + '/',
    'simple with trailing');

  assert.equal(
    Nano('http://a:b@someurl.com:5984').config.url,
    'http://a:b@someurl.com:5984',
    'with authentication');

  //var withDb = Nano({
  //  url: 'http://a:b@someurl.com:5984',
  //  db: 'foo'
  //})

  //assert.equal(withDb.config.db, 'foo', 'should create url with db');
  //assert.ok(withDb.attachment, 'should have an attachment');

  assert.equal(
    Nano('http://a:b%20c%3F@someurl.com:5984/mydb').config.url,
    'http://a:b%20c%3F@someurl.com:5984',
    'with escaped auth');

  assert.equal(
    Nano('http://a:b%20c%3F@someurl.com:5984/my%2Fdb').config.url,
    'http://a:b%20c%3F@someurl.com:5984',
    'with dbname containing encoded slash');

  assert.equal(
    Nano('http://mydb-a:b%20c%3F@someurl.com:5984/mydb').config.url,
    'http://mydb-a:b%20c%3F@someurl.com:5984',
    'with repeating dbname');

  assert.equal(
    Nano('http://a:b%20c%3F@someurl.com:5984/prefix/mydb').config.url,
    'http://a:b%20c%3F@someurl.com:5984/prefix',
    'with subdir');

  assert.equal(
    Nano(baseUrl + ':5984/a').config.url,
    baseUrl + ':5984',
    'with port');

  assert.equal(
    Nano(baseUrl + '/a').config.url,
    baseUrl,
    '`a` database');

  assert.end();
});

it('should accept and handle customer http headers', function(assert) {
  var nanoWithDefaultHeaders = Nano({
    url: helpers.couch,
    defaultHeaders: {
      'x-custom-header': 'custom',
      'x-second-header': 'second'
    }
  });

  var req = nanoWithDefaultHeaders.db.list(function(err) {
    assert.equal(err, null, 'should list');
    assert.end();
  });

  assert.equal(
    req.headers['x-custom-header'],
    'custom',
    'header `x-second-header` honored');

  assert.equal(
    req.headers['x-second-header'],
    'second',
    'headers `x-second-header` honored');
});

it('should prevent shallow object copies', function(assert) {
  var config = {
    url: 'http://someurl.com'
  };

  assert.equal(
    Nano(config).config.url,
    config.url,
    'simple url');

  assert.ok(
    Nano(config).config.requestDefaults,
    '`requestDefaults` should be set');
  assert.ok(!config.requestDefaults,
    'should not be re-using the same object');

  assert.end();
});
