--- /dev/null
+var fs = require('fs')
+var join = require('path').join
+
+var mkdirp = require('mkdirp')
+var rimraf = require('rimraf')
+var test = require('tap').test
+
+var common = require('../common-tap.js')
+var pkg = join(__dirname, 'dedupe-scoped')
+var modules = join(pkg, 'node_modules')
+
+var EXEC_OPTS = { cwd: pkg }
+
+var prolog = 'dedupe@0.0.0 ' + pkg
+var body = function () {/*
+├─┬ first@1.0.0
+│ └── @scope/shared@2.1.6
+└─┬ second@2.0.0
+ └── @scope/shared@2.1.6
+*/}.toString().split('\n').slice(1, -1)
+
+var deduper = {
+ 'name': 'dedupe',
+ 'version': '0.0.0',
+ 'dependencies': {
+ 'first': '1.0.0',
+ 'second': '2.0.0'
+ }
+}
+
+var first = {
+ 'name': 'first',
+ 'version': '1.0.0',
+ 'dependencies': {
+ 'firstUnique': '0.6.0',
+ '@scope/shared': '2.1.6'
+ }
+}
+
+var second = {
+ 'name': 'second',
+ 'version': '2.0.0',
+ 'dependencies': {
+ 'secondUnique': '1.2.0',
+ '@scope/shared': '2.1.6'
+ }
+}
+
+var shared = {
+ 'name': '@scope/shared',
+ 'version': '2.1.6'
+}
+
+var firstUnique = {
+ 'name': 'firstUnique',
+ 'version': '0.6.0'
+}
+
+var secondUnique = {
+ 'name': 'secondUnique',
+ 'version': '1.2.0'
+}
+
+
+test('setup', function (t) {
+ setup()
+ t.end()
+})
+
+// we like the cars
+function ltrimm (l) { return l.trim() }
+
+test('dedupe finds the common scoped modules and moves it up one level', function (t) {
+ common.npm(
+ [
+ 'find-dupes' // I actually found a use for this command!
+ ],
+ EXEC_OPTS,
+ function (err, code, stdout, stderr) {
+ t.ifError(err, 'successful dry run against fake install')
+ t.notOk(code, 'npm ran without issue')
+ t.notOk(stderr, 'npm printed no errors')
+ t.same(
+ stdout.trim().split('\n').map(ltrimm),
+ [prolog].concat(body).map(ltrimm),
+ 'got expected output'
+ )
+
+ t.end()
+ }
+ )
+})
+
+test('cleanup', function (t) {
+ cleanup()
+ t.end()
+})
+
+function setup (cb) {
+ cleanup()
+
+ mkdirp.sync(pkg)
+ fs.writeFileSync(
+ join(pkg, 'package.json'),
+ JSON.stringify(deduper, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'first'))
+ fs.writeFileSync(
+ join(modules, 'first', 'package.json'),
+ JSON.stringify(first, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'first', 'node_modules', 'firstUnique'))
+ fs.writeFileSync(
+ join(modules, 'first', 'node_modules', 'firstUnique', 'package.json'),
+ JSON.stringify(firstUnique, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'first', 'node_modules', '@scope', 'shared'))
+ fs.writeFileSync(
+ join(modules, 'first', 'node_modules', '@scope', 'shared', 'package.json'),
+ JSON.stringify(shared, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'second'))
+ fs.writeFileSync(
+ join(modules, 'second', 'package.json'),
+ JSON.stringify(second, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'second', 'node_modules', 'secondUnique'))
+ fs.writeFileSync(
+ join(modules, 'second', 'node_modules', 'secondUnique', 'package.json'),
+ JSON.stringify(secondUnique, null, 2)
+ )
+
+ mkdirp.sync(join(modules, 'second', 'node_modules', '@scope', 'shared'))
+ fs.writeFileSync(
+ join(modules, 'second', 'node_modules', '@scope', 'shared', 'package.json'),
+ JSON.stringify(shared, null, 2)
+ )
+}
+
+function cleanup () {
+ rimraf.sync(pkg)
+}