2015-04-29 02:07:55 -04:00
|
|
|
import {
|
|
|
|
AsyncTestCompleter,
|
2015-06-24 03:27:07 -04:00
|
|
|
afterEach,
|
2015-04-29 02:07:55 -04:00
|
|
|
beforeEach,
|
|
|
|
ddescribe,
|
|
|
|
describe,
|
|
|
|
expect,
|
|
|
|
iit,
|
|
|
|
inject,
|
|
|
|
it,
|
|
|
|
xit,
|
|
|
|
SpyObject
|
|
|
|
} from 'angular2/test_lib';
|
2015-06-24 03:27:07 -04:00
|
|
|
import {ObservableWrapper} from 'angular2/src/facade/async';
|
|
|
|
import {BrowserXhr} from 'angular2/src/http/backends/browser_xhr';
|
2015-04-29 02:07:55 -04:00
|
|
|
import {XHRConnection, XHRBackend} from 'angular2/src/http/backends/xhr_backend';
|
|
|
|
import {bind, Injector} from 'angular2/di';
|
|
|
|
import {Request} from 'angular2/src/http/static_request';
|
2015-07-07 23:03:00 -04:00
|
|
|
import {Response} from 'angular2/src/http/static_response';
|
2015-07-01 18:20:09 -04:00
|
|
|
import {Headers} from 'angular2/src/http/headers';
|
2015-06-24 03:27:07 -04:00
|
|
|
import {Map} from 'angular2/src/facade/collection';
|
|
|
|
import {RequestOptions, BaseRequestOptions} from 'angular2/src/http/base_request_options';
|
|
|
|
import {BaseResponseOptions, ResponseOptions} from 'angular2/src/http/base_response_options';
|
|
|
|
import {ResponseTypes} from 'angular2/src/http/enums';
|
2015-04-29 02:07:55 -04:00
|
|
|
|
|
|
|
var abortSpy;
|
|
|
|
var sendSpy;
|
|
|
|
var openSpy;
|
2015-07-01 18:20:09 -04:00
|
|
|
var setRequestHeaderSpy;
|
2015-04-29 02:07:55 -04:00
|
|
|
var addEventListenerSpy;
|
2015-06-24 03:27:07 -04:00
|
|
|
var existingXHRs = [];
|
2015-07-07 23:03:00 -04:00
|
|
|
var unused: Response;
|
2015-04-29 02:07:55 -04:00
|
|
|
|
2015-06-24 03:27:07 -04:00
|
|
|
class MockBrowserXHR extends BrowserXhr {
|
2015-04-29 02:07:55 -04:00
|
|
|
abort: any;
|
|
|
|
send: any;
|
|
|
|
open: any;
|
|
|
|
response: any;
|
|
|
|
responseText: string;
|
2015-07-01 18:20:09 -04:00
|
|
|
setRequestHeader: any;
|
2015-06-24 03:27:07 -04:00
|
|
|
callbacks: Map<string, Function>;
|
2015-07-05 04:58:37 -04:00
|
|
|
status: number;
|
2015-04-29 02:07:55 -04:00
|
|
|
constructor() {
|
|
|
|
super();
|
2015-06-19 15:14:12 -04:00
|
|
|
var spy = new SpyObject();
|
|
|
|
this.abort = abortSpy = spy.spy('abort');
|
|
|
|
this.send = sendSpy = spy.spy('send');
|
|
|
|
this.open = openSpy = spy.spy('open');
|
2015-07-01 18:20:09 -04:00
|
|
|
this.setRequestHeader = setRequestHeaderSpy = spy.spy('setRequestHeader');
|
2015-06-24 03:27:07 -04:00
|
|
|
this.callbacks = new Map();
|
2015-04-29 02:07:55 -04:00
|
|
|
}
|
2015-06-19 15:14:12 -04:00
|
|
|
|
2015-07-05 04:58:37 -04:00
|
|
|
setStatusCode(status) { this.status = status; }
|
2015-06-24 03:27:07 -04:00
|
|
|
addEventListener(type: string, cb: Function) { this.callbacks.set(type, cb); }
|
|
|
|
|
|
|
|
dispatchEvent(type: string) { this.callbacks.get(type)({}); }
|
|
|
|
|
|
|
|
build() {
|
|
|
|
var xhr = new MockBrowserXHR();
|
|
|
|
existingXHRs.push(xhr);
|
|
|
|
return xhr;
|
|
|
|
}
|
2015-04-29 02:07:55 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
export function main() {
|
|
|
|
describe('XHRBackend', () => {
|
|
|
|
var backend;
|
|
|
|
var sampleRequest;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2015-06-24 03:27:07 -04:00
|
|
|
var injector = Injector.resolveAndCreate([
|
|
|
|
bind(ResponseOptions)
|
|
|
|
.toClass(BaseResponseOptions),
|
|
|
|
bind(BrowserXhr).toClass(MockBrowserXHR),
|
|
|
|
XHRBackend
|
|
|
|
]);
|
2015-04-29 02:07:55 -04:00
|
|
|
backend = injector.get(XHRBackend);
|
2015-06-24 03:27:07 -04:00
|
|
|
var base = new BaseRequestOptions();
|
|
|
|
sampleRequest = new Request(base.merge(new RequestOptions({url: 'https://google.com'})));
|
2015-04-29 02:07:55 -04:00
|
|
|
});
|
|
|
|
|
2015-06-24 03:27:07 -04:00
|
|
|
afterEach(() => { existingXHRs = []; });
|
|
|
|
|
2015-04-29 02:07:55 -04:00
|
|
|
it('should create a connection',
|
|
|
|
() => { expect(() => backend.createConnection(sampleRequest)).not.toThrow(); });
|
|
|
|
|
|
|
|
|
|
|
|
describe('XHRConnection', () => {
|
2015-06-24 03:27:07 -04:00
|
|
|
it('should use the injected BaseResponseOptions to create the response',
|
|
|
|
inject([AsyncTestCompleter], async => {
|
|
|
|
var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(),
|
|
|
|
new ResponseOptions({type: ResponseTypes.Error}));
|
2015-07-07 23:03:00 -04:00
|
|
|
ObservableWrapper.subscribe<Response>(connection.response, res => {
|
2015-06-24 03:27:07 -04:00
|
|
|
expect(res.type).toBe(ResponseTypes.Error);
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
existingXHRs[0].dispatchEvent('load');
|
|
|
|
}));
|
|
|
|
|
2015-07-27 19:59:09 -04:00
|
|
|
it('should complete a request', inject([AsyncTestCompleter], async => {
|
|
|
|
var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(),
|
|
|
|
new ResponseOptions({type: ResponseTypes.Error}));
|
|
|
|
ObservableWrapper.subscribe<Response>(connection.response, res => {
|
|
|
|
expect(res.type).toBe(ResponseTypes.Error);
|
|
|
|
}, null, () => { async.done(); });
|
|
|
|
|
|
|
|
existingXHRs[0].dispatchEvent('load');
|
|
|
|
}));
|
|
|
|
|
2015-04-29 02:07:55 -04:00
|
|
|
it('should call abort when disposed', () => {
|
2015-06-19 15:14:12 -04:00
|
|
|
var connection = new XHRConnection(sampleRequest, new MockBrowserXHR());
|
2015-04-29 02:07:55 -04:00
|
|
|
connection.dispose();
|
|
|
|
expect(abortSpy).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('should automatically call open with method and url', () => {
|
2015-06-19 15:14:12 -04:00
|
|
|
new XHRConnection(sampleRequest, new MockBrowserXHR());
|
2015-04-29 02:07:55 -04:00
|
|
|
expect(openSpy).toHaveBeenCalledWith('GET', sampleRequest.url);
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('should automatically call send on the backend with request body', () => {
|
|
|
|
var body = 'Some body to love';
|
2015-06-24 03:27:07 -04:00
|
|
|
var base = new BaseRequestOptions();
|
|
|
|
new XHRConnection(new Request(base.merge(new RequestOptions({body: body}))),
|
|
|
|
new MockBrowserXHR());
|
2015-04-29 02:07:55 -04:00
|
|
|
expect(sendSpy).toHaveBeenCalledWith(body);
|
|
|
|
});
|
2015-07-01 18:20:09 -04:00
|
|
|
|
|
|
|
it('should attach headers to the request', () => {
|
|
|
|
var headers = new Headers({'Content-Type': 'text/xml', 'Breaking-Bad': '<3'});
|
|
|
|
|
|
|
|
var base = new BaseRequestOptions();
|
|
|
|
new XHRConnection(new Request(base.merge(new RequestOptions({headers: headers}))),
|
|
|
|
new MockBrowserXHR());
|
|
|
|
expect(setRequestHeaderSpy).toHaveBeenCalledWith('Content-Type', ['text/xml']);
|
|
|
|
expect(setRequestHeaderSpy).toHaveBeenCalledWith('Breaking-Bad', ['<3']);
|
|
|
|
});
|
2015-07-05 04:58:37 -04:00
|
|
|
|
|
|
|
it('should return the correct status code', inject([AsyncTestCompleter], async => {
|
|
|
|
var statusCode = 418;
|
|
|
|
var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(),
|
|
|
|
new ResponseOptions({status: statusCode}));
|
|
|
|
|
|
|
|
ObservableWrapper.subscribe(connection.response, res => {
|
|
|
|
expect(res.status).toBe(statusCode);
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
|
|
|
|
existingXHRs[0].setStatusCode(statusCode);
|
|
|
|
existingXHRs[0].dispatchEvent('load');
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should normalize IE\'s 1223 status code into 204', inject([AsyncTestCompleter], async => {
|
|
|
|
var statusCode = 1223;
|
|
|
|
var normalizedCode = 204;
|
|
|
|
var connection = new XHRConnection(sampleRequest, new MockBrowserXHR(),
|
|
|
|
new ResponseOptions({status: statusCode}));
|
|
|
|
|
|
|
|
ObservableWrapper.subscribe(connection.response, res => {
|
|
|
|
expect(res.status).toBe(normalizedCode);
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
|
|
|
|
existingXHRs[0].setStatusCode(statusCode);
|
|
|
|
existingXHRs[0].dispatchEvent('load');
|
|
|
|
}));
|
2015-04-29 02:07:55 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|