Skip to content

Commit 6042b29

Browse files
authored
Merge pull request #422 from IQSS/407-add-use-cases-for-publish-dataset-settings
Add use cases for Publish Dataset text settings. All tests passing locally and in GH.
2 parents 554dbe0 + 0379774 commit 6042b29

File tree

10 files changed

+240
-4
lines changed

10 files changed

+240
-4
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
2020
- Guestbooks: Added dataset-level guestbook assignment and removal support via `assignDatasetGuestbook` (`PUT /api/datasets/{identifier}/guestbook`) and `removeDatasetGuestbook` (`DELETE /api/datasets/{identifier}/guestbook`).
2121
- Datasets/Guestbooks: Added `guestbookId` in `getDataset` responses.
2222
- Access: Added`access` module for guestbook-at-request and download terms/guestbook submission endpoints.
23+
- New Use Case: [Get Publish Dataset Disclaimer Text](./docs/useCases.md#get-publish-dataset-disclaimer-text).
24+
- New Use Case: [Get Dataset Publish Popup Custom Text](./docs/useCases.md#get-dataset-publish-popup-custom-text).
2325
- DatasetType: Updated datasetType data model. Added two more fields: description and displayName.
2426

2527
### Changed

docs/useCases.md

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2589,6 +2589,42 @@ getAvailableDatasetMetadataExportFormats
25892589

25902590
_See [use case](../src/info/domain/useCases/GetAvailableDatasetMetadataExportFormats.ts) implementation_.
25912591

2592+
#### Get Dataset Publish Popup Custom Text
2593+
2594+
Returns the custom text displayed in the dataset publish confirmation popup
2595+
2596+
##### Example call:
2597+
2598+
```typescript
2599+
import { getDatasetPublishPopupCustomText } from '@iqss/dataverse-client-javascript'
2600+
2601+
/* ... */
2602+
2603+
getDatasetPublishPopupCustomText.execute().then((text: string) => {
2604+
/* ... */
2605+
})
2606+
```
2607+
2608+
_See [use case](../src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts) implementation_.
2609+
2610+
#### Get Publish Dataset Disclaimer Text
2611+
2612+
Returns the disclaimer text displayed in the dataset publish flow.
2613+
2614+
##### Example calls:
2615+
2616+
```typescript
2617+
import { getPublishDatasetDisclaimerText } from '@iqss/dataverse-client-javascript'
2618+
2619+
/* ... */
2620+
2621+
getPublishDatasetDisclaimerText.execute().then((disclaimerText: string) => {
2622+
/* ... */
2623+
})
2624+
```
2625+
2626+
_See [use case](../src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts) implementation_.
2627+
25922628
## Licenses
25932629

25942630
### Get Available Standard License Terms
@@ -2623,7 +2659,7 @@ import { submitContactInfo } from '@iqss/dataverse-client-javascript'
26232659
/* ... */
26242660

26252661
const contactDTO: ContactDTO = {
2626-
targedId: 1
2662+
targetId: 1,
26272663
subject: 'Data Question',
26282664
body: 'Please help me understand your data. Thank you!',
26292665
fromEmail: '[email protected]'

src/info/domain/repositories/IDataverseInfoRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ export interface IDataverseInfoRepository {
77
getMaxEmbargoDurationInMonths(): Promise<number>
88
getApplicationTermsOfUse(lang?: string): Promise<string>
99
getAvailableDatasetMetadataExportFormats(): Promise<DatasetMetadataExportFormats>
10+
getDatasetPublishPopupCustomText(): Promise<string>
11+
getPublishDatasetDisclaimerText(): Promise<string>
1012
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'
3+
4+
export class GetDatasetPublishPopupCustomText implements UseCase<string> {
5+
private dataverseInfoRepository: IDataverseInfoRepository
6+
7+
constructor(dataverseInfoRepository: IDataverseInfoRepository) {
8+
this.dataverseInfoRepository = dataverseInfoRepository
9+
}
10+
11+
/**
12+
* Returns a string containing custom text for the Publish Dataset modal.
13+
*
14+
* @returns {Promise<string>}
15+
*/
16+
async execute(): Promise<string> {
17+
return await this.dataverseInfoRepository.getDatasetPublishPopupCustomText()
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'
3+
4+
export class GetPublishDatasetDisclaimerText implements UseCase<string> {
5+
private dataverseInfoRepository: IDataverseInfoRepository
6+
7+
constructor(dataverseInfoRepository: IDataverseInfoRepository) {
8+
this.dataverseInfoRepository = dataverseInfoRepository
9+
}
10+
11+
/**
12+
* Returns a string containing the disclaimer text for the Publish Dataset modal.
13+
*
14+
* @returns {Promise<string>}
15+
*/
16+
async execute(): Promise<string> {
17+
return await this.dataverseInfoRepository.getPublishDatasetDisclaimerText()
18+
}
19+
}

src/info/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit'
44
import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths'
55
import { GetApplicationTermsOfUse } from './domain/useCases/GetApplicationTermsOfUse'
66
import { GetAvailableDatasetMetadataExportFormats } from './domain/useCases/GetAvailableDatasetMetadataExportFormats'
7+
import { GetDatasetPublishPopupCustomText } from './domain/useCases/GetDatasetPublishPopupCustomText'
8+
import { GetPublishDatasetDisclaimerText } from './domain/useCases/GetPublishDatasetDisclaimerText'
79

810
const dataverseInfoRepository = new DataverseInfoRepository()
911

@@ -14,13 +16,19 @@ const getApplicationTermsOfUse = new GetApplicationTermsOfUse(dataverseInfoRepos
1416
const getAvailableDatasetMetadataExportFormats = new GetAvailableDatasetMetadataExportFormats(
1517
dataverseInfoRepository
1618
)
19+
const getPublishDatasetDisclaimerText = new GetPublishDatasetDisclaimerText(dataverseInfoRepository)
20+
const getDatasetPublishPopupCustomText = new GetDatasetPublishPopupCustomText(
21+
dataverseInfoRepository
22+
)
1723

1824
export {
1925
getDataverseVersion,
2026
getZipDownloadLimit,
2127
getMaxEmbargoDurationInMonths,
2228
getApplicationTermsOfUse,
23-
getAvailableDatasetMetadataExportFormats
29+
getAvailableDatasetMetadataExportFormats,
30+
getDatasetPublishPopupCustomText,
31+
getPublishDatasetDisclaimerText
2432
}
2533

2634
export { DatasetMetadataExportFormats } from './domain/models/DatasetMetadataExportFormats'

src/info/infra/repositories/DataverseInfoRepository.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,26 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse
6666
throw error
6767
})
6868
}
69+
public async getDatasetPublishPopupCustomText(): Promise<string> {
70+
return this.doGet(
71+
this.buildApiEndpoint(this.infoResourceName, `settings/:DatasetPublishPopupCustomText`)
72+
)
73+
.then((response: AxiosResponse<{ data: { message: string } }>) => {
74+
return response.data.data.message
75+
})
76+
.catch((error) => {
77+
throw error
78+
})
79+
}
80+
public async getPublishDatasetDisclaimerText(): Promise<string> {
81+
return this.doGet(
82+
this.buildApiEndpoint(this.infoResourceName, `settings/:PublishDatasetDisclaimerText`)
83+
)
84+
.then((response: AxiosResponse<{ data: { message: string } }>) => {
85+
return response.data.data.message
86+
})
87+
.catch((error) => {
88+
throw error
89+
})
90+
}
6991
}

test/integration/info/DataverseInfoRepository.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import { TestConstants } from '../../testHelpers/TestConstants'
77
import {
88
deleteApplicationTermsOfUseViaApi,
99
setApplicationTermsOfUseViaApi,
10-
setMaxEmbargoDurationInMonthsViaApi
10+
setDatasetPublishPopupCustomTextViaApi,
11+
setMaxEmbargoDurationInMonthsViaApi,
12+
setPublishDatasetDisclaimerTextViaApi
1113
} from '../../testHelpers/info/infoHelper'
1214
import { ReadError } from '../../../src/core/domain/repositories/ReadError'
1315

@@ -53,7 +55,40 @@ describe('DataverseInfoRepository', () => {
5355
expect(actual).toBe(testMaxEmbargoDurationInMonths)
5456
})
5557
})
58+
describe('getPublishDatasetDisclaimerText', () => {
59+
test('should return error when the setting does not exist', async () => {
60+
const errorExpected: ReadError = new ReadError(
61+
'[404] Setting :PublishDatasetDisclaimerText not found'
62+
)
63+
64+
await expect(sut.getPublishDatasetDisclaimerText()).rejects.toThrow(errorExpected)
65+
})
5666

67+
test('should return text when the setting exists', async () => {
68+
const testPublishDatasetDisclaimerText = 'please read and accept'
69+
await setPublishDatasetDisclaimerTextViaApi(testPublishDatasetDisclaimerText)
70+
const actual = await sut.getPublishDatasetDisclaimerText()
71+
72+
expect(actual).toBe(testPublishDatasetDisclaimerText)
73+
})
74+
})
75+
describe('getDatasetPublishPopupCustomText', () => {
76+
test('should return error when the setting does not exist', async () => {
77+
const errorExpected: ReadError = new ReadError(
78+
'[404] Setting :DatasetPublishPopupCustomText not found'
79+
)
80+
81+
await expect(sut.getDatasetPublishPopupCustomText()).rejects.toThrow(errorExpected)
82+
})
83+
84+
test('should return text when the setting exists', async () => {
85+
const testDatasetPublishPopupCustomText = 'custom publish popup text'
86+
await setDatasetPublishPopupCustomTextViaApi(testDatasetPublishPopupCustomText)
87+
const actual = await sut.getDatasetPublishPopupCustomText()
88+
89+
expect(actual).toBe(testDatasetPublishPopupCustomText)
90+
})
91+
})
5792
describe('getApplicationTermsOfUse', () => {
5893
test('should return no terms message when terms are not set', async () => {
5994
const defaultNoTermsOfUseMessage =

test/testHelpers/info/infoHelper.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,28 @@ export const setApplicationTermsOfUseViaApi = async (
2424
}
2525
)
2626
}
27-
27+
export const setDatasetPublishPopupCustomTextViaApi = async (
28+
datasetPublishPopupCustomText: string
29+
): Promise<AxiosResponse> => {
30+
return await axios.put(
31+
`${TestConstants.TEST_API_URL}/admin/settings/:DatasetPublishPopupCustomText`,
32+
datasetPublishPopupCustomText,
33+
{
34+
headers: { 'Content-Type': 'text/plain' }
35+
}
36+
)
37+
}
38+
export const setPublishDatasetDisclaimerTextViaApi = async (
39+
publishDatasetDisclaimerText: string
40+
): Promise<AxiosResponse> => {
41+
return await axios.put(
42+
`${TestConstants.TEST_API_URL}/admin/settings/:PublishDatasetDisclaimerText`,
43+
publishDatasetDisclaimerText,
44+
{
45+
headers: { 'Content-Type': 'text/plain' }
46+
}
47+
)
48+
}
2849
export const deleteApplicationTermsOfUseViaApi = async (): Promise<AxiosResponse> => {
2950
return await axios.delete(`${TestConstants.TEST_API_URL}/admin/settings/:ApplicationTermsOfUse`)
3051
}

test/unit/info/DataverseInfoRepository.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,76 @@ describe('DataverseInfoRepository', () => {
240240
expect(error).toBeInstanceOf(Error)
241241
})
242242
})
243+
244+
describe('getDatasetPublishPopupCustomText', () => {
245+
test('should return dataset publish popup custom text on successful response', async () => {
246+
const testPopupText = 'Custom popup text.'
247+
const testSuccessfulResponse = {
248+
data: {
249+
status: 'OK',
250+
data: {
251+
message: testPopupText
252+
}
253+
}
254+
}
255+
jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse)
256+
257+
const actual = await sut.getDatasetPublishPopupCustomText()
258+
259+
expect(axios.get).toHaveBeenCalledWith(
260+
`${TestConstants.TEST_API_URL}/info/settings/:DatasetPublishPopupCustomText`,
261+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
262+
)
263+
expect(actual).toMatch(testPopupText)
264+
})
265+
266+
test('should return error result on error response', async () => {
267+
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)
268+
269+
let error: ReadError | undefined
270+
await sut.getDatasetPublishPopupCustomText().catch((e) => (error = e))
271+
272+
expect(axios.get).toHaveBeenCalledWith(
273+
`${TestConstants.TEST_API_URL}/info/settings/:DatasetPublishPopupCustomText`,
274+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
275+
)
276+
expect(error).toBeInstanceOf(Error)
277+
})
278+
})
279+
280+
describe('getPublishDatasetDisclaimerText', () => {
281+
test('should return publish dataset disclaimer text on successful response', async () => {
282+
const testDisclaimerText = 'Disclaimer text.'
283+
const testSuccessfulResponse = {
284+
data: {
285+
status: 'OK',
286+
data: {
287+
message: testDisclaimerText
288+
}
289+
}
290+
}
291+
jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse)
292+
293+
const actual = await sut.getPublishDatasetDisclaimerText()
294+
295+
expect(axios.get).toHaveBeenCalledWith(
296+
`${TestConstants.TEST_API_URL}/info/settings/:PublishDatasetDisclaimerText`,
297+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
298+
)
299+
expect(actual).toMatch(testDisclaimerText)
300+
})
301+
302+
test('should return error result on error response', async () => {
303+
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)
304+
305+
let error: ReadError | undefined
306+
await sut.getPublishDatasetDisclaimerText().catch((e) => (error = e))
307+
308+
expect(axios.get).toHaveBeenCalledWith(
309+
`${TestConstants.TEST_API_URL}/info/settings/:PublishDatasetDisclaimerText`,
310+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
311+
)
312+
expect(error).toBeInstanceOf(Error)
313+
})
314+
})
243315
})

0 commit comments

Comments
 (0)