@pinata/sdk 1.1.25 → 1.2.0
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.
- package/.babelrc +4 -3
- package/.nvmrc +1 -1
- package/README.md +85 -123
- package/lib/pinata-sdk.js +348 -217
- package/lib/pinata-sdk.min.js +5 -5
- package/package.json +3 -2
- package/src/commands/data/getFilesByCount/getFilesByCount.js +70 -0
- package/src/commands/data/pinList/pinList.js +4 -2
- package/src/commands/data/pinList/queryBuilder.js +4 -0
- package/src/index.js +5 -25
- package/test/commands/data/getFilesByCount/getFilesByCount.test.js +215 -0
- package/test/commands/data/pinList/pinList.test.js +95 -26
- package/test/commands/data/pinlist-sample-api.js +540 -0
- package/types/commands/data/getFilesByCount/getFilesByCount.d.ts +12 -0
- package/types/commands/data/pinList/pinList.d.ts +2 -2
- package/types/index.d.ts +0 -31
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinata/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Official SDK for the Pinata IPFS platform",
|
|
5
5
|
"main": "lib/pinata-sdk.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@babel/cli": "^7.8.4",
|
|
38
38
|
"@babel/core": "^7.8.4",
|
|
39
|
-
"@babel/
|
|
39
|
+
"@babel/plugin-transform-runtime": "^7.19.1",
|
|
40
|
+
"@babel/preset-env": "^7.19.4",
|
|
40
41
|
"@babel/register": "^7.8.3",
|
|
41
42
|
"@types/node": "^15.6.1",
|
|
42
43
|
"acorn": "^7.1.0",
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { validateApiKeys } from '../../../util/validators';
|
|
2
|
+
import pinList from '../pinList/pinList';
|
|
3
|
+
|
|
4
|
+
export default function getFilesByCount(
|
|
5
|
+
pinataApiKey,
|
|
6
|
+
pinataSecretApiKey,
|
|
7
|
+
|
|
8
|
+
filters = {},
|
|
9
|
+
maxCount = -1
|
|
10
|
+
) {
|
|
11
|
+
validateApiKeys(pinataApiKey, pinataSecretApiKey);
|
|
12
|
+
if (maxCount === 0) {
|
|
13
|
+
throw Error("Max count can't be 0");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const asyncIterable = {
|
|
17
|
+
[Symbol.asyncIterator]: () => {
|
|
18
|
+
let i = 0;
|
|
19
|
+
const pageLimit = 10;
|
|
20
|
+
let pageOffset = 0;
|
|
21
|
+
let cache = [];
|
|
22
|
+
let keepLooping = false;
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
next() {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
if (i === 0 || (i % pageLimit === 0 && keepLooping)) {
|
|
28
|
+
resolve(
|
|
29
|
+
pinList(pinataApiKey, pinataSecretApiKey, {
|
|
30
|
+
filters,
|
|
31
|
+
...{ pageOffset, pageLimit }
|
|
32
|
+
}).then((resp) => {
|
|
33
|
+
cache = resp.rows;
|
|
34
|
+
pageOffset = pageOffset + cache.length;
|
|
35
|
+
|
|
36
|
+
// If the user requested all pins we have to keep looping if the limit page was not fulfill
|
|
37
|
+
keepLooping =
|
|
38
|
+
cache.length !== 0 &&
|
|
39
|
+
(maxCount === -1 ?
|
|
40
|
+
cache.length === pageLimit :
|
|
41
|
+
i < maxCount);
|
|
42
|
+
})
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
resolve();
|
|
46
|
+
}).then(() => {
|
|
47
|
+
const valueToReturn = cache[i % pageLimit];
|
|
48
|
+
|
|
49
|
+
const done = !(
|
|
50
|
+
(maxCount === -1 ? i < pageOffset : i < maxCount) &&
|
|
51
|
+
keepLooping
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
i++;
|
|
55
|
+
return Promise.resolve({
|
|
56
|
+
value: valueToReturn,
|
|
57
|
+
done
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
return() {
|
|
62
|
+
// This will be reached if the consumer called 'break' or 'return' early in the loop.
|
|
63
|
+
return Promise.resolve({ value: i, done: true });
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return asyncIterable;
|
|
70
|
+
}
|
|
@@ -8,12 +8,14 @@ import queryBuilder from './queryBuilder';
|
|
|
8
8
|
* Pin List
|
|
9
9
|
* @param {string} pinataApiKey
|
|
10
10
|
* @param {string} pinataSecretApiKey
|
|
11
|
-
* @param {
|
|
11
|
+
* @param {any} filters
|
|
12
12
|
* @returns {Promise<unknown>}
|
|
13
13
|
*/
|
|
14
|
-
export default function pinList(pinataApiKey, pinataSecretApiKey, filters) {
|
|
14
|
+
export default function pinList(pinataApiKey, pinataSecretApiKey, filters = {}) {
|
|
15
15
|
validateApiKeys(pinataApiKey, pinataSecretApiKey);
|
|
16
16
|
|
|
17
|
+
filters = {...filters, ...{includeCount: 'false' }};
|
|
18
|
+
|
|
17
19
|
const baseEndpoint = `${baseUrl}/data/pinList`;
|
|
18
20
|
const endpoint = queryBuilder(baseEndpoint, filters);
|
|
19
21
|
|
|
@@ -35,6 +35,10 @@ export default function queryBuilder(baseUrl, filters) {
|
|
|
35
35
|
|
|
36
36
|
if (filters) {
|
|
37
37
|
// now we need to construct the actual URL based on the given filters provided
|
|
38
|
+
if (filters.includeCount) {
|
|
39
|
+
filterQuery = filterQuery + `includeCount=${filters.includeCount}&`;
|
|
40
|
+
}
|
|
41
|
+
|
|
38
42
|
if (filters.hashContains) {
|
|
39
43
|
if (typeof filters.hashContains !== 'string') {
|
|
40
44
|
throw new Error('hashContains value is not a string');
|
package/src/index.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import pinByHash from './commands/pinning/pinByHash';
|
|
2
2
|
import hashMetadata from './commands/pinning/hashMetadata';
|
|
3
|
-
import hashPinPolicy from './commands/pinning/hashPinPolicy';
|
|
4
3
|
import pinFileToIPFS from './commands/pinning/pinFileToIPFS';
|
|
5
4
|
import pinFromFS from './commands/pinning/pinFromFS';
|
|
6
5
|
import pinJSONToIPFS from './commands/pinning/pinJSONToIPFS';
|
|
7
6
|
import pinJobs from './commands/pinning/pinJobs/pinJobs';
|
|
8
7
|
import unpin from './commands/pinning/unpin';
|
|
9
|
-
import userPinPolicy from './commands/pinning/userPinPolicy';
|
|
10
8
|
import testAuthentication from './commands/data/testAuthentication';
|
|
11
9
|
import pinList from './commands/data/pinList/pinList';
|
|
10
|
+
import getFilesByCount from './commands/data/getFilesByCount/getFilesByCount';
|
|
12
11
|
import userPinnedDataTotal from './commands/data/userPinnedDataTotal';
|
|
13
12
|
|
|
14
13
|
// OPTIONS
|
|
@@ -135,14 +134,6 @@ import userPinnedDataTotal from './commands/data/userPinnedDataTotal';
|
|
|
135
134
|
* @returns {Promise<any>}
|
|
136
135
|
*/
|
|
137
136
|
|
|
138
|
-
/**
|
|
139
|
-
* Hash pin policy
|
|
140
|
-
* @callback hashPinPolicy
|
|
141
|
-
* @param {string} ipfsPinHash
|
|
142
|
-
* @param {{regions: PinataPinPolicyItem[]}} newPinPolicy
|
|
143
|
-
* @returns {Promise<any>}
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
137
|
/**
|
|
147
138
|
* Pin by hash
|
|
148
139
|
* @callback pinByHash
|
|
@@ -189,13 +180,6 @@ import userPinnedDataTotal from './commands/data/userPinnedDataTotal';
|
|
|
189
180
|
* @returns {Promise<any>}
|
|
190
181
|
*/
|
|
191
182
|
|
|
192
|
-
/**
|
|
193
|
-
* User Pin Policy
|
|
194
|
-
* @callback userPinPolicy
|
|
195
|
-
* @param {{regions: PinataPinPolicyItem[]}} newPinPolicy
|
|
196
|
-
* @returns {Promise<any>}
|
|
197
|
-
*/
|
|
198
|
-
|
|
199
183
|
/**
|
|
200
184
|
* Test Authentication
|
|
201
185
|
* @callback testAuthentication
|
|
@@ -219,13 +203,11 @@ import userPinnedDataTotal from './commands/data/userPinnedDataTotal';
|
|
|
219
203
|
* @typedef PinataClient
|
|
220
204
|
* @property {pinByHash} pinByHash
|
|
221
205
|
* @property {hashMetadata} hashMetadata
|
|
222
|
-
* @property {hashPinPolicy} hashPinPolicy
|
|
223
206
|
* @property {pinFileToIPFS} pinFileToIPFS
|
|
224
207
|
* @property {pinFromFS} pinFromFS
|
|
225
208
|
* @property {pinJSONToIPFS} pinJSONToIPFS
|
|
226
209
|
* @property {pinJobs} pinJobs
|
|
227
210
|
* @property {unpin} unpin
|
|
228
|
-
* @property {userPinPolicy} userPinPolicy
|
|
229
211
|
* @property {testAuthentication} testAuthentication
|
|
230
212
|
* @property {pinList} pinList
|
|
231
213
|
* @property {userPinnedDataTotal} userPinnedDataTotal
|
|
@@ -248,9 +230,6 @@ export default function pinataClient(pinataApiKey, pinataSecretApiKey) {
|
|
|
248
230
|
client.hashMetadata = function (ipfsPinHash, metadata) {
|
|
249
231
|
return hashMetadata(pinataApiKey, pinataSecretApiKey, ipfsPinHash, metadata);
|
|
250
232
|
};
|
|
251
|
-
client.hashPinPolicy = function (ipfsPinHash, newPinPolicy) {
|
|
252
|
-
return hashPinPolicy(pinataApiKey, pinataSecretApiKey, ipfsPinHash, newPinPolicy);
|
|
253
|
-
};
|
|
254
233
|
client.pinFileToIPFS = function (readableStream, options) {
|
|
255
234
|
return pinFileToIPFS(pinataApiKey, pinataSecretApiKey, readableStream, options);
|
|
256
235
|
};
|
|
@@ -266,15 +245,16 @@ export default function pinataClient(pinataApiKey, pinataSecretApiKey) {
|
|
|
266
245
|
client.unpin = function (hashToUnpin) {
|
|
267
246
|
return unpin(pinataApiKey, pinataSecretApiKey, hashToUnpin);
|
|
268
247
|
};
|
|
269
|
-
client.userPinPolicy = function (newPinPolicy) {
|
|
270
|
-
return userPinPolicy(pinataApiKey, pinataSecretApiKey, newPinPolicy);
|
|
271
|
-
};
|
|
272
248
|
client.testAuthentication = function () {
|
|
273
249
|
return testAuthentication(pinataApiKey, pinataSecretApiKey);
|
|
274
250
|
};
|
|
275
251
|
client.pinList = function (filters) {
|
|
276
252
|
return pinList(pinataApiKey, pinataSecretApiKey, filters);
|
|
277
253
|
};
|
|
254
|
+
|
|
255
|
+
client.getFilesByCount = function (filters, maxCount,) {
|
|
256
|
+
return getFilesByCount(pinataApiKey, pinataSecretApiKey, filters, maxCount);
|
|
257
|
+
};
|
|
278
258
|
client.userPinnedDataTotal = function () {
|
|
279
259
|
return userPinnedDataTotal(pinataApiKey, pinataSecretApiKey);
|
|
280
260
|
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import getFilesByCount from "../../../../src/commands/data/getFilesByCount/getFilesByCount";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import { APIData, pinListAxiosMockPages, fakeHeaders } from "../pinlist-sample-api";
|
|
4
|
+
|
|
5
|
+
jest.mock("axios");
|
|
6
|
+
|
|
7
|
+
const metadataName = (item) => {
|
|
8
|
+
return item.metadata.name;
|
|
9
|
+
};
|
|
10
|
+
const callIterableObject = async (
|
|
11
|
+
pinataKey,
|
|
12
|
+
pinataSecret,
|
|
13
|
+
filterToApply,
|
|
14
|
+
pinsCount
|
|
15
|
+
) => {
|
|
16
|
+
const pins = [];
|
|
17
|
+
for await (const item of getFilesByCount(
|
|
18
|
+
pinataKey,
|
|
19
|
+
pinataSecret,
|
|
20
|
+
filterToApply,
|
|
21
|
+
pinsCount
|
|
22
|
+
)) {
|
|
23
|
+
pins.push(metadataName(item));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return pins;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
describe("Get Files By Count", () => {
|
|
30
|
+
const filterToApply = {
|
|
31
|
+
status: "pinned",
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
jest.resetAllMocks();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("Request 17 pins, pins available", async () => {
|
|
39
|
+
const pinsToRequest = 17;
|
|
40
|
+
|
|
41
|
+
axios.get
|
|
42
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
43
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
44
|
+
|
|
45
|
+
const pins = await callIterableObject(
|
|
46
|
+
fakeHeaders.headers.pinata_api_key,
|
|
47
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
48
|
+
filterToApply,
|
|
49
|
+
pinsToRequest
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(pins).toEqual(
|
|
53
|
+
APIData.rows.slice(0, pinsToRequest).map(metadataName)
|
|
54
|
+
);
|
|
55
|
+
expect(pins).toHaveLength(pinsToRequest);
|
|
56
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
57
|
+
1,
|
|
58
|
+
pinListAxiosMockPages.firstPage.url,
|
|
59
|
+
pinListAxiosMockPages.firstPage.headers
|
|
60
|
+
);
|
|
61
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
62
|
+
2,
|
|
63
|
+
pinListAxiosMockPages.secondPage.url,
|
|
64
|
+
pinListAxiosMockPages.secondPage.headers
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("Request 6 pins, pins available", async () => {
|
|
71
|
+
const pinsToRequest = 6;
|
|
72
|
+
|
|
73
|
+
axios.get.mockResolvedValueOnce(
|
|
74
|
+
pinListAxiosMockPages.firstPage.response
|
|
75
|
+
);
|
|
76
|
+
const pins = await callIterableObject(
|
|
77
|
+
fakeHeaders.headers.pinata_api_key,
|
|
78
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
79
|
+
filterToApply,
|
|
80
|
+
pinsToRequest
|
|
81
|
+
);
|
|
82
|
+
expect(pins).toEqual(
|
|
83
|
+
APIData.rows.slice(0, pinsToRequest).map(metadataName)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
expect(pins).toHaveLength(pinsToRequest);
|
|
87
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
88
|
+
1,
|
|
89
|
+
pinListAxiosMockPages.firstPage.url,
|
|
90
|
+
pinListAxiosMockPages.firstPage.headers
|
|
91
|
+
);
|
|
92
|
+
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("Request 25 pins, pins not available", async () => {
|
|
96
|
+
const pinsToRequest = 25;
|
|
97
|
+
|
|
98
|
+
axios.get
|
|
99
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
100
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
101
|
+
.mockResolvedValueOnce(
|
|
102
|
+
pinListAxiosMockPages.thirdPageEmpty.response
|
|
103
|
+
);
|
|
104
|
+
const pins = await callIterableObject(
|
|
105
|
+
fakeHeaders.headers.pinata_api_key,
|
|
106
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
107
|
+
filterToApply,
|
|
108
|
+
pinsToRequest
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
expect(pins).toEqual(
|
|
112
|
+
APIData.rows.slice(0, pinsToRequest).map(metadataName)
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
expect(pins).toHaveLength(20);
|
|
116
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
117
|
+
1,
|
|
118
|
+
pinListAxiosMockPages.firstPage.url,
|
|
119
|
+
pinListAxiosMockPages.firstPage.headers
|
|
120
|
+
);
|
|
121
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
122
|
+
2,
|
|
123
|
+
pinListAxiosMockPages.secondPage.url,
|
|
124
|
+
pinListAxiosMockPages.secondPage.headers
|
|
125
|
+
);
|
|
126
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
127
|
+
3,
|
|
128
|
+
pinListAxiosMockPages.thirdPageEmpty.url,
|
|
129
|
+
pinListAxiosMockPages.thirdPageEmpty.headers
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("Request 3 pins, pins not available", async () => {
|
|
136
|
+
const pinsToRequest = 3;
|
|
137
|
+
|
|
138
|
+
axios.get.mockResolvedValueOnce(
|
|
139
|
+
pinListAxiosMockPages.firstPageEmpty.response
|
|
140
|
+
);
|
|
141
|
+
const pins = await callIterableObject(
|
|
142
|
+
fakeHeaders.headers.pinata_api_key,
|
|
143
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
144
|
+
filterToApply,
|
|
145
|
+
pinsToRequest
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
expect(pins).toEqual([]);
|
|
149
|
+
|
|
150
|
+
expect(pins).toHaveLength(0);
|
|
151
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
152
|
+
1,
|
|
153
|
+
pinListAxiosMockPages.firstPageEmpty.url,
|
|
154
|
+
pinListAxiosMockPages.firstPageEmpty.headers
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("Request all pins, pins available", async () => {
|
|
161
|
+
axios.get
|
|
162
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
163
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
164
|
+
.mockResolvedValueOnce(
|
|
165
|
+
pinListAxiosMockPages.thirdPageEmpty.response
|
|
166
|
+
);
|
|
167
|
+
const pins = await callIterableObject(
|
|
168
|
+
fakeHeaders.headers.pinata_api_key,
|
|
169
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
170
|
+
filterToApply
|
|
171
|
+
);
|
|
172
|
+
expect(pins).toEqual(APIData.rows.map(metadataName));
|
|
173
|
+
|
|
174
|
+
expect(pins).toHaveLength(APIData.rows.length);
|
|
175
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
176
|
+
1,
|
|
177
|
+
pinListAxiosMockPages.firstPage.url,
|
|
178
|
+
pinListAxiosMockPages.firstPage.headers
|
|
179
|
+
);
|
|
180
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
181
|
+
2,
|
|
182
|
+
pinListAxiosMockPages.secondPage.url,
|
|
183
|
+
pinListAxiosMockPages.secondPage.headers
|
|
184
|
+
);
|
|
185
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
186
|
+
3,
|
|
187
|
+
pinListAxiosMockPages.thirdPageEmpty.url,
|
|
188
|
+
pinListAxiosMockPages.thirdPageEmpty.headers
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("Request all pins, pins not available", async () => {
|
|
195
|
+
axios.get.mockResolvedValueOnce(
|
|
196
|
+
pinListAxiosMockPages.firstPageEmpty.response
|
|
197
|
+
);
|
|
198
|
+
const pins = await callIterableObject(
|
|
199
|
+
fakeHeaders.headers.pinata_api_key,
|
|
200
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
201
|
+
filterToApply
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
expect(pins).toEqual([]);
|
|
205
|
+
|
|
206
|
+
expect(pins).toHaveLength(0);
|
|
207
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
208
|
+
1,
|
|
209
|
+
pinListAxiosMockPages.firstPageEmpty.url,
|
|
210
|
+
pinListAxiosMockPages.firstPageEmpty.headers
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
@@ -1,29 +1,98 @@
|
|
|
1
|
-
import axios from
|
|
2
|
-
import pinList from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
status: 700
|
|
9
|
-
};
|
|
10
|
-
axios.get.mockResolvedValue(badStatus);
|
|
11
|
-
expect.assertions(1);
|
|
12
|
-
expect(pinList('test', 'test')).rejects.toEqual(Error(`unknown server response while attempting to retrieve user pin list: ${badStatus}`));
|
|
13
|
-
});
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import pinList from "./../../../../src/commands/data/pinList/pinList";
|
|
3
|
+
import {
|
|
4
|
+
APIData,
|
|
5
|
+
pinListAxiosMockPages,
|
|
6
|
+
fakeHeaders,
|
|
7
|
+
} from "../pinlist-sample-api";
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
jest.mock("axios");
|
|
10
|
+
|
|
11
|
+
describe("Get Files By Count", () => {
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
jest.resetAllMocks();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("Call two pages in a row", async () => {
|
|
17
|
+
axios.get
|
|
18
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
19
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
20
|
+
|
|
21
|
+
const resp = await pinList(
|
|
22
|
+
fakeHeaders.headers.pinata_api_key,
|
|
23
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
24
|
+
{ pageLimit: 10, pageOffset: 0 }
|
|
25
|
+
);
|
|
26
|
+
const resp2 = await pinList(
|
|
27
|
+
fakeHeaders.headers.pinata_api_key,
|
|
28
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
29
|
+
{ pageLimit: 10, pageOffset: 10 }
|
|
30
|
+
);
|
|
31
|
+
expect(resp).toEqual(pinListAxiosMockPages.firstPage.response.data);
|
|
32
|
+
expect(resp2).toEqual(pinListAxiosMockPages.secondPage.response.data);
|
|
33
|
+
|
|
34
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
35
|
+
1,
|
|
36
|
+
pinListAxiosMockPages.firstPage.url,
|
|
37
|
+
pinListAxiosMockPages.firstPage.headers
|
|
38
|
+
);
|
|
39
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
40
|
+
2,
|
|
41
|
+
pinListAxiosMockPages.secondPage.url,
|
|
42
|
+
pinListAxiosMockPages.secondPage.headers
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("Call empty page", async () => {
|
|
49
|
+
axios.get
|
|
50
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPageEmpty.response)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
const resp = await pinList(
|
|
54
|
+
fakeHeaders.headers.pinata_api_key,
|
|
55
|
+
fakeHeaders.headers.pinata_secret_api_key,
|
|
56
|
+
{ pageLimit: 10, pageOffset: 0 }
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
expect(resp).toEqual({rows: []});
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
63
|
+
1,
|
|
64
|
+
pinListAxiosMockPages.firstPageEmpty.url,
|
|
65
|
+
pinListAxiosMockPages.firstPageEmpty.headers
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
69
|
+
});
|
|
70
|
+
test("Result other than 200 status is returned", () => {
|
|
71
|
+
const badStatus = {
|
|
72
|
+
status: 700,
|
|
73
|
+
};
|
|
74
|
+
axios.get.mockResolvedValue(badStatus);
|
|
75
|
+
expect.assertions(1);
|
|
76
|
+
expect(pinList("test", "test")).rejects.toEqual(
|
|
77
|
+
Error(
|
|
78
|
+
`unknown server response while attempting to retrieve user pin list: ${badStatus}`
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("200 status is returned", () => {
|
|
84
|
+
const goodStatus = {
|
|
85
|
+
status: 200,
|
|
86
|
+
data: "testData",
|
|
87
|
+
};
|
|
88
|
+
axios.get.mockResolvedValue(goodStatus);
|
|
89
|
+
expect.assertions(1);
|
|
90
|
+
expect(pinList("test", "test")).resolves.toEqual(goodStatus.data);
|
|
91
|
+
});
|
|
24
92
|
|
|
25
|
-
test(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
93
|
+
test("Rejection handled", () => {
|
|
94
|
+
axios.get.mockRejectedValue("test error");
|
|
95
|
+
expect.assertions(1);
|
|
96
|
+
expect(pinList("test", "test")).rejects.toEqual("test error");
|
|
97
|
+
});
|
|
29
98
|
});
|