1
1
var chai = require ( 'chai' ) ;
2
+ var chaiAsPromised = require ( 'chai-as-promised' ) ;
3
+ chai . use ( chaiAsPromised ) ;
2
4
var assert = chai . assert ;
5
+ var expect = chai . expect ;
3
6
var http = require ( 'http' ) ;
4
7
var https = require ( 'https' ) ;
5
- var SandboxedModule = require ( 'sandboxed-module' ) ;
8
+ var Web3 = require ( '../packages/web3' ) ;
9
+ var HttpProvider = require ( '../packages/web3-providers-http' ) ;
10
+ var fetchMock = require ( 'fetch-mock' ) ;
6
11
7
- SandboxedModule . registerBuiltInSourceTransformer ( 'istanbul' ) ;
12
+ function isObject ( object ) {
13
+ return object != null && typeof object === 'object' ;
14
+ }
8
15
9
- class Response {
10
- constructor ( url , headers ) {
11
- this . url = url ;
12
- var header = new Map ( ) ;
13
- headers . map ( function ( h ) {
14
- header . set ( `${ h [ 0 ] . toLowerCase ( ) } ` , `${ h [ 1 ] } ` ) ;
15
- } ) ;
16
- this . headers = header ;
17
- this . ok = true ;
18
- this . status = 200 ;
19
- this . statusText = 'OK' ;
20
- }
21
- } ;
22
-
23
- function Mock ( url , options ) {
24
- const response = new Response ( url , Object . entries ( options . headers ) ) ;
25
- return new Promise ( function ( resolve , reject ) {
26
- resolve ( response ) ;
27
- } ) ;
28
- } ;
29
-
30
- var HttpProvider = SandboxedModule . require ( '../packages/web3-providers-http' , {
31
- requires : {
32
- 'cross-fetch' : Mock ,
33
- } ,
34
- singleOnly : true
35
- } ) ;
16
+ function deepEqual ( object1 , object2 ) {
17
+ const keys1 = Object . keys ( object1 ) ;
18
+ const keys2 = Object . keys ( object2 ) ;
19
+ if ( keys1 . length !== keys2 . length ) {
20
+ return false ;
21
+ }
22
+ for ( const key of keys1 ) {
23
+ const val1 = object1 [ key ] ;
24
+ const val2 = object2 [ key ] ;
25
+ const areObjects = isObject ( val1 ) && isObject ( val2 ) ;
26
+ if ( areObjects && ! deepEqual ( val1 , val2 ) || ! areObjects && val1 !== val2 ) {
27
+ return false ;
28
+ }
29
+ }
30
+ return true ;
31
+ }
36
32
37
33
describe ( 'web3-providers-http' , function ( ) {
38
34
describe ( 'prepareRequest' , function ( ) {
39
- it ( 'should set request header' , async function ( ) {
35
+ it ( 'should set request header' , function ( ) {
40
36
var options = { headers : [ { name : 'Access-Control-Allow-Origin' , value : '*' } ] }
41
37
var provider = new HttpProvider ( 'http://localhost:8545' , options ) ;
42
38
43
- var origin = 'Access-Control-Allow-Origin' ;
44
39
assert . equal ( provider . headers , options . headers ) ;
40
+ assert . equal ( provider . httpAgent instanceof http . Agent , true ) ;
41
+ } ) ;
42
+
43
+ it ( 'should have https agent' , function ( ) {
44
+ var provider = new HttpProvider ( 'https://localhost' ) ;
45
+
46
+ assert . equal ( provider . httpsAgent instanceof https . Agent , true ) ;
45
47
} ) ;
46
48
47
- it ( 'should use the passed custom http agent' , async function ( ) {
49
+ it ( 'should use the passed custom http agent' , function ( ) {
48
50
var agent = new http . Agent ( ) ;
49
51
var options = { agent : { http : agent } } ;
50
52
var provider = new HttpProvider ( 'http://localhost:8545' , options ) ;
@@ -55,7 +57,7 @@ describe('web3-providers-http', function () {
55
57
assert . equal ( provider . agent , options . agent ) ;
56
58
} ) ;
57
59
58
- it ( 'should use the passed custom https agent' , async function ( ) {
60
+ it ( 'should use the passed custom https agent' , function ( ) {
59
61
var agent = new https . Agent ( ) ;
60
62
var options = { agent : { https : agent } } ;
61
63
var provider = new HttpProvider ( 'http://localhost:8545' , options ) ;
@@ -65,34 +67,85 @@ describe('web3-providers-http', function () {
65
67
assert . equal ( provider . httpsAgent , undefined ) ;
66
68
assert . equal ( provider . agent , options . agent ) ;
67
69
} ) ;
70
+ } ) ;
68
71
69
- /**
70
- Deprecated with xhr2-cookies since this is non-standard
72
+ describe ( 'send' , function ( ) {
73
+ it ( 'should fail with invalid remote node connection' , async function ( ) {
74
+ var provider = new HttpProvider ( 'http://localhost:8545' ) ;
75
+ var web3 = new Web3 ( provider ) ;
71
76
72
- it('should use the passed baseUrl', function () {
73
- agent = new https.Agent();
74
- options = {agent: {https: agent, baseUrl: 'base'}};
75
- provider = new HttpProvider('http://localhost:8545', options);
76
- result = provider._prepareRequest();
77
+ await expect ( web3 . eth . getChainId ( ) ) . to . be . rejectedWith ( Error , "CONNECTION ERROR: Couldn't connect to node http://localhost:8545." ) ;
78
+ } ) ;
77
79
78
- assert.equal(typeof result, 'object');
79
- assert.equal(result.agents.httpsAgent, agent);
80
- assert.equal(result.agents.baseUrl, 'base');
81
- assert.equal(provider.httpAgent, undefined);
82
- assert.equal(provider.httpsAgent, undefined);
83
- assert.equal(provider.agent, options.agent);
80
+ it ( 'should fail for non-json format response' , async function ( ) {
81
+ var provider = new HttpProvider ( '/fetchMock' ) ;
82
+ var web3 = new Web3 ( provider ) ;
83
+
84
+ fetchMock . mock ( '/fetchMock' , 'Testing non-json format response' ) ;
85
+
86
+ await expect ( web3 . eth . getChainId ( ) ) . to . be . rejectedWith ( Error , / I n v a l i d J S O N R P C r e s p o n s e / ) ;
87
+ fetchMock . restore ( ) ;
84
88
} ) ;
85
- **/
86
- } ) ;
87
89
88
- describe ( 'send' , function ( ) {
89
- it ( 'should send basic async request' , function ( done ) {
90
- var provider = new HttpProvider ( ) ;
90
+ it ( 'should timeout by delayed response' , async function ( ) {
91
+ var provider = new HttpProvider ( '/fetchMock' , { timeout : 500 } ) ;
92
+ var web3 = new Web3 ( provider ) ;
93
+
94
+ fetchMock . mock ( '/fetchMock' , 'Testing non-json format response' , { delay : 1000 } ) ;
95
+
96
+ await expect ( web3 . eth . getChainId ( ) ) . to . be . rejectedWith ( Error , 'CONNECTION TIMEOUT: timeout of 500 ms achived' ) ;
97
+ fetchMock . restore ( ) ;
98
+ } ) ;
99
+
100
+ it ( 'should send basic async request' , async function ( ) {
101
+ var provider = new HttpProvider ( '/fetchMock' ) ;
102
+
103
+ var reqObject = {
104
+ 'jsonrpc' : '2.0' ,
105
+ 'id' : 0 ,
106
+ 'method' : 'eth_chainId' ,
107
+ 'params' : [ ]
108
+ } ;
109
+
110
+ var resObject = {
111
+ 'jsonrpc' : '2.0' ,
112
+ 'id' : 0 ,
113
+ 'result' : '0x1'
114
+ } ;
115
+
116
+ fetchMock . mock ( ( url , opts ) => {
117
+ const reqCount = JSON . parse ( opts . body ) . id ;
118
+ reqObject = JSON . stringify ( ( ( ) => {
119
+ const obj = reqObject ;
120
+ obj . id = reqCount ;
121
+ return obj ;
122
+ } ) ( ) ) ;
123
+ resObject = ( ( ) => {
124
+ const obj = resObject ;
125
+ obj . id = reqCount ;
126
+ return obj ;
127
+ } ) ( ) ;
128
+ const matcher = {
129
+ url : '/fetchMock' ,
130
+ method : 'POST' ,
131
+ credentials : 'omit' ,
132
+ headers : {
133
+ 'Content-Type' : 'application/json'
134
+ } ,
135
+ body : reqObject
136
+ } ;
137
+ return url === matcher . url
138
+ && opts . method === matcher . method
139
+ && opts . credentials === matcher . credentials
140
+ && deepEqual ( opts . headers , matcher . headers )
141
+ && opts . body === matcher . body ;
142
+ } , resObject ) ;
143
+
144
+ var web3 = new Web3 ( provider ) ;
91
145
92
- provider . send ( { } , function ( err , result ) {
93
- assert . equal ( typeof result , 'undefined' ) ;
94
- done ( ) ;
95
- } ) ;
146
+ var chainId = await web3 . eth . getChainId ( ) ;
147
+ assert . equal ( chainId , 1 ) ;
148
+ fetchMock . restore ( ) ;
96
149
} ) ;
97
150
} ) ;
98
151
} ) ;
0 commit comments