Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
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
6 changes: 6 additions & 0 deletions src/datasetTypes/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[]
availableLicenses?: string[]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { DatasetType } from '../models/DatasetType'

export interface IDatasetTypesRepository {
getAvailableDatasetTypes(): Promise<DatasetType[]>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface DatasetTypePayload {
id: number
name: string
linkedMetadataBlocks?: string[]
availableLicenses?: string[]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { AxiosResponse } from 'axios'
import { DatasetType } from '../../models/DatasetType'
import { DatasetTypePayload } from './DatasetTypePayload'

export const transformPayloadToDatasetType = (response: AxiosResponse): DatasetType[] => {
const payload = response.data.data as DatasetTypePayload[]

return payload.map((datasetType: DatasetTypePayload) => ({
id: datasetType.id,
name: datasetType.name,
linkedMetadataBlocks: datasetType.linkedMetadataBlocks,
availableLicenses: datasetType.availableLicenses
}))
}
20 changes: 20 additions & 0 deletions src/datasetTypes/domain/useCases/GetAvailableDatasetTypes.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 { IDatasetTypesRepository } from '../repositories/IDatasetTypesRepository'

export class GetAvailableDatasetTypes implements UseCase<DatasetType[]> {
private datasetTypesRepository: IDatasetTypesRepository

constructor(datasetTypesRepository: IDatasetTypesRepository) {
this.datasetTypesRepository = datasetTypesRepository
}

/**
* Returns the list of available dataset types that can be selected for a dataset.
*
* @returns {Promise<DatasetType[]>}
*/
async execute(): Promise<DatasetType[]> {
return await this.datasetTypesRepository.getAvailableDatasetTypes()
}
}
10 changes: 10 additions & 0 deletions src/datasetTypes/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { DatasetTypesRepository } from './infra/repositories/DatasetTypesRepository'
import { GetAvailableDatasetTypes } from './domain/useCases/GetAvailableDatasetTypes'

const datasetTypesRepository = new DatasetTypesRepository()

const getAvailableDatasetTypes = new GetAvailableDatasetTypes(datasetTypesRepository)

export { getAvailableDatasetTypes }

export { DatasetType } from './domain/models/DatasetType'
15 changes: 15 additions & 0 deletions src/datasetTypes/infra/repositories/DatasetTypesRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
import { IDatasetTypesRepository } from '../../domain/repositories/IDatasetTypesRepository'
import { DatasetType } from '../../domain/models/DatasetType'

export class DatasetTypesRepository extends ApiRepository implements IDatasetTypesRepository {
private readonly datasetTypesResourceName: string = 'datasets/datasetTypes'

public async getAvailableDatasetTypes(): Promise<DatasetType[]> {
return this.doGet(this.buildApiEndpoint(this.datasetTypesResourceName))
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}
}
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ export * from './files'
export * from './contactInfo'
export * from './notifications'
export * from './search'
export * from './datasetTypes'
31 changes: 31 additions & 0 deletions test/functional/datasetTypes/GetAvailableDatasetTypes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ApiConfig } from '../../../src'
import { getAvailableDatasetTypes } from '../../../src/datasetTypes'
import { DatasetType } from '../../../src/datasetTypes/domain/models/DatasetType'
Comment on lines +1 to +3
Copy link
Member Author

Choose a reason for hiding this comment

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

I noticed at

import { ApiConfig, getAvailableStandardLicenses, License } from '../../../src'
that the equivalent three import statements above are on a single line.

I'm not sure why this isn't working for me but perhaps it's related to the error I'm seeing in src/index.ts in VS Code:

Screenshot 2025-09-09 at 1 55 33 PM

I'm not sure what's going on. 🤷

import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'

describe('getAvailableDatasetTypes', () => {
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 getAvailableDatasetTypes.execute()
const expectedDatasetTypes = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
}
]

expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
})
})
})
36 changes: 36 additions & 0 deletions test/integration/datasetTypes/DatasetTypesRepository.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {
ApiConfig,
DataverseApiAuthMechanism
} from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'
import { DatasetTypesRepository } from '../../../src/datasetTypes/infra/repositories/DatasetTypesRepository'
// import { LicensesRepository } from '../../../src/licenses/infra/repositories/LicensesRepository'

describe('DatasetTypesRepository', () => {
const sut: DatasetTypesRepository = new DatasetTypesRepository()

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

test('should return list of available dataset types', async () => {
const actual = await sut.getAvailableDatasetTypes()

const datasetTypes = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
}
]

expect(actual).toEqual(datasetTypes)
})
})
})
50 changes: 50 additions & 0 deletions test/unit/datasetTypes/GetAvailableDatasetTypes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { ReadError } from '../../../src'
// import { DatasetType } from '../../../src/datasetTypes/models/DatasetType'
import { DatasetType } from '../../../src/datasetTypes/domain/models/DatasetType'
import { IDatasetTypesRepository } from '../../../src/datasetTypes/domain/repositories/IDatasetTypesRepository'
import { GetAvailableDatasetTypes } from '../../../src/datasetTypes/domain/useCases/GetAvailableDatasetTypes'

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

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

datasetTypesRepositoryStub.getAvailableDatasetTypes = jest
.fn()
.mockResolvedValue(testDatasetTypes)
const sut = new GetAvailableDatasetTypes(datasetTypesRepositoryStub)

const actual = await sut.execute()

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

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

await expect(sut.execute()).rejects.toThrow(ReadError)
expect(datasetTypesRepositoryStub.getAvailableDatasetTypes).toHaveBeenCalledTimes(1)
})
})
})
Loading