summaryrefslogtreecommitdiffstats
path: root/test/node-fetch/response.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/node-fetch/response.js')
-rw-r--r--test/node-fetch/response.js251
1 files changed, 251 insertions, 0 deletions
diff --git a/test/node-fetch/response.js b/test/node-fetch/response.js
new file mode 100644
index 0000000..4bb7c42
--- /dev/null
+++ b/test/node-fetch/response.js
@@ -0,0 +1,251 @@
+/* eslint no-unused-expressions: "off" */
+
+const chai = require('chai')
+const stream = require('stream')
+const { Response } = require('../../lib/fetch/response.js')
+const TestServer = require('./utils/server.js')
+const { Blob } = require('buffer')
+const { kState } = require('../../lib/fetch/symbols.js')
+
+const { expect } = chai
+
+describe('Response', () => {
+ const local = new TestServer()
+ let base
+
+ before(async () => {
+ await local.start()
+ base = `http://${local.hostname}:${local.port}/`
+ })
+
+ after(async () => {
+ return local.stop()
+ })
+
+ it('should have attributes conforming to Web IDL', () => {
+ const res = new Response()
+ const enumerableProperties = []
+ for (const property in res) {
+ enumerableProperties.push(property)
+ }
+
+ for (const toCheck of [
+ 'body',
+ 'bodyUsed',
+ 'arrayBuffer',
+ 'blob',
+ 'json',
+ 'text',
+ 'type',
+ 'url',
+ 'status',
+ 'ok',
+ 'redirected',
+ 'statusText',
+ 'headers',
+ 'clone'
+ ]) {
+ expect(enumerableProperties).to.contain(toCheck)
+ }
+
+ // TODO
+ // for (const toCheck of [
+ // 'body',
+ // 'bodyUsed',
+ // 'type',
+ // 'url',
+ // 'status',
+ // 'ok',
+ // 'redirected',
+ // 'statusText',
+ // 'headers'
+ // ]) {
+ // expect(() => {
+ // res[toCheck] = 'abc'
+ // }).to.throw()
+ // }
+ })
+
+ it('should support empty options', () => {
+ const res = new Response(stream.Readable.from('a=1'))
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support parsing headers', () => {
+ const res = new Response(null, {
+ headers: {
+ a: '1'
+ }
+ })
+ expect(res.headers.get('a')).to.equal('1')
+ })
+
+ it('should support text() method', () => {
+ const res = new Response('a=1')
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support json() method', () => {
+ const res = new Response('{"a":1}')
+ return res.json().then(result => {
+ expect(result.a).to.equal(1)
+ })
+ })
+
+ if (Blob) {
+ it('should support blob() method', () => {
+ const res = new Response('a=1', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ })
+ return res.blob().then(result => {
+ expect(result).to.be.an.instanceOf(Blob)
+ expect(result.size).to.equal(3)
+ expect(result.type).to.equal('text/plain')
+ })
+ })
+ }
+
+ it('should support clone() method', () => {
+ const body = stream.Readable.from('a=1')
+ const res = new Response(body, {
+ headers: {
+ a: '1'
+ },
+ status: 346,
+ statusText: 'production'
+ })
+ res[kState].urlList = [new URL(base)]
+ const cl = res.clone()
+ expect(cl.headers.get('a')).to.equal('1')
+ expect(cl.type).to.equal('default')
+ expect(cl.url).to.equal(base)
+ expect(cl.status).to.equal(346)
+ expect(cl.statusText).to.equal('production')
+ expect(cl.ok).to.be.false
+ // Clone body shouldn't be the same body
+ expect(cl.body).to.not.equal(body)
+ return Promise.all([cl.text(), res.text()]).then(results => {
+ expect(results[0]).to.equal('a=1')
+ expect(results[1]).to.equal('a=1')
+ })
+ })
+
+ it('should support stream as body', () => {
+ const body = stream.Readable.from('a=1')
+ const res = new Response(body)
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support string as body', () => {
+ const res = new Response('a=1')
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support buffer as body', () => {
+ const res = new Response(Buffer.from('a=1'))
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support ArrayBuffer as body', () => {
+ const encoder = new TextEncoder()
+ const fullbuffer = encoder.encode('a=12345678901234').buffer
+ const res = new Response(fullbuffer)
+ new Uint8Array(fullbuffer)[0] = 0
+ return res.text().then(result => {
+ expect(result).to.equal('a=12345678901234')
+ })
+ })
+
+ it('should support blob as body', async () => {
+ const res = new Response(new Blob(['a=1']))
+ return res.text().then(result => {
+ expect(result).to.equal('a=1')
+ })
+ })
+
+ it('should support Uint8Array as body', () => {
+ const encoder = new TextEncoder()
+ const fullbuffer = encoder.encode('a=12345678901234').buffer
+ const body = new Uint8Array(fullbuffer, 2, 9)
+ const res = new Response(body)
+ body[0] = 0
+ return res.text().then(result => {
+ expect(result).to.equal('123456789')
+ })
+ })
+
+ it('should support BigUint64Array as body', () => {
+ const encoder = new TextEncoder()
+ const fullbuffer = encoder.encode('a=12345678901234').buffer
+ const body = new BigUint64Array(fullbuffer, 8, 1)
+ const res = new Response(body)
+ body[0] = 0n
+ return res.text().then(result => {
+ expect(result).to.equal('78901234')
+ })
+ })
+
+ it('should support DataView as body', () => {
+ const encoder = new TextEncoder()
+ const fullbuffer = encoder.encode('a=12345678901234').buffer
+ const body = new Uint8Array(fullbuffer, 2, 9)
+ const res = new Response(body)
+ body[0] = 0
+ return res.text().then(result => {
+ expect(result).to.equal('123456789')
+ })
+ })
+
+ it('should default to null as body', () => {
+ const res = new Response()
+ expect(res.body).to.equal(null)
+
+ return res.text().then(result => expect(result).to.equal(''))
+ })
+
+ it('should default to 200 as status code', () => {
+ const res = new Response(null)
+ expect(res.status).to.equal(200)
+ })
+
+ it('should default to empty string as url', () => {
+ const res = new Response()
+ expect(res.url).to.equal('')
+ })
+
+ it('should support error() static method', () => {
+ const res = Response.error()
+ expect(res).to.be.an.instanceof(Response)
+ expect(res.type).to.equal('error')
+ expect(res.status).to.equal(0)
+ expect(res.statusText).to.equal('')
+ })
+
+ it('should support undefined status', () => {
+ const res = new Response(null, { status: undefined })
+ expect(res.status).to.equal(200)
+ })
+
+ it('should support undefined statusText', () => {
+ const res = new Response(null, { statusText: undefined })
+ expect(res.statusText).to.equal('')
+ })
+
+ it('should not set bodyUsed to undefined', () => {
+ const res = new Response()
+ expect(res.bodyUsed).to.be.false
+ })
+})