11import { Http , BaseRequestOptions , Response , ResponseOptions , RequestMethod , XHRBackend , RequestOptions } from '@angular/http' ;
22import { MockBackend , MockConnection } from '@angular/http/testing' ;
33
4- export let fakeBackendProvider = {
5- // use fake backend in place of Http service for backend-less development
6- provide : Http ,
7- useFactory : function ( backend : MockBackend , options : BaseRequestOptions , realBackend : XHRBackend ) {
8- // array in local storage for registered users
9- let users : any [ ] = JSON . parse ( localStorage . getItem ( 'users' ) ) || [ ] ;
10-
11- // configure fake backend
12- backend . connections . subscribe ( ( connection : MockConnection ) => {
13- // wrap in timeout to simulate server api call
14- setTimeout ( ( ) => {
15-
16- // authenticate
17- if ( connection . request . url . endsWith ( '/api/authenticate' ) && connection . request . method === RequestMethod . Post ) {
18- // get parameters from post request
19- let params = JSON . parse ( connection . request . getBody ( ) ) ;
20-
21- // find if any user matches login credentials
22- let filteredUsers = users . filter ( user => {
23- return user . username === params . username && user . password === params . password ;
24- } ) ;
25-
26- if ( filteredUsers . length ) {
27- // if login details are valid return 200 OK with user details and fake jwt token
28- let user = filteredUsers [ 0 ] ;
29- connection . mockRespond ( new Response ( new ResponseOptions ( {
30- status : 200 ,
31- body : {
32- id : user . id ,
33- username : user . username ,
34- firstName : user . firstName ,
35- lastName : user . lastName ,
36- token : 'fake-jwt-token'
37- }
38- } ) ) ) ;
39- } else {
40- // else return 400 bad request
41- connection . mockError ( new Error ( 'Username or password is incorrect' ) ) ;
42- }
4+ export function fakeBackendFactory ( backend : MockBackend , options : BaseRequestOptions , realBackend : XHRBackend ) {
5+ // array in local storage for registered users
6+ let users : any [ ] = JSON . parse ( localStorage . getItem ( 'users' ) ) || [ ] ;
7+
8+ // configure fake backend
9+ backend . connections . subscribe ( ( connection : MockConnection ) => {
10+ // wrap in timeout to simulate server api call
11+ setTimeout ( ( ) => {
12+
13+ // authenticate
14+ if ( connection . request . url . endsWith ( '/api/authenticate' ) && connection . request . method === RequestMethod . Post ) {
15+ // get parameters from post request
16+ let params = JSON . parse ( connection . request . getBody ( ) ) ;
17+
18+ // find if any user matches login credentials
19+ let filteredUsers = users . filter ( user => {
20+ return user . username === params . username && user . password === params . password ;
21+ } ) ;
4322
44- return ;
23+ if ( filteredUsers . length ) {
24+ // if login details are valid return 200 OK with user details and fake jwt token
25+ let user = filteredUsers [ 0 ] ;
26+ connection . mockRespond ( new Response ( new ResponseOptions ( {
27+ status : 200 ,
28+ body : {
29+ id : user . id ,
30+ username : user . username ,
31+ firstName : user . firstName ,
32+ lastName : user . lastName ,
33+ token : 'fake-jwt-token'
34+ }
35+ } ) ) ) ;
36+ } else {
37+ // else return 400 bad request
38+ connection . mockError ( new Error ( 'Username or password is incorrect' ) ) ;
4539 }
4640
47- // get users
48- if ( connection . request . url . endsWith ( '/api/users' ) && connection . request . method === RequestMethod . Get ) {
49- // check for fake auth token in header and return users if valid, this security is implemented server side in a real application
50- if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt-token' ) {
51- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 , body : users } ) ) ) ;
52- } else {
53- // return 401 not authorised if token is null or invalid
54- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
55- }
56-
57- return ;
41+ return ;
42+ }
43+
44+ // get users
45+ if ( connection . request . url . endsWith ( '/api/users' ) && connection . request . method === RequestMethod . Get ) {
46+ // check for fake auth token in header and return users if valid, this security is implemented server side in a real application
47+ if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt- token' ) {
48+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 , body : users } ) ) ) ;
49+ } else {
50+ // return 401 not authorised if token is null or invalid
51+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
5852 }
5953
60- // get user by id
61- if ( connection . request . url . match ( / \/ a p i \/ u s e r s \/ \d + $ / ) && connection . request . method === RequestMethod . Get ) {
62- // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
63- if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt-token' ) {
64- // find user by id in users array
65- let urlParts = connection . request . url . split ( '/' ) ;
66- let id = parseInt ( urlParts [ urlParts . length - 1 ] ) ;
67- let matchedUsers = users . filter ( user => { return user . id === id ; } ) ;
68- let user = matchedUsers . length ? matchedUsers [ 0 ] : null ;
69-
70- // respond 200 OK with user
71- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 , body : user } ) ) ) ;
72- } else {
73- // return 401 not authorised if token is null or invalid
74- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
75- }
76-
77- return ;
54+ return ;
55+ }
56+
57+ // get user by id
58+ if ( connection . request . url . match ( / \/ a p i \/ u s e r s \/ \d + $ / ) && connection . request . method === RequestMethod . Get ) {
59+ // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
60+ if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt-token' ) {
61+ // find user by id in users array
62+ let urlParts = connection . request . url . split ( '/' ) ;
63+ let id = parseInt ( urlParts [ urlParts . length - 1 ] ) ;
64+ let matchedUsers = users . filter ( user => { return user . id === id ; } ) ;
65+ let user = matchedUsers . length ? matchedUsers [ 0 ] : null ;
66+
67+ // respond 200 OK with user
68+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 , body : user } ) ) ) ;
69+ } else {
70+ // return 401 not authorised if token is null or invalid
71+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
7872 }
7973
80- // create user
81- if ( connection . request . url . endsWith ( '/api/users' ) && connection . request . method === RequestMethod . Post ) {
82- // get new user object from post body
83- let newUser = JSON . parse ( connection . request . getBody ( ) ) ;
84-
85- // validation
86- let duplicateUser = users . filter ( user => { return user . username === newUser . username ; } ) . length ;
87- if ( duplicateUser ) {
88- return connection . mockError ( new Error ( 'Username "' + newUser . username + '" is already taken' ) ) ;
89- }
90-
91- // save new user
92- newUser . id = users . length + 1 ;
93- users . push ( newUser ) ;
94- localStorage . setItem ( 'users' , JSON . stringify ( users ) ) ;
74+ return ;
75+ }
9576
96- // respond 200 OK
97- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 } ) ) ) ;
77+ // create user
78+ if ( connection . request . url . endsWith ( '/api/users' ) && connection . request . method === RequestMethod . Post ) {
79+ // get new user object from post body
80+ let newUser = JSON . parse ( connection . request . getBody ( ) ) ;
9881
99- return ;
82+ // validation
83+ let duplicateUser = users . filter ( user => { return user . username === newUser . username ; } ) . length ;
84+ if ( duplicateUser ) {
85+ return connection . mockError ( new Error ( 'Username "' + newUser . username + '" is already taken' ) ) ;
10086 }
10187
102- // delete user
103- if ( connection . request . url . match ( / \/ a p i \/ u s e r s \/ \d + $ / ) && connection . request . method === RequestMethod . Delete ) {
104- // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
105- if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt-token' ) {
106- // find user by id in users array
107- let urlParts = connection . request . url . split ( '/' ) ;
108- let id = parseInt ( urlParts [ urlParts . length - 1 ] ) ;
109- for ( let i = 0 ; i < users . length ; i ++ ) {
110- let user = users [ i ] ;
111- if ( user . id === id ) {
112- // delete user
113- users . splice ( i , 1 ) ;
114- localStorage . setItem ( 'users' , JSON . stringify ( users ) ) ;
115- break ;
116- }
88+ // save new user
89+ newUser . id = users . length + 1 ;
90+ users . push ( newUser ) ;
91+ localStorage . setItem ( 'users' , JSON . stringify ( users ) ) ;
92+
93+ // respond 200 OK
94+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 } ) ) ) ;
95+
96+ return ;
97+ }
98+
99+ // delete user
100+ if ( connection . request . url . match ( / \/ a p i \/ u s e r s \/ \d + $ / ) && connection . request . method === RequestMethod . Delete ) {
101+ // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
102+ if ( connection . request . headers . get ( 'Authorization' ) === 'Bearer fake-jwt-token' ) {
103+ // find user by id in users array
104+ let urlParts = connection . request . url . split ( '/' ) ;
105+ let id = parseInt ( urlParts [ urlParts . length - 1 ] ) ;
106+ for ( let i = 0 ; i < users . length ; i ++ ) {
107+ let user = users [ i ] ;
108+ if ( user . id === id ) {
109+ // delete user
110+ users . splice ( i , 1 ) ;
111+ localStorage . setItem ( 'users' , JSON . stringify ( users ) ) ;
112+ break ;
117113 }
118-
119- // respond 200 OK
120- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 } ) ) ) ;
121- } else {
122- // return 401 not authorised if token is null or invalid
123- connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
124114 }
125115
126- return ;
116+ // respond 200 OK
117+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 200 } ) ) ) ;
118+ } else {
119+ // return 401 not authorised if token is null or invalid
120+ connection . mockRespond ( new Response ( new ResponseOptions ( { status : 401 } ) ) ) ;
127121 }
128122
129- // pass through any requests not handled above
130- let realHttp = new Http ( realBackend , options ) ;
131- let requestOptions = new RequestOptions ( {
132- method : connection . request . method ,
133- headers : connection . request . headers ,
134- body : connection . request . getBody ( ) ,
135- url : connection . request . url ,
136- withCredentials : connection . request . withCredentials ,
137- responseType : connection . request . responseType
123+ return ;
124+ }
125+
126+ // pass through any requests not handled above
127+ let realHttp = new Http ( realBackend , options ) ;
128+ let requestOptions = new RequestOptions ( {
129+ method : connection . request . method ,
130+ headers : connection . request . headers ,
131+ body : connection . request . getBody ( ) ,
132+ url : connection . request . url ,
133+ withCredentials : connection . request . withCredentials ,
134+ responseType : connection . request . responseType
135+ } ) ;
136+ realHttp . request ( connection . request . url , requestOptions )
137+ . subscribe ( ( response : Response ) => {
138+ connection . mockRespond ( response ) ;
139+ } ,
140+ ( error : any ) => {
141+ connection . mockError ( error ) ;
138142 } ) ;
139- realHttp . request ( connection . request . url , requestOptions )
140- . subscribe ( ( response : Response ) => {
141- connection . mockRespond ( response ) ;
142- } ,
143- ( error : any ) => {
144- connection . mockError ( error ) ;
145- } ) ;
146143
147- } , 500 ) ;
144+ } , 500 ) ;
145+
146+ } ) ;
148147
149- } ) ;
148+ return new Http ( backend , options ) ;
149+ } ;
150150
151- return new Http ( backend , options ) ;
152- } ,
151+ export let fakeBackendProvider = {
152+ // use fake backend in place of Http service for backend-less development
153+ provide : Http ,
154+ useFactory : fakeBackendFactory ,
153155 deps : [ MockBackend , BaseRequestOptions , XHRBackend ]
154156} ;
0 commit comments