From a362c3f1919987419ed8a37c8defa19d2e6697b0 Mon Sep 17 00:00:00 2001 From: Steve Mason Date: Fri, 20 Sep 2013 13:18:13 +0100 Subject: Avoid installing URL dependencies multiple times. Use the _resolved property from installed packages to avoid installing URL dependencies after they are already installed. Also ensure that you can still use --force if the packages have really changed This also fixes #3463 as shrinkwrapped dependencies are basically treated the same as tarball dependencies. --- test/tap/url-dependencies.js | 72 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 test/tap/url-dependencies.js (limited to 'test/tap/url-dependencies.js') diff --git a/test/tap/url-dependencies.js b/test/tap/url-dependencies.js new file mode 100644 index 000000000..0c2078aff --- /dev/null +++ b/test/tap/url-dependencies.js @@ -0,0 +1,72 @@ +var test = require("tap").test +var rimraf = require("rimraf") + +var mr = require("npm-registry-mock") + +var spawn = require("child_process").spawn +var npm = require.resolve("../../bin/npm-cli.js") +var node = process.execPath +var pkg = "./url-dependencies" + +var mockRoutes = { + "get": { + "/underscore/-/underscore-1.3.1.tgz": [200] + } +} + +test("url-dependencies: download first time", function(t) { + rimraf.sync(__dirname + "/url-dependencies/node_modules") + + performInstall(function(output){ + if(!tarballWasFetched(output)){ + t.fail("Tarball was not fetched") + }else{ + t.pass("Tarball was fetched") + } + t.end() + }) +}) + +test("url-dependencies: do not download subsequent times", function(t) { + rimraf.sync(__dirname + "/url-dependencies/node_modules") + + performInstall(function(){ + performInstall(function(output){ + if(tarballWasFetched(output)){ + t.fail("Tarball was fetched second time around") + }else{ + t.pass("Tarball was not fetched") + } + t.end() + }) + }) +}) + +function tarballWasFetched(output){ + return output.indexOf("http GET http://localhost:1337/underscore/-/underscore-1.3.1.tgz") > -1 +} + +function performInstall (cb) { + mr({port: 1337, mocks: mockRoutes}, function(s){ + var output = "" + , child = spawn(node, [npm, "install"], { + cwd: pkg, + env: { + npm_config_registry: "http://localhost:1337", + npm_config_cache_lock_stale: 1000, + npm_config_cache_lock_wait: 1000, + HOME: process.env.HOME, + Path: process.env.PATH, + PATH: process.env.PATH + } + }) + + child.stderr.on("data", function(data){ + output += data.toString() + }) + child.on("close", function () { + s.close() + cb(output) + }) + }) +} -- cgit v1.2.3