rxjs-ajax-cancelable
Version:
Cancelable XMLHttpRequest library based on RxJS.
151 lines • 5.81 kB
JavaScript
import * as fetch from 'isomorphic-fetch';
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/delay';
import 'rxjs/add/operator/do';
import { AjaxCancelable } from '../index';
class Action {
constructor(request) {
this.request = request;
this.cancelable = new AjaxCancelable(request);
}
requestCancelable(request) {
return this.cancelable
.requestAjax(request)
.toPromise();
}
requestNotCancelable() {
return fetch(this.request.url || '');
}
manualCancel() {
this.cancelable.cancelAjax();
}
}
describe('', () => {
describe('Firebase test', () => {
let action;
beforeEach(() => {
action = new Action({
method: 'GET',
url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json',
crossDomain: true,
timeout: 1000 * 5,
testing: true,
});
});
it('get json', async () => {
const res = await action.requestCancelable();
expect(res.status).toBe(200);
expect(res.responseType).toBe('json');
expect(res.response).toEqual({ name: 'Jack' });
});
it('Fetch cannot cancel requests.', async () => {
const results = [];
action.requestNotCancelable()
.then(res => res.json())
.then(result => results.push(result));
await waiting(50);
action.requestNotCancelable()
.then(res => res.json())
.then(result => results.push(result));
await waiting(50);
action.requestNotCancelable()
.then(res => res.json())
.then(result => results.push(result));
await waiting(3000);
expect(results.length).toBe(3);
expect(results).toEqual([{ name: 'Jack' }, { name: 'Jack' }, { name: 'Jack' }]);
});
it('RxJS can cancel requests.', async () => {
const results = [];
action.requestCancelable()
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable()
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable()
.then(res => results.push(res.response));
await waiting(3000);
expect(results.length).toBe(1);
expect(results).toEqual([{ name: 'Jack' }]);
});
});
describe('Prioritize first test', () => {
let action;
beforeEach(() => {
action = new Action({
method: 'GET',
crossDomain: true,
timeout: 1000 * 5,
testing: true,
priorityFirst: true,
});
});
it('Prioritize the first stream.', async () => {
const results = [];
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/ted.json' })
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json' })
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json' })
.then(res => results.push(res.response));
await waiting(3000);
expect(results.length).toBe(1);
expect(results).toEqual([{ name: 'Ted' }]);
});
});
describe('Prioritize last test', () => {
let action;
beforeEach(() => {
action = new Action({
method: 'GET',
crossDomain: true,
timeout: 1000 * 5,
testing: true,
priorityFirst: false,
});
});
it('Prioritize the last stream.', async () => {
const results = [];
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json' })
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json' })
.then(res => results.push(res.response));
await waiting(50);
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/ted.json' })
.then(res => results.push(res.response));
await waiting(3000);
expect(results.length).toBe(1);
expect(results).toEqual([{ name: 'Ted' }]);
});
});
describe('cancellation', () => {
let action;
beforeEach(() => {
action = new Action({
method: 'GET',
crossDomain: true,
testing: true,
retry: 0,
});
});
it('manual cancel', async () => {
let result = { description: 'this value will be replaced by undefined.' };
action.requestCancelable({ url: 'https://rxjs-ajax-cancelable-d2228.firebaseio.com/users/jack.json' })
.then(res => result = res);
await waiting(10);
action.manualCancel();
await waiting();
expect(result).toBeUndefined();
});
});
});
function waiting(timeout = 0) {
return new Promise(resolve => setTimeout(resolve, timeout));
}
//# sourceMappingURL=firebase.test.js.map