• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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