diff --git a/README.md b/README.md index 81cc8c6a..fae2fef3 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ http://demo.dataverse.org/api/datasets/389608/versions/1 `public async getMetricByCountry(datasetId: string, metricType: DataverseMetricType, countryCode?: string, yearMonth?: string) {` -`public async replaceFile(fileId: string, filename: string, fileBuffer: Buffer): Promise {` +`public async replaceFile(fileId: string, filename: string, fileBuffer: Buffer, jsonData: object = {}): Promise {` `public async publishDataset(datasetId: string, versionUpgradeType: DatasetVersionUpgradeType = DatasetVersionUpgradeType.MAJOR): Promise {` diff --git a/package.json b/package.json index 07f5ceab..5c7fdd69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-dataverse", - "version": "1.0.33", + "version": "1.0.34", "description": "A Dataverse module for JavaScript/TypeScript", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/dataverseClient.ts b/src/dataverseClient.ts index 40938cf3..8be9e3b6 100644 --- a/src/dataverseClient.ts +++ b/src/dataverseClient.ts @@ -144,7 +144,7 @@ export class DataverseClient { return this.getRequest(url) } - public async replaceFile(fileId: string, filename: string, fileBuffer: Buffer): Promise { + public async replaceFile(fileId: string, filename: string, fileBuffer: Buffer, jsonData: object = {}): Promise { const url = `${this.host}/api/files/${fileId}/replace` const options = { @@ -155,14 +155,15 @@ export class DataverseClient { value: fileBuffer, options: { filename: filename - } - } + }, + }, + jsonData: JSON.stringify(jsonData) }, resolveWithFullResponse: true } return request.post(options).catch(error => { - throw new DataverseException(error.response.statusCode, error.response.body ? JSON.parse(error.response.body).message : '') + throw new DataverseException(error.response.statusCode, error.response.body ? error.response.body.message : '') }) } diff --git a/test/dataverseClient.spec.ts b/test/dataverseClient.spec.ts index 3fc7adde..3b9c422d 100644 --- a/test/dataverseClient.spec.ts +++ b/test/dataverseClient.spec.ts @@ -359,7 +359,7 @@ describe('DataverseClient', () => { await client.searchOnlyPublished({ query: mockQuery, type, dataverseAlias: mockDataverseAlias }) assert.calledOnce(searchStub) - assert.calledWithExactly(searchStub, expectedOptions, {'X-Dataverse-key': ''}) + assert.calledWithExactly(searchStub, expectedOptions, { 'X-Dataverse-key': '' }) }) }) @@ -1147,10 +1147,15 @@ describe('DataverseClient', () => { const testFile = fs.readFileSync(path.resolve(__dirname, '../test/assets/test-file.csv'), 'base64') const fileBuffer = Buffer.from(testFile, 'base64') - it('should call request with expected url', async () => { - const mockFileId: string = random.number().toString() - const mockFilename: string = system.fileName() + let mockFileId: string + let mockFilename: string + + beforeEach(() => { + mockFileId = random.number().toString() + mockFilename = system.fileName() + }) + it('should call request with expected input', async () => { const expectedRequest = { url: `${host}/api/files/${mockFileId}/replace`, headers: { 'X-Dataverse-key': apiToken }, @@ -1160,7 +1165,8 @@ describe('DataverseClient', () => { options: { filename: mockFilename } - } + }, + jsonData: JSON.stringify({}) }, resolveWithFullResponse: true } @@ -1171,9 +1177,39 @@ describe('DataverseClient', () => { assert.calledWithExactly(requestPostStub, expectedRequest) }) + describe('with json data', () => { + it('should call request with expected input', async () => { + const mockDescription: string = random.words() + + const expectedRequest = { + url: `${host}/api/files/${mockFileId}/replace`, + headers: { 'X-Dataverse-key': apiToken }, + formData: { + file: { + value: fileBuffer, + options: { + filename: mockFilename + } + }, + jsonData: JSON.stringify({ + forceReplace: true, + description: mockDescription + }) + }, + resolveWithFullResponse: true + } + + await client.replaceFile(mockFileId, mockFilename, fileBuffer, { + forceReplace: true, + description: mockDescription + }) + + assert.calledOnce(requestPostStub) + assert.calledWithExactly(requestPostStub, expectedRequest) + }) + }) + it('should return expected response', async () => { - const mockFileId: string = random.number().toString() - const mockFilename: string = system.fileName() const randomValue = random.word() const expectedResponse = { ...mockResponse, @@ -1189,7 +1225,8 @@ describe('DataverseClient', () => { options: { filename: mockFilename } - } + }, + jsonData: JSON.stringify({}) }, resolveWithFullResponse: true } @@ -1202,11 +1239,9 @@ describe('DataverseClient', () => { }) it('should throw expected error', async () => { - const mockFileId: string = random.number().toString() - const mockFilename: string = system.fileName() const errorMessage = random.words() const errorCode = random.number() - requestPostStub.rejects({ response: { statusCode: errorCode, body: JSON.stringify({ message: errorMessage }) } }) + requestPostStub.rejects({ response: { statusCode: errorCode, body: { message: errorMessage } } }) let error: DataverseException = undefined