From 93596dff3fc6b9e9e60a7be27d3b1375154a50c2 Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Fri, 12 Jun 2015 21:50:19 -0700 Subject: [PATCH] feat(BaseRequestOptions): add merge method to make copies of options --- .../angular2/src/http/base_request_options.ts | 29 ++++++++++++----- .../test/http/base_request_options_spec.ts | 32 +++++++++++++++++++ 2 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 modules/angular2/test/http/base_request_options_spec.ts diff --git a/modules/angular2/src/http/base_request_options.ts b/modules/angular2/src/http/base_request_options.ts index 77b0165cde..602865b639 100644 --- a/modules/angular2/src/http/base_request_options.ts +++ b/modules/angular2/src/http/base_request_options.ts @@ -1,21 +1,34 @@ -import {CONST_EXPR, CONST} from 'angular2/src/facade/lang'; +import {CONST_EXPR, CONST, isPresent} from 'angular2/src/facade/lang'; import {Headers} from './headers'; import {URLSearchParams} from './url_search_params'; import {RequestModesOpts, RequestMethods, RequestCacheOpts, RequestCredentialsOpts} from './enums'; import {RequestOptions} from './interfaces'; import {Injectable} from 'angular2/di'; +import {ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection'; -@Injectable() -export class BaseRequestOptions implements RequestOptions { - method: RequestMethods; +export class RequestOptionsClass { + method: RequestMethods = RequestMethods.GET; headers: Headers; body: URLSearchParams | FormData | string; - mode: RequestModesOpts; + mode: RequestModesOpts = RequestModesOpts.Cors; credentials: RequestCredentialsOpts; cache: RequestCacheOpts; + constructor({method, headers, body, mode, credentials, + cache}: RequestOptions = {method: RequestMethods.GET, mode: RequestModesOpts.Cors}) { + this.method = method; + this.headers = headers; + this.body = body; + this.mode = mode; + this.credentials = credentials; + this.cache = cache; + } - constructor() { - this.method = RequestMethods.GET; - this.mode = RequestModesOpts.Cors; + merge(opts: RequestOptions = {}): RequestOptionsClass { + return new RequestOptionsClass(StringMapWrapper.merge(this, opts)); } } + +@Injectable() +export class BaseRequestOptions extends RequestOptionsClass { + constructor() { super(); } +} diff --git a/modules/angular2/test/http/base_request_options_spec.ts b/modules/angular2/test/http/base_request_options_spec.ts new file mode 100644 index 0000000000..a4915f05cc --- /dev/null +++ b/modules/angular2/test/http/base_request_options_spec.ts @@ -0,0 +1,32 @@ +import { + AsyncTestCompleter, + beforeEach, + ddescribe, + describe, + expect, + iit, + inject, + it, + xit +} from 'angular2/test_lib'; +import {BaseRequestOptions} from 'angular2/src/http/base_request_options'; +import {RequestMethods, RequestModesOpts} from 'angular2/src/http/enums'; + +export function main() { + describe('BaseRequestOptions', () => { + it('should create a new object when calling merge', () => { + var options1 = new BaseRequestOptions(); + var options2 = options1.merge({method: RequestMethods.DELETE}); + expect(options2).not.toBe(options1); + expect(options2.method).toBe(RequestMethods.DELETE); + }); + + it('should retain previously merged values when merging again', () => { + var options1 = new BaseRequestOptions(); + var options2 = options1.merge({method: RequestMethods.DELETE}); + var options3 = options2.merge({mode: RequestModesOpts.NoCors}) expect(options3.mode) + .toBe(RequestModesOpts.NoCors); + expect(options3.method).toBe(RequestMethods.DELETE); + }); + }); +}