Skip to content

Commit 877141a

Browse files
authored
Merge pull request #22 from tainguyenbui/feature/HASI-000_improves_error_handling_for_replacefile_and_upload_dataset_thumbnail
HASI-000 improves error handling for replacefile and upload dataset thumbnail
2 parents c1e2962 + 1e64d8f commit 877141a

5 files changed

Lines changed: 110 additions & 25 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-dataverse",
3-
"version": "1.0.34",
3+
"version": "1.0.35",
44
"description": "A Dataverse module for JavaScript/TypeScript",
55
"main": "./dist/index.js",
66
"types": "./dist/index.d.ts",

src/dataverseClient.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { DatasetUtil } from './utils/datasetUtil'
88
import request from 'request-promise'
99
import { DatasetVersionUpgradeType } from './@types/datasetVersionUpgradeType'
1010
import { DatasetVersionType } from './@types/datasetVersionType'
11+
import { ResponseUtil } from './utils/ResponseUtil'
1112

1213
export class DataverseClient {
1314
private readonly host: string
@@ -120,7 +121,7 @@ export class DataverseClient {
120121
}
121122

122123
return request.post(options).catch(error => {
123-
throw new DataverseException(error.response.statusCode, error.response.body ? JSON.parse(error.response.body).message : '')
124+
throw new DataverseException(error.response.statusCode, ResponseUtil.getErrorMessage(error.response.body))
124125
})
125126
}
126127

@@ -163,7 +164,7 @@ export class DataverseClient {
163164
}
164165

165166
return request.post(options).catch(error => {
166-
throw new DataverseException(error.response.statusCode, error.response.body ? error.response.body.message : '')
167+
throw new DataverseException(error.response.statusCode, ResponseUtil.getErrorMessage(error.response.body))
167168
})
168169
}
169170

src/utils/ResponseUtil.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export class ResponseUtil {
2+
public static getErrorMessage(body: string): string {
3+
let message: string
4+
try {
5+
message = JSON.parse(body).message
6+
}
7+
catch {
8+
message = ''
9+
}
10+
11+
return message
12+
}
13+
}

test/dataverseClient.spec.ts

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { BasicDatasetInformation } from '../src/@types/basicDataset'
1212
import { DatasetUtil } from '../src/utils/datasetUtil'
1313
import fs from 'fs'
1414
import { DatasetVersionUpgradeType } from '../src/@types/datasetVersionUpgradeType'
15+
import { ResponseUtil } from '../src/utils/ResponseUtil'
1516

