Skip to content

Commit 482691e

Browse files
committed
- Code modifications to remove the HttpClient interface, and mock Http as a subclass instead. This interface is what was preventing the client from loading and working with SystemJS and Angular 4.
- Lots of white space improvements to make tslint happy.
1 parent e9b1c27 commit 482691e

21 files changed

+363
-417
lines changed

src/abstract/http-client.ts

-8
This file was deleted.

src/builders/request-builder.ts

+34-34
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import {
55
RequestOptions,
66
Response,
77
URLSearchParams,
8-
} from "@angular/http";
8+
} from '@angular/http';
99

10-
import "reflect-metadata";
11-
import { RestClient } from "../rest-client";
12-
import { Observable } from "rxjs/Observable";
13-
import "rxjs/add/operator/map";
14-
import { Format } from "../decorators/parameters";
10+
import 'reflect-metadata';
11+
import { RestClient } from '../rest-client';
12+
import { Observable } from 'rxjs/Observable';
13+
import 'rxjs/add/operator/map';
14+
import { Format } from '../decorators/parameters';
1515

1616
export function methodBuilder( method: number) {
1717
return function(url: string) {
@@ -28,18 +28,18 @@ export function methodBuilder( method: number) {
2828
// Body
2929
var body:any = null;
3030
if (pBody) {
31-
if(pBody.length > 1){
32-
throw new Error("Only one @Body is allowed");
31+
if (pBody.length > 1) {
32+
throw new Error('Only one @Body is allowed');
3333
}
3434
var value = args[pBody[0].parameterIndex];
35-
if(value === undefined && pBody[0].value !== undefined) {
35+
if (value === undefined && pBody[0].value !== undefined) {
3636
value = pBody[0].value;
3737
}
3838
body = JSON.stringify(value);
3939
}
4040
if (pPlainBody) {
4141
if (pPlainBody.length > 1) {
42-
throw new Error("Only one @Body is allowed");
42+
throw new Error('Only one @Body is allowed');
4343
}
4444
var value = args[pPlainBody[0].parameterIndex];
4545
if (value === undefined && pPlainBody[0].value !== undefined) {
@@ -57,16 +57,16 @@ export function methodBuilder( method: number) {
5757
value = pPath[k].value;
5858
}
5959
if(value !== undefined && value !== null) {
60-
resUrl = resUrl.replace( "{" + pPath[ k ].key + "}", value );
61-
}else{
62-
throw new Error("Missing path variable '" + pPath[k].key + "' in url '" + url + "'");
60+
resUrl = resUrl.replace( '{' + pPath[ k ].key + '}', value );
61+
} else {
62+
throw new Error('Missing path variable \'' + pPath[k].key + '\' in url ' + url);
6363
}
6464
}
6565
}
6666
}
67-
if(this.getBaseUrl() != null){
67+
if (this.getBaseUrl() !== null) {
6868
var baseUrl = this.getBaseUrl();
69-
if(baseUrl.indexOf("/") == baseUrl.length-1 && resUrl.indexOf("/") == 0){
69+
if (baseUrl.indexOf('/') === baseUrl.length-1 && resUrl.indexOf('/') === 0) {
7070
baseUrl = baseUrl.substring(0, 1);
7171
}
7272
resUrl = baseUrl + resUrl;
@@ -76,17 +76,17 @@ export function methodBuilder( method: number) {
7676
var search = new URLSearchParams();
7777
if (pQuery) {
7878
pQuery
79-
.filter((p:any) => args[p.parameterIndex] !== undefined || p.value !== undefined) // filter out optional parameters
80-
.forEach((p:any) => {
79+
.filter((p: any) => args[p.parameterIndex] !== undefined || p.value !== undefined) // filter out optional parameters
80+
.forEach((p: any) => {
8181
var key = p.key;
82-
let value:any = args[p.parameterIndex];
82+
let value: any = args[p.parameterIndex];
8383
if(value === undefined && p.value !== undefined) {
8484
value = p.value;
8585
}
8686

8787
// if the value is a instance of Object, we stringify it
88-
if(Array.isArray(value)){
89-
switch(p.format){
88+
if (Array.isArray(value)) {
89+
switch(p.format) {
9090
case Format.CSV:
9191
value = value.join(',');
9292
break;
@@ -108,9 +108,9 @@ export function methodBuilder( method: number) {
108108
}else if (value instanceof Object) {
109109
value = JSON.stringify(value);
110110
}
111-
if(Array.isArray(value)){
111+
if(Array.isArray(value)) {
112112
value.forEach(v => search.append(key, v));
113-
}else {
113+
} else {
114114
search.set( key, value );
115115
}
116116
});
@@ -130,11 +130,11 @@ export function methodBuilder( method: number) {
130130
for (var k in pHeader) {
131131
if (pHeader.hasOwnProperty(k)) {
132132
let value:any = args[pHeader[k].parameterIndex];
133-
if(value === undefined && pHeader[k].value !== undefined) {
133+
if (value === undefined && pHeader[k].value !== undefined) {
134134
value = pHeader[k].value;
135135
}
136-
if(Array.isArray(value)){
137-
switch(pHeader[k].format){
136+
if (Array.isArray(value)) {
137+
switch(pHeader[k].format) {
138138
case Format.CSV:
139139
value = value.join(',');
140140
break;
@@ -154,10 +154,10 @@ export function methodBuilder( method: number) {
154154
value = value.join(',');
155155
}
156156
}
157-
if(Array.isArray(value)){
157+
if (Array.isArray(value)) {
158158
value.forEach(v => headers.append(pHeader[k].key, v));
159159
}else {
160-
headers.append( pHeader[k].key, value );
160+
headers.append(pHeader[k].key, value);
161161
}
162162
}
163163
}
@@ -178,32 +178,32 @@ export function methodBuilder( method: number) {
178178
// intercept the request
179179
this.requestInterceptor(req);
180180
// make the request and store the observable for later transformation
181-
var observable = this.httpClient.request(req);
181+
var observable = this.http.request(req);
182182

183183
// transform the observable in accordance to the @Produces decorator
184184
if (descriptor.mime) {
185185
observable = observable.map(descriptor.mime);
186186
}
187187
if (descriptor.timeout) {
188-
descriptor.timeout.forEach((timeout:number) => {
188+
descriptor.timeout.forEach((timeout: number) => {
189189
observable = observable.timeout(timeout);
190190
});
191191
}
192-
if(descriptor.mappers){
193-
descriptor.mappers.forEach((mapper:(resp : any)=>any) => {
192+
if (descriptor.mappers) {
193+
descriptor.mappers.forEach((mapper:(resp : any) => any) => {
194194
observable = observable.map(mapper);
195195
});
196196
}
197-
if(descriptor.emitters){
198-
descriptor.emitters.forEach((handler:(resp : Observable<any>)=>Observable<any>) => {
197+
if (descriptor.emitters) {
198+
descriptor.emitters.forEach((handler:(resp : Observable<any>) => Observable<any>) => {
199199
observable = handler(observable);
200200
});
201201
}
202202

203203
// intercept the response
204204
observable = this.responseInterceptor(observable);
205205

206-
var returnType = Reflect.getMetadata("design:returntype", target, propertyKey);
206+
var returnType = Reflect.getMetadata('design:returntype', target, propertyKey);
207207
if (returnType === Promise) {
208208
if (observable.toPromise) {
209209
observable = observable.toPromise();

src/decorators/client.spec.ts

+14-17
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,40 @@
11

22
import {assert} from 'chai';
3-
import { Observable } from "rxjs";
4-
import { Request, Response, ResponseOptions, RequestMethod } from "@angular/http";
5-
import { HttpClient } from "../abstract/http-client";
6-
import { RestClient } from "../rest-client";
7-
import { Get } from "./request-methods";
8-
import { Client } from "./client";
3+
import { Observable } from 'rxjs';
4+
import { Http, Request, Response, ResponseOptions, RequestMethod } from '@angular/http';
5+
import { RestClient } from '../rest-client';
6+
import { Get } from './request-methods';
7+
import { Client } from './client';
98

109
describe('@Client', () => {
1110

1211
it('verify decorator attributes are added to the request', () => {
1312
// Arrange
14-
let requestMock = new RequestMock((req:Request) => {
13+
let requestMock = new HttpMock((req: Request) => {
1514
return Observable.of(new Response(new ResponseOptions({status: 200})));
1615
});
1716
let testClient = new TestClient(requestMock);
1817

1918
// Assert
2019
assert.equal(testClient.getServiceId(), 'customer-service');
2120
assert.equal(testClient.getBaseUrl(), '/api/v1/customers');
22-
assert.deepEqual(testClient.getDefaultHeaders(), {
21+
assert.deepEqual(<any> testClient.getDefaultHeaders(), {
2322
'content-type': 'application/json'
2423
});
2524

2625
});
2726
});
2827

29-
class RequestMock implements HttpClient{
30-
31-
constructor(private requestFunction:(req:Request) =>Observable<Response>){}
28+
class HttpMock extends Http {
3229

3330
public callCount:number = 0;
3431
public lastRequest:Request;
3532

36-
public request(req:Request):Observable<Response> {
33+
constructor(private requestFunction:(req: Request) => Observable<Response>) {
34+
super(null, null);
35+
}
36+
37+
public request(req: Request): Observable<Response> {
3738
this.callCount++;
3839
this.lastRequest = req;
3940
return this.requestFunction(req);
@@ -49,12 +50,8 @@ class RequestMock implements HttpClient{
4950
})
5051
class TestClient extends RestClient {
5152

52-
constructor(httpClient:HttpClient){
53-
super(httpClient );
54-
}
55-
5653
@Get('/test')
57-
public getItems():Observable<Response>{
54+
public getItems(): Observable<Response> {
5855
return null;
5956
}
6057

src/decorators/client.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
*/
88
export function Client(args:{serviceId?: string, baseUrl?: string, headers?: any}) {
99
return function <TFunction extends Function>(Target: TFunction): TFunction {
10-
if(args.serviceId){
10+
if (args.serviceId) {
1111
Target.prototype.getServiceId = function() {
1212
return args.serviceId;
1313
};
1414
}
15-
if(args.baseUrl){
15+
if (args.baseUrl) {
1616
Target.prototype.getBaseUrl = function() {
1717
return args.baseUrl;
1818
};
1919
}
20-
if(args.headers){
20+
if (args.headers) {
2121
Target.prototype.getDefaultHeaders = function() {
2222
return args.headers;
2323
};

src/decorators/headers.spec.ts

+14-17
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11

22
import {assert} from 'chai';
3-
import { Observable } from "rxjs";
4-
import { Request, Response, ResponseOptions, RequestMethod } from "@angular/http";
5-
import { HttpClient } from "../abstract/http-client";
6-
import { Client } from "./client";
7-
import { RestClient } from "../rest-client";
8-
import { Get } from "./request-methods";
9-
import { Headers } from "./headers";
3+
import { Observable } from 'rxjs';
4+
import {Request, Response, ResponseOptions, RequestMethod, Http} from '@angular/http';
5+
import { Client } from './client';
6+
import { RestClient } from '../rest-client';
7+
import { Get } from './request-methods';
8+
import { Headers } from './headers';
109

1110
describe('@Headers', () => {
1211

@@ -15,7 +14,7 @@ describe('@Headers', () => {
1514
let headers:{
1615
[name: string]: any;
1716
};
18-
let requestMock = new RequestMock((req:Request) => {
17+
let requestMock = new HttpMock((req: Request) => {
1918
headers = req.headers.toJSON();
2019
return Observable.of(new Response(new ResponseOptions({status: 200})));
2120
});
@@ -33,14 +32,16 @@ describe('@Headers', () => {
3332
});
3433
});
3534

36-
class RequestMock implements HttpClient{
37-
38-
constructor(private requestFunction:(req:Request) =>Observable<Response>){}
35+
class HttpMock extends Http {
3936

4037
public callCount:number = 0;
4138
public lastRequest:Request;
4239

43-
public request(req:Request):Observable<Response> {
40+
constructor(private requestFunction: (req: Request) => Observable<Response>) {
41+
super(null, null);
42+
}
43+
44+
public request(req: Request): Observable<Response> {
4445
this.callCount++;
4546
this.lastRequest = req;
4647
return this.requestFunction(req);
@@ -49,16 +50,12 @@ class RequestMock implements HttpClient{
4950

5051
class TestClient extends RestClient {
5152

52-
constructor(httpClient:HttpClient){
53-
super(httpClient );
54-
}
55-
5653
@Get('/test')
5754
@Headers({
5855
'accept': 'application/json',
5956
'lang': ['en','nl']
6057
})
61-
public getItems():Observable<Response>{
58+
public getItems(): Observable<Response> {
6259
return null;
6360
}
6461

src/decorators/headers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RestClient } from "../rest-client";
1+
import { RestClient } from '../rest-client';
22

33
/**
44
* Set custom headers for a REST method

0 commit comments

Comments
 (0)