var common = require("../common-tap.js")
var test = require("tap").test
var npm = require("../../")
var mkdirp = require("mkdirp")
var rimraf = require("rimraf")
var path = require("path")
var mr = require("npm-registry-mock")

var updateIndex = require("../../lib/cache/update-index.js")

var PKG_DIR = path.resolve(__dirname, "get-basic")
var CACHE_DIR = path.resolve(PKG_DIR, "cache")

var server

function setup (t, mock) {
  mkdirp.sync(CACHE_DIR)
  mr({ port: common.port, mocks: mock }, function (s) {
    npm.load({ cache: CACHE_DIR, registry: common.registry }, function (err) {
      t.ifError(err, "no error")
      server = s
      t.end()
    })
  })
}

function cleanup (t) {
  server.close()
  rimraf.sync(PKG_DIR)

  t.end()
}

test("setup basic", function (t) {
  setup(t, mocks.basic)
})

test("request basic", function (t) {
  updateIndex("http://localhost:1337/-/all", {}, function (er) {
    t.ifError(er, "no error")
    t.end()
  })
})

test("cleanup basic", cleanup)

test("setup auth", function (t) {
  setup(t, mocks.auth)
})

test("request auth failure", function (t) {
  updateIndex("http://localhost:1337/-/all", {}, function (er) {
    t.ok(er.code, "E401")
    t.ok(/^unauthorized/.test(er.message), "unauthorized message")
    t.end()
  })
})

test("request auth success", function (t) {
  // mimic as if alwaysAuth had been set
  var params = {
    auth: {
      username: "bobby",
      password: "tables",
      alwaysAuth: true
    }
  }

  updateIndex("http://localhost:1337/-/all", params, function (er) {
    t.ifError(er, "no error")
    t.end()
  })
})

test("cleanup auth", cleanup)

var mocks = {
  basic: function(server) {
    server.get("/-/all").reply(200, allMock)
  },
  auth: function(server) {
    var littleBobbyTablesAuth = new Buffer("bobby:tables").toString("base64")
    var auth = "Basic " + littleBobbyTablesAuth
    server.get("/-/all", { authorization: auth }).reply(200, allMock)
    server.get("/-/all").reply(401, {
      error: "unauthorized",
      reason: "You are not authorized to access this db."
    })
  }
}

var allMock = {
  "_updated": 1411727900+25,
  "generator-frontcow": {
      "name": "generator-frontcow",
      "description": "f36b6a6123da50959741e2ce4d634f96ec668c56 This is a fake description to ensure we do not accidentally search the real npm registry or use some kind of cache",
      "dist-tags": {
          "latest": "0.1.19"
      },
      "maintainers": [
          {
              "name": "bcabanes",
              "email": "contact@benjamincabanes.com"
          }
      ],
      "homepage": "https://github.com/bcabanes/generator-frontcow",
      "keywords": [
          "sass",
          "frontend",
          "yeoman-generator",
          "atomic",
          "design",
          "sass",
          "foundation",
          "foundation5",
          "atomic design",
          "bourbon",
          "polyfill",
          "font awesome"
      ],
      "repository": {
          "type": "git",
          "url": "https://github.com/bcabanes/generator-frontcow"
      },
      "author": {
          "name": "ben",
          "email": "contact@benjamincabanes.com",
          "url": "https://github.com/bcabanes"
      },
      "bugs": {
          "url": "https://github.com/bcabanes/generator-frontcow/issues"
      },
      "license": "MIT",
      "readmeFilename": "README.md",
      "time": {
          "modified": "2014-10-03T02:26:18.406Z"
      },
      "versions": {
          "0.1.19": "latest"
      }
  },
  "marko": {
      "name": "marko",
      "description": "Marko is an extensible, streaming, asynchronous, high performance, HTML-based templating language that can be used in Node.js or in the browser.",
      "dist-tags": {
          "latest": "1.2.16"
      },
      "maintainers": [
          {
              "name": "pnidem",
              "email": "pnidem@gmail.com"
          },
          {
              "name": "philidem",
              "email": "phillip.idem@gmail.com"
          }
      ],
      "homepage": "https://github.com/raptorjs/marko",
      "keywords": [
          "templating",
          "template",
          "async",
          "streaming"
      ],
      "repository": {
          "type": "git",
          "url": "https://github.com/raptorjs/marko.git"
      },
      "author": {
          "name": "Patrick Steele-Idem",
          "email": "pnidem@gmail.com"
      },
      "bugs": {
          "url": "https://github.com/raptorjs/marko/issues"
      },
      "license": "Apache License v2.0",
      "readmeFilename": "README.md",
      "users": {
          "pnidem": true
      },
      "time": {
          "modified": "2014-10-03T02:27:31.775Z"
      },
      "versions": {
          "1.2.16": "latest"
      }
  }
}
