// Run all the tests in the `npm-registry-couchapp` suite
// This verifies that the server-side stuff still works.

var common = require("../common-tap")
var test = require("tap").test

var npmExec = require.resolve("../../bin/npm-cli.js")
var path = require("path")
var ca = path.resolve(__dirname, "../../node_modules/npm-registry-couchapp")

var which = require("which")

var v = process.versions.node.split(".").map(function (n) { return parseInt(n, 10) })
if (v[0] === 0 && v[1] < 10) {
  console.error(
    "WARNING: need a recent Node for npm-registry-couchapp tests to run, have",
    process.versions.node
  )
}
else {
  which("couchdb", function (er) {
    if (er) {
      console.error("WARNING: need couch to run test: " + er.message)
    }
    else {
      runTests()
    }
  })
}


function runTests () {
  var env = { TAP: 1 }
  for (var i in process.env) env[i] = process.env[i]
  env.npm = npmExec

  var opts = {
    cwd: ca,
    stdio: "inherit"
  }
  common.npm(["install"], opts, function (err, code, stdout, stderr) {
    if (err) { throw err }
    if (code) {
      return test("need install to work", function (t) {
        t.fail(
          "install failed with: " + code +
          '\nstdout: ' + stdout +
          '\nstderr: ' + stderr)
        t.end()
      })

    } else {
      opts = {
        cwd: ca,
        env: env,
        stdio: "inherit"
      }
      common.npm(
        [
          "test", "--", "-Rtap"
        ],
        opts,
        function (err, code, stdout, stderr) {
          if (err) { throw err }
          if (code) {
            return test("need test to work", function (t) {
              t.fail(
                "test failed with: " + code +
                '\nstdout: ' + stdout +
                '\nstderr: ' + stderr)
                t.end()
              })
            }
            opts = {
              cwd: ca,
              env: env,
              stdio: "inherit"
            }
            common.npm(["prune", "--production"], opts, function (err, code) {
              if (err) { throw err }
              process.exit(code || 0)
            })
          })
        }
  })
}
