Skip to content

Commit 60ce44e

Browse files
committed
Added: dataset update repository logic and unit tests
1 parent 99408e9 commit 60ce44e

File tree

5 files changed

+174
-18
lines changed

5 files changed

+174
-18
lines changed

src/core/infra/repositories/ApiRepository.ts

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@ export abstract class ApiRepository {
2222
data: string | object,
2323
queryParams: object = {}
2424
): Promise<AxiosResponse> {
25-
return await axios
26-
.post(
27-
this.buildRequestUrl(apiEndpoint),
28-
JSON.stringify(data),
29-
this.buildRequestConfig(true, queryParams)
30-
)
31-
.then((response) => response)
32-
.catch((error) => {
33-
throw new WriteError(this.buildErrorMessage(error))
34-
})
25+
return await this.doRequest('post', apiEndpoint, data, queryParams)
26+
}
27+
28+
public async doPut(
29+
apiEndpoint: string,
30+
data: string | object,
31+
queryParams: object = {}
32+
): Promise<AxiosResponse> {
33+
return await this.doRequest('put', apiEndpoint, data, queryParams)
3534
}
3635

3736
protected buildApiEndpoint(
@@ -83,4 +82,22 @@ export abstract class ApiRepository {
8382
const message = error.response && error.response.data ? ` ${error.response.data.message}` : ''
8483
return `[${status}]${message}`
8584
}
85+
86+
private async doRequest(
87+
method: 'post' | 'put',
88+
apiEndpoint: string,
89+
data: string | object,
90+
queryParams: object = {}
91+
): Promise<AxiosResponse> {
92+
const requestData = JSON.stringify(data)
93+
const requestUrl = this.buildRequestUrl(apiEndpoint)
94+
const requestConfig = this.buildRequestConfig(true, queryParams)
95+
96+
try {
97+
const response = await axios[method](requestUrl, requestData, requestConfig)
98+
return response
99+
} catch (error) {
100+
throw new WriteError(this.buildErrorMessage(error))
101+
}
102+
}
86103
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DatasetLock } from '../models/DatasetLock'
33
import { DatasetPreviewSubset } from '../models/DatasetPreviewSubset'
44
import { DatasetUserPermissions } from '../models/DatasetUserPermissions'
55
import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers'
6-
import { NewDatasetDTO } from '../dtos/DatasetDTO'
6+
import { DatasetDTO } from '../dtos/DatasetDTO'
77
import { MetadataBlock } from '../../../metadataBlocks'
88

99
export interface IDatasetsRepository {
@@ -28,14 +28,14 @@ export interface IDatasetsRepository {
2828
getPrivateUrlDatasetCitation(token: string): Promise<string>
2929
getDatasetUserPermissions(datasetId: number | string): Promise<DatasetUserPermissions>
3030
createDataset(
31-
newDataset: NewDatasetDTO,
31+
newDataset: DatasetDTO,
3232
datasetMetadataBlocks: MetadataBlock[],
3333
collectionId: string
3434
): Promise<CreatedDatasetIdentifiers>
3535
publishDataset(datasetId: number | string, versionUpdateType: VersionUpdateType): Promise<void>
3636
updateDataset(
3737
datasetId: number | string,
38-
newDataset: NewDatasetDTO,
38+
dataset: DatasetDTO,
3939
datasetMetadataBlocks: MetadataBlock[]
4040
): Promise<void>
4141
}

src/datasets/domain/useCases/UpdateDataset.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ export class UpdateDataset extends DatasetWriteUseCase<void> {
2626
async execute(datasetId: number | string, updatedDataset: DatasetDTO): Promise<void> {
2727
const metadataBlocks = await this.getNewDatasetMetadataBlocks(updatedDataset)
2828
this.getNewDatasetValidator().validate(updatedDataset, metadataBlocks)
29-
this.getDatasetsRepository().updateDataset(datasetId, updatedDataset, metadataBlocks)
29+
return this.getDatasetsRepository().updateDataset(datasetId, updatedDataset, metadataBlocks)
3030
}
3131
}

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,18 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
175175
})
176176
}
177177

