@pinata/sdk 1.2.1 → 2.0.0-beta.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 +1 -1
- package/.eslintrc +7 -7
- package/.husky/pre-commit +6 -0
- package/.nvmrc +1 -1
- package/README.md +3 -3
- package/lib/pinata-sdk.js +494 -468
- package/lib/pinata-sdk.min.js +5 -5
- package/package.json +83 -71
- package/src/commands/data/getFilesByCount/{getFilesByCount.js → getFilesByCount.ts} +8 -9
- package/src/commands/data/index.ts +4 -0
- package/src/commands/data/pinList/pinList.ts +77 -0
- package/src/commands/data/pinList/{queryBuilder.js → queryBuilder.ts} +6 -16
- package/src/commands/data/{testAuthentication.js → testAuthentication.ts} +8 -9
- package/src/commands/data/{userPinnedDataTotal.js → userPinnedDataTotal.ts} +4 -9
- package/src/commands/pinning/{hashMetadata.js → hashMetadata.ts} +9 -11
- package/src/commands/pinning/index.ts +8 -0
- package/src/commands/pinning/{pinByHash.js → pinByHash.ts} +22 -11
- package/src/commands/pinning/{pinFileToIPFS.js → pinFileToIPFS.ts} +27 -11
- package/src/commands/pinning/{pinFromFS.js → pinFromFS.ts} +14 -19
- package/src/commands/pinning/{pinJSONToIPFS.js → pinJSONToIPFS.ts} +5 -11
- package/src/commands/pinning/pinJobs/{pinJobs.js → pinJobs.ts} +23 -9
- package/src/commands/pinning/pinJobs/{queryBuilder.js → queryBuilder.ts} +2 -8
- package/src/commands/pinning/{unpin.js → unpin.ts} +3 -9
- package/src/{constants.js → constants.ts} +0 -0
- package/src/index.ts +120 -0
- package/src/third-party/base-path-converter.d.ts +3 -0
- package/src/third-party/is-ipfs.d.ts +5 -0
- package/src/third-party/recursive-fs.d.ts +5 -0
- package/src/util/{errorResponse.js → errorResponse.ts} +1 -1
- package/src/util/{validators.js → validators.ts} +14 -33
- package/test/commands/data/getFilesByCount/{getFilesByCount.test.js → getFilesByCount.test.ts} +23 -22
- package/test/commands/data/pinList/{pinList.test.js → pinList.test.ts} +25 -26
- package/test/commands/data/pinList/{queryBuilder.test.js → queryBuilder.test.ts} +9 -10
- package/test/commands/data/pinlist-sample-api.ts +540 -0
- package/test/commands/data/{testAuthentication.test.js → testAuthentication.test.ts} +13 -13
- package/test/commands/data/{userPinnedDataTotal.test.js → userPinnedDataTotal.test.ts} +4 -4
- package/test/commands/pinning/{hashMetadata.test.js → hashMetadata.test.ts} +7 -8
- package/test/commands/pinning/{pinByHash.test.js → pinByHash.test.ts} +4 -5
- package/test/commands/pinning/{pinFileToIPFS.test.js → pinFileToIPFS.test.ts} +5 -7
- package/test/commands/pinning/{pinFromFS.js → pinFromFS.ts} +5 -6
- package/test/commands/pinning/{pinJSONToIPFS.test.js → pinJSONToIPFS.test.ts} +4 -5
- package/test/commands/pinning/pinJobs/{pinJobs.test.js → pinJobs.test.ts} +4 -4
- package/test/commands/pinning/pinJobs/{queryBuilder.test.js → queryBuilder.test.ts} +5 -5
- package/test/commands/pinning/{unpin.test.js → unpin.test.ts} +4 -5
- package/test/util/validators.test.ts +234 -0
- package/tsconfig.json +2 -2
- package/types/commands/data/getFilesByCount/getFilesByCount.d.ts +4 -2
- package/types/commands/data/index.d.ts +4 -0
- package/types/commands/data/pinList/pinList.d.ts +45 -8
- package/types/commands/data/pinList/queryBuilder.d.ts +1 -7
- package/types/commands/data/testAuthentication.d.ts +5 -7
- package/types/commands/data/userPinnedDataTotal.d.ts +2 -7
- package/types/commands/pinning/hashMetadata.d.ts +3 -9
- package/types/commands/pinning/index.d.ts +8 -0
- package/types/commands/pinning/pinByHash.d.ts +14 -9
- package/types/commands/pinning/pinFileToIPFS.d.ts +25 -1
- package/types/commands/pinning/pinFromFS.d.ts +3 -9
- package/types/commands/pinning/pinJSONToIPFS.d.ts +3 -9
- package/types/commands/pinning/pinJobs/pinJobs.d.ts +20 -8
- package/types/commands/pinning/pinJobs/queryBuilder.d.ts +1 -7
- package/types/commands/pinning/unpin.d.ts +2 -8
- package/types/constants.d.ts +2 -2
- package/types/index.d.ts +37 -165
- package/types/util/errorResponse.d.ts +1 -1
- package/types/util/validators.d.ts +20 -37
- package/webpack.config.js +50 -53
- package/src/commands/data/pinList/pinList.js +0 -34
- package/src/commands/pinning/hashPinPolicy.js +0 -51
- package/src/commands/pinning/userPinPolicy.js +0 -40
- package/src/index.js +0 -307
- package/test/commands/data/pinlist-sample-api.js +0 -540
- package/test/commands/pinning/hashPinPolicy.test.js +0 -65
- package/test/commands/pinning/userPinPolicy.test.js +0 -80
- package/test/util/validators.test.js +0 -234
|
@@ -1,17 +1,31 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import { baseUrl } from '
|
|
2
|
+
import { baseUrl } from '../../../constants';
|
|
3
3
|
import { createConfigForAxiosHeaders } from '../../../util/validators';
|
|
4
4
|
import queryBuilder from './queryBuilder';
|
|
5
5
|
import { handleError } from '../../../util/errorResponse';
|
|
6
|
+
import { PinataConfig } from '../../..';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export
|
|
8
|
+
export interface PinataPinJobsResponseRow {
|
|
9
|
+
id: number | string;
|
|
10
|
+
ipfs_pin_hash: string;
|
|
11
|
+
date_queued: string;
|
|
12
|
+
name: string | undefined | null;
|
|
13
|
+
status: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PinataPinJobsResponse {
|
|
16
|
+
count: number;
|
|
17
|
+
rows: PinataPinJobsResponseRow[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface PinataPinJobsFilterOptions {
|
|
21
|
+
sort: 'ASC' | 'DESC';
|
|
22
|
+
status?: string | undefined;
|
|
23
|
+
ipfs_pin_hash?: string | undefined;
|
|
24
|
+
limit?: number | undefined;
|
|
25
|
+
offset?: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default function pinJobs(config: PinataConfig, filters? : PinataPinJobsFilterOptions): Promise<PinataPinJobsResponse> {
|
|
15
29
|
|
|
16
30
|
let endpoint = `${baseUrl}/pinning/pinJobs`;
|
|
17
31
|
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import isIPFS from 'is-ipfs';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
* Query Buidler
|
|
5
|
-
* @param {string} baseUrl
|
|
6
|
-
* @param {*} filters
|
|
7
|
-
* @returns {*}
|
|
8
|
-
*/
|
|
9
|
-
export default function queryBuilder(baseUrl, filters) {
|
|
3
|
+
export default function queryBuilder(baseUrl: string, filters?: any): string {
|
|
10
4
|
if (!baseUrl) {
|
|
11
5
|
throw new Error('no baseUrl provided');
|
|
12
6
|
}
|
|
@@ -19,7 +13,7 @@ export default function queryBuilder(baseUrl, filters) {
|
|
|
19
13
|
|
|
20
14
|
let firstFilterApplied = false; // we want to make sure that the "?" character is only applied once
|
|
21
15
|
|
|
22
|
-
function addFilter(newFilter) {
|
|
16
|
+
function addFilter(newFilter: string) {
|
|
23
17
|
if (firstFilterApplied) {
|
|
24
18
|
newUrl = `${newUrl}&${newFilter}`;
|
|
25
19
|
} else {
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import { baseUrl } from '
|
|
2
|
+
import { baseUrl } from '../../constants';
|
|
3
3
|
import { createConfigForAxiosHeaders } from '../../util/validators';
|
|
4
4
|
import isIPFS from 'is-ipfs';
|
|
5
5
|
import { handleError } from '../../util/errorResponse';
|
|
6
|
+
import { PinataConfig } from '../..';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
* Unpin
|
|
9
|
-
* @param {string} pinataApiKey
|
|
10
|
-
* @param {string} pinataSecretApiKey
|
|
11
|
-
* @param {string} hashToUnpin
|
|
12
|
-
* @returns {Promise<unknown>}
|
|
13
|
-
*/
|
|
14
|
-
export default function unpin(config, hashToUnpin) {
|
|
8
|
+
export default function unpin(config: PinataConfig, hashToUnpin: string) {
|
|
15
9
|
if (!hashToUnpin) {
|
|
16
10
|
throw new Error('hashToUnpin value is required for removing a pin from Pinata');
|
|
17
11
|
}
|
|
File without changes
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import pinByHash, {
|
|
2
|
+
PinataPinByHashPinOptions
|
|
3
|
+
} from './commands/pinning/pinByHash';
|
|
4
|
+
import hashMetadata from './commands/pinning/hashMetadata';
|
|
5
|
+
import pinFileToIPFS, {
|
|
6
|
+
PinataPinOptions
|
|
7
|
+
} from './commands/pinning/pinFileToIPFS';
|
|
8
|
+
import pinFromFS from './commands/pinning/pinFromFS';
|
|
9
|
+
import pinJSONToIPFS from './commands/pinning/pinJSONToIPFS';
|
|
10
|
+
import pinJobs, {
|
|
11
|
+
PinataPinJobsFilterOptions
|
|
12
|
+
} from './commands/pinning/pinJobs/pinJobs';
|
|
13
|
+
import unpin from './commands/pinning/unpin';
|
|
14
|
+
import testAuthentication from './commands/data/testAuthentication';
|
|
15
|
+
import pinList, {
|
|
16
|
+
PinataMetadata,
|
|
17
|
+
PinataPinListFilterOptions
|
|
18
|
+
} from './commands/data/pinList/pinList';
|
|
19
|
+
import getFilesByCount from './commands/data/getFilesByCount/getFilesByCount';
|
|
20
|
+
import userPinnedDataTotal from './commands/data/userPinnedDataTotal';
|
|
21
|
+
|
|
22
|
+
export interface PinataConfig {
|
|
23
|
+
pinataApiKey?: string;
|
|
24
|
+
pinataSecretApiKey?: string;
|
|
25
|
+
pinataJWTKey?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function refactorConfig(pinataConfigParam: PinataConfig): PinataConfig {
|
|
29
|
+
const config: PinataConfig = {};
|
|
30
|
+
if (pinataConfigParam.pinataApiKey) {
|
|
31
|
+
config.pinataApiKey = pinataConfigParam.pinataApiKey;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (pinataConfigParam.pinataSecretApiKey) {
|
|
35
|
+
config.pinataSecretApiKey = pinataConfigParam.pinataSecretApiKey;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (pinataConfigParam.pinataJWTKey) {
|
|
39
|
+
config.pinataJWTKey = pinataConfigParam.pinataJWTKey;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return config;
|
|
43
|
+
}
|
|
44
|
+
function sanitizeConfig(
|
|
45
|
+
pinataApiKey?: string | PinataConfig,
|
|
46
|
+
pinataSecretApiKey?: string
|
|
47
|
+
): PinataConfig {
|
|
48
|
+
let config: PinataConfig = {};
|
|
49
|
+
|
|
50
|
+
if (
|
|
51
|
+
typeof pinataApiKey === 'string' &&
|
|
52
|
+
typeof pinataSecretApiKey === 'string'
|
|
53
|
+
) {
|
|
54
|
+
config.pinataApiKey = pinataApiKey;
|
|
55
|
+
config.pinataSecretApiKey = pinataSecretApiKey;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const isPinataConfigParam = typeof pinataApiKey === 'object';
|
|
59
|
+
if (isPinataConfigParam) {
|
|
60
|
+
config = refactorConfig(pinataApiKey);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
class PinataClient {
|
|
67
|
+
config: PinataConfig;
|
|
68
|
+
|
|
69
|
+
constructor(
|
|
70
|
+
pinataApiKey?: string | PinataConfig,
|
|
71
|
+
pinataSecretApiKey?: string
|
|
72
|
+
) {
|
|
73
|
+
this.config = sanitizeConfig(pinataApiKey, pinataSecretApiKey);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
pinByHash(hashToPin: string, options?: PinataPinByHashPinOptions) {
|
|
77
|
+
return pinByHash(this.config, hashToPin, options);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
hashMetadata(ipfsPinHash: string, metadata: PinataMetadata) {
|
|
81
|
+
return hashMetadata(this.config, ipfsPinHash, metadata);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
pinFileToIPFS(readableStream: any, options?: PinataPinOptions) {
|
|
85
|
+
return pinFileToIPFS(this.config, readableStream, options);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
pinFromFS(sourcePath: string, options?: PinataPinOptions) {
|
|
89
|
+
return pinFromFS(this.config, sourcePath, options);
|
|
90
|
+
}
|
|
91
|
+
pinJSONToIPFS(body: any, options?: PinataPinOptions) {
|
|
92
|
+
return pinJSONToIPFS(this.config, body, options);
|
|
93
|
+
}
|
|
94
|
+
pinJobs(filters?: PinataPinJobsFilterOptions) {
|
|
95
|
+
return pinJobs(this.config, filters);
|
|
96
|
+
}
|
|
97
|
+
unpin(hashToUnpin: string) {
|
|
98
|
+
return unpin(this.config, hashToUnpin);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
pinList(filters: PinataPinListFilterOptions) {
|
|
102
|
+
return pinList(this.config, filters);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
getFilesByCount(filters: PinataPinListFilterOptions, maxCount?: number) {
|
|
106
|
+
return getFilesByCount(this.config, filters, maxCount);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
testAuthentication() {
|
|
110
|
+
return testAuthentication(this.config);
|
|
111
|
+
}
|
|
112
|
+
userPinnedDataTotal() {
|
|
113
|
+
return userPinnedDataTotal(this.config);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export * from './commands/data';
|
|
118
|
+
export * from './commands/pinning';
|
|
119
|
+
|
|
120
|
+
export default PinataClient;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const handleError = (error) => {
|
|
1
|
+
export const handleError = (error : any) => {
|
|
2
2
|
if (error && error.response && error.response && error.response.data && error.response.data.error) {
|
|
3
3
|
return error.response.data.error;
|
|
4
4
|
} else if (error.data && error.data.error) {
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import isIPFS from 'is-ipfs';
|
|
2
|
+
import { PinataConfig } from '..';
|
|
2
3
|
import { ERROR_NO_CREDENTIALS_PROVIDED} from '../constants';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* @param {string} pinataApiKey
|
|
6
|
-
* @param {string} pinataSecretApiKey
|
|
7
|
-
*/
|
|
8
|
-
export function validateApiKeys(pinataApiKey, pinataSecretApiKey) {
|
|
4
|
+
|
|
5
|
+
export function validateApiKeys(pinataApiKey?: string, pinataSecretApiKey?: string) {
|
|
9
6
|
if (!pinataApiKey || pinataApiKey === '') {
|
|
10
7
|
throw new Error(
|
|
11
8
|
'No pinataApiKey provided! Please provide your pinata api key as an argument when you start this script'
|
|
@@ -18,7 +15,7 @@ export function validateApiKeys(pinataApiKey, pinataSecretApiKey) {
|
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
|
|
21
|
-
export function createConfigForAxiosHeaders(config) {
|
|
18
|
+
export function createConfigForAxiosHeaders(config: PinataConfig) {
|
|
22
19
|
if (
|
|
23
20
|
config.pinataApiKey && config.pinataApiKey.length > 0 &&
|
|
24
21
|
config.pinataSecretApiKey && config.pinataSecretApiKey.length > 0
|
|
@@ -43,24 +40,20 @@ export function createConfigForAxiosHeaders(config) {
|
|
|
43
40
|
throw new Error(ERROR_NO_CREDENTIALS_PROVIDED);
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
export function createConfigForAxiosHeadersWithFormData(config, boundaryValue) {
|
|
43
|
+
export function createConfigForAxiosHeadersWithFormData(config: PinataConfig, boundaryValue: string) {
|
|
47
44
|
const requestOptions = {
|
|
48
45
|
...createConfigForAxiosHeaders(config),
|
|
49
46
|
maxContentLength: Infinity, //this is needed to prevent axios from erroring out with large files
|
|
50
|
-
maxBodyLength: Infinity
|
|
47
|
+
maxBodyLength: Infinity,
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-type': `multipart/form-data; boundary= ${boundaryValue}`
|
|
50
|
+
}
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
requestOptions.headers[
|
|
54
|
-
'Content-type'
|
|
55
|
-
] = `multipart/form-data; boundary= ${boundaryValue}`;
|
|
56
53
|
return requestOptions;
|
|
57
54
|
}
|
|
58
55
|
|
|
59
|
-
|
|
60
|
-
* Validate host Nodes
|
|
61
|
-
* @param {*} hostNodes
|
|
62
|
-
*/
|
|
63
|
-
export function validateHostNodes(hostNodes) {
|
|
56
|
+
export function validateHostNodes(hostNodes: any) {
|
|
64
57
|
if (!Array.isArray(hostNodes)) {
|
|
65
58
|
throw new Error('host_nodes value must be an array');
|
|
66
59
|
}
|
|
@@ -73,11 +66,7 @@ export function validateHostNodes(hostNodes) {
|
|
|
73
66
|
});
|
|
74
67
|
}
|
|
75
68
|
|
|
76
|
-
|
|
77
|
-
* Validate MetaData
|
|
78
|
-
* @param {*} metadata
|
|
79
|
-
*/
|
|
80
|
-
export function validateMetadata(metadata) {
|
|
69
|
+
export function validateMetadata(metadata: any) {
|
|
81
70
|
if (metadata.name) {
|
|
82
71
|
if (
|
|
83
72
|
!(
|
|
@@ -96,7 +85,7 @@ export function validateMetadata(metadata) {
|
|
|
96
85
|
|
|
97
86
|
let i = 0;
|
|
98
87
|
|
|
99
|
-
Object.entries(metadata.keyvalues).forEach(function (keyValue) {
|
|
88
|
+
Object.entries(metadata.keyvalues).forEach(function (keyValue: any) {
|
|
100
89
|
if (i > 9) {
|
|
101
90
|
throw new Error(
|
|
102
91
|
'No more than 10 keyvalues can be provided for metadata entries'
|
|
@@ -119,11 +108,7 @@ export function validateMetadata(metadata) {
|
|
|
119
108
|
}
|
|
120
109
|
}
|
|
121
110
|
|
|
122
|
-
|
|
123
|
-
* Validate Pin Policy Structure
|
|
124
|
-
* @param {*} pinPolicy
|
|
125
|
-
*/
|
|
126
|
-
export function validatePinPolicyStructure(pinPolicy) {
|
|
111
|
+
export function validatePinPolicyStructure(pinPolicy: { regions: any[]; }) {
|
|
127
112
|
//this function takes in a pin policy and checks the JSON structure to make sure it's valid
|
|
128
113
|
if (!pinPolicy) {
|
|
129
114
|
throw new Error('No pin policy provided');
|
|
@@ -157,11 +142,7 @@ export function validatePinPolicyStructure(pinPolicy) {
|
|
|
157
142
|
}
|
|
158
143
|
}
|
|
159
144
|
|
|
160
|
-
|
|
161
|
-
* Validate Pinata Options
|
|
162
|
-
* @param {*} options
|
|
163
|
-
*/
|
|
164
|
-
export function validatePinataOptions(options) {
|
|
145
|
+
export function validatePinataOptions(options: { cidVersion?: number; wrapWithDirectory?: boolean; hostNodes?: any; customPinPolicy?: any; }) {
|
|
165
146
|
if (typeof options !== 'object') {
|
|
166
147
|
throw new Error('options must be an object');
|
|
167
148
|
}
|
package/test/commands/data/getFilesByCount/{getFilesByCount.test.js → getFilesByCount.test.ts}
RENAMED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import getFilesByCount from
|
|
2
|
-
import axios from
|
|
1
|
+
import getFilesByCount from '../../../../src/commands/data/getFilesByCount/getFilesByCount';
|
|
2
|
+
import axios from 'axios';
|
|
3
3
|
import {
|
|
4
4
|
APIData,
|
|
5
5
|
pinListAxiosMockPages,
|
|
6
|
-
fakeHeaders
|
|
7
|
-
} from
|
|
6
|
+
fakeHeaders
|
|
7
|
+
} from '../pinlist-sample-api';
|
|
8
|
+
import { PinataConfig, PinataPin, PinataPinListFilterOptions } from '../../../../src';
|
|
8
9
|
|
|
9
|
-
jest.mock(
|
|
10
|
+
jest.mock('axios');
|
|
10
11
|
|
|
11
12
|
const metadataName = (item) => {
|
|
12
13
|
return item.metadata.name;
|
|
13
14
|
};
|
|
14
|
-
const callIterableObject = async (config, filterToApply, pinsCount) => {
|
|
15
|
-
const pins = [];
|
|
15
|
+
const callIterableObject = async (config: PinataConfig, filterToApply: PinataPinListFilterOptions, pinsCount?: number) => {
|
|
16
|
+
const pins: PinataPin[] = [];
|
|
16
17
|
for await (const item of getFilesByCount(
|
|
17
18
|
config,
|
|
18
19
|
filterToApply,
|
|
@@ -24,23 +25,23 @@ const callIterableObject = async (config, filterToApply, pinsCount) => {
|
|
|
24
25
|
return pins;
|
|
25
26
|
};
|
|
26
27
|
|
|
27
|
-
describe(
|
|
28
|
+
describe('Get Files By Count', () => {
|
|
28
29
|
const pinataConfig = {
|
|
29
30
|
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
30
|
-
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
31
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
31
32
|
};
|
|
32
33
|
const filterToApply = {
|
|
33
|
-
status:
|
|
34
|
+
status: 'pinned'
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
afterEach(() => {
|
|
37
38
|
jest.resetAllMocks();
|
|
38
39
|
});
|
|
39
40
|
|
|
40
|
-
test(
|
|
41
|
+
test('Request 17 pins, pins available', async () => {
|
|
41
42
|
const pinsToRequest = 17;
|
|
42
43
|
|
|
43
|
-
axios.get
|
|
44
|
+
(axios.get as jest.Mock)
|
|
44
45
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
45
46
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
46
47
|
|
|
@@ -68,10 +69,10 @@ describe("Get Files By Count", () => {
|
|
|
68
69
|
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
69
70
|
});
|
|
70
71
|
|
|
71
|
-
test(
|
|
72
|
+
test('Request 6 pins, pins available', async () => {
|
|
72
73
|
const pinsToRequest = 6;
|
|
73
74
|
|
|
74
|
-
axios.get.mockResolvedValueOnce(
|
|
75
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
75
76
|
pinListAxiosMockPages.firstPage.response
|
|
76
77
|
);
|
|
77
78
|
const pins = await callIterableObject(
|
|
@@ -92,10 +93,10 @@ describe("Get Files By Count", () => {
|
|
|
92
93
|
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
93
94
|
});
|
|
94
95
|
|
|
95
|
-
test(
|
|
96
|
+
test('Request 25 pins, pins not available', async () => {
|
|
96
97
|
const pinsToRequest = 25;
|
|
97
98
|
|
|
98
|
-
axios.get
|
|
99
|
+
(axios.get as jest.Mock)
|
|
99
100
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
100
101
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
101
102
|
.mockResolvedValueOnce(
|
|
@@ -131,10 +132,10 @@ describe("Get Files By Count", () => {
|
|
|
131
132
|
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
132
133
|
});
|
|
133
134
|
|
|
134
|
-
test(
|
|
135
|
+
test('Request 3 pins, pins not available', async () => {
|
|
135
136
|
const pinsToRequest = 3;
|
|
136
137
|
|
|
137
|
-
axios.get.mockResolvedValueOnce(
|
|
138
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
138
139
|
pinListAxiosMockPages.firstPageEmpty.response
|
|
139
140
|
);
|
|
140
141
|
const pins = await callIterableObject(
|
|
@@ -155,8 +156,8 @@ describe("Get Files By Count", () => {
|
|
|
155
156
|
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
156
157
|
});
|
|
157
158
|
|
|
158
|
-
test(
|
|
159
|
-
axios.get
|
|
159
|
+
test('Request all pins, pins available', async () => {
|
|
160
|
+
(axios.get as jest.Mock)
|
|
160
161
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
161
162
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
162
163
|
.mockResolvedValueOnce(
|
|
@@ -188,8 +189,8 @@ describe("Get Files By Count", () => {
|
|
|
188
189
|
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
189
190
|
});
|
|
190
191
|
|
|
191
|
-
test(
|
|
192
|
-
axios.get.mockResolvedValueOnce(
|
|
192
|
+
test('Request all pins, pins not available', async () => {
|
|
193
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
193
194
|
pinListAxiosMockPages.firstPageEmpty.response
|
|
194
195
|
);
|
|
195
196
|
const pins = await callIterableObject(
|
|
@@ -1,36 +1,35 @@
|
|
|
1
|
-
import axios from
|
|
2
|
-
import pinList from
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import pinList from '../../../../src/commands/data/pinList/pinList';
|
|
3
3
|
import {
|
|
4
|
-
APIData,
|
|
5
4
|
pinListAxiosMockPages,
|
|
6
|
-
fakeHeaders
|
|
7
|
-
} from
|
|
5
|
+
fakeHeaders
|
|
6
|
+
} from '../pinlist-sample-api';
|
|
8
7
|
|
|
9
|
-
jest.mock(
|
|
8
|
+
jest.mock('axios');
|
|
10
9
|
|
|
11
|
-
describe(
|
|
10
|
+
describe('Pin List by page', () => {
|
|
12
11
|
afterEach(() => {
|
|
13
12
|
jest.resetAllMocks();
|
|
14
13
|
});
|
|
15
14
|
|
|
16
|
-
test(
|
|
17
|
-
axios.get
|
|
15
|
+
test('Call two pages in a row', async () => {
|
|
16
|
+
(axios.get as jest.Mock)
|
|
18
17
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
19
18
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
20
19
|
|
|
21
20
|
const resp = await pinList(
|
|
22
21
|
{
|
|
23
22
|
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
24
|
-
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
23
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
25
24
|
},
|
|
26
|
-
{ pageLimit: 10, pageOffset: 0 }
|
|
25
|
+
{ pageLimit: 10, pageOffset: 0, status: 'pinned' }
|
|
27
26
|
);
|
|
28
27
|
const resp2 = await pinList(
|
|
29
28
|
{
|
|
30
29
|
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
31
|
-
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
30
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
32
31
|
},
|
|
33
|
-
{ pageLimit: 10, pageOffset: 10 }
|
|
32
|
+
{ pageLimit: 10, pageOffset: 10, status: 'pinned' }
|
|
34
33
|
);
|
|
35
34
|
expect(resp).toEqual(pinListAxiosMockPages.firstPage.response.data);
|
|
36
35
|
expect(resp2).toEqual(pinListAxiosMockPages.secondPage.response.data);
|
|
@@ -49,17 +48,17 @@ describe("Get Files By Count", () => {
|
|
|
49
48
|
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
50
49
|
});
|
|
51
50
|
|
|
52
|
-
test(
|
|
53
|
-
axios.get.mockResolvedValueOnce(
|
|
51
|
+
test('Call empty page', async () => {
|
|
52
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
54
53
|
pinListAxiosMockPages.firstPageEmpty.response
|
|
55
54
|
);
|
|
56
55
|
|
|
57
56
|
const resp = await pinList(
|
|
58
57
|
{
|
|
59
58
|
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
60
|
-
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
59
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
61
60
|
},
|
|
62
|
-
{ pageLimit: 10, pageOffset: 0 }
|
|
61
|
+
{ pageLimit: 10, pageOffset: 0, status: 'pinned' }
|
|
63
62
|
);
|
|
64
63
|
|
|
65
64
|
expect(resp).toEqual({ rows: [] });
|
|
@@ -72,11 +71,11 @@ describe("Get Files By Count", () => {
|
|
|
72
71
|
|
|
73
72
|
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
74
73
|
});
|
|
75
|
-
test(
|
|
74
|
+
test('Result other than 200 status is returned', () => {
|
|
76
75
|
const badStatus = {
|
|
77
|
-
status: 700
|
|
76
|
+
status: 700
|
|
78
77
|
};
|
|
79
|
-
axios.get.mockResolvedValue(badStatus);
|
|
78
|
+
(axios.get as jest.Mock).mockResolvedValue(badStatus);
|
|
80
79
|
expect.assertions(1);
|
|
81
80
|
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).rejects.toEqual(
|
|
82
81
|
Error(
|
|
@@ -85,19 +84,19 @@ describe("Get Files By Count", () => {
|
|
|
85
84
|
);
|
|
86
85
|
});
|
|
87
86
|
|
|
88
|
-
test(
|
|
87
|
+
test('200 status is returned', () => {
|
|
89
88
|
const goodStatus = {
|
|
90
89
|
status: 200,
|
|
91
|
-
data:
|
|
90
|
+
data: 'testData'
|
|
92
91
|
};
|
|
93
|
-
axios.get.mockResolvedValue(goodStatus);
|
|
92
|
+
(axios.get as jest.Mock).mockResolvedValue(goodStatus);
|
|
94
93
|
expect.assertions(1);
|
|
95
94
|
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).resolves.toEqual(goodStatus.data);
|
|
96
95
|
});
|
|
97
96
|
|
|
98
|
-
test(
|
|
99
|
-
axios.get.mockRejectedValue(
|
|
97
|
+
test('Rejection handled', () => {
|
|
98
|
+
(axios.get as jest.Mock).mockRejectedValue('test error');
|
|
100
99
|
expect.assertions(1);
|
|
101
|
-
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).rejects.toEqual(
|
|
100
|
+
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).rejects.toEqual('test error');
|
|
102
101
|
});
|
|
103
102
|
});
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import queryBuilder from '
|
|
1
|
+
import queryBuilder from '../../../../src/commands/data/pinList/queryBuilder';
|
|
2
2
|
|
|
3
3
|
const baseUrl = 'testing.com/test';
|
|
4
|
-
const badFilterValue = 'badFilterValue';
|
|
5
4
|
const noFiltersUrl = `${baseUrl}?`;
|
|
6
5
|
const validISODate = '2019-03-12T20:42:26.743Z';
|
|
7
6
|
const validInteger = 5;
|
|
8
7
|
|
|
9
8
|
describe('queryBuilder no params provided', () => {
|
|
10
9
|
test('if no baseUrl is provided', () => {
|
|
11
|
-
expect(() => {
|
|
12
|
-
|
|
13
|
-
}).toThrow('no baseUrl provided');
|
|
10
|
+
// expect(() => {
|
|
11
|
+
// queryBuilder();
|
|
12
|
+
// }).toThrow('no baseUrl provided');
|
|
14
13
|
});
|
|
15
14
|
test('if no filters are provided, return a non filtered url', () => {
|
|
16
15
|
expect(queryBuilder(baseUrl)).toEqual(noFiltersUrl);
|
|
@@ -163,7 +162,7 @@ describe('queryBuilder filter: pageLimit', () => {
|
|
|
163
162
|
};
|
|
164
163
|
expect(() => {
|
|
165
164
|
queryBuilder(baseUrl, filters);
|
|
166
|
-
}).toThrow(
|
|
165
|
+
}).toThrow('Please make sure the pageLimit is a valid integer between 1-1000');
|
|
167
166
|
});
|
|
168
167
|
test('non valid pageLimit is passed in', () => {
|
|
169
168
|
const filters = {
|
|
@@ -171,7 +170,7 @@ describe('queryBuilder filter: pageLimit', () => {
|
|
|
171
170
|
};
|
|
172
171
|
expect(() => {
|
|
173
172
|
queryBuilder(baseUrl, filters);
|
|
174
|
-
}).toThrow(
|
|
173
|
+
}).toThrow('Please make sure the pageLimit is a valid integer between 1-1000');
|
|
175
174
|
});
|
|
176
175
|
test('Decimal is passed in - expect to round down', () => {
|
|
177
176
|
const filters = {
|
|
@@ -320,7 +319,7 @@ describe('metadata provided', () => {
|
|
|
320
319
|
};
|
|
321
320
|
expect(() => {
|
|
322
321
|
queryBuilder(baseUrl, filters);
|
|
323
|
-
}).toThrow(
|
|
322
|
+
}).toThrow('Because between op code was passed in, keyValue: testKeyValue must have both also include a secondValue');
|
|
324
323
|
});
|
|
325
324
|
test('between op code passed in, but object passed in as secondValue', () => {
|
|
326
325
|
const filters = {
|
|
@@ -353,7 +352,7 @@ describe('metadata provided', () => {
|
|
|
353
352
|
};
|
|
354
353
|
expect(() => {
|
|
355
354
|
queryBuilder(baseUrl, filters);
|
|
356
|
-
}).toThrow(
|
|
355
|
+
}).toThrow('Because notBetween op code was passed in, keyValue: testKeyValue must have both also include a secondValue');
|
|
357
356
|
});
|
|
358
357
|
test('notBetween op code passed in, but object passed in as secondValue', () => {
|
|
359
358
|
const filters = {
|
|
@@ -394,7 +393,7 @@ describe('metadata provided', () => {
|
|
|
394
393
|
testKeyValue: {
|
|
395
394
|
value: 'test',
|
|
396
395
|
op: 'eq'
|
|
397
|
-
},
|
|
396
|
+
},
|
|
398
397
|
testKeyValue2: {
|
|
399
398
|
value: 'test2',
|
|
400
399
|
op: 'eq'
|