npm-registry-mock
Version:
mock the npm registry
330 lines (307 loc) • 11 kB
JavaScript
var assert = require("assert")
var mr = require("../index.js")
// clients
var request = require("request")
var RC = require("npm-registry-client")
var npm = require("npm")
// misc test helper
var mkdir = require("mkdirp")
var rimraf = require("rimraf")
var fs = require("fs")
// test-settings
var tempdir = __dirname + "/out"
var path = require('path')
// config
var port = 1331
var address = "http://localhost:" + port
var real = "http://registry.npmjs.org"
var conf = {
cache: tempdir
, registry: address }
function reset (done) {
rimraf.sync(tempdir)
mkdir.sync(tempdir + '/_locks')
done()
}
beforeEach(reset);
afterEach(reset);
describe("registry mocking - RegistryClient", function () {
it("returns the underscore json", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/underscore", {}, function (er, data, raw, res) {
assert.equal(data._id, "underscore")
s.close(() => done(er))
})
})
})
it("responds to latest", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/underscore/latest", {},function (er, data, raw, res) {
assert.equal(data._id, "underscore@1.5.1")
s.close(() => done(er))
})
})
})
})
describe("serving a namespaced package", function () {
it("serves namespaced package", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/@isaacs%2fnamespace-test", {}, function (er, data, raw, res) {
assert.equal(data._id, "@isaacs/namespace-test")
s.close(() => done(er))
})
})
})
})
describe("registry mocking - npm.install", function () {
var path = tempdir + "/node_modules/underscore/package.json"
it("sends the module as tarball (version specified)", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
npm.load({audit: false, cache: tempdir, registry: address}, function () {
npm.commands.install(tempdir, ["underscore@1.3.1"], function (err) {
delete require.cache[path]
var version = require(path).version
assert.equal(version, "1.3.1")
s.close(() => done())
})
})
})
})
it("sends the module as tarball (no version specified -- latest)", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
npm.load({audit: false, cache: tempdir, registry: address}, function () {
npm.commands.install(tempdir, ["underscore"], function (err) {
delete require.cache[path]
var version = require(path).version
assert.equal(version, "1.5.1")
s.close(() => done())
})
})
})
})
it("i have a test package with one dependency", function (done) {
mr(port, function (err, s) {
if (err) return done(err)
npm.load({audit: false, cache: tempdir, registry: address}, function () {
npm.commands.install(tempdir, ["test-package-with-one-dep"], function (err) {
console.error(err)
var exists = fs.existsSync(tempdir + "/node_modules/test-package/package.json")
console.error(require('child_process').spawnSync('find', ['.'], { cwd: tempdir}).stdout.toString())
assert.ok(exists)
s.close(() => done())
})
})
})
})
})
describe("extending the predefined mocks with custom ones", function () {
it("handles new mocks", function (done) {
var customMocks = {
"get": {
"/ente200": [200, {ente200: "true"}],
"/ente400": [400, {ente400: "true"}],
"/async/-/async-0.1.0.tgz": [200, __dirname + "/fixtures/async/-/async-0.1.0.tgz"],
"/async/0.1.0": [200, __dirname + "/fixtures/async/0.1.0"],
}
}
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
request(address + "/ente200", function (er, res) {
assert.equal(res.headers.connection, 'close')
assert.deepEqual(res.body, JSON.stringify({ente200: "true"}))
assert.equal(res.statusCode, 200)
request(address + "/ente400", function (er, res) {
assert.equal(res.body, JSON.stringify({ente400: "true"}))
assert.equal(res.statusCode, 400)
npm.load({audit: false, cache: tempdir, registry: address}, function () {
npm.commands.install(tempdir, ["async@0.1.0"], function (err) {
var exists = fs.existsSync(tempdir + "/node_modules/async/package.json")
assert.ok(exists)
s.close(() => done(er))
})
})
})
})
})
})
it("uses the fake registry (GH-22)", function (done) {
var customMocks = {
"get": {
"/async/-/async-0.1.0.tgz": [200, __dirname + "/fixtures/async/-/async-0.1.0.tgz"],
"/async/0.1.0": [200, __dirname + "/fixtures/async/0.1.0"],
}
}
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/async/0.1.0", {}, function (er, data, raw, res) {
assert.notEqual(data.dist.tarball,
"http://registry.npmjs.org/async/-/async-0.1.0.tgz")
assert.ok(/localhost|\[::\]/.test(data.dist.tarball))
s.close(() => done(er))
})
})
})
it("serves js-files", function (done) {
var customMocks = {
"get": {
"/foo.js": [200, __dirname + "/fixtures/index.js"]
}
}
var file = fs.readFileSync(__dirname + "/fixtures/index.js", "utf8")
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
request(address + "/foo.js", function (er, res) {
assert.equal(res.body, file)
s.close(() => done(er))
})
})
})
it("extends the custom mocks instead of overwriting", function (done) {
var customMocks = {
"get": {
"/foo.js": [200, __dirname + "/fixtures/index.js"]
}
}
var file = fs.readFileSync(__dirname + "/fixtures/index.js", "utf8")
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
request(address + "/foo.js", function (er, res) {
assert.equal(res.body, file)
var client = new RC(conf)
client.get(address + "/underscore/latest", {}, function (er, data, raw, res) {
assert.equal(data._id, "underscore@1.5.1")
s.close(() => done(er))
})
})
})
})
it("can hande custom data for js files", function (done) {
var customMocks = {
"get": {
"/package.js": [200, {"ente" : true}],
"/shrinkwrap.js": [200, {"ente" : true}]
}
}
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
request(address + "/package.js", function (er, res) {
assert.equal(res.body, JSON.stringify({"ente" : true}))
s.close(() => done())
})
})
})
it("overwrites the predefined routes, if custom one given", function (done) {
var customMocks = {
"get": {
"/foo.js": [200, __dirname + "/fixtures/index.js"],
"/underscore/1.3.1": [200, __dirname + "/fixtures/async/0.1.0"],
}
}
var file = fs.readFileSync(__dirname + "/fixtures/index.js", "utf8")
mr({port: port, mocks: customMocks}, function (err, s) {
if (err) return done(err)
request(address + "/foo.js", function (er, res) {
assert.equal(res.body, file)
var client = new RC(conf)
client.get(address + "/underscore/1.3.1", {}, function (er, data, raw, res) {
assert.equal(data._id, "async@0.1.0")
s.close(() => done(er))
})
})
})
})
})
describe("injecting functions", function () {
it("handles plugins", function (done) {
function plugin (s) {
s.get("/test").reply(500, {"foo": "true"})
s.get("/test").reply(500, {"foo": "true"})
s.get("/test").reply(200, {"lala": "true"})
}
mr({port: port, plugin: plugin}, function (err, s) {
if (err) return done(err)
request(address + "/test", function (er, res) {
assert.deepEqual(res.body, JSON.stringify({foo: "true"}))
assert.equal(res.statusCode, 500)
request(address + "/test", function (er, res) {
assert.deepEqual(res.body, JSON.stringify({foo: "true"}))
assert.equal(res.statusCode, 500)
request(address + "/test", function (er, res) {
assert.deepEqual(res.body, JSON.stringify({lala: "true"}))
assert.equal(res.statusCode, 200)
s.close(() => done())
})
})
})
})
})
it("default routes still work", function (done) {
function plugin (s) {
s.get("/test").reply(500, {"foo": "true"})
s.get("/test").reply(500, {"foo": "true"})
s.get("/test").reply(200, {"lala": "true"})
}
mr({port: port, plugin: plugin}, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/underscore/latest", {}, function (er, data, raw, res) {
assert.equal(data._id, "underscore@1.5.1")
s.close(() => done(er))
})
})
})
})
describe("api", function () {
it("allows an options object with port but no mocks given", function (done) {
mr({port: port}, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + "/underscore/latest", {}, function (er, data, raw, res) {
assert.equal(data._id, "underscore@1.5.1")
s.close(() => done(er))
})
})
})
it("allows an options object with port = 0 but no mocks given", function (done) {
mr({port: 0}, function (err, s) {
if (err) return done(err)
var realUrl = "http://localhost:" + s.address().port
var client = new RC({
cache: conf.cache,
registry: realUrl
})
client.get(realUrl + "/underscore/latest", {}, function (er, data, raw, res) {
assert.equal(data._id, "underscore@1.5.1")
s.close(() => done(er))
})
})
})
})
describe('multiple requests', function () {
it('will not error after the first request, if nothing is specified', function (done) {
mr({
port: port
}, function (err, s) {
if (err) return done(err)
var client = new RC(conf)
client.get(address + '/underscore/latest', {}, function (er, data, raw, res) {
assert.equal(er, null)
client.get(address + '/underscore/latest', {}, function (er, data, raw, res) {
assert.equal(er, null)
client.get(address + '/underscore/latest', {}, function (er, data, raw, res) {
s.close(() => done(er))
})
})
})
})
})
})