smartystreets-javascript-sdk 2.2.0 → 3.0.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/Makefile +2 -2
- package/package.json +1 -1
- package/src/Errors.js +9 -1
- package/src/HttpSender.js +4 -4
- package/src/StatusCodeSender.js +3 -25
- package/tests/test_StatusCodeSender.js +40 -27
package/Makefile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/make -f
|
|
2
2
|
|
|
3
|
-
VERSION := $(shell tagit -
|
|
3
|
+
VERSION := $(shell tagit -M --dry-run)
|
|
4
4
|
VERSION_FILE1 := package.json
|
|
5
5
|
VERSION_FILE2 := package-lock.json
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ node_modules:
|
|
|
11
11
|
npm install
|
|
12
12
|
|
|
13
13
|
publish: test version upload unversion
|
|
14
|
-
tagit -
|
|
14
|
+
tagit -M
|
|
15
15
|
git push origin --tags
|
|
16
16
|
|
|
17
17
|
upload:
|
package/package.json
CHANGED
package/src/Errors.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
class SmartyError extends Error {
|
|
2
|
+
constructor(message = "unexpected error") {
|
|
3
|
+
super(message);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
class DefaultError extends SmartyError {
|
|
2
8
|
constructor(message) {
|
|
3
9
|
super(message);
|
|
4
10
|
}
|
|
11
|
+
|
|
5
12
|
}
|
|
6
13
|
|
|
7
14
|
class BatchFullError extends SmartyError {
|
|
@@ -88,5 +95,6 @@ module.exports = {
|
|
|
88
95
|
TooManyRequestsError: TooManyRequestsError,
|
|
89
96
|
InternalServerError: InternalServerError,
|
|
90
97
|
ServiceUnavailableError: ServiceUnavailableError,
|
|
91
|
-
GatewayTimeoutError: GatewayTimeoutError
|
|
98
|
+
GatewayTimeoutError: GatewayTimeoutError,
|
|
99
|
+
DefaultError: DefaultError
|
|
92
100
|
};
|
package/src/HttpSender.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const Response = require("./Response");
|
|
2
1
|
const Axios = require("axios");
|
|
3
2
|
const {buildSmartyResponse} = require("../src/util/buildSmartyResponse");
|
|
4
3
|
|
|
5
4
|
class HttpSender {
|
|
6
5
|
constructor(timeout = 10000, proxyConfig, debug = false) {
|
|
6
|
+
this.axiosInstance = Axios.create();
|
|
7
7
|
this.timeout = timeout;
|
|
8
8
|
this.proxyConfig = proxyConfig;
|
|
9
9
|
if (debug) this.enableDebug();
|
|
@@ -34,7 +34,7 @@ class HttpSender {
|
|
|
34
34
|
return new Promise((resolve, reject) => {
|
|
35
35
|
let requestConfig = this.buildRequestConfig(request);
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
this.axiosInstance(requestConfig)
|
|
38
38
|
.then(response => {
|
|
39
39
|
let smartyResponse = buildSmartyResponse(response);
|
|
40
40
|
|
|
@@ -47,13 +47,13 @@ class HttpSender {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
enableDebug() {
|
|
50
|
-
|
|
50
|
+
this.axiosInstance.interceptors.request.use(request => {
|
|
51
51
|
console.log('Request:\r\n', request);
|
|
52
52
|
console.log('\r\n*******************************************\r\n');
|
|
53
53
|
return request
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
this.axiosInstance.interceptors.response.use(response => {
|
|
57
57
|
console.log('Response:\r\n');
|
|
58
58
|
console.log('Status:', response.status, response.statusText);
|
|
59
59
|
console.log('Headers:', response.headers);
|
package/src/StatusCodeSender.js
CHANGED
|
@@ -11,30 +11,6 @@ class StatusCodeSender {
|
|
|
11
11
|
.then(resolve)
|
|
12
12
|
.catch(error => {
|
|
13
13
|
switch (error.statusCode) {
|
|
14
|
-
case 400:
|
|
15
|
-
error.error = new Errors.BadRequestError();
|
|
16
|
-
break;
|
|
17
|
-
|
|
18
|
-
case 401:
|
|
19
|
-
error.error = new Errors.BadCredentialsError();
|
|
20
|
-
break;
|
|
21
|
-
|
|
22
|
-
case 402:
|
|
23
|
-
error.error = new Errors.PaymentRequiredError();
|
|
24
|
-
break;
|
|
25
|
-
|
|
26
|
-
case 413:
|
|
27
|
-
error.error = new Errors.RequestEntityTooLargeError();
|
|
28
|
-
break;
|
|
29
|
-
|
|
30
|
-
case 422:
|
|
31
|
-
error.error = new Errors.UnprocessableEntityError("GET request lacked required fields.");
|
|
32
|
-
break;
|
|
33
|
-
|
|
34
|
-
case 429:
|
|
35
|
-
error.error = new Errors.TooManyRequestsError();
|
|
36
|
-
break;
|
|
37
|
-
|
|
38
14
|
case 500:
|
|
39
15
|
error.error = new Errors.InternalServerError();
|
|
40
16
|
break;
|
|
@@ -46,8 +22,10 @@ class StatusCodeSender {
|
|
|
46
22
|
case 504:
|
|
47
23
|
error.error = new Errors.GatewayTimeoutError();
|
|
48
24
|
break;
|
|
49
|
-
}
|
|
50
25
|
|
|
26
|
+
default:
|
|
27
|
+
error.error = new Errors.DefaultError(error && error.payload && error.payload.errors[0] && error.payload.errors[0].message);
|
|
28
|
+
}
|
|
51
29
|
reject(error);
|
|
52
30
|
});
|
|
53
31
|
});
|
|
@@ -23,35 +23,24 @@ describe("A status code sender", function () {
|
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
it("gives a
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
it("gives a Request Entity Too Large error on a 413.", function () {
|
|
35
|
-
return expectedErrorForStatusCode(errors.RequestEntityTooLargeError, 413);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("gives a Bad Request error on a 400.", function () {
|
|
39
|
-
return expectedErrorForStatusCode(errors.BadRequestError, 400);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("gives an Unprocessable Entity error on a 422.", function () {
|
|
43
|
-
return expectedErrorForStatusCode(errors.UnprocessableEntityError, 422);
|
|
44
|
-
});
|
|
26
|
+
it("gives a custom message for 400", function () {
|
|
27
|
+
const payload = {
|
|
28
|
+
errors: [
|
|
29
|
+
{message: "custom message"}
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
return expectedErrorWithPayloadMessage(400, payload);
|
|
33
|
+
})
|
|
45
34
|
|
|
46
|
-
it("
|
|
47
|
-
return
|
|
48
|
-
})
|
|
35
|
+
it("returns an error message if payload is undefined", function () {
|
|
36
|
+
return expectedDefaultError()
|
|
37
|
+
})
|
|
49
38
|
|
|
50
|
-
it("gives an Internal Server Error
|
|
39
|
+
it("gives an Internal Server Error on a 500.", function () {
|
|
51
40
|
return expectedErrorForStatusCode(errors.InternalServerError, 500);
|
|
52
41
|
});
|
|
53
42
|
|
|
54
|
-
it("gives an Service
|
|
43
|
+
it("gives an Service Unavailable error on a 503.", function () {
|
|
55
44
|
return expectedErrorForStatusCode(errors.ServiceUnavailableError, 503);
|
|
56
45
|
});
|
|
57
46
|
|
|
@@ -60,22 +49,46 @@ describe("A status code sender", function () {
|
|
|
60
49
|
});
|
|
61
50
|
});
|
|
62
51
|
|
|
52
|
+
const expectedErrorWithPayloadMessage = (errorCode, payload) => {
|
|
53
|
+
let mockSender = generateMockSender(errorCode, payload);
|
|
54
|
+
let statusCodeSender = new StatusCodeSender(mockSender);
|
|
55
|
+
let request = new Request();
|
|
56
|
+
|
|
57
|
+
return statusCodeSender.send(request).then(() => {
|
|
58
|
+
}, error => {
|
|
59
|
+
expect(error.error).to.be.an.instanceOf(errors.DefaultError);
|
|
60
|
+
expect(error.error.message).to.be.equal(payload.errors[0].message);
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const expectedDefaultError = () => {
|
|
65
|
+
let mockSender = generateMockSender(400);
|
|
66
|
+
let statusCodeSender = new StatusCodeSender(mockSender);
|
|
67
|
+
let request = new Request();
|
|
68
|
+
|
|
69
|
+
return statusCodeSender.send(request).then(() => {
|
|
70
|
+
}, error => {
|
|
71
|
+
expect(error.error).to.be.an.instanceOf(errors.DefaultError);
|
|
72
|
+
expect(error.error.message).to.be.equal("unexpected error");
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
63
76
|
function expectedErrorForStatusCode(expectedError, errorCode) {
|
|
64
77
|
let mockSender = generateMockSender(errorCode);
|
|
65
78
|
let statusCodeSender = new StatusCodeSender(mockSender);
|
|
66
79
|
let request = new Request();
|
|
67
80
|
|
|
68
|
-
return statusCodeSender.send(request).then(
|
|
81
|
+
return statusCodeSender.send(request).then(() => {
|
|
69
82
|
}, error => {
|
|
70
83
|
expect(error.error).to.be.an.instanceOf(expectedError);
|
|
71
84
|
})
|
|
72
85
|
}
|
|
73
86
|
|
|
74
|
-
function generateMockSender(errorCode) {
|
|
87
|
+
function generateMockSender(errorCode, payload) {
|
|
75
88
|
return {
|
|
76
89
|
send: () => {
|
|
77
90
|
return new Promise((resolve, reject) => {
|
|
78
|
-
reject(new Response(errorCode))
|
|
91
|
+
reject(new Response(errorCode, payload))
|
|
79
92
|
});
|
|
80
93
|
}
|
|
81
94
|
};
|