1617
describe('DataverseClient', () => {
1718
const sandbox: SinonSandbox = createSandbox()
@@ -20,6 +21,7 @@ describe('DataverseClient', () => {
2021
let host: string
2122
let client: DataverseClient
2223

24+
let mockErrorMessage: string
2325
let mockResponse: object
2426
let mockDatasetInformation: object
2527

@@ -28,12 +30,14 @@ describe('DataverseClient', () => {
2830
let requestPostStub: SinonStub
2931

3032
let mapBasicDatasetInformationStub: SinonStub
33+
let getErrorMessageStub: SinonStub
3134

3235
beforeEach(() => {
3336
apiToken = random.uuid()
3437
host = internet.url()
3538
client = new DataverseClient(host, apiToken)
3639

40+
mockErrorMessage = random.words()
3741
mockResponse = {
3842
status: random.number(),
3943
data: {}
@@ -61,6 +65,7 @@ describe('DataverseClient', () => {
6165
requestPostStub = sandbox.stub(request, 'post').resolves(mockResponse)
6266

6367
mapBasicDatasetInformationStub = sandbox.stub(DatasetUtil, 'mapBasicDatasetInformation').returns(mockDatasetInformation)
68+
getErrorMessageStub = sandbox.stub(ResponseUtil, 'getErrorMessage').returns(mockErrorMessage)
6469
})
6570

6671
afterEach(() => {
@@ -905,8 +910,13 @@ describe('DataverseClient', () => {
905910
const testImage = fs.readFileSync(path.resolve(__dirname, '../test/assets/theam.png'), 'base64')
906911
const imageBuffer = Buffer.from(testImage, 'base64')
907912

913+
let datasetId: string
914+
915+
beforeEach(() => {
916+
datasetId = random.number().toString()
917+
})
918+
908919
it('should call request with expected url', async () => {
909-
const datasetId: string = random.number().toString()
910920
const expectedRequest = {
911921
url: `${host}/api/datasets/${datasetId}/thumbnail`,
912922
headers: { 'X-Dataverse-key': apiToken },
@@ -921,7 +931,6 @@ describe('DataverseClient', () => {
921931
})
922932

923933
it('should call request with expected headers when no apiToken provided', async () => {
924-
const datasetId: string = random.number().toString()
925934
const expectedRequest = {
926935
url: `${host}/api/datasets/${datasetId}/thumbnail`,
927936
headers: { 'X-Dataverse-key': '' },
@@ -942,7 +951,6 @@ describe('DataverseClient', () => {
942951
...mockResponse,
943952
'test': randomValue
944953
}
945-
const datasetId: string = random.number().toString()
946954

947955
const expectedRequest = {
948956
url: `${host}/api/datasets/${datasetId}/thumbnail`,
@@ -958,19 +966,40 @@ describe('DataverseClient', () => {
958966
expect(response).to.be.deep.equal(expectedResponse)
959967
})
960968

961-
it('should throw expected error', async () => {
962-
const datasetId = random.word()
963-
const errorMessage = random.words()
964-
const errorCode = random.number()
965-
requestPostStub.rejects({ response: { statusCode: errorCode, body: JSON.stringify({ message: errorMessage }) } })
969+
describe('on error', () => {
970+
let mockErrorCode: number
971+
let mockBody: string
966972

967-
let error: DataverseException = undefined
973+
beforeEach(() => {
974+
mockErrorCode = random.number()
975+
mockBody = random.words()
976+
requestPostStub.rejects({
977+
response: {
978+
statusCode: mockErrorCode,
979+
body: mockBody
980+
}
981+
})
982+
})
968983

969-
await client.uploadDatasetThumbnail(datasetId, imageBuffer).catch(e => error = e)
984+
it('should call getErrorMessage', async () => {
985+
let error: DataverseException = undefined
970986

971-
expect(error).to.be.instanceOf(Error)
972-
expect(error.message).to.be.equal(errorMessage)
973-
expect(error.errorCode).to.be.equal(errorCode)
987+
await client.uploadDatasetThumbnail(datasetId, imageBuffer).catch(e => error = e)
988+
989+
expect(error).to.be.instanceOf(Error)
990+
assert.calledOnce(getErrorMessageStub)
991+
assert.calledWithExactly(getErrorMessageStub, mockBody)
992+
})
993+
994+
it('should throw expected error', async () => {
995+
let error: DataverseException = undefined
996+
997+
await client.uploadDatasetThumbnail(datasetId, imageBuffer).catch(e => error = e)
998+
999+
expect(error).to.be.instanceOf(Error)
1000+
expect(error.message).to.be.equal(mockErrorMessage)
1001+
expect(error.errorCode).to.be.equal(mockErrorCode)
1002+
})
9741003
})
9751004
})
9761005

@@ -1238,18 +1267,40 @@ describe('DataverseClient', () => {
12381267
expect(response).to.be.deep.equal(expectedResponse)
12391268
})
12401269

1241-
it('should throw expected error', async () => {
1242-
const errorMessage = random.words()
1243-
const errorCode = random.number()
1244-
requestPostStub.rejects({ response: { statusCode: errorCode, body: { message: errorMessage } } })
1270+
describe('on error', () => {
1271+
let mockErrorCode: number
1272+
let mockBody: string
12451273

1246-
let error: DataverseException = undefined
1274+
beforeEach(() => {
1275+
mockErrorCode = random.number()
1276+
mockBody = random.words()
1277+
requestPostStub.rejects({
1278+
response: {
1279+
statusCode: mockErrorCode,
1280+
body: mockBody
1281+
}
1282+
})
1283+
})
12471284

1248-
await client.replaceFile(mockFileId, mockFilename, fileBuffer).catch(e => error = e)
1285+
it('should call getErrorMessage', async () => {
1286+
let error: DataverseException = undefined
12491287

1250-
expect(error).to.be.instanceOf(Error)
1251-
expect(error.message).to.be.equal(errorMessage)
1252-
expect(error.errorCode).to.be.equal(errorCode)
1288+
await client.replaceFile(mockFileId, mockFilename, fileBuffer).catch(e => error = e)
1289+
1290+
expect(error).to.be.instanceOf(Error)
1291+
assert.calledOnce(getErrorMessageStub)
1292+
assert.calledWithExactly(getErrorMessageStub, mockBody)
1293+
})
1294+
1295+
it('should throw expected error', async () => {
1296+
let error: DataverseException = undefined
1297+
1298+
await client.replaceFile(mockFileId, mockFilename, fileBuffer).catch(e => error = e)
1299+
1300+
expect(error).to.be.instanceOf(Error)
1301+
expect(error.message).to.be.equal(mockErrorMessage)
1302+
expect(error.errorCode).to.be.equal(mockErrorCode)
1303+
})
12531304
})
12541305
})
12551306

test/utils/ResponseUtil.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { ResponseUtil } from '../../src/utils/ResponseUtil'
2+
import { random } from 'faker'
3+
4+
describe('ResponseUtil', () => {
5+
describe('getErrorMessage', () => {
6+
let mockMessage: string
7+
8+
beforeEach(() => {
9+
mockMessage = random.words()
10+
})
11+
12+
it('should return expected message', () => {
13+
const expectedResult: string = mockMessage
14+
15+
const result: string = ResponseUtil.getErrorMessage(JSON.stringify({ message: mockMessage }))
16+
17+
expect(result).toEqual(expectedResult)
18+
})
19+
})
20+
})

0 commit comments

Comments
 (0)