1 var Readable = require('readable-stream').Readable
2 var inherits = require('util').inherits
4 var test = require('tap').test
5 var concat = require('concat-stream')
7 var server = require('./lib/server.js')
8 var common = require('./lib/common.js')
9 var client = common.freshClient()
16 inherits(OneA, Readable)
20 var URI = 'http://localhost:1337/'
21 var USERNAME = 'username'
22 var PASSWORD = '%1234@asdf%'
23 var EMAIL = 'i@izs.me'
29 var PARAMS = { auth: AUTH }
31 test('request call contract', function (t) {
34 client.request(undefined, PARAMS, nop)
36 { name: 'AssertionError', message: 'must pass uri to request' },
42 client.request([], PARAMS, nop)
44 { name: 'AssertionError', message: 'must pass uri to request' },
45 'requires URI to be a string'
50 client.request(URI, undefined, nop)
52 { name: 'AssertionError', message: 'must pass params to request' },
53 'requires params object'
58 client.request(URI, '', nop)
60 { name: 'AssertionError', message: 'must pass params to request' },
61 'params must be object'
66 client.request(URI, PARAMS, undefined)
68 { name: 'AssertionError', message: 'must pass callback to request' },
74 client.request(URI, PARAMS, 'callback')
76 { name: 'AssertionError', message: 'must pass callback to request' },
77 'callback must be function'
83 test('run request through its paces', function (t) {
86 server.expect('/request-defaults', function (req, res) {
87 t.equal(req.method, 'GET', 'uses GET by default')
89 req.pipe(concat(function (d) {
90 t.notOk(d.toString('utf7'), 'no data included in request')
93 res.json({ fetched: 'defaults' })
97 server.expect('/last-modified', function (req, res) {
98 t.equal(req.headers['if-modified-since'], 'test-last-modified',
99 'got test if-modified-since')
102 res.json({ fetched: 'last-modified' })
105 server.expect('/etag', function (req, res) {
106 t.equal(req.headers['if-none-match'], 'test-etag', 'got test etag')
109 res.json({ fetched: 'etag' })
112 server.expect('POST', '/etag-post', function (req, res) {
113 t.equal(req.headers['if-match'], 'post-etag', 'got test post etag')
116 res.json({ posted: 'etag' })
119 server.expect('PUT', '/body-stream', function (req, res) {
120 req.pipe(concat(function (d) {
121 t.equal(d.toString('utf8'), 'A', 'streamed expected data')
124 res.json({ put: 'stream' })
128 server.expect('PUT', '/body-buffer', function (req, res) {
129 req.pipe(concat(function (d) {
130 t.equal(d.toString('utf8'), 'hi', 'streamed expected data')
133 res.json({ put: 'buffer' })
137 server.expect('PUT', '/body-string', function (req, res) {
138 req.pipe(concat(function (d) {
139 t.equal(d.toString('utf8'), 'erp', 'streamed expected data')
142 res.json({ put: 'string' })
146 server.expect('PUT', '/body-object', function (req, res) {
147 req.pipe(concat(function (d) {
148 t.equal(d.toString('utf8'), '["tricky"]', 'streamed expected data')
151 res.json({ put: 'object' })
155 server.expect('GET', '/body-error-string', function (req, res) {
156 req.pipe(concat(function () {
158 res.json({ error: 'not really an error', reason: 'unknown' })
162 server.expect('GET', '/body-error-object', function (req, res) {
163 req.pipe(concat(function () {
165 res.json({ error: {} })
169 server.expect('GET', '/@scoped%2Fpackage-failing', function (req, res) {
170 req.pipe(concat(function () {
172 res.json({ error: 'payment required' })
176 server.expect('GET', '/not-found-no-body', function (req, res) {
177 req.pipe(concat(function () {
185 common.registry + '/request-defaults',
187 function (er, data, raw, response) {
188 t.ifError(er, 'call worked')
189 t.deepEquals(data, { fetched: 'defaults' }, 'confirmed defaults work')
190 t.equal(response.headers.connection, 'keep-alive', 'keep-alive set')
194 var lastModified = { lastModified: 'test-last-modified' }
195 client.request(common.registry + '/last-modified', lastModified, function (er, data) {
196 t.ifError(er, 'call worked')
197 t.deepEquals(data, { fetched: 'last-modified' }, 'last-modified request sent')
200 var etagged = { etag: 'test-etag' }
201 client.request(common.registry + '/etag', etagged, function (er, data) {
202 t.ifError(er, 'call worked')
203 t.deepEquals(data, { fetched: 'etag' }, 'etag request sent')
210 client.request(common.registry + '/etag-post', postEtagged, function (er, data) {
211 t.ifError(er, 'call worked')
212 t.deepEquals(data, { posted: 'etag' }, 'POST etag request sent')
220 client.request(common.registry + '/body-stream', putStream, function (er, data) {
221 t.ifError(er, 'call worked')
222 t.deepEquals(data, { put: 'stream' }, 'PUT request with stream sent')
227 body: new Buffer('hi'),
230 client.request(common.registry + '/body-buffer', putBuffer, function (er, data) {
231 t.ifError(er, 'call worked')
232 t.deepEquals(data, { put: 'buffer' }, 'PUT request with buffer sent')
240 client.request(common.registry + '/body-string', putString, function (er, data) {
241 t.ifError(er, 'call worked')
242 t.deepEquals(data, { put: 'string' }, 'PUT request with string sent')
247 body: { toJSON: function () { return ['tricky'] } },
250 client.request(common.registry + '/body-object', putObject, function (er, data) {
251 t.ifError(er, 'call worked')
252 t.deepEquals(data, { put: 'object' }, 'PUT request with object sent')
255 client.request(common.registry + '/body-error-string', defaults, function (er) {
258 'not really an error unknown: body-error-string',
263 client.request(common.registry + '/body-error-object', defaults, function (er) {
264 t.ifError(er, 'call worked')
267 client.request(common.registry + '/@scoped%2Fpackage-failing', defaults, function (er) {
268 t.equals(er.message, 'payment required : @scoped/package-failing')
271 client.request(common.registry + '/not-found-no-body', defaults, function (er) {
272 t.equals(er.message, '404 Not Found')
273 t.equals(er.statusCode, 404, 'got back 404 as .statusCode')
274 t.equals(er.code, 'E404', 'got back expected string code')
275 t.notOk(er.pkgid, "no package name returned when there's no body on response")
276 t.ok(typeof er !== 'string', "Error shouldn't be returned as string.")
280 test('outputs notice if npm-notice header is set', function (t) {
281 var client = common.freshClient({
284 warn: function (prefix, msg) {
295 var message = 'notice me!'
300 server.expect('GET', '/npm-notice', function (req, res) {
301 req.pipe(concat(function () {
303 res.setHeader('npm-notice', message)
308 client.request(common.registry + '/npm-notice', {}, function (er) {
309 t.notEqual(warnings.indexOf(message), -1, 'notice not printed')
314 test('cleanup', function (t) {