@@ -9,19 +9,20 @@ import { DataSourceError } from '@/domain/errors/data-source.error';
9
9
import { NetworkResponseError } from '@/datasources/network/entities/network.error.entity' ;
10
10
import { rawify } from '@/validation/entities/raw.entity' ;
11
11
import type { IConfigurationService } from '@/config/configuration.service.interface' ;
12
- import type { INetworkService } from '@/datasources/network/network.service.interface ' ;
12
+ import type { CacheFirstDataSource } from '@/datasources/cache/cache.first.data.source ' ;
13
13
14
14
const mockConfigurationService = jest . mocked ( {
15
15
getOrThrow : jest . fn ( ) ,
16
16
} as jest . MockedObjectDeep < IConfigurationService > ) ;
17
17
18
- const mockNetworkService = jest . mocked ( {
18
+ const mockCacheFirstDataSource = jest . mocked ( {
19
19
get : jest . fn ( ) ,
20
20
post : jest . fn ( ) ,
21
- } as jest . MockedObjectDeep < INetworkService > ) ;
21
+ } as jest . MockedObjectDeep < CacheFirstDataSource > ) ;
22
22
23
23
describe ( 'DataDecoderApi' , ( ) => {
24
24
const baseUrl = faker . internet . url ( { appendSlash : false } ) ;
25
+ const notFoundExpireTimeSeconds = faker . number . int ( ) ;
25
26
let target : DataDecoderApi ;
26
27
27
28
beforeEach ( ( ) => {
@@ -31,12 +32,15 @@ describe('DataDecoderApi', () => {
31
32
if ( key === 'safeDataDecoder.baseUri' ) {
32
33
return baseUrl ;
33
34
}
35
+ if ( key === 'expirationTimeInSeconds.notFound.default' ) {
36
+ return notFoundExpireTimeSeconds ;
37
+ }
34
38
throw new Error ( 'Unexpected key' ) ;
35
39
} ) ;
36
40
const httpErrorFactory = new HttpErrorFactory ( ) ;
37
41
target = new DataDecoderApi (
38
42
mockConfigurationService ,
39
- mockNetworkService ,
43
+ mockCacheFirstDataSource ,
40
44
httpErrorFactory ,
41
45
) ;
42
46
} ) ;
@@ -48,19 +52,24 @@ describe('DataDecoderApi', () => {
48
52
const chainId = faker . string . numeric ( ) ;
49
53
const data = faker . string . hexadecimal ( ) as `0x${string } `;
50
54
const getDataDecodedUrl = `${ baseUrl } /api/v1/data-decoder` ;
51
- mockNetworkService . post . mockImplementation ( ( { url } ) => {
55
+ mockCacheFirstDataSource . post . mockImplementation ( ( { url } ) => {
52
56
if ( url === getDataDecodedUrl ) {
53
- return Promise . resolve ( { status : 200 , data : rawify ( dataDecoded ) } ) ;
57
+ return Promise . resolve ( rawify ( dataDecoded ) ) ;
54
58
}
55
59
throw new Error ( 'Unexpected URL' ) ;
56
60
} ) ;
57
61
58
62
const actual = await target . getDecodedData ( { data, to, chainId } ) ;
59
63
60
64
expect ( actual ) . toStrictEqual ( dataDecoded ) ;
61
- expect ( mockNetworkService . post ) . toHaveBeenCalledTimes ( 1 ) ;
62
- expect ( mockNetworkService . post ) . toHaveBeenCalledWith ( {
65
+ expect ( mockCacheFirstDataSource . post ) . toHaveBeenCalledTimes ( 1 ) ;
66
+ expect ( mockCacheFirstDataSource . post ) . toHaveBeenCalledWith ( {
67
+ cacheDir : {
68
+ field : '' ,
69
+ key : `${ chainId } _decoded_data_${ data } _${ to } ` ,
70
+ } ,
63
71
url : getDataDecodedUrl ,
72
+ notFoundExpireTimeSeconds,
64
73
data : { chainId, to, data } ,
65
74
} ) ;
66
75
} ) ;
@@ -75,7 +84,7 @@ describe('DataDecoderApi', () => {
75
84
} ) ;
76
85
const expected = new DataSourceError ( errorMessage , statusCode ) ;
77
86
const getDataDecodedUrl = `${ baseUrl } /api/v1/data-decoder` ;
78
- mockNetworkService . post . mockImplementation ( ( { url } ) => {
87
+ mockCacheFirstDataSource . post . mockImplementation ( ( { url } ) => {
79
88
if ( url === getDataDecodedUrl ) {
80
89
return Promise . reject (
81
90
new NetworkResponseError (
@@ -94,9 +103,14 @@ describe('DataDecoderApi', () => {
94
103
target . getDecodedData ( { data, to, chainId } ) ,
95
104
) . rejects . toThrow ( expected ) ;
96
105
97
- expect ( mockNetworkService . post ) . toHaveBeenCalledTimes ( 1 ) ;
98
- expect ( mockNetworkService . post ) . toHaveBeenCalledWith ( {
106
+ expect ( mockCacheFirstDataSource . post ) . toHaveBeenCalledTimes ( 1 ) ;
107
+ expect ( mockCacheFirstDataSource . post ) . toHaveBeenCalledWith ( {
108
+ cacheDir : {
109
+ field : '' ,
110
+ key : `${ chainId } _decoded_data_${ data } _${ to } ` ,
111
+ } ,
99
112
url : getDataDecodedUrl ,
113
+ notFoundExpireTimeSeconds,
100
114
data : { chainId, to, data } ,
101
115
} ) ;
102
116
} ) ;
@@ -107,9 +121,9 @@ describe('DataDecoderApi', () => {
107
121
const contract = contractBuilder ( ) . build ( ) ;
108
122
const contractPage = pageBuilder ( ) . with ( 'results' , [ contract ] ) . build ( ) ;
109
123
const getContractsUrl = `${ baseUrl } /api/v1/contracts/${ contract . address } ` ;
110
- mockNetworkService . get . mockImplementation ( ( { url } ) => {
124
+ mockCacheFirstDataSource . get . mockImplementation ( ( { url } ) => {
111
125
if ( url === getContractsUrl ) {
112
- return Promise . resolve ( { status : 200 , data : rawify ( contractPage ) } ) ;
126
+ return Promise . resolve ( rawify ( contractPage ) ) ;
113
127
}
114
128
throw new Error ( 'Unexpected URL' ) ;
115
129
} ) ;
@@ -120,9 +134,14 @@ describe('DataDecoderApi', () => {
120
134
} ) ;
121
135
122
136
expect ( actual ) . toStrictEqual ( contractPage ) ;
123
- expect ( mockNetworkService . get ) . toHaveBeenCalledTimes ( 1 ) ;
124
- expect ( mockNetworkService . get ) . toHaveBeenCalledWith ( {
137
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledTimes ( 1 ) ;
138
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledWith ( {
139
+ cacheDir : {
140
+ field : 'undefined_undefined' ,
141
+ key : `${ contract . chainId } _decoded_data_contracts_${ contract . address } ` ,
142
+ } ,
125
143
url : getContractsUrl ,
144
+ notFoundExpireTimeSeconds,
126
145
networkRequest : {
127
146
params : {
128
147
chain_ids : contract . chainId . toString ( ) ,
@@ -142,9 +161,9 @@ describe('DataDecoderApi', () => {
142
161
] ;
143
162
const contractPage = pageBuilder ( ) . with ( 'results' , [ contract ] ) . build ( ) ;
144
163
const getContractsUrl = `${ baseUrl } /api/v1/contracts/${ contract . address } ` ;
145
- mockNetworkService . get . mockImplementation ( ( { url } ) => {
164
+ mockCacheFirstDataSource . get . mockImplementation ( ( { url } ) => {
146
165
if ( url === getContractsUrl ) {
147
- return Promise . resolve ( { status : 200 , data : rawify ( contractPage ) } ) ;
166
+ return Promise . resolve ( rawify ( contractPage ) ) ;
148
167
}
149
168
throw new Error ( 'Unexpected URL' ) ;
150
169
} ) ;
@@ -155,9 +174,14 @@ describe('DataDecoderApi', () => {
155
174
} ) ;
156
175
157
176
expect ( actual ) . toStrictEqual ( contractPage ) ;
158
- expect ( mockNetworkService . get ) . toHaveBeenCalledTimes ( 1 ) ;
159
- expect ( mockNetworkService . get ) . toHaveBeenCalledWith ( {
177
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledTimes ( 1 ) ;
178
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledWith ( {
179
+ cacheDir : {
180
+ field : 'undefined_undefined' ,
181
+ key : `${ chainIds . sort ( ) . join ( '_' ) } _decoded_data_contracts_${ contract . address } ` ,
182
+ } ,
160
183
url : getContractsUrl ,
184
+ notFoundExpireTimeSeconds,
161
185
networkRequest : {
162
186
params : {
163
187
chain_ids : `${ chainIds [ 0 ] } &chain_ids=${ chainIds [ 1 ] } &chain_ids=${ chainIds [ 2 ] } ` ,
@@ -176,7 +200,7 @@ describe('DataDecoderApi', () => {
176
200
} ) ;
177
201
const expected = new DataSourceError ( errorMessage , statusCode ) ;
178
202
const getContractsUrl = `${ baseUrl } /api/v1/contracts/${ contract . address } ` ;
179
- mockNetworkService . get . mockImplementation ( ( { url } ) => {
203
+ mockCacheFirstDataSource . get . mockImplementation ( ( { url } ) => {
180
204
if ( url === getContractsUrl ) {
181
205
return Promise . reject (
182
206
new NetworkResponseError (
@@ -198,9 +222,14 @@ describe('DataDecoderApi', () => {
198
222
} ) ,
199
223
) . rejects . toThrow ( expected ) ;
200
224
201
- expect ( mockNetworkService . get ) . toHaveBeenCalledTimes ( 1 ) ;
202
- expect ( mockNetworkService . get ) . toHaveBeenCalledWith ( {
225
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledTimes ( 1 ) ;
226
+ expect ( mockCacheFirstDataSource . get ) . toHaveBeenCalledWith ( {
227
+ cacheDir : {
228
+ field : 'undefined_undefined' ,
229
+ key : `${ contract . chainId } _decoded_data_contracts_${ contract . address } ` ,
230
+ } ,
203
231
url : getContractsUrl ,
232
+ notFoundExpireTimeSeconds,
204
233
networkRequest : {
205
234
params : {
206
235
chain_ids : contract . chainId . toString ( ) ,
0 commit comments