mock_sync.js
1 var path = require('path'); 2 var test = require('tape'); 3 var resolve = require('../'); 4 5 test('mock', function (t) { 6 t.plan(4); 7 8 var files = {}; 9 files[path.resolve('/foo/bar/baz.js')] = 'beep'; 10 11 var dirs = {}; 12 dirs[path.resolve('/foo/bar')] = true; 13 14 function opts(basedir) { 15 return { 16 basedir: path.resolve(basedir), 17 isFile: function (file) { 18 return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); 19 }, 20 isDirectory: function (dir) { 21 return !!dirs[path.resolve(dir)]; 22 }, 23 readFileSync: function (file) { 24 return files[path.resolve(file)]; 25 }, 26 realpathSync: function (file) { 27 return file; 28 } 29 }; 30 } 31 32 t.equal( 33 resolve.sync('./baz', opts('/foo/bar')), 34 path.resolve('/foo/bar/baz.js') 35 ); 36 37 t.equal( 38 resolve.sync('./baz.js', opts('/foo/bar')), 39 path.resolve('/foo/bar/baz.js') 40 ); 41 42 t.throws(function () { 43 resolve.sync('baz', opts('/foo/bar')); 44 }); 45 46 t.throws(function () { 47 resolve.sync('../baz', opts('/foo/bar')); 48 }); 49 }); 50 51 test('mock package', function (t) { 52 t.plan(1); 53 54 var files = {}; 55 files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; 56 files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ 57 main: './baz.js' 58 }); 59 60 var dirs = {}; 61 dirs[path.resolve('/foo')] = true; 62 dirs[path.resolve('/foo/node_modules')] = true; 63 64 function opts(basedir) { 65 return { 66 basedir: path.resolve(basedir), 67 isFile: function (file) { 68 return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); 69 }, 70 isDirectory: function (dir) { 71 return !!dirs[path.resolve(dir)]; 72 }, 73 readFileSync: function (file) { 74 return files[path.resolve(file)]; 75 }, 76 realpathSync: function (file) { 77 return file; 78 } 79 }; 80 } 81 82 t.equal( 83 resolve.sync('bar', opts('/foo')), 84 path.resolve('/foo/node_modules/bar/baz.js') 85 ); 86 }); 87 88 test('symlinked', function (t) { 89 t.plan(2); 90 91 var files = {}; 92 files[path.resolve('/foo/bar/baz.js')] = 'beep'; 93 files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep'; 94 95 var dirs = {}; 96 dirs[path.resolve('/foo/bar')] = true; 97 dirs[path.resolve('/foo/bar/symlinked')] = true; 98 99 function opts(basedir) { 100 return { 101 preserveSymlinks: false, 102 basedir: path.resolve(basedir), 103 isFile: function (file) { 104 return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); 105 }, 106 isDirectory: function (dir) { 107 return !!dirs[path.resolve(dir)]; 108 }, 109 readFileSync: function (file) { 110 return files[path.resolve(file)]; 111 }, 112 realpathSync: function (file) { 113 var resolved = path.resolve(file); 114 115 if (resolved.indexOf('symlinked') >= 0) { 116 return resolved; 117 } 118 119 var ext = path.extname(resolved); 120 121 if (ext) { 122 var dir = path.dirname(resolved); 123 var base = path.basename(resolved); 124 return path.join(dir, 'symlinked', base); 125 } else { 126 return path.join(resolved, 'symlinked'); 127 } 128 } 129 }; 130 } 131 132 t.equal( 133 resolve.sync('./baz', opts('/foo/bar')), 134 path.resolve('/foo/bar/symlinked/baz.js') 135 ); 136 137 t.equal( 138 resolve.sync('./baz.js', opts('/foo/bar')), 139 path.resolve('/foo/bar/symlinked/baz.js') 140 ); 141 }); 142 143 test('readPackageSync', function (t) { 144 t.plan(3); 145 146 var files = {}; 147 files[path.resolve('/foo/node_modules/bar/something-else.js')] = 'beep'; 148 files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ 149 main: './baz.js' 150 }); 151 files[path.resolve('/foo/node_modules/bar/baz.js')] = 'boop'; 152 153 var dirs = {}; 154 dirs[path.resolve('/foo')] = true; 155 dirs[path.resolve('/foo/node_modules')] = true; 156 157 function opts(basedir, useReadPackage) { 158 return { 159 basedir: path.resolve(basedir), 160 isFile: function (file) { 161 return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); 162 }, 163 isDirectory: function (dir) { 164 return !!dirs[path.resolve(dir)]; 165 }, 166 readFileSync: useReadPackage ? null : function (file) { 167 return files[path.resolve(file)]; 168 }, 169 realpathSync: function (file) { 170 return file; 171 } 172 }; 173 } 174 t.test('with readFile', function (st) { 175 st.plan(1); 176 177 st.equal( 178 resolve.sync('bar', opts('/foo')), 179 path.resolve('/foo/node_modules/bar/baz.js') 180 ); 181 }); 182 183 var readPackageSync = function (readFileSync, file) { 184 if (file.indexOf(path.join('bar', 'package.json')) >= 0) { 185 return { main: './something-else.js' }; 186 } else { 187 return JSON.parse(files[path.resolve(file)]); 188 } 189 }; 190 191 t.test('with readPackage', function (st) { 192 st.plan(1); 193 194 var options = opts('/foo'); 195 delete options.readFileSync; 196 options.readPackageSync = readPackageSync; 197 198 st.equal( 199 resolve.sync('bar', options), 200 path.resolve('/foo/node_modules/bar/something-else.js') 201 ); 202 }); 203 204 t.test('with readFile and readPackage', function (st) { 205 st.plan(1); 206 207 var options = opts('/foo'); 208 options.readPackageSync = readPackageSync; 209 st.throws( 210 function () { resolve.sync('bar', options); }, 211 TypeError, 212 'errors when both readFile and readPackage are provided' 213 ); 214 }); 215 }); 216