Skip to content

Commit 53d1c70

Browse files
authored
Merge pull request #17 from tainguyenbui/feature/create_new_functions_to_allow_version_types
Create new functions to allow version types
2 parents 4cc953c + cabfe62 commit 53d1c70

5 files changed

Lines changed: 172 additions & 73 deletions

File tree

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,18 @@ const response = await client.getDataverseInformation('myDataverseAlias')
3232

3333
`public async getFileMetadata(fileId: string, draftVersion: boolean = false): Promise<AxiosResponse> {`
3434

35+
`public async getLatestPublishedDatasetInformation(datasetId: string): Promise<AxiosResponse> {`
36+
3537
`public async getLatestDatasetInformation(datasetId: string): Promise<AxiosResponse> {`
3638

39+
`public async getDraftDatasetInformation(datasetId: string): Promise<AxiosResponse> {`
40+
41+
`public async getLatestPublishedDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {`
42+
3743
`public async getLatestDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {`
3844

45+
`public async getDraftDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {`
46+
3947
`public async getDatasetVersions(datasetId: string): Promise<AxiosResponse> {`
4048

4149
```
@@ -45,6 +53,8 @@ Note: Version must be published, e.g.:
4553
http://demo.dataverse.org/api/datasets/389608/versions/1
4654
```
4755

56+
`public async getDatasetVersionFromDOI(doi: string, version: string): Promise<AxiosResponse> {`
57+
4858
`public async listDataverseRoleAssignments(dataverseAlias: string): Promise<AxiosResponse> {`
4959

5060
`public async getMetric(datasetId: string, metricType: DataverseMetricType, yearMonth?: string): Promise<AxiosResponse> {`

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.29",
3+
"version": "1.0.30",
44
"description": "A Dataverse module for JavaScript/TypeScript",
55
"main": "./dist/index.js",
66
"types": "./dist/index.d.ts",

src/@types/datasetVersionType.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export enum DatasetVersionType {
2+
LATEST_PUBLISHED = ':latest-published',
3+
LATEST = ':latest',
4+
DRAFT = ':draft'
5+
}

src/dataverseClient.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { BasicDatasetInformation } from './@types/basicDataset'
77
import { DatasetUtil } from './utils/datasetUtil'
88
import request from 'request-promise'
99
import { DatasetVersionUpgradeType } from './@types/datasetVersionUpgradeType'
10+
import { DatasetVersionType } from './@types/datasetVersionType'
1011

