var path = require('path')
var test = require('tap').test
var npm = require('../../lib/npm.js')
var requireInject = require('require-inject')

var realizePackageSpecifier = requireInject('realize-package-specifier', {
  'fs': {
    stat: function (file, cb) {
      process.nextTick(function () {
        switch (file) {
          case path.resolve('named'):
            cb(new Error('ENOENT'))
            break
          case path.resolve('file.tgz'):
            cb(null, { isDirectory: function () { return false } })
            break
          case path.resolve('dir-no-package'):
            cb(null, { isDirectory: function () { return true } })
            break
          case path.resolve('dir-no-package/package.json'):
            cb(new Error('ENOENT'))
            break
          case path.resolve('dir-with-package'):
            cb(null, { isDirectory: function () { return true } })
            break
          case path.resolve('dir-with-package/package.json'):
            cb(null, {})
            break
          case path.resolve(__dirname, 'dir-with-package'):
            cb(null, { isDirectory: function () { return true } })
            break
          case path.join(__dirname, 'dir-with-package', 'package.json'):
            cb(null, {})
            break
          case path.resolve(__dirname, 'file.tgz'):
            cb(null, { isDirectory: function () { return false } })
            break
          default:
            throw new Error('Unknown test file passed to stat: ' + file)
        }
      })
    }
  }
})

npm.load({ loglevel: 'silent' }, function () {
  var cache = requireInject('../../lib/cache.js', {
    'realize-package-specifier': realizePackageSpecifier,
    '../../lib/cache/add-named.js': function addNamed (name, version, data, cb) {
      cb(null, 'addNamed')
    },
    '../../lib/cache/add-local.js': function addLocal (name, data, cb) {
      cb(null, 'addLocal')
    }
  })

  test('npm install localdir fallback', function (t) {
    t.plan(12)
    cache.add('named', null, null, false, function (er, which) {
      t.ifError(er, 'named was cached')
      t.is(which, 'addNamed', 'registry package name')
    })
    cache.add('file.tgz', null, null, false, function (er, which) {
      t.ifError(er, 'file.tgz was cached')
      t.is(which, 'addLocal', 'local file')
    })
    cache.add('dir-no-package', null, null, false, function (er, which) {
      t.ifError(er, 'local directory was cached')
      t.is(which, 'addNamed', 'local directory w/o package.json')
    })
    cache.add('dir-with-package', null, null, false, function (er, which) {
      t.ifError(er, 'local directory with package was cached')
      t.is(which, 'addLocal', 'local directory with package.json')
    })
    cache.add('file:./dir-with-package', null, __dirname, false, function (er, which) {
      t.ifError(er, 'local directory (as URI) with package was cached')
      t.is(which, 'addLocal', 'file: URI to local directory with package.json')
    })
    cache.add('file:./file.tgz', null, __dirname, false, function (er, which) {
      t.ifError(er, 'local file (as URI) with package was cached')
      t.is(which, 'addLocal', 'file: URI to local file with package.json')
    })
  })
})
