Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ The different use cases currently available in the package are classified below,
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
- [Get Dataset Available Categories](#get-dataset-available-categories)
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
- [Datasets write use cases](#datasets-write-use-cases)
- [Create a Dataset](#create-a-dataset)
- [Update a Dataset](#update-a-dataset)
Expand Down Expand Up @@ -1113,6 +1114,24 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts

The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.

#### Get Dataset Available Dataset Types

Returns a list of available dataset types that can be used at dataset creation. By default, only the type "dataset" is returned.

###### Example call:

```typescript
import { getDatasetAvailableDatasetTypes } from '@iqss/dataverse-client-javascript'

/* ... */

getDatasetAvailableDatasetTypes.execute().then((categories: String[]) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why there is a categories (404 copy-paste error ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops! Yes, this was a copy/paste error. Fixed in e4f09f9.

/* ... */
})
```

_See [use case](../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts) implementation_.

## Files

### Files read use cases
Expand Down
6 changes: 6 additions & 0 deletions src/datasets/domain/models/DatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface DatasetType {
id: number
name: string
linkedMetadataBlocks?: string[]
Comment thread
ChengShi-1 marked this conversation as resolved.
availableLicenses?: string[]
}
2 changes: 2 additions & 0 deletions src/datasets/domain/repositories/IDatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
import { CitationFormat } from '../models/CitationFormat'
import { FormattedCitation } from '../models/FormattedCitation'
import { DatasetType } from '../models/DatasetType'

export interface IDatasetsRepository {
getDataset(
Expand Down Expand Up @@ -74,4 +75,5 @@ export interface IDatasetsRepository {
format: CitationFormat,
includeDeaccessioned?: boolean
): Promise<FormattedCitation>
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
}
20 changes: 20 additions & 0 deletions src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetType } from '../models/DatasetType'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class GetDatasetAvailableDatasetTypes implements UseCase<DatasetType[]> {
private datasetsRepository: IDatasetsRepository

constructor(datasetsRepository: IDatasetsRepository) {
this.datasetsRepository = datasetsRepository
}

/**
* Returns the list of available dataset types that can be selected when creating a dataset.
*
* @returns {Promise<DatasetType[]>}
*/
async execute(): Promise<DatasetType[]> {
return await this.datasetsRepository.getDatasetAvailableDatasetTypes()
}
}
4 changes: 4 additions & 0 deletions src/datasets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { LinkDataset } from './domain/useCases/LinkDataset'
import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
import { GetDatasetAvailableDatasetTypes } from './domain/useCases/GetDatasetAvailableDatasetTypes'
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'

const datasetsRepository = new DatasetsRepository()
Expand Down Expand Up @@ -63,6 +64,7 @@ const linkDataset = new LinkDataset(datasetsRepository)
const unlinkDataset = new UnlinkDataset(datasetsRepository)
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)

export {
Expand All @@ -86,6 +88,7 @@ export {
unlinkDataset,
getDatasetLinkedCollections,
getDatasetAvailableCategories,
getDatasetAvailableDatasetTypes,
getDatasetCitationInOtherFormats
}
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
Expand Down Expand Up @@ -121,3 +124,4 @@ export {
DatasetVersionSummaryStringValues
} from './domain/models/DatasetVersionSummaryInfo'
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'
export { DatasetType } from './domain/models/DatasetType'
9 changes: 9 additions & 0 deletions src/datasets/infra/repositories/DatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { DatasetLinkedCollection } from '../../domain/models/DatasetLinkedCollec
import { CitationFormat } from '../../domain/models/CitationFormat'
import { transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection } from './transformers/datasetLinkedCollectionsTransformers'
import { FormattedCitation } from '../../domain/models/FormattedCitation'
import { DatasetType } from '../../domain/models/DatasetType'

export interface GetAllDatasetPreviewsQueryParams {
per_page?: number
Expand Down Expand Up @@ -357,4 +358,12 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
throw error
})
}

public async getDatasetAvailableDatasetTypes(): Promise<DatasetType[]> {
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'))
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}
}
29 changes: 29 additions & 0 deletions test/functional/datasets/GetDatasetAvailableDatasetTypes.test.ts

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made this a functional test but I'd be happy to switch it to an integration test if that's more appropriate. I'm confused about which to use. They seem quite similar, both spinning up Docker containers. On my machine functional is faster, clocking in at around 20 seconds while integration takes almost 50 seconds.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's good to keep a functional test here! Could you also add to integration test as well to test/integration/datasets/DatasetsRepository.test.ts?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ChengShi-1 I know in person I said I'd delete the functional test and add an integration test, but after looking at the code I decided to keep the functional test and add an integration test, which I did in a49c004.

My reasoning was that I like how easy it is to run just the one test I added like this (because it's in its own file):

npm run test:functional -- test/functional/datasets/GetDatasetsAvailableDatasetTypes.test.ts

On the integration side, tests are all in one file (DatasetsRepository.test.ts). After adding a test, I tried to run just that test like this...

npm run test:integration DatasetsRepository.test.ts -t "getDatasetAvailableDatasetTypes"

... but it didn't work. All tests in that file ran.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { ApiConfig, DatasetType, getDatasetAvailableDatasetTypes } from '../../../src'
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'

describe('getDatasetAvailableDatasetTypes', () => {
describe('execute', () => {
beforeAll(async () => {
ApiConfig.init(
TestConstants.TEST_API_URL,
DataverseApiAuthMechanism.API_KEY,
process.env.TEST_API_KEY
)
})

test('should return available dataset types', async () => {
const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute()
const expectedDatasetTypes = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
}
]

expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
})
})
})
49 changes: 49 additions & 0 deletions test/unit/datasets/GetDatasetAvailableDatasetTypes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ReadError } from '../../../src'
import { DatasetType } from '../../../src'
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
import { GetDatasetAvailableDatasetTypes } from '../../../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes'

describe('GetDatasetAvailableDatasetTypes', () => {
describe('execute', () => {
test('should return datasetTypes array on repository success', async () => {
const datasetTypesRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository

const testDatasetTypes: DatasetType[] = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
},
{
id: 2,
name: 'software',
linkedMetadataBlocks: ['codeMeta20'],
availableLicenses: ['MIT', 'Apache-2.0']
}
]

datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes = jest
.fn()
.mockResolvedValue(testDatasetTypes)
const sut = new GetDatasetAvailableDatasetTypes(datasetTypesRepositoryStub)

const actual = await sut.execute()

expect(actual).toEqual(testDatasetTypes)
expect(datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
})

test('should return error result on repository error', async () => {
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
const expectedError = new ReadError('Failed to fetch dataset types')
datasetsRepositoryStub.getDatasetAvailableDatasetTypes = jest
.fn()
.mockRejectedValue(expectedError)
const sut = new GetDatasetAvailableDatasetTypes(datasetsRepositoryStub)

await expect(sut.execute()).rejects.toThrow(ReadError)
expect(datasetsRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
})
})
})
Loading