1'use strict' 2 3const figgyPudding = require('figgy-pudding') 4const test = require('tap').test 5const tnock = require('./util/tnock.js') 6 7const OPTS = figgyPudding({ registry: {} })({ 8 registry: 'https://mock.reg/' 9}) 10 11const REG = OPTS.registry 12const REV = '72-47f2986bfd8e8b55068b204588bbf484' 13const unpub = require('../unpublish.js') 14 15test('basic test', t => { 16 const doc = { 17 _id: 'foo', 18 _rev: REV, 19 name: 'foo', 20 'dist-tags': { 21 latest: '1.0.0' 22 }, 23 versions: { 24 '1.0.0': { 25 name: 'foo', 26 dist: { 27 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 28 } 29 } 30 } 31 } 32 const srv = tnock(t, REG) 33 srv.get('/foo?write=true').reply(200, doc) 34 srv.delete(`/foo/-rev/${REV}`).reply(201) 35 return unpub('foo', OPTS).then(ret => { 36 t.ok(ret, 'foo was unpublished') 37 }) 38}) 39 40test('scoped basic test', t => { 41 const doc = { 42 _id: '@foo/bar', 43 _rev: REV, 44 name: '@foo/bar', 45 'dist-tags': { 46 latest: '1.0.0' 47 }, 48 versions: { 49 '1.0.0': { 50 name: '@foo/bar', 51 dist: { 52 tarball: `${REG}/@foo/bar/-/foo-1.0.0.tgz` 53 } 54 } 55 } 56 } 57 const srv = tnock(t, REG) 58 srv.get('/@foo%2fbar?write=true').reply(200, doc) 59 srv.delete(`/@foo%2fbar/-rev/${REV}`).reply(201) 60 return unpub('@foo/bar', OPTS).then(() => { 61 t.ok(true, 'foo was unpublished') 62 }) 63}) 64 65test('unpublish specific, last version', t => { 66 const doc = { 67 _id: 'foo', 68 _rev: REV, 69 name: 'foo', 70 'dist-tags': { 71 latest: '1.0.0' 72 }, 73 versions: { 74 '1.0.0': { 75 name: 'foo', 76 dist: { 77 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 78 } 79 } 80 } 81 } 82 const srv = tnock(t, REG) 83 srv.get('/foo?write=true').reply(200, doc) 84 srv.delete(`/foo/-rev/${REV}`).reply(201) 85 return unpub('foo@1.0.0', OPTS).then(() => { 86 t.ok(true, 'foo was unpublished') 87 }) 88}) 89 90test('unpublish specific version', t => { 91 const doc = { 92 _id: 'foo', 93 _rev: REV, 94 _revisions: [1, 2, 3], 95 _attachments: [1, 2, 3], 96 name: 'foo', 97 'dist-tags': { 98 latest: '1.0.1' 99 }, 100 versions: { 101 '1.0.0': { 102 name: 'foo', 103 dist: { 104 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 105 } 106 }, 107 '1.0.1': { 108 name: 'foo', 109 dist: { 110 tarball: `${REG}/foo/-/foo-1.0.1.tgz` 111 } 112 } 113 } 114 } 115 const postEdit = { 116 _id: 'foo', 117 _rev: REV, 118 name: 'foo', 119 'dist-tags': { 120 latest: '1.0.0' 121 }, 122 versions: { 123 '1.0.0': { 124 name: 'foo', 125 dist: { 126 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 127 } 128 } 129 } 130 } 131 132 const srv = tnock(t, REG) 133 srv.get('/foo?write=true').reply(200, doc) 134 srv.put(`/foo/-rev/${REV}`, postEdit).reply(200) 135 srv.get('/foo?write=true').reply(200, postEdit) 136 srv.delete(`/foo/-/foo-1.0.1.tgz/-rev/${REV}`).reply(200) 137 return unpub('foo@1.0.1', OPTS).then(() => { 138 t.ok(true, 'foo was unpublished') 139 }) 140}) 141 142test('404 considered a success', t => { 143 const srv = tnock(t, REG) 144 srv.get('/foo?write=true').reply(404) 145 return unpub('foo', OPTS).then(() => { 146 t.ok(true, 'foo was unpublished') 147 }) 148}) 149 150test('non-404 errors', t => { 151 const srv = tnock(t, REG) 152 srv.get('/foo?write=true').reply(500) 153 return unpub('foo', OPTS).then( 154 () => { throw new Error('should not have succeeded') }, 155 err => { t.equal(err.code, 'E500', 'got right error from server') } 156 ) 157}) 158 159test('packument with missing versions unpublishes whole thing', t => { 160 const doc = { 161 _id: 'foo', 162 _rev: REV, 163 name: 'foo', 164 'dist-tags': { 165 latest: '1.0.0' 166 } 167 } 168 const srv = tnock(t, REG) 169 srv.get('/foo?write=true').reply(200, doc) 170 srv.delete(`/foo/-rev/${REV}`).reply(201) 171 return unpub('foo@1.0.0', OPTS).then(() => { 172 t.ok(true, 'foo was unpublished') 173 }) 174}) 175 176test('packument with missing specific version assumed unpublished', t => { 177 const doc = { 178 _id: 'foo', 179 _rev: REV, 180 name: 'foo', 181 'dist-tags': { 182 latest: '1.0.0' 183 }, 184 versions: { 185 '1.0.0': { 186 name: 'foo', 187 dist: { 188 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 189 } 190 } 191 } 192 } 193 const srv = tnock(t, REG) 194 srv.get('/foo?write=true').reply(200, doc) 195 return unpub('foo@1.0.1', OPTS).then(() => { 196 t.ok(true, 'foo was unpublished') 197 }) 198}) 199 200test('unpublish specific version without dist-tag update', t => { 201 const doc = { 202 _id: 'foo', 203 _rev: REV, 204 _revisions: [1, 2, 3], 205 _attachments: [1, 2, 3], 206 name: 'foo', 207 'dist-tags': { 208 latest: '1.0.0' 209 }, 210 versions: { 211 '1.0.0': { 212 name: 'foo', 213 dist: { 214 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 215 } 216 }, 217 '1.0.1': { 218 name: 'foo', 219 dist: { 220 tarball: `${REG}/foo/-/foo-1.0.1.tgz` 221 } 222 } 223 } 224 } 225 const postEdit = { 226 _id: 'foo', 227 _rev: REV, 228 name: 'foo', 229 'dist-tags': { 230 latest: '1.0.0' 231 }, 232 versions: { 233 '1.0.0': { 234 name: 'foo', 235 dist: { 236 tarball: `${REG}/foo/-/foo-1.0.0.tgz` 237 } 238 } 239 } 240 } 241 const srv = tnock(t, REG) 242 srv.get('/foo?write=true').reply(200, doc) 243 srv.put(`/foo/-rev/${REV}`, postEdit).reply(200) 244 srv.get('/foo?write=true').reply(200, postEdit) 245 srv.delete(`/foo/-/foo-1.0.1.tgz/-rev/${REV}`).reply(200) 246 return unpub('foo@1.0.1', OPTS).then(() => { 247 t.ok(true, 'foo was unpublished') 248 }) 249}) 250