178-
// TODO
179178
public async updateDataset(
180179
datasetId: string | number,
181-
newDataset: any,
180+
dataset: DatasetDTO,
182181
datasetMetadataBlocks: MetadataBlock[]
183182
): Promise<void> {
184-
console.log(datasetId + newDataset + datasetMetadataBlocks.length)
185-
throw new Error('Method not implemented.')
183+
return this.doPut(
184+
this.buildApiEndpoint(this.datasetsResourceName, `editMetadata`, datasetId),
185+
transformDatasetModelToRequestPayload(dataset, datasetMetadataBlocks)
186+
)
187+
.then(() => undefined)
188+
.catch((error) => {
189+
throw error
190+
})
186191
}
187192
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import { UpdateDataset } from '../../../src/datasets/domain/useCases/UpdateDataset'
2+
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
3+
import { ResourceValidator } from '../../../src/core/domain/useCases/validators/ResourceValidator'
4+
import {
5+
createDatasetDTO,
6+
createDatasetMetadataBlockModel
7+
} from '../../testHelpers/datasets/datasetHelper'
8+
import { IMetadataBlocksRepository } from '../../../src/metadataBlocks/domain/repositories/IMetadataBlocksRepository'
9+
import { ResourceValidationError } from '../../../src/core/domain/useCases/validators/errors/ResourceValidationError'
10+
import { WriteError, ReadError } from '../../../src'
11+
12+
describe('execute', () => {
13+
const testDataset = createDatasetDTO()
14+
const testMetadataBlocks = [createDatasetMetadataBlockModel()]
15+
16+
test('should return undefined when validation is successful and repository call is successful', async () => {
17+
const datasetsRepositoryStub = <IDatasetsRepository>{}
18+
datasetsRepositoryStub.updateDataset = jest.fn().mockResolvedValue(undefined)
19+
20+
const datasetValidatorStub = <ResourceValidator>{}
21+
datasetValidatorStub.validate = jest.fn().mockResolvedValue(undefined)
22+
23+
const metadataBlocksRepositoryStub = <IMetadataBlocksRepository>{}
24+
metadataBlocksRepositoryStub.getMetadataBlockByName = jest
25+
.fn()
26+
.mockResolvedValue(testMetadataBlocks[0])
27+
28+
const sut = new UpdateDataset(
29+
datasetsRepositoryStub,
30+
metadataBlocksRepositoryStub,
31+
datasetValidatorStub
32+
)
33+
34+
const actual = await sut.execute(1, testDataset)
35+
36+
expect(actual).toEqual(undefined)
37+
38+
expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith(
39+
testMetadataBlocks[0].name
40+
)
41+
expect(datasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks)
42+
expect(datasetsRepositoryStub.updateDataset).toHaveBeenCalledWith(
43+
1,
44+
testDataset,
45+
testMetadataBlocks
46+
)
47+
})
48+
49+
test('should throw ResourceValidationError and not call repository when validation is unsuccessful', async () => {
50+
const datasetsRepositoryMock = <IDatasetsRepository>{}
51+
datasetsRepositoryMock.updateDataset = jest.fn().mockResolvedValue(undefined)
52+
53+
const datasetValidatorStub = <ResourceValidator>{}
54+
datasetValidatorStub.validate = jest.fn().mockImplementation(() => {
55+
throw new ResourceValidationError('Test error')
56+
})
57+
58+
const metadataBlocksRepositoryStub = <IMetadataBlocksRepository>{}
59+
metadataBlocksRepositoryStub.getMetadataBlockByName = jest
60+
.fn()
61+
.mockResolvedValue(testMetadataBlocks[0])
62+
63+
const sut = new UpdateDataset(
64+
datasetsRepositoryMock,
65+
metadataBlocksRepositoryStub,
66+
datasetValidatorStub
67+
)
68+
69+
await expect(sut.execute(1, testDataset)).rejects.toThrow(ResourceValidationError)
70+
71+
expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith(
72+
testMetadataBlocks[0].name
73+
)
74+
expect(datasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks)
75+
expect(datasetsRepositoryMock.updateDataset).not.toHaveBeenCalled()
76+
})
77+
78+
test('should throw WriteError when validation is successful and repository raises an error', async () => {
79+
const datasetsRepositoryStub = <IDatasetsRepository>{}
80+
const testWriteError = new WriteError('Test error')
81+
datasetsRepositoryStub.updateDataset = jest.fn().mockRejectedValue(testWriteError)
82+
83+
const datasetValidatorStub = <ResourceValidator>{}
84+
datasetValidatorStub.validate = jest.fn().mockResolvedValue(undefined)
85+
86+
const metadataBlocksRepositoryStub = <IMetadataBlocksRepository>{}
87+
metadataBlocksRepositoryStub.getMetadataBlockByName = jest
88+
.fn()
89+
.mockResolvedValue(testMetadataBlocks[0])
90+
91+
const sut = new UpdateDataset(
92+
datasetsRepositoryStub,
93+
metadataBlocksRepositoryStub,
94+
datasetValidatorStub
95+
)
96+
await expect(sut.execute(1, testDataset)).rejects.toThrow(testWriteError)
97+
98+
expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith(
99+
testMetadataBlocks[0].name
100+
)
101+
expect(datasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks)
102+
expect(datasetsRepositoryStub.updateDataset).toHaveBeenCalledWith(
103+
1,
104+
testDataset,
105+
testMetadataBlocks
106+
)
107+
})
108+
109+
test('should throw ReadError when metadata blocks repository raises an error', async () => {
110+
const datasetsRepositoryMock = <IDatasetsRepository>{}
111+
datasetsRepositoryMock.updateDataset = jest.fn().mockResolvedValue(undefined)
112+
113+
const datasetValidatorMock = <ResourceValidator>{}
114+
datasetValidatorMock.validate = jest.fn().mockResolvedValue(undefined)
115+
116+
const metadataBlocksRepositoryStub = <IMetadataBlocksRepository>{}
117+
const testReadError = new ReadError('Test error')
118+
metadataBlocksRepositoryStub.getMetadataBlockByName = jest.fn().mockRejectedValue(testReadError)
119+
120+
const sut = new UpdateDataset(
121+
datasetsRepositoryMock,
122+
metadataBlocksRepositoryStub,
123+
datasetValidatorMock
124+
)
125+
await expect(sut.execute(1, testDataset)).rejects.toThrow(testReadError)
126+
127+
expect(datasetValidatorMock.validate).not.toHaveBeenCalled()
128+
expect(datasetsRepositoryMock.updateDataset).not.toHaveBeenCalled()
129+
130+
expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith(
131+
testMetadataBlocks[0].name
132+
)
133+
})
134+
})

0 commit comments

Comments
 (0)