var test = require('tap').test

var npmconf = require('../../lib/config/core.js')
var common = require('../common-config.js')

var URI = 'https://registry.lvh.me:8661/'

test('getting scope with no credentials set', function (t) {
  npmconf.load({}, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var basic = conf.getCredentialsByURI(URI)
    t.equal(basic.scope, '//registry.lvh.me:8661/', 'nerfed URL extracted')

    t.end()
  })
})

test('trying to set credentials with no URI', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.throws(function () {
      conf.setCredentialsByURI()
    }, 'enforced missing URI')

    t.end()
  })
})

test('trying to clear credentials with no URI', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.throws(function () {
      conf.clearCredentialsByURI()
    }, 'enforced missing URI')

    t.end()
  })
})

test('set with missing credentials object', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.throws(function () {
      conf.setCredentialsByURI(URI)
    }, 'enforced missing credentials')

    t.end()
  })
})

test('set with empty credentials object', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.throws(function () {
      conf.setCredentialsByURI(URI, {})
    }, 'enforced missing credentials')

    t.end()
  })
})

test('set with token', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.doesNotThrow(function () {
      conf.setCredentialsByURI(URI, { token: 'simple-token' })
    }, 'needs only token')

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: 'simple-token',
      username: undefined,
      password: undefined,
      email: undefined,
      auth: undefined,
      alwaysAuth: false
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got bearer token and scope')

    t.end()
  })
})

test('clear with token', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    t.doesNotThrow(function () {
      conf.setCredentialsByURI(URI, { token: 'simple-token' })
    }, 'needs only token')

    t.doesNotThrow(function () {
      conf.clearCredentialsByURI(URI)
    }, 'needs only URI')

    t.notOk(conf.getCredentialsByURI(URI).token, 'token all gone')

    t.end()
  })
})

test('set with missing username', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      password: 'password',
      email: 'ogd@aoaioxxysz.net'
    }

    t.throws(function () {
      conf.setCredentialsByURI(URI, credentials)
    }, 'enforced missing email')

    t.end()
  })
})

test('set with missing password', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      email: 'ogd@aoaioxxysz.net'
    }

    t.throws(function () {
      conf.setCredentialsByURI(URI, credentials)
    }, 'enforced missing email')

    t.end()
  })
})

test('set with missing email', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      password: 'password'
    }

    t.throws(function () {
      conf.setCredentialsByURI(URI, credentials)
    }, 'enforced missing email')

    t.end()
  })
})

test('set with old-style credentials', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net'
    }

    t.doesNotThrow(function () {
      conf.setCredentialsByURI(URI, credentials)
    }, 'requires all of username, password, and email')

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: undefined,
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: false
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got credentials')

    t.end()
  })
})

test('clear with old-style credentials', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net'
    }

    t.doesNotThrow(function () {
      conf.setCredentialsByURI(URI, credentials)
    }, 'requires all of username, password, and email')

    t.doesNotThrow(function () {
      conf.clearCredentialsByURI(URI)
    }, 'clearing only required URI')

    t.notOk(conf.getCredentialsByURI(URI).username, 'username cleared')
    t.notOk(conf.getCredentialsByURI(URI).password, 'password cleared')

    t.end()
  })
})

test('get old-style credentials for default registry', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    var actual = conf.getCredentialsByURI(conf.get('registry'))
    var expected = {
      scope: '//registry.npmjs.org/',
      token: undefined,
      password: 'password',
      username: 'username',
      email: 'i@izs.me',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: false
    }
    t.same(actual, expected)
    t.end()
  })
})

test('set with always-auth enabled', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      alwaysAuth: true
    }

    conf.setCredentialsByURI(URI, credentials)

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: undefined,
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: true
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got credentials')

    t.end()
  })
})

test('set with always-auth disabled', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      alwaysAuth: false
    }

    conf.setCredentialsByURI(URI, credentials)

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: undefined,
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: false
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got credentials')

    t.end()
  })
})

test('set with global always-auth enabled', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')
    var original = conf.get('always-auth')
    conf.set('always-auth', true)

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net'
    }

    conf.setCredentialsByURI(URI, credentials)

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: undefined,
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: true
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got credentials')

    conf.set('always-auth', original)
    t.end()
  })
})

test('set with global always-auth disabled', function (t) {
  npmconf.load(common.builtin, function (er, conf) {
    t.ifError(er, 'configuration loaded')
    var original = conf.get('always-auth')
    conf.set('always-auth', false)

    var credentials = {
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net'
    }

    conf.setCredentialsByURI(URI, credentials)

    var expected = {
      scope: '//registry.lvh.me:8661/',
      token: undefined,
      username: 'username',
      password: 'password',
      email: 'ogd@aoaioxxysz.net',
      auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
      alwaysAuth: false
    }

    t.same(conf.getCredentialsByURI(URI), expected, 'got credentials')

    conf.set('always-auth', original)
    t.end()
  })
})
