2022-05-03 15:10:13 +00:00
|
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
|
|
|
|
import * as httpm from '..'
|
|
|
|
import * as path from 'path'
|
|
|
|
import * as fs from 'fs'
|
|
|
|
|
|
|
|
const sampleFilePath: string = path.join(__dirname, 'testoutput.txt')
|
|
|
|
|
|
|
|
interface HttpBinData {
|
|
|
|
url: string
|
|
|
|
data: any
|
|
|
|
json: any
|
|
|
|
headers: any
|
|
|
|
args?: any
|
|
|
|
}
|
|
|
|
|
|
|
|
describe('basics', () => {
|
|
|
|
let _http: httpm.HttpClient
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
_http = new httpm.HttpClient('http-client-tests')
|
|
|
|
})
|
|
|
|
|
|
|
|
afterEach(() => {})
|
|
|
|
|
|
|
|
it('constructs', () => {
|
|
|
|
const http: httpm.HttpClient = new httpm.HttpClient('thttp-client-tests')
|
|
|
|
expect(http).toBeDefined()
|
|
|
|
})
|
|
|
|
|
|
|
|
// responses from httpbin return something like:
|
|
|
|
// {
|
|
|
|
// "args": {},
|
|
|
|
// "headers": {
|
|
|
|
// "Connection": "close",
|
2023-05-23 11:23:56 +00:00
|
|
|
// "Host": "postman-echo.com",
|
|
|
|
// "user-agent": "typed-test-client-tests"
|
2022-05-03 15:10:13 +00:00
|
|
|
// },
|
|
|
|
// "origin": "173.95.152.44",
|
2024-08-15 20:53:06 +00:00
|
|
|
// "url": "http://postman-echo.com/get"
|
2022-05-03 15:10:13 +00:00
|
|
|
// }
|
|
|
|
|
|
|
|
it('does basic http get request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
|
|
|
expect(obj.headers['user-agent']).toBeTruthy()
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http get request with no user agent', async () => {
|
|
|
|
const http: httpm.HttpClient = new httpm.HttpClient()
|
|
|
|
const res: httpm.HttpClientResponse = await http.get(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
|
|
|
expect(obj.headers['user-agent']).toBeFalsy()
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
2024-08-15 20:53:06 +00:00
|
|
|
/* TODO write a mock rather then relying on a third party
|
2022-05-03 15:10:13 +00:00
|
|
|
it('does basic https get request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
2024-08-15 20:53:06 +00:00
|
|
|
*/
|
2022-05-03 15:10:13 +00:00
|
|
|
it('does basic http get request with default headers', async () => {
|
|
|
|
const http: httpm.HttpClient = new httpm.HttpClient(
|
|
|
|
'http-client-tests',
|
|
|
|
[],
|
|
|
|
{
|
|
|
|
headers: {
|
|
|
|
Accept: 'application/json',
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
const res: httpm.HttpClientResponse = await http.get(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.headers.accept).toBe('application/json')
|
|
|
|
expect(obj.headers['content-type']).toBe('application/json')
|
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http get request with merged headers', async () => {
|
|
|
|
const http: httpm.HttpClient = new httpm.HttpClient(
|
|
|
|
'http-client-tests',
|
|
|
|
[],
|
|
|
|
{
|
|
|
|
headers: {
|
|
|
|
Accept: 'application/json',
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
const res: httpm.HttpClientResponse = await http.get(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/get',
|
2022-05-03 15:10:13 +00:00
|
|
|
{
|
|
|
|
'content-type': 'application/x-www-form-urlencoded'
|
|
|
|
}
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.headers.accept).toBe('application/json')
|
|
|
|
expect(obj.headers['content-type']).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
'application/x-www-form-urlencoded'
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('pipes a get request', async () => {
|
|
|
|
return new Promise<void>(async resolve => {
|
|
|
|
const file = fs.createWriteStream(sampleFilePath)
|
2024-08-15 20:53:06 +00:00
|
|
|
;(await _http.get('http://postman-echo.com/get')).message
|
2022-05-03 15:10:13 +00:00
|
|
|
.pipe(file)
|
|
|
|
.on('close', () => {
|
|
|
|
const body: string = fs.readFileSync(sampleFilePath).toString()
|
|
|
|
const obj = JSON.parse(body)
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
resolve()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic get request with redirects', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}`
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic get request with redirects (303)', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}&status_code=303`
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('returns 404 for not found get request on redirect', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://postman-echo.com/status/404'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}&status_code=303`
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(404)
|
|
|
|
await res.readBody()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('does not follow redirects if disabled', async () => {
|
|
|
|
const http: httpm.HttpClient = new httpm.HttpClient(
|
|
|
|
'typed-test-client-tests',
|
|
|
|
undefined,
|
|
|
|
{allowRedirects: false}
|
|
|
|
)
|
|
|
|
const res: httpm.HttpClientResponse = await http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}`
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(302)
|
|
|
|
await res.readBody()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('does not pass auth with diff hostname redirects', async () => {
|
|
|
|
const headers = {
|
|
|
|
accept: 'application/json',
|
|
|
|
authorization: 'shhh'
|
|
|
|
}
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://www.postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}`,
|
|
|
|
headers
|
|
|
|
)
|
|
|
|
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
|
|
|
// httpbin "fixes" the casing
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.headers[httpm.Headers.Accept]).toBe('application/json')
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(obj.headers['Authorization']).toBeUndefined()
|
|
|
|
expect(obj.headers['authorization']).toBeUndefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://www.postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does not pass Auth with diff hostname redirects', async () => {
|
|
|
|
const headers = {
|
|
|
|
Accept: 'application/json',
|
|
|
|
Authorization: 'shhh'
|
|
|
|
}
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2024-08-15 20:53:06 +00:00
|
|
|
`http://postman-echo.com/redirect-to?url=${encodeURIComponent(
|
|
|
|
'http://www.postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)}`,
|
|
|
|
headers
|
|
|
|
)
|
|
|
|
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
|
|
|
// httpbin "fixes" the casing
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.headers[httpm.Headers.Accept]).toBe('application/json')
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(obj.headers['Authorization']).toBeUndefined()
|
|
|
|
expect(obj.headers['authorization']).toBeUndefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(obj.url).toBe('http://www.postman-echo.com/get')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic head request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.head(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/get'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http delete request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.del(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/delete'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
JSON.parse(body)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http post request', async () => {
|
|
|
|
const b = 'Hello World!'
|
|
|
|
const res: httpm.HttpClientResponse = await _http.post(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/post',
|
2022-05-03 15:10:13 +00:00
|
|
|
b
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
|
|
|
expect(obj.data).toBe(b)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/post')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http patch request', async () => {
|
|
|
|
const b = 'Hello World!'
|
|
|
|
const res: httpm.HttpClientResponse = await _http.patch(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/patch',
|
2022-05-03 15:10:13 +00:00
|
|
|
b
|
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
const body: string = await res.readBody()
|
|
|
|
const obj = JSON.parse(body)
|
|
|
|
expect(obj.data).toBe(b)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(obj.url).toBe('http://postman-echo.com/patch')
|
2022-05-03 15:10:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
it('does basic http options request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.options(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(200)
|
|
|
|
await res.readBody()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('returns 404 for not found get request', async () => {
|
|
|
|
const res: httpm.HttpClientResponse = await _http.get(
|
2023-05-23 11:23:56 +00:00
|
|
|
'http://postman-echo.com/status/404'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(res.message.statusCode).toBe(404)
|
|
|
|
await res.readBody()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('gets a json object', async () => {
|
2023-05-23 11:23:56 +00:00
|
|
|
const jsonObj = await _http.getJson<HttpBinData>(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/get'
|
2023-05-23 11:23:56 +00:00
|
|
|
)
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(jsonObj.statusCode).toBe(200)
|
|
|
|
expect(jsonObj.result).toBeDefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(jsonObj.result?.url).toBe('http://postman-echo.com/get')
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(jsonObj.result?.headers[httpm.Headers.Accept]).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(jsonObj.headers['content-type']).toContain(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('getting a non existent json object returns null', async () => {
|
|
|
|
const jsonObj = await _http.getJson<HttpBinData>(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/status/404'
|
2022-05-03 15:10:13 +00:00
|
|
|
)
|
|
|
|
expect(jsonObj.statusCode).toBe(404)
|
|
|
|
expect(jsonObj.result).toBeNull()
|
|
|
|
})
|
|
|
|
|
|
|
|
it('posts a json object', async () => {
|
|
|
|
const res = {name: 'foo'}
|
|
|
|
const restRes = await _http.postJson<HttpBinData>(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/post',
|
2022-05-03 15:10:13 +00:00
|
|
|
res
|
|
|
|
)
|
|
|
|
expect(restRes.statusCode).toBe(200)
|
|
|
|
expect(restRes.result).toBeDefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(restRes.result?.url).toBe('http://postman-echo.com/post')
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(restRes.result?.json.name).toBe('foo')
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers[httpm.Headers.Accept]).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers['content-type']).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.headers['content-type']).toContain(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('puts a json object', async () => {
|
|
|
|
const res = {name: 'foo'}
|
|
|
|
const restRes = await _http.putJson<HttpBinData>(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/put',
|
2022-05-03 15:10:13 +00:00
|
|
|
res
|
|
|
|
)
|
|
|
|
expect(restRes.statusCode).toBe(200)
|
|
|
|
expect(restRes.result).toBeDefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(restRes.result?.url).toBe('http://postman-echo.com/put')
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(restRes.result?.json.name).toBe('foo')
|
|
|
|
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers[httpm.Headers.Accept]).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers['content-type']).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.headers['content-type']).toContain(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('patch a json object', async () => {
|
|
|
|
const res = {name: 'foo'}
|
|
|
|
const restRes = await _http.patchJson<HttpBinData>(
|
2024-08-15 20:53:06 +00:00
|
|
|
'http://postman-echo.com/patch',
|
2022-05-03 15:10:13 +00:00
|
|
|
res
|
|
|
|
)
|
|
|
|
expect(restRes.statusCode).toBe(200)
|
|
|
|
expect(restRes.result).toBeDefined()
|
2024-08-15 20:53:06 +00:00
|
|
|
expect(restRes.result?.url).toBe('http://postman-echo.com/patch')
|
2022-05-03 15:10:13 +00:00
|
|
|
expect(restRes.result?.json.name).toBe('foo')
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers[httpm.Headers.Accept]).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.result?.headers['content-type']).toBe(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
2023-05-23 11:23:56 +00:00
|
|
|
expect(restRes.headers['content-type']).toContain(
|
2022-05-03 15:10:13 +00:00
|
|
|
httpm.MediaTypes.ApplicationJson
|
|
|
|
)
|
|
|
|
})
|
|
|
|
})
|