Skip to content

Commit 0a849c3

Browse files
authored
Merge pull request #71 from mailjet/dev
Perform api call - now return Promise in order to be the same as real Mailjet api call Error handling - able to get status, response and reason and return proper error message
2 parents 78af682 + 28c49b1 commit 0a849c3

File tree

5 files changed

+186
-7
lines changed

5 files changed

+186
-7
lines changed

mailjet-client.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ MailjetClient.prototype.httpRequest = function (method, url, data, callback, per
292292
}
293293

294294
if (perform_api_call === false || this.perform_api_call) {
295-
return [url, payload]
295+
return Promise.resolve({body: payload, url: url})
296296
}
297297

298298
if (method === 'delete') { method = 'del' }
@@ -318,10 +318,12 @@ MailjetClient.prototype.httpRequest = function (method, url, data, callback, per
318318
}
319319

320320
if (err) {
321-
const error = new Error('Unsuccessful')
321+
const error = new Error()
322322
error.ErrorMessage = body.ErrorMessage || err.message
323+
error.ErrorIdentifier = body.ErrorIdentifier
323324
error.statusCode = err.status || null
324325
error.response = result || null
326+
error.message = 'Unsuccessful: ' + error.statusCode + ' ' + error.ErrorMessage
325327
return ret(error)
326328
}
327329

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "node-mailjet",
3-
"version": "3.3.0",
3+
"version": "3.3.1",
44
"description": "Mailjet NodeJS API client",
55
"main": "index.js",
66
"directories": {

test/test-error-handling.js

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/* global describe, it */
2+
var API_TOKEN = process.env.MJ_API_TOKEN
3+
var API_PUBLIC_KEY = process.env.MJ_APIKEY_PUBLIC
4+
var API_PRIVATE_KEY = process.env.MJ_APIKEY_PRIVATE
5+
6+
var Mailjet = require('../mailjet-client')
7+
var chai = require('chai')
8+
var expect = chai.expect
9+
var should = chai.should() // eslint-disable-line no-unused-vars
10+
var Promise = require('bluebird')
11+
12+
describe('Basic Error Handling', function () {
13+
API_TOKEN = API_TOKEN || '#invalidToken'
14+
API_PUBLIC_KEY = API_PUBLIC_KEY || '#invalidPublicKey'
15+
API_PRIVATE_KEY = API_PRIVATE_KEY || '#invalidPrivateKey'
16+
17+
const AUTH_ERROR_MESSAGE = 'API key authentication/authorization failure. You may be unauthorized to access the API or your API key may be expired. Visit API keys management section to check your keys.'
18+
const AUTH_V3_ERROR_MESSAGE = 'Unauthorized'
19+
const AUTH_ERROR_CODE = 401
20+
21+
describe('invalid token', function () {
22+
var v4Config = {
23+
'url': 'api.mailjet.com',
24+
'version': 'v4',
25+
'output': 'json',
26+
'perform_api_call': true,
27+
'secured': true
28+
}
29+
var v4Client = Mailjet.connect(API_TOKEN, v4Config)
30+
31+
describe('get', function () {
32+
33+
var smsGet = v4Client.get('sms')
34+
35+
it('check error message', function (done) {
36+
var promise = smsGet
37+
.request({ FromTS: +new Date, ToTS: +new Date })
38+
.then(function (response) {
39+
expect(response.body).to.be.a('object')
40+
done()
41+
})
42+
.catch(function (err) {
43+
expect(err.ErrorMessage).to.equal(AUTH_ERROR_MESSAGE)
44+
done()
45+
})
46+
expect(Promise.prototype.isPrototypeOf(promise)).to.equal(true)
47+
})
48+
49+
it('check status code', function (done) {
50+
var promise = smsGet
51+
.request({ FromTS: +new Date, ToTS: +new Date })
52+
.then(function (response) {
53+
expect(response.body).to.be.a('object')
54+
expect(response.body.Data.length).to.equal(0)
55+
done()
56+
})
57+
.catch(function (err) {
58+
expect(err.statusCode).to.equal(AUTH_ERROR_CODE)
59+
done()
60+
})
61+
expect(Promise.prototype.isPrototypeOf(promise)).to.equal(true)
62+
})
63+
64+
it('check response body is not null on error', function (done) {
65+
var promise = smsGet
66+
.request({ FromTS: +new Date, ToTS: +new Date })
67+
.then(function (response) {
68+
expect(response.body).to.be.a('object')
69+
expect(response.body.Data.length).to.equal(0)
70+
done()
71+
})
72+
.catch(function (err) {
73+
expect(err.response).to.not.equal(null)
74+
done()
75+
})
76+
expect(Promise.prototype.isPrototypeOf(promise)).to.equal(true)
77+
})
78+
79+
it('check error identitfier is not empty string', function (done) {
80+
var promise = smsGet
81+
.request({ FromTS: +new Date, ToTS: +new Date })
82+
.then(function (response) {
83+
expect(response.body).to.be.a('object')
84+
expect(response.body.Data.length).to.equal(0)
85+
done()
86+
})
87+
.catch(function (err) {
88+
expect(err.ErrorIdentifier).to.not.equal('')
89+
done()
90+
})
91+
expect(Promise.prototype.isPrototypeOf(promise)).to.equal(true)
92+
})
93+
})
94+
95+
describe('invalid public/private keys', function () {
96+
var v3Config = {
97+
url: 'api.mailjet.com',
98+
version: 'v3',
99+
output: 'json',
100+
perform_api_call: true,
101+
secured: true
102+
}
103+
var v3Client = Mailjet.connect(API_PUBLIC_KEY, API_PRIVATE_KEY, v3Config)
104+
105+
describe('get', function () {
106+
107+
var contact = v3Client.get('contact')
108+
109+
it('check v3 error message', function (done) {
110+
contact.request()
111+
.then(function (result) {
112+
result.body.should.be.a('object')
113+
expect(result.response.statusCode).to.equal(200)
114+
done()
115+
})
116+
.catch(function (err) {
117+
expect(err.ErrorMessage).to.equal(AUTH_V3_ERROR_MESSAGE)
118+
done()
119+
})
120+
})
121+
122+
it('check v3 error status code', function (done) {
123+
contact.request()
124+
.then(function (result) {
125+
result.body.should.be.a('object')
126+
expect(result.response.statusCode).to.equal(200)
127+
done()
128+
})
129+
.catch(function (err) {
130+
expect(err.statusCode).to.equal(AUTH_ERROR_CODE)
131+
done()
132+
})
133+
})
134+
135+
it('check v3 response body is not null on error', function (done) {
136+
contact.request()
137+
.then(function (result) {
138+
result.body.should.be.a('object')
139+
expect(result.response.statusCode).to.equal(200)
140+
done()
141+
})
142+
.catch(function (err) {
143+
expect(err.response).to.not.equal(null)
144+
done()
145+
})
146+
})
147+
148+
it('check v3 error identitfier is not empty string', function (done) {
149+
contact.request()
150+
.then(function (result) {
151+
result.body.should.be.a('object')
152+
expect(result.response.statusCode).to.equal(200)
153+
done()
154+
})
155+
.catch(function (err) {
156+
expect(err.ErrorIdentifier).to.not.equal('')
157+
done()
158+
})
159+
})
160+
161+
})
162+
})
163+
})
164+
})

test/test-sms.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ describe('Basic Usage', function() {
102102
expect(reason.ErrorMessage).to.equal(
103103
'FromTS must not be older than one year.'
104104
)
105-
expect(reason.message).to.equal('Unsuccessful')
105+
expect(reason.message).to.include('Unsuccessful')
106106
done()
107107
})
108108
expect(Promise.prototype.isPrototypeOf(promise)).to.equal(true)

test/test.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,16 @@ describe('Advanced API Calls', function () {
159159
this.fn = fn
160160
this.payload = payload
161161
this.format = function (obj) { return JSON.stringify(obj).match(/\S+/g).join('') }
162+
var self = this
162163
this.call = function () {
163164
var res = this.fn.request(this.payload)
164-
var ret = res[0].replace(/\\/g, '/') + ' ' + this.format(res[1])
165-
return ret
165+
if(res[0]) {
166+
return res[0].replace(/\\/g, '/') + ' ' + this.format(res[1])
167+
} else {
168+
return res.then(function(result) {
169+
return result.url.replace(/\\/g, '/') + ' ' + self.format(result.body)
170+
})
171+
}
166172
}
167173
}
168174

@@ -210,7 +216,14 @@ describe('Advanced API Calls', function () {
210216

211217
EXPECTED_SET.forEach(function (test, index) {
212218
it('should output: ' + test, function () {
213-
EXAMPLES_SET[index].call().should.equal(test)
219+
var call = EXAMPLES_SET[index].call()
220+
if(call instanceof Promise) {
221+
call.then(function(response) {
222+
response.should.equal(test)
223+
})
224+
} else {
225+
call.should.equal(test) }
226+
214227
})
215228
})
216229
})

0 commit comments

Comments
 (0)