blessing-skin-server/resources/assets/tests/js/net.test.js
2018-09-11 23:29:02 +08:00

118 lines
3.4 KiB
JavaScript

import * as net from '@/js/net';
import { on } from '@/js/event';
import { showAjaxError } from '@/js/notify';
jest.mock('@/js/notify');
window.Request = function Request(url, init) {
this.url = url;
Object.keys(init).forEach(key => this[key] = init[key]);
this.headers = new Map(Object.entries(init.headers));
};
test('the GET method', async () => {
const json = jest.fn().mockResolvedValue({});
window.fetch = jest.fn().mockResolvedValue({
ok: true,
json,
headers: new Map([['Content-Type', 'application/json']])
});
const stub = jest.fn();
on('beforeFetch', stub);
await net.get('/abc', { a: 'b' });
expect(stub).toBeCalledWith({
method: 'GET',
url: '/abc',
data: { a: 'b' }
});
expect(window.fetch.mock.calls[0][0].url).toBe('/abc?a=b');
expect(json).toBeCalled();
await net.get('/abc');
expect(window.fetch.mock.calls[1][0].url).toBe('/abc');
});
test('the POST method', async () => {
window.fetch = jest.fn()
.mockResolvedValue({
ok: true,
json: () => Promise.resolve({}),
headers: new Map([['Content-Type', 'application/json']])
});
const meta = document.createElement('meta');
meta.name = 'csrf-token';
meta.content = 'token';
document.head.appendChild(meta);
const stub = jest.fn();
on('beforeFetch', stub);
const formData = new FormData();
await net.post('/abc', formData);
expect(stub).toBeCalledWith({
method: 'POST',
url: '/abc',
data: formData
});
await net.post('/abc', { a: 'b' });
expect(stub).toBeCalledWith({
method: 'POST',
url: '/abc',
data: { a: 'b' }
});
const request = window.fetch.mock.calls[1][0];
expect(request.url).toBe('/abc');
expect(request.method).toBe('POST');
expect(request.body).toBe(JSON.stringify({ a: 'b' }));
expect(request.headers.get('X-CSRF-TOKEN')).toBe('token');
expect(request.headers.get('Content-Type')).toBe('application/json');
await net.post('/abc');
expect(window.fetch.mock.calls[2][0].body).toBe('{}');
});
test('low level fetch', async () => {
const json = jest.fn().mockResolvedValue({});
window.fetch = jest.fn()
.mockRejectedValueOnce(new Error('network'))
.mockResolvedValueOnce({
ok: false,
text: () => Promise.resolve('404'),
clone: () => ({})
})
.mockResolvedValueOnce({
ok: true,
json,
headers: new Map([['Content-Type', 'application/json']])
})
.mockResolvedValueOnce({
ok: true,
headers: new Map(),
text: () => Promise.resolve('text')
});
const request = { headers: new Map() };
const stub = jest.fn();
on('fetchError', stub);
await net.walkFetch(request);
expect(showAjaxError.mock.calls[0][0]).toBeInstanceOf(Error);
expect(showAjaxError.mock.calls[0][0]).toHaveProperty('message', 'network');
expect(stub).toBeCalledWith(expect.any(Error));
await net.walkFetch(request);
expect(showAjaxError.mock.calls[1][0]).toBeInstanceOf(Error);
expect(stub.mock.calls[1][0]).toHaveProperty('message', '404');
expect(stub.mock.calls[1][0]).toHaveProperty('response');
await net.walkFetch(request);
expect(json).toBeCalled();
expect(await net.walkFetch(request)).toBe('text');
});