1'use strict' 2 3const common = require('../common-tap.js') 4const test = require('tap').test 5 6test('hook add', (t) => { 7 let body 8 return common.withServer(server => { 9 server.filteringRequestBody(bod => { 10 body = JSON.parse(bod) 11 t.deepEqual(body, { 12 type: 'owner', 13 name: 'zkat', 14 endpoint: 'https://example.com', 15 secret: 'sekrit' 16 }, 'request sent correct body') 17 return true 18 }) 19 .post('/-/npm/v1/hooks/hook', true) 20 .reply(201, { 21 name: 'zkat', 22 type: 'owner', 23 endpoint: 'https://example.com' 24 }) 25 return common.npm([ 26 'hook', 'add', '~zkat', 'https://example.com', 'sekrit', 27 '--registry', server.registry 28 ], {}).then(([code, stdout, stderr]) => { 29 t.comment(stdout) 30 t.comment(stderr) 31 t.equal(code, 0, 'exited successfully') 32 t.match( 33 stdout.trim(), 34 /^\+ ~zkat.*https:\/\/example\.com$/, 35 'output info about new hook' 36 ) 37 }) 38 }) 39}) 40 41test('hook add --json', (t) => { 42 return common.withServer(server => { 43 server 44 .filteringRequestBody(() => true) 45 .post('/-/npm/v1/hooks/hook', true) 46 .reply(201, { 47 name: 'npm', 48 type: 'scope', 49 endpoint: 'https://example.com' 50 }) 51 return common.npm([ 52 'hook', 'add', '~zkat', 'https://example.com', 'sekrit', 53 '--json', 54 '--registry', server.registry 55 ], {}).then(([code, stdout, stderr]) => { 56 t.comment(stdout) 57 t.comment(stderr) 58 t.equal(code, 0, 'exited successfully') 59 t.deepEqual(JSON.parse(stdout), { 60 name: 'npm', 61 type: 'scope', 62 endpoint: 'https://example.com' 63 }, 'json response data returned') 64 }) 65 }) 66}) 67 68test('hook rm', t => { 69 return common.withServer(server => { 70 server 71 .delete('/-/npm/v1/hooks/hook/dead%40beef') 72 .reply(200, { 73 name: 'zkat', 74 type: 'owner', 75 endpoint: 'https://example.com', 76 secret: 'sekrit' 77 }) 78 return common.npm([ 79 'hook', 'rm', 'dead@beef', 80 '--registry', server.registry 81 ], {}).then(([code, stdout, stderr]) => { 82 t.comment(stdout) 83 t.comment(stderr) 84 t.equal(code, 0, 'exited successfully') 85 t.match( 86 stdout.trim(), 87 /^- ~zkat.*https:\/\/example\.com$/, 88 'output info about new hook' 89 ) 90 }) 91 }) 92}) 93 94test('hook rm --json', t => { 95 return common.withServer(server => { 96 server 97 .delete('/-/npm/v1/hooks/hook/dead%40beef') 98 .reply(200, { 99 name: 'zkat', 100 type: 'owner', 101 endpoint: 'https://example.com', 102 secret: 'sekrit' 103 }) 104 return common.npm([ 105 'hook', 'rm', 'dead@beef', 106 '--json', 107 '--registry', server.registry 108 ], {}).then(([code, stdout, stderr]) => { 109 t.comment(stdout) 110 t.comment(stderr) 111 t.equal(code, 0, 'exited successfully') 112 t.deepEqual(JSON.parse(stdout), { 113 name: 'zkat', 114 type: 'owner', 115 endpoint: 'https://example.com', 116 secret: 'sekrit' 117 }, 'json response data returned') 118 }) 119 }) 120}) 121 122test('hook ls', t => { 123 const objects = [ 124 {id: 'foo', type: 'package', name: '@foo/pkg', endpoint: 'foo.com'}, 125 {id: 'bar', type: 'owner', name: 'bar', endpoint: 'bar.com'}, 126 {id: 'baz', type: 'scope', name: 'baz', endpoint: 'baz.com'} 127 ] 128 return common.withServer(server => { 129 server 130 .get('/-/npm/v1/hooks?package=%40npm%2Fhooks') 131 .reply(200, {objects}) 132 return common.npm([ 133 'hook', 'ls', '@npm/hooks', 134 '--registry', server.registry 135 ], {}).then(([code, stdout, stderr]) => { 136 t.comment(stdout) 137 t.comment(stderr) 138 t.equal(code, 0, 'exited successfully') 139 t.match( 140 stdout, 141 /You have 3 hooks configured/, 142 'message about hook count' 143 ) 144 t.match( 145 stdout, 146 /foo\s+.*\s+@foo\/pkg\s+.*\s+foo\.com/, 147 'package displayed as expected' 148 ) 149 t.match( 150 stdout, 151 /bar\s+.*\s+~bar\s+.*\s+bar\.com/, 152 'owner displayed as expected' 153 ) 154 t.match( 155 stdout, 156 /baz\s+.*\s+@baz\s+.*\s+baz\.com/, 157 'scope displayed as expected' 158 ) 159 }) 160 }) 161}) 162 163test('hook ls --json', t => { 164 const objects = [ 165 {id: 'foo'}, 166 {id: 'bar'}, 167 {id: 'baz'} 168 ] 169 return common.withServer(server => { 170 server 171 .get('/-/npm/v1/hooks?package=%40npm%2Fhooks') 172 .reply(200, {objects}) 173 return common.npm([ 174 'hook', 'ls', '@npm/hooks', 175 '--json', 176 '--registry', server.registry 177 ], {}).then(([code, stdout, stderr]) => { 178 t.comment(stdout) 179 t.comment(stderr) 180 t.equal(code, 0, 'exited successfully') 181 t.deepEqual(JSON.parse(stdout), objects, 'objects output as json') 182 }) 183 }) 184}) 185 186test('hook update', t => { 187 return common.withServer(server => { 188 server.filteringRequestBody(() => true) 189 .put('/-/npm/v1/hooks/hook/dead%40beef', true) 190 .reply(200, { 191 type: 'scope', 192 name: 'npm', 193 endpoint: 'https://example.com', 194 secret: 'sekrit' 195 }) 196 return common.npm([ 197 'hook', 'update', 'dead@beef', 'https://example.com', 'sekrit', 198 '--registry', server.registry 199 ], {}).then(([code, stdout, stderr]) => { 200 t.comment(stdout) 201 t.comment(stderr) 202 t.equal(code, 0, 'exited successfully') 203 t.match( 204 stdout.trim(), 205 /^\+ @npm\s+.*\s+https:\/\/example\.com$/, 206 'output info about updated hook' 207 ) 208 }) 209 }) 210}) 211 212test('hook update --json', t => { 213 let body 214 return common.withServer(server => { 215 server.filteringRequestBody(bod => { 216 body = JSON.parse(bod) 217 t.deepEqual(body, { 218 endpoint: 'https://example.com', 219 secret: 'sekrit' 220 }, 'request sent correct body') 221 return true 222 }) 223 .put('/-/npm/v1/hooks/hook/dead%40beef', true) 224 .reply(200, { 225 endpoint: 'https://example.com', 226 secret: 'sekrit' 227 }) 228 return common.npm([ 229 'hook', 'update', 'dead@beef', 'https://example.com', 'sekrit', 230 '--json', 231 '--registry', server.registry 232 ], {}).then(([code, stdout, stderr]) => { 233 t.comment(stdout) 234 t.comment(stderr) 235 t.equal(code, 0, 'exited successfully') 236 const json = JSON.parse(stdout) 237 t.deepEqual(json, { 238 endpoint: 'https://example.com', 239 secret: 'sekrit' 240 }, 'json response data returned') 241 }) 242 }) 243}) 244