@chainlink/external-adapter-framework 0.0.14 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/.c8rc.json +3 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +96 -0
  4. package/.github/README.MD +42 -0
  5. package/.github/actions/setup/action.yaml +13 -0
  6. package/.github/workflows/label.yaml +39 -0
  7. package/.github/workflows/main.yaml +39 -0
  8. package/.github/workflows/publish.yaml +17 -0
  9. package/.prettierignore +13 -0
  10. package/.yarnrc +0 -0
  11. package/README.md +103 -0
  12. package/dist/examples/coingecko/test/e2e/adapter.test.ts.js +82953 -0
  13. package/dist/examples/coingecko/test/integration/adapter.test.ts.js +91672 -0
  14. package/dist/main.js +72703 -0
  15. package/docker-compose.yaml +35 -0
  16. package/env.sh +54 -0
  17. package/env2.sh +55 -0
  18. package/jest.config.js +5 -0
  19. package/package.json +14 -3
  20. package/publish.sh +0 -0
  21. package/src/adapter.ts +263 -0
  22. package/src/background-executor.ts +52 -0
  23. package/src/cache/factory.ts +26 -0
  24. package/src/cache/index.ts +258 -0
  25. package/src/cache/local.ts +73 -0
  26. package/src/cache/metrics.ts +112 -0
  27. package/src/cache/redis.ts +93 -0
  28. package/src/config/index.ts +517 -0
  29. package/src/config/provider-limits.ts +127 -0
  30. package/src/examples/bank-frick/README.MD +10 -0
  31. package/src/examples/bank-frick/accounts.ts +246 -0
  32. package/src/examples/bank-frick/config/index.ts +53 -0
  33. package/src/examples/bank-frick/index.ts +13 -0
  34. package/src/examples/bank-frick/types.d.ts +38 -0
  35. package/src/examples/bank-frick/util.ts +55 -0
  36. package/src/examples/coingecko/src/config/index.ts +12 -0
  37. package/src/examples/coingecko/src/config/overrides.json +10826 -0
  38. package/src/examples/coingecko/src/cryptoUtils.ts +88 -0
  39. package/src/examples/coingecko/src/endpoint/coins.ts +54 -0
  40. package/src/examples/coingecko/src/endpoint/crypto-marketcap.ts +66 -0
  41. package/src/examples/coingecko/src/endpoint/crypto-volume.ts +66 -0
  42. package/src/examples/coingecko/src/endpoint/crypto.ts +63 -0
  43. package/src/examples/coingecko/src/endpoint/dominance.ts +40 -0
  44. package/src/examples/coingecko/src/endpoint/global-marketcap.ts +40 -0
  45. package/src/examples/coingecko/src/endpoint/index.ts +6 -0
  46. package/src/examples/coingecko/src/globalUtils.ts +78 -0
  47. package/src/examples/coingecko/src/index.ts +17 -0
  48. package/src/examples/coingecko/test/e2e/adapter.test.ts +278 -0
  49. package/src/examples/coingecko/test/integration/__snapshots__/adapter.test.ts.snap +15 -0
  50. package/src/examples/coingecko/test/integration/adapter.test.ts +281 -0
  51. package/src/examples/coingecko/test/integration/capturedRequests.json +1 -0
  52. package/src/examples/coingecko/test/integration/fixtures.ts +42 -0
  53. package/src/examples/coingecko-old/batch-warming.ts +79 -0
  54. package/src/examples/coingecko-old/index.ts +9 -0
  55. package/src/examples/coingecko-old/rest.ts +77 -0
  56. package/src/examples/ncfx/config/index.ts +12 -0
  57. package/src/examples/ncfx/index.ts +9 -0
  58. package/src/examples/ncfx/websocket.ts +99 -0
  59. package/src/index.ts +149 -0
  60. package/src/metrics/constants.ts +23 -0
  61. package/src/metrics/index.ts +115 -0
  62. package/src/metrics/util.ts +18 -0
  63. package/src/rate-limiting/background/fixed-frequency.ts +45 -0
  64. package/src/rate-limiting/index.ts +100 -0
  65. package/src/rate-limiting/metrics.ts +18 -0
  66. package/src/rate-limiting/request/simple-counting.ts +76 -0
  67. package/src/transports/batch-warming.ts +127 -0
  68. package/src/transports/index.ts +152 -0
  69. package/src/transports/metrics.ts +95 -0
  70. package/src/transports/rest.ts +168 -0
  71. package/src/transports/util.ts +63 -0
  72. package/src/transports/websocket.ts +245 -0
  73. package/src/util/index.ts +23 -0
  74. package/src/util/logger.ts +69 -0
  75. package/src/util/recordRequests.ts +47 -0
  76. package/src/util/request.ts +117 -0
  77. package/src/util/subscription-set/expiring-sorted-set.ts +54 -0
  78. package/src/util/subscription-set/subscription-set.ts +35 -0
  79. package/src/util/test-payload-loader.ts +87 -0
  80. package/src/validation/error.ts +116 -0
  81. package/src/validation/index.ts +110 -0
  82. package/src/validation/input-params.ts +45 -0
  83. package/src/validation/override-functions.ts +44 -0
  84. package/src/validation/overrideFunctions.ts +44 -0
  85. package/src/validation/preset-tokens.json +23 -0
  86. package/src/validation/validator.ts +384 -0
  87. package/test/adapter.test.ts +27 -0
  88. package/test/background-executor.test.ts +108 -0
  89. package/test/cache/cache-key.test.ts +114 -0
  90. package/test/cache/helper.ts +100 -0
  91. package/test/cache/local.test.ts +54 -0
  92. package/test/cache/redis.test.ts +89 -0
  93. package/test/correlation.test.ts +114 -0
  94. package/test/index.test.ts +37 -0
  95. package/test/metrics/feed-id.test.ts +38 -0
  96. package/test/metrics/helper.ts +14 -0
  97. package/test/metrics/labels.test.ts +36 -0
  98. package/test/metrics/metrics.test.ts +267 -0
  99. package/test/metrics/redis-metrics.test.ts +113 -0
  100. package/test/metrics/warmer-metrics.test.ts +193 -0
  101. package/test/metrics/ws-metrics.test.ts +225 -0
  102. package/test/rate-limit-config.test.ts +242 -0
  103. package/test/smoke/smoke.test.ts +166 -0
  104. package/test/smoke/test-payload-fail.json +3 -0
  105. package/test/smoke/test-payload.js +22 -0
  106. package/test/smoke/test-payload.json +7 -0
  107. package/test/transports/batch.test.ts +466 -0
  108. package/test/transports/rest.test.ts +242 -0
  109. package/test/transports/websocket.test.ts +183 -0
  110. package/test/tsconfig.json +5 -0
  111. package/test/util.ts +77 -0
  112. package/test/validation.test.ts +178 -0
  113. package/test.sh +20 -0
  114. package/test2.sh +2 -0
  115. package/tsconfig.json +28 -0
  116. package/typedoc.json +6 -0
  117. package/webpack.config.js +57 -0
  118. package/yarn-error.log +3778 -0
  119. package/adapter.d.ts +0 -107
  120. package/adapter.js +0 -115
  121. package/background-executor.d.ts +0 -11
  122. package/background-executor.js +0 -45
  123. package/cache/factory.d.ts +0 -6
  124. package/cache/factory.js +0 -55
  125. package/cache/index.d.ts +0 -94
  126. package/cache/index.js +0 -173
  127. package/cache/local.d.ts +0 -23
  128. package/cache/local.js +0 -83
  129. package/cache/metrics.d.ts +0 -27
  130. package/cache/metrics.js +0 -120
  131. package/cache/redis.d.ts +0 -16
  132. package/cache/redis.js +0 -100
  133. package/chainlink-external-adapter-framework-0.0.6.tgz +0 -0
  134. package/config/index.d.ts +0 -209
  135. package/config/index.js +0 -380
  136. package/config/provider-limits.d.ts +0 -31
  137. package/config/provider-limits.js +0 -79
  138. package/examples/bank-frick/accounts.d.ts +0 -39
  139. package/examples/bank-frick/accounts.js +0 -191
  140. package/examples/bank-frick/config/index.d.ts +0 -4
  141. package/examples/bank-frick/config/index.js +0 -54
  142. package/examples/bank-frick/index.d.ts +0 -2
  143. package/examples/bank-frick/index.js +0 -14
  144. package/examples/bank-frick/util.d.ts +0 -4
  145. package/examples/bank-frick/util.js +0 -39
  146. package/examples/coingecko/batch-warming.d.ts +0 -2
  147. package/examples/coingecko/batch-warming.js +0 -52
  148. package/examples/coingecko/index.d.ts +0 -2
  149. package/examples/coingecko/index.js +0 -10
  150. package/examples/coingecko/rest.d.ts +0 -2
  151. package/examples/coingecko/rest.js +0 -50
  152. package/examples/ncfx/config/index.d.ts +0 -12
  153. package/examples/ncfx/config/index.js +0 -15
  154. package/examples/ncfx/index.d.ts +0 -2
  155. package/examples/ncfx/index.js +0 -10
  156. package/examples/ncfx/websocket.d.ts +0 -36
  157. package/examples/ncfx/websocket.js +0 -72
  158. package/index.d.ts +0 -11
  159. package/index.js +0 -133
  160. package/metrics/constants.d.ts +0 -16
  161. package/metrics/constants.js +0 -25
  162. package/metrics/index.d.ts +0 -15
  163. package/metrics/index.js +0 -122
  164. package/metrics/util.d.ts +0 -7
  165. package/metrics/util.js +0 -9
  166. package/package/adapter.d.ts +0 -88
  167. package/package/adapter.js +0 -112
  168. package/package/background-executor.d.ts +0 -11
  169. package/package/background-executor.js +0 -45
  170. package/package/cache/factory.d.ts +0 -6
  171. package/package/cache/factory.js +0 -57
  172. package/package/cache/index.d.ts +0 -90
  173. package/package/cache/index.js +0 -169
  174. package/package/cache/local.d.ts +0 -23
  175. package/package/cache/local.js +0 -83
  176. package/package/cache/metrics.d.ts +0 -27
  177. package/package/cache/metrics.js +0 -120
  178. package/package/cache/redis.d.ts +0 -16
  179. package/package/cache/redis.js +0 -100
  180. package/package/config/index.d.ts +0 -195
  181. package/package/config/index.js +0 -365
  182. package/package/config/provider-limits.d.ts +0 -31
  183. package/package/config/provider-limits.js +0 -76
  184. package/package/examples/coingecko/batch-warming.d.ts +0 -2
  185. package/package/examples/coingecko/batch-warming.js +0 -52
  186. package/package/examples/coingecko/index.d.ts +0 -2
  187. package/package/examples/coingecko/index.js +0 -10
  188. package/package/examples/coingecko/rest.d.ts +0 -2
  189. package/package/examples/coingecko/rest.js +0 -50
  190. package/package/examples/ncfx/config/index.d.ts +0 -12
  191. package/package/examples/ncfx/config/index.js +0 -15
  192. package/package/examples/ncfx/index.d.ts +0 -2
  193. package/package/examples/ncfx/index.js +0 -10
  194. package/package/examples/ncfx/websocket.d.ts +0 -36
  195. package/package/examples/ncfx/websocket.js +0 -72
  196. package/package/index.d.ts +0 -12
  197. package/package/index.js +0 -92
  198. package/package/metrics/constants.d.ts +0 -16
  199. package/package/metrics/constants.js +0 -25
  200. package/package/metrics/index.d.ts +0 -15
  201. package/package/metrics/index.js +0 -123
  202. package/package/metrics/util.d.ts +0 -3
  203. package/package/metrics/util.js +0 -9
  204. package/package/package.json +0 -72
  205. package/package/rate-limiting/background/fixed-frequency.d.ts +0 -10
  206. package/package/rate-limiting/background/fixed-frequency.js +0 -37
  207. package/package/rate-limiting/index.d.ts +0 -54
  208. package/package/rate-limiting/index.js +0 -63
  209. package/package/rate-limiting/metrics.d.ts +0 -3
  210. package/package/rate-limiting/metrics.js +0 -44
  211. package/package/rate-limiting/request/simple-counting.d.ts +0 -20
  212. package/package/rate-limiting/request/simple-counting.js +0 -62
  213. package/package/test.d.ts +0 -1
  214. package/package/test.js +0 -6
  215. package/package/transports/batch-warming.d.ts +0 -34
  216. package/package/transports/batch-warming.js +0 -101
  217. package/package/transports/index.d.ts +0 -87
  218. package/package/transports/index.js +0 -87
  219. package/package/transports/metrics.d.ts +0 -21
  220. package/package/transports/metrics.js +0 -105
  221. package/package/transports/rest.d.ts +0 -43
  222. package/package/transports/rest.js +0 -129
  223. package/package/transports/util.d.ts +0 -8
  224. package/package/transports/util.js +0 -85
  225. package/package/transports/websocket.d.ts +0 -80
  226. package/package/transports/websocket.js +0 -169
  227. package/package/util/expiring-sorted-set.d.ts +0 -21
  228. package/package/util/expiring-sorted-set.js +0 -47
  229. package/package/util/index.d.ts +0 -11
  230. package/package/util/index.js +0 -35
  231. package/package/util/logger.d.ts +0 -42
  232. package/package/util/logger.js +0 -62
  233. package/package/util/request.d.ts +0 -55
  234. package/package/util/request.js +0 -2
  235. package/package/validation/error.d.ts +0 -50
  236. package/package/validation/error.js +0 -79
  237. package/package/validation/index.d.ts +0 -5
  238. package/package/validation/index.js +0 -86
  239. package/package/validation/input-params.d.ts +0 -15
  240. package/package/validation/input-params.js +0 -30
  241. package/package/validation/override-functions.d.ts +0 -3
  242. package/package/validation/override-functions.js +0 -40
  243. package/package/validation/preset-tokens.json +0 -23
  244. package/package/validation/validator.d.ts +0 -47
  245. package/package/validation/validator.js +0 -303
  246. package/rate-limiting/background/fixed-frequency.d.ts +0 -10
  247. package/rate-limiting/background/fixed-frequency.js +0 -35
  248. package/rate-limiting/index.d.ts +0 -54
  249. package/rate-limiting/index.js +0 -63
  250. package/rate-limiting/metrics.d.ts +0 -3
  251. package/rate-limiting/metrics.js +0 -44
  252. package/rate-limiting/request/simple-counting.d.ts +0 -20
  253. package/rate-limiting/request/simple-counting.js +0 -62
  254. package/test.d.ts +0 -1
  255. package/test.js +0 -6
  256. package/transports/batch-warming.d.ts +0 -35
  257. package/transports/batch-warming.js +0 -101
  258. package/transports/index.d.ts +0 -70
  259. package/transports/index.js +0 -87
  260. package/transports/metrics.d.ts +0 -21
  261. package/transports/metrics.js +0 -105
  262. package/transports/rest.d.ts +0 -44
  263. package/transports/rest.js +0 -131
  264. package/transports/util.d.ts +0 -8
  265. package/transports/util.js +0 -85
  266. package/transports/websocket.d.ts +0 -81
  267. package/transports/websocket.js +0 -168
  268. package/util/expiring-sorted-set.d.ts +0 -21
  269. package/util/expiring-sorted-set.js +0 -47
  270. package/util/index.d.ts +0 -12
  271. package/util/index.js +0 -35
  272. package/util/logger.d.ts +0 -42
  273. package/util/logger.js +0 -62
  274. package/util/request.d.ts +0 -57
  275. package/util/request.js +0 -2
  276. package/util/subscription-set/expiring-sorted-set.d.ts +0 -22
  277. package/util/subscription-set/expiring-sorted-set.js +0 -47
  278. package/util/subscription-set/subscription-set.d.ts +0 -18
  279. package/util/subscription-set/subscription-set.js +0 -19
  280. package/util/test-payload-loader.d.ts +0 -25
  281. package/util/test-payload-loader.js +0 -83
  282. package/validation/error.d.ts +0 -50
  283. package/validation/error.js +0 -79
  284. package/validation/index.d.ts +0 -5
  285. package/validation/index.js +0 -91
  286. package/validation/input-params.d.ts +0 -15
  287. package/validation/input-params.js +0 -30
  288. package/validation/override-functions.d.ts +0 -3
  289. package/validation/override-functions.js +0 -40
  290. package/validation/preset-tokens.json +0 -23
  291. package/validation/validator.d.ts +0 -47
  292. package/validation/validator.js +0 -303
@@ -0,0 +1,278 @@
1
+ /* eslint-disable max-nested-callbacks */
2
+ import { adapter } from '../../src/index'
3
+ import { expose } from '../../../..'
4
+ import { Server } from 'http'
5
+ import request, { SuperTest, Test } from 'supertest'
6
+
7
+ let adapterServer: Server | undefined
8
+
9
+ function sleep(ms: number) {
10
+ // eslint-disable-next-line
11
+ return new Promise((resolve) => setTimeout(resolve, ms))
12
+ }
13
+
14
+ describe('execute', () => {
15
+ const id = '1'
16
+ let req: SuperTest<Test>
17
+
18
+ jest.setTimeout(10000)
19
+
20
+ const successfulRequests = {
21
+ crypto: {
22
+ id,
23
+ data: {
24
+ base: 'ETH',
25
+ quote: 'USD',
26
+ },
27
+ },
28
+ cryptoWithCoinid: {
29
+ id,
30
+ data: {
31
+ coinid: 'bitcoin',
32
+ quote: 'USD',
33
+ },
34
+ },
35
+ cryptoWithOverride: {
36
+ id,
37
+ data: {
38
+ base: 'BTC',
39
+ quote: 'EUR',
40
+ overrides: {
41
+ coingecko: {
42
+ BTC: 'solana',
43
+ },
44
+ },
45
+ },
46
+ },
47
+ coins: {
48
+ id,
49
+ endpoint: 'coins',
50
+ },
51
+ marketcap: {
52
+ id,
53
+ endpoint: 'marketcap',
54
+ data: {
55
+ base: 'ETH',
56
+ quote: 'USD',
57
+ },
58
+ },
59
+ volume: {
60
+ id,
61
+ endpoint: 'volume',
62
+ data: {
63
+ base: 'ETH',
64
+ quote: 'USD',
65
+ },
66
+ },
67
+ globalmarketcap: {
68
+ id,
69
+ endpoint: 'globalmarketcap',
70
+ data: {
71
+ market: 'ETH',
72
+ },
73
+ },
74
+ dominance: {
75
+ id,
76
+ endpoint: 'dominance',
77
+ data: {
78
+ market: 'ETH',
79
+ },
80
+ },
81
+ }
82
+
83
+ const errorRequests = {
84
+ cryptoWithBadSymbol: {
85
+ id,
86
+ data: {
87
+ base: 'ZWXK',
88
+ quote: 'USD',
89
+ },
90
+ },
91
+ cryptoWithBadOverride: {
92
+ id,
93
+ data: {
94
+ base: 'LINK',
95
+ quote: 'USD',
96
+ overrides: {
97
+ coingecko: {
98
+ LINK: 'badtokenid',
99
+ },
100
+ },
101
+ },
102
+ },
103
+ dominanceWithBadSymbol: {
104
+ id,
105
+ endpoint: 'dominance',
106
+ data: {
107
+ market: 'ZWXK',
108
+ },
109
+ },
110
+ }
111
+
112
+ beforeAll(async () => {
113
+ try {
114
+ adapterServer = await expose(adapter)
115
+ req = request('localhost:8080')
116
+ } catch {
117
+ throw new Error('Could not start server when running CoinGecko e2e tests')
118
+ }
119
+ if (!adapterServer) {
120
+ throw new Error('Could not start server when running CoinGecko e2e tests')
121
+ }
122
+
123
+ // Send inital requests to warm the cache
124
+ const pendingRequests: Test[] = []
125
+ for (const reqData of Object.values(successfulRequests)) {
126
+ pendingRequests.push(req.post('/').send(reqData))
127
+ }
128
+ for (const reqData of Object.values(errorRequests)) {
129
+ pendingRequests.push(req.post('/').send(reqData))
130
+ }
131
+ // Wait for all the pending requests to be complete
132
+ Promise.all(pendingRequests)
133
+ // Sleep while the cache is filled
134
+ await sleep(5000)
135
+ })
136
+
137
+ afterAll((done) => {
138
+ if (adapterServer) {
139
+ adapterServer.close(done())
140
+ }
141
+ })
142
+
143
+ describe('crypto api', () => {
144
+ it('should return success', async () => {
145
+ // Send inital request to warm cache
146
+ const response = await req
147
+ .post('/')
148
+ .send(successfulRequests.crypto)
149
+ .set('Accept', '*/*')
150
+ .set('Content-Type', 'application/json')
151
+ .expect(200)
152
+ expect(response.body.result).toBeGreaterThan(0)
153
+ })
154
+
155
+ it('should return success with coinid', async () => {
156
+ const response = await req
157
+ .post('/')
158
+ .send(successfulRequests.cryptoWithCoinid)
159
+ .set('Accept', '*/*')
160
+ .set('Content-Type', 'application/json')
161
+ .expect('Content-Type', /json/)
162
+ .expect(200)
163
+ expect(response.body.result).toBeGreaterThan(0)
164
+ })
165
+
166
+ it('should return error message for bad symbol', async () => {
167
+ await req
168
+ .post('/')
169
+ .send(errorRequests.cryptoWithBadSymbol)
170
+ .set('Accept', '*/*')
171
+ .set('Content-Type', 'application/json')
172
+ .expect(504)
173
+ })
174
+
175
+ it('should return success with override', async () => {
176
+ const response = await req
177
+ .post('/')
178
+ .send(successfulRequests.cryptoWithOverride)
179
+ .set('Accept', '*/*')
180
+ .set('Content-Type', 'application/json')
181
+ .expect('Content-Type', /json/)
182
+ .expect(200)
183
+ expect(response.body.result).toBeGreaterThan(0)
184
+ })
185
+
186
+ it('should return 504 for bad override', async () => {
187
+ const response = await req
188
+ .post('/')
189
+ .send(errorRequests.cryptoWithBadOverride)
190
+ .set('Accept', '*/*')
191
+ .set('Content-Type', 'application/json')
192
+ .expect(504)
193
+ expect(typeof response.body.result === 'string')
194
+ })
195
+
196
+ it('should return 504 for bad symbol', async () => {
197
+ await req
198
+ .post('/')
199
+ .send(errorRequests.cryptoWithBadSymbol)
200
+ .set('Accept', '*/*')
201
+ .set('Content-Type', 'application/json')
202
+ .expect(504)
203
+ })
204
+ })
205
+
206
+ describe('coins api', () => {
207
+ it('should return success', async () => {
208
+ await req
209
+ .post('/')
210
+ .send(successfulRequests.coins)
211
+ .set('Accept', '*/*')
212
+ .set('Content-Type', 'application/json')
213
+ .expect('Content-Type', /json/)
214
+ .expect(200)
215
+ })
216
+ })
217
+
218
+ describe('volume api', () => {
219
+ it('should return success', async () => {
220
+ const response = await req
221
+ .post('/')
222
+ .send(successfulRequests.volume)
223
+ .set('Accept', '*/*')
224
+ .set('Content-Type', 'application/json')
225
+ .expect('Content-Type', /json/)
226
+ .expect(200)
227
+ expect(response.body.result).toBeGreaterThan(0)
228
+ })
229
+ })
230
+
231
+ describe('marketcap api', () => {
232
+ it('should return success', async () => {
233
+ const response = await req
234
+ .post('/')
235
+ .send(successfulRequests.marketcap)
236
+ .set('Accept', '*/*')
237
+ .set('Content-Type', 'application/json')
238
+ .expect('Content-Type', /json/)
239
+ .expect(200)
240
+ expect(response.body.result).toBeGreaterThan(0)
241
+ })
242
+ })
243
+
244
+ describe('globalmarketcap api', () => {
245
+ it('should return success', async () => {
246
+ const response = await req
247
+ .post('/')
248
+ .send(successfulRequests.globalmarketcap)
249
+ .set('Accept', '*/*')
250
+ .set('Content-Type', 'application/json')
251
+ .expect('Content-Type', /json/)
252
+ .expect(200)
253
+ expect(response.body.result).toBeGreaterThan(0)
254
+ })
255
+ })
256
+
257
+ describe('dominance api', () => {
258
+ it('should return success', async () => {
259
+ const response = await req
260
+ .post('/')
261
+ .send(successfulRequests.dominance)
262
+ .set('Accept', '*/*')
263
+ .set('Content-Type', 'application/json')
264
+ .expect('Content-Type', /json/)
265
+ .expect(200)
266
+ expect(response.body.result).toBeGreaterThan(0)
267
+ })
268
+
269
+ it('should return 504 for bad symbol', async () => {
270
+ await req
271
+ .post('/')
272
+ .send(errorRequests.dominanceWithBadSymbol)
273
+ .set('Accept', '*/*')
274
+ .set('Content-Type', 'application/json')
275
+ .expect(504)
276
+ })
277
+ })
278
+ })
@@ -0,0 +1,15 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`execute crypto api should return success 1`] = `1538.07`;
4
+
5
+ exports[`execute crypto api should return success with coinid 1`] = `19870.79`;
6
+
7
+ exports[`execute crypto api should return success with override 1`] = `31.56`;
8
+
9
+ exports[`execute dominance api should return success 1`] = `18.279852881342133`;
10
+
11
+ exports[`execute globalmarketcap api should return success 1`] = `658754556.659843`;
12
+
13
+ exports[`execute marketcap api should return success 1`] = `185951583005.47522`;
14
+
15
+ exports[`execute volume api should return success 1`] = `19905025820.52171`;
@@ -0,0 +1,281 @@
1
+ /* eslint-disable max-nested-callbacks */
2
+ import { adapter } from '../../src/index'
3
+ import { expose } from '../../../..'
4
+ import { Server } from 'http'
5
+ import request, { SuperTest, Test } from 'supertest'
6
+ import { createMocks } from './fixtures'
7
+
8
+ let adapterServer: Server | undefined
9
+
10
+ function sleep(ms: number) {
11
+ // eslint-disable-next-line
12
+ return new Promise((resolve) => setTimeout(resolve, ms))
13
+ }
14
+
15
+ describe('execute', () => {
16
+ const id = '1'
17
+ let req: SuperTest<Test>
18
+
19
+ jest.setTimeout(10000)
20
+
21
+ const successfulRequests = {
22
+ crypto: {
23
+ id,
24
+ data: {
25
+ base: 'ETH',
26
+ quote: 'USD',
27
+ },
28
+ },
29
+ cryptoWithCoinid: {
30
+ id,
31
+ data: {
32
+ coinid: 'bitcoin',
33
+ quote: 'USD',
34
+ },
35
+ },
36
+ cryptoWithOverride: {
37
+ id,
38
+ data: {
39
+ base: 'BTC',
40
+ quote: 'EUR',
41
+ overrides: {
42
+ coingecko: {
43
+ BTC: 'solana',
44
+ },
45
+ },
46
+ },
47
+ },
48
+ coins: {
49
+ id,
50
+ endpoint: 'coins',
51
+ },
52
+ marketcap: {
53
+ id,
54
+ endpoint: 'marketcap',
55
+ data: {
56
+ base: 'ETH',
57
+ quote: 'USD',
58
+ },
59
+ },
60
+ volume: {
61
+ id,
62
+ endpoint: 'volume',
63
+ data: {
64
+ base: 'ETH',
65
+ quote: 'USD',
66
+ },
67
+ },
68
+ globalmarketcap: {
69
+ id,
70
+ endpoint: 'globalmarketcap',
71
+ data: {
72
+ market: 'ETH',
73
+ },
74
+ },
75
+ dominance: {
76
+ id,
77
+ endpoint: 'dominance',
78
+ data: {
79
+ market: 'ETH',
80
+ },
81
+ },
82
+ }
83
+
84
+ const errorRequests = {
85
+ cryptoWithBadSymbol: {
86
+ id,
87
+ data: {
88
+ base: 'ZWXK',
89
+ quote: 'USD',
90
+ },
91
+ },
92
+ cryptoWithBadOverride: {
93
+ id,
94
+ data: {
95
+ base: 'LINK',
96
+ quote: 'USD',
97
+ overrides: {
98
+ coingecko: {
99
+ LINK: 'badtokenid',
100
+ },
101
+ },
102
+ },
103
+ },
104
+ dominanceWithBadSymbol: {
105
+ id,
106
+ endpoint: 'dominance',
107
+ data: {
108
+ market: 'ZWXK',
109
+ },
110
+ },
111
+ }
112
+
113
+ beforeAll(async () => {
114
+ try {
115
+ adapterServer = await expose(adapter)
116
+ req = request('localhost:8080')
117
+ } catch {
118
+ throw new Error('Could not start server when running CoinGecko e2e tests')
119
+ }
120
+ if (!adapterServer) {
121
+ throw new Error('Could not start server when running CoinGecko e2e tests')
122
+ }
123
+
124
+ createMocks()
125
+
126
+ // Send inital requests to warm the cache
127
+ const pendingRequests: Test[] = []
128
+ for (const reqData of Object.values(successfulRequests)) {
129
+ pendingRequests.push(req.post('/').send(reqData))
130
+ }
131
+ for (const reqData of Object.values(errorRequests)) {
132
+ pendingRequests.push(req.post('/').send(reqData))
133
+ }
134
+ // Wait for all the pending requests to be complete
135
+ Promise.all(pendingRequests)
136
+ // Sleep while the cache is filled
137
+ await sleep(5000)
138
+ })
139
+
140
+ afterAll((done) => {
141
+ if (adapterServer) {
142
+ adapterServer.close(done())
143
+ }
144
+ })
145
+
146
+ describe('crypto api', () => {
147
+ it('should return success', async () => {
148
+ // Send inital request to warm cache
149
+ const response = await req
150
+ .post('/')
151
+ .send(successfulRequests.crypto)
152
+ .set('Accept', '*/*')
153
+ .set('Content-Type', 'application/json')
154
+ .expect(200)
155
+ expect(response.body.result).toMatchSnapshot()
156
+ })
157
+
158
+ it('should return success with coinid', async () => {
159
+ const response = await req
160
+ .post('/')
161
+ .send(successfulRequests.cryptoWithCoinid)
162
+ .set('Accept', '*/*')
163
+ .set('Content-Type', 'application/json')
164
+ .expect('Content-Type', /json/)
165
+ .expect(200)
166
+ expect(response.body.result).toMatchSnapshot()
167
+ })
168
+
169
+ it('should return error message for bad symbol', async () => {
170
+ await req
171
+ .post('/')
172
+ .send(errorRequests.cryptoWithBadSymbol)
173
+ .set('Accept', '*/*')
174
+ .set('Content-Type', 'application/json')
175
+ .expect(504)
176
+ })
177
+
178
+ it('should return success with override', async () => {
179
+ const response = await req
180
+ .post('/')
181
+ .send(successfulRequests.cryptoWithOverride)
182
+ .set('Accept', '*/*')
183
+ .set('Content-Type', 'application/json')
184
+ .expect('Content-Type', /json/)
185
+ .expect(200)
186
+ expect(response.body.result).toMatchSnapshot()
187
+ })
188
+
189
+ it('should return 504 for bad override', async () => {
190
+ const response = await req
191
+ .post('/')
192
+ .send(errorRequests.cryptoWithBadOverride)
193
+ .set('Accept', '*/*')
194
+ .set('Content-Type', 'application/json')
195
+ .expect(504)
196
+ expect(typeof response.body.result === 'string')
197
+ })
198
+
199
+ it('should return 504 for bad symbol', async () => {
200
+ await req
201
+ .post('/')
202
+ .send(errorRequests.cryptoWithBadSymbol)
203
+ .set('Accept', '*/*')
204
+ .set('Content-Type', 'application/json')
205
+ .expect(504)
206
+ })
207
+ })
208
+
209
+ describe('coins api', () => {
210
+ it('should return success', async () => {
211
+ await req
212
+ .post('/')
213
+ .send(successfulRequests.coins)
214
+ .set('Accept', '*/*')
215
+ .set('Content-Type', 'application/json')
216
+ .expect('Content-Type', /json/)
217
+ .expect(200)
218
+ })
219
+ })
220
+
221
+ describe('volume api', () => {
222
+ it('should return success', async () => {
223
+ const response = await req
224
+ .post('/')
225
+ .send(successfulRequests.volume)
226
+ .set('Accept', '*/*')
227
+ .set('Content-Type', 'application/json')
228
+ .expect('Content-Type', /json/)
229
+ .expect(200)
230
+ expect(response.body.result).toMatchSnapshot()
231
+ })
232
+ })
233
+
234
+ describe('marketcap api', () => {
235
+ it('should return success', async () => {
236
+ const response = await req
237
+ .post('/')
238
+ .send(successfulRequests.marketcap)
239
+ .set('Accept', '*/*')
240
+ .set('Content-Type', 'application/json')
241
+ .expect('Content-Type', /json/)
242
+ .expect(200)
243
+ expect(response.body.result).toMatchSnapshot()
244
+ })
245
+ })
246
+
247
+ describe('globalmarketcap api', () => {
248
+ it('should return success', async () => {
249
+ const response = await req
250
+ .post('/')
251
+ .send(successfulRequests.globalmarketcap)
252
+ .set('Accept', '*/*')
253
+ .set('Content-Type', 'application/json')
254
+ .expect('Content-Type', /json/)
255
+ .expect(200)
256
+ expect(response.body.result).toMatchSnapshot()
257
+ })
258
+ })
259
+
260
+ describe('dominance api', () => {
261
+ it('should return success', async () => {
262
+ const response = await req
263
+ .post('/')
264
+ .send(successfulRequests.dominance)
265
+ .set('Accept', '*/*')
266
+ .set('Content-Type', 'application/json')
267
+ .expect('Content-Type', /json/)
268
+ .expect(200)
269
+ expect(response.body.result).toMatchSnapshot()
270
+ })
271
+
272
+ it('should return 504 for bad symbol', async () => {
273
+ await req
274
+ .post('/')
275
+ .send(errorRequests.dominanceWithBadSymbol)
276
+ .set('Accept', '*/*')
277
+ .set('Content-Type', 'application/json')
278
+ .expect(504)
279
+ })
280
+ })
281
+ })