// 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 = Object.assign({ TAP: 1 }, process.env)
  env.npm = npmExec
  // TODO: fix tap and / or nyc to handle nested invocations properly
  env.COVERALLS_REPO_TOKEN = ''

  var opts = {
    cwd: ca,
    stdio: 'inherit'
  }
  common.npm(['install'], opts, function (err, code) {
    if (err) { throw err }
    if (code) {
      return test('need install to work', function (t) {
        t.fail('install failed with: ' + code)
        t.end()
      })
    } else {
      opts = {
        cwd: ca,
        env: env,
        stdio: 'inherit'
      }
      common.npm(['test', '--', '-Rtap', '--no-coverage'], opts, function (err, code) {
        if (err) { throw err }
        if (code) {
          return test('need test to work', function (t) {
            t.fail('test failed with: ' + code)
            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)
        })
      })
    }
  })
}