1112
export class DataverseClient {
1213
private readonly host: string
@@ -63,14 +64,28 @@ export class DataverseClient {
6364
return this.getRequest(url)
6465
}
6566

67+
public async getLatestPublishedDatasetInformation(datasetId: string): Promise<AxiosResponse> {
68+
return this.getDatasetVersion(datasetId, DatasetVersionType.LATEST_PUBLISHED)
69+
}
70+
6671
public async getLatestDatasetInformation(datasetId: string): Promise<AxiosResponse> {
67-
const url = `${this.host}/api/datasets/${datasetId}`
68-
return this.getRequest(url)
72+
return this.getDatasetVersion(datasetId, DatasetVersionType.LATEST)
73+
}
74+
75+
public async getDraftDatasetInformation(datasetId: string): Promise<AxiosResponse> {
76+
return this.getDatasetVersion(datasetId, DatasetVersionType.DRAFT)
77+
}
78+
79+
public async getLatestPublishedDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {
80+
return this.getDatasetVersionFromDOI(doi, DatasetVersionType.LATEST_PUBLISHED)
6981
}
7082

7183
public async getLatestDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {
72-
const url = `${this.host}/api/datasets/:persistentId?persistentId=doi:${doi}`
73-
return this.getRequest(url)
84+
return this.getDatasetVersionFromDOI(doi, DatasetVersionType.LATEST)
85+
}
86+
87+
public async getDraftDatasetInformationFromDOI(doi: string): Promise<AxiosResponse> {
88+
return this.getDatasetVersionFromDOI(doi, DatasetVersionType.DRAFT)
7489
}
7590

7691
public async getDatasetVersions(datasetId: string): Promise<AxiosResponse> {
@@ -83,6 +98,11 @@ export class DataverseClient {
8398
return this.getRequest(url)
8499
}
85100

101+
public async getDatasetVersionFromDOI(doi: string, version: string): Promise<AxiosResponse> {
102+
const url = `${this.host}/api/datasets/:persistentId/versions/${version}?persistentId=doi:${doi}`
103+
return this.getRequest(url)
104+
}
105+
86106
public async getDatasetThumbnail(datasetId: string): Promise<AxiosResponse> {
87107
const url = `${this.host}/api/datasets/${datasetId}/thumbnail`
88108
return this.getRequest(url, {

test/dataverseClient.spec.ts

Lines changed: 132 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -562,108 +562,117 @@ describe('DataverseClient', () => {
562562
})
563563
})
564564

565-
describe('getLatestDatasetInformation', () => {
566-
it('should call axios with expected url', async () => {
567-
const datasetId: string = random.number().toString()
565+
describe('getLatestPublishedDatasetInformation', () => {
566+
let mockDatasetId: string
568567

569-
await client.getLatestDatasetInformation(datasetId)
568+
let getDatasetVersionStub: SinonStub
570569

571-
assert.calledOnce(axiosGetStub)
572-
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/${datasetId}`, { headers: { 'X-Dataverse-key': apiToken } })
573-
})
570+
beforeEach(() => {
571+
mockDatasetId = random.number().toString()
574572

575-
it('should call axios with expected headers when no apiToken provided', async () => {
576-
client = new DataverseClient(host)
577-
const datasetId: string = random.number().toString()
573+
getDatasetVersionStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersion')
574+
})
578575

579-
await client.getLatestDatasetInformation(datasetId)
576+
it('should call getDatasetVersion with expected input', async () => {
577+
await client.getLatestPublishedDatasetInformation(mockDatasetId)
580578

581-
assert.calledOnce(axiosGetStub)
582-
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/${datasetId}`, { headers: { 'X-Dataverse-key': '' } })
579+
assert.calledOnce(getDatasetVersionStub)
580+
assert.calledWithExactly(getDatasetVersionStub, mockDatasetId, ':latest-published')
583581
})
582+
})
584583

585-
it('should return expected response', async () => {
586-
const datasetId: string = random.number().toString()
587-
const randomValue = random.word()
588-
const expectedResponse = {
589-
...mockResponse,
590-
'test': randomValue
591-
}
592-
axiosGetStub
593-
.withArgs(`${host}/api/datasets/${datasetId}`, { headers: { 'X-Dataverse-key': apiToken } })
594-
.resolves({ ...mockResponse, 'test': randomValue })
584+
describe('getLatestDatasetInformation', () => {
585+
let mockDatasetId: string
595586

596-
const response = await client.getLatestDatasetInformation(datasetId)
587+
let getDatasetVersionStub: SinonStub
597588

598-
expect(response).to.be.deep.equal(expectedResponse)
589+
beforeEach(() => {
590+
mockDatasetId = random.number().toString()
591+
592+
getDatasetVersionStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersion')
599593
})
600594

601-
it('should throw expected error', async () => {
602-
const datasetId: string = random.number().toString()
603-
const errorMessage = random.words()
604-
const errorCode = random.number()
605-
axiosGetStub.rejects({ response: { status: errorCode, data: { message: errorMessage } } })
595+
it('should call getDatasetVersion with expected input', async () => {
596+
await client.getLatestDatasetInformation(mockDatasetId)
606597

607-
let error: DataverseException = undefined
598+
assert.calledOnce(getDatasetVersionStub)
599+
assert.calledWithExactly(getDatasetVersionStub, mockDatasetId, ':latest')
600+
})
601+
})
608602

609-
await client.getLatestDatasetInformation(datasetId).catch(e => error = e)
603+
describe('getDraftDatasetInformation', () => {
604+
let mockDatasetId: string
610605

611-
expect(error).to.be.instanceOf(Error)
612-
expect(error.message).to.be.equal(errorMessage)
613-
expect(error.errorCode).to.be.equal(errorCode)
606+
let getDatasetVersionStub: SinonStub
607+
608+
beforeEach(() => {
609+
mockDatasetId = random.number().toString()
610+
611+
getDatasetVersionStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersion')
612+
})
613+
614+
it('should call getDatasetVersion with expected input', async () => {
615+
await client.getDraftDatasetInformation(mockDatasetId)
616+
617+
assert.calledOnce(getDatasetVersionStub)
618+
assert.calledWithExactly(getDatasetVersionStub, mockDatasetId, ':draft')
614619
})
615620
})
616621

617-
describe('getLatestDatasetInformationFromDOI', () => {
618-
let doi: string
622+
describe('getLatestPublishedDatasetInformationFromDOI', () => {
623+
let mockDatasetId: string
624+
625+
let getDatasetVersionFromDOIStub: SinonStub
619626

620627
beforeEach(() => {
621-
doi = `${random.number()}.${random.number()}/${random.word()}/${random.word()}`
628+
mockDatasetId = random.number().toString()
629+
630+
getDatasetVersionFromDOIStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersionFromDOI')
622631
})
623632

624-
it('should call axios with expected url', async () => {
625-
await client.getLatestDatasetInformationFromDOI(doi)
633+
it('should call getDatasetVersionFromDOI with expected input', async () => {
634+
await client.getLatestPublishedDatasetInformationFromDOI(mockDatasetId)
626635

627-
assert.calledOnce(axiosGetStub)
628-
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/:persistentId?persistentId=doi:${doi}`, { headers: { 'X-Dataverse-key': apiToken } })
636+
assert.calledOnce(getDatasetVersionFromDOIStub)
637+
assert.calledWithExactly(getDatasetVersionFromDOIStub, mockDatasetId, ':latest-published')
629638
})
639+
})
630640

631-
it('should call axios with expected headers when no apiToken provided', async () => {
632-
client = new DataverseClient(host)
641+
describe('getLatestDatasetInformationFromDOI', () => {
642+
let mockDoi: string
633643

634-
await client.getLatestDatasetInformationFromDOI(doi)
644+
let getDatasetVersionFromDOIStub: SinonStub
635645

636-
assert.calledOnce(axiosGetStub)
637-
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/:persistentId?persistentId=doi:${doi}`, { headers: { 'X-Dataverse-key': '' } })
638-
})
646+
beforeEach(() => {
647+
mockDoi = `${random.number()}.${random.number()}/${random.word()}/${random.word()}`
639648

640-
it('should return expected response', async () => {
641-
const randomValue = random.word()
642-
const expectedResponse = {
643-
...mockResponse,
644-
'test': randomValue
645-
}
646-
axiosGetStub
647-
.withArgs(`${host}/api/datasets/:persistentId?persistentId=doi:${doi}`, { headers: { 'X-Dataverse-key': apiToken } })
648-
.resolves({ ...mockResponse, 'test': randomValue })
649+
getDatasetVersionFromDOIStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersionFromDOI')
650+
})
649651

650-
const response = await client.getLatestDatasetInformationFromDOI(doi)
652+
it('should call getDatasetVersionFromDOI with expected input', async () => {
653+
await client.getLatestDatasetInformationFromDOI(mockDoi)
651654

652-
expect(response).to.be.deep.equal(expectedResponse)
655+
assert.calledOnce(getDatasetVersionFromDOIStub)
656+
assert.calledWithExactly(getDatasetVersionFromDOIStub, mockDoi, ':latest')
653657
})
658+
})
654659

655-
it('should throw expected error', async () => {
656-
const errorMessage = random.words()
657-
const errorCode = random.number()
658-
axiosGetStub.rejects({ response: { status: errorCode, data: { message: errorMessage } } })
660+
describe('getDraftDatasetInformationFromDOI', () => {
661+
let mockDoi: string
659662

660-
let error: DataverseException = undefined
663+
let getDatasetVersionFromDOIStub: SinonStub
661664

662-
await client.getLatestDatasetInformationFromDOI(doi).catch(e => error = e)
665+
beforeEach(() => {
666+
mockDoi = `${random.number()}.${random.number()}/${random.word()}/${random.word()}`
663667

664-
expect(error).to.be.instanceOf(Error)
665-
expect(error.message).to.be.equal(errorMessage)
666-
expect(error.errorCode).to.be.equal(errorCode)
668+
getDatasetVersionFromDOIStub = sandbox.stub(DataverseClient.prototype, 'getDatasetVersionFromDOI')
669+
})
670+
671+
it('should call getDatasetVersionFromDOI with expected input', async () => {
672+
await client.getDraftDatasetInformationFromDOI(mockDoi)
673+
674+
assert.calledOnce(getDatasetVersionFromDOIStub)
675+
assert.calledWithExactly(getDatasetVersionFromDOIStub, mockDoi, ':draft')
667676
})
668677
})
669678

@@ -775,6 +784,61 @@ describe('DataverseClient', () => {
775784
})
776785
})
777786

787+
describe('getDatasetVersionFromDOI', () => {
788+
let mockDoi: string
789+
let mockVersion: string
790+
791+
beforeEach(() => {
792+
mockDoi = `${random.number()}.${random.number()}/${random.word()}/${random.word()}`
793+
mockVersion = random.number().toString()
794+
})
795+
796+
it('should call axios with expected url', async () => {
797+
await client.getDatasetVersionFromDOI(mockDoi, mockVersion)
798+
799+
assert.calledOnce(axiosGetStub)
800+
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/:persistentId/versions/${mockVersion}?persistentId=doi:${mockDoi}`, { headers: { 'X-Dataverse-key': apiToken } })
801+
})
802+
803+
it('should call axios with expected headers when no apiToken provided', async () => {
804+
client = new DataverseClient(host)
805+
806+
await client.getDatasetVersionFromDOI(mockDoi, mockVersion)
807+
808+
assert.calledOnce(axiosGetStub)
809+
assert.calledWithExactly(axiosGetStub, `${host}/api/datasets/:persistentId/versions/${mockVersion}?persistentId=doi:${mockDoi}`, { headers: { 'X-Dataverse-key': '' } })
810+
})
811+
812+
it('should return expected response', async () => {
813+
const randomValue = random.word()
814+
const expectedResponse = {
815+
...mockResponse,
816+
'test': randomValue
817+
}
818+
axiosGetStub
819+
.withArgs(`${host}/api/datasets/:persistentId/versions/${mockVersion}?persistentId=doi:${mockDoi}`, { headers: { 'X-Dataverse-key': apiToken } })
820+
.resolves({ ...mockResponse, 'test': randomValue })
821+
822+
const response = await client.getDatasetVersionFromDOI(mockDoi, mockVersion)
823+
824+
expect(response).to.be.deep.equal(expectedResponse)
825+
})
826+
827+
it('should throw expected error', async () => {
828+
const errorMessage = random.words()
829+
const errorCode = random.number()
830+
axiosGetStub.rejects({ response: { status: errorCode, data: { message: errorMessage } } })
831+
832+
let error: DataverseException = undefined
833+
834+
await client.getDatasetVersionFromDOI(mockDoi, mockVersion).catch(e => error = e)
835+
836+
expect(error).to.be.instanceOf(Error)
837+
expect(error.message).to.be.equal(errorMessage)
838+
expect(error.errorCode).to.be.equal(errorCode)
839+
})
840+
})
841+
778842
describe('getDatasetThumbnail', () => {
779843
it('should call axios with expected url', async () => {
780844
const datasetId: string = random.number().toString()

0 commit comments

Comments
 (0)