From a316ca7023bc7fdec732687caf7caf774833457f Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 5 Dec 2025 17:26:26 +0100 Subject: [PATCH 1/9] feat: add use case for setting default contributor role --- .../repositories/ICollectionsRepository.ts | 4 +++ .../useCases/SetDefaultContributorRole.ts | 26 +++++++++++++++++++ src/collections/index.ts | 5 +++- .../repositories/CollectionsRepository.ts | 14 ++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/collections/domain/useCases/SetDefaultContributorRole.ts diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index bc8960c8..8a67c5c8 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -25,6 +25,10 @@ export interface ICollectionsRepository { getCollectionUserPermissions( collectionIdOrAlias: number | string ): Promise + setDefaultContributorRole( + collectionIdOrAlias: number | string, + roleAlias: string + ): Promise getCollectionItems( collectionId?: string, limit?: number, diff --git a/src/collections/domain/useCases/SetDefaultContributorRole.ts b/src/collections/domain/useCases/SetDefaultContributorRole.ts new file mode 100644 index 00000000..7e3f09c0 --- /dev/null +++ b/src/collections/domain/useCases/SetDefaultContributorRole.ts @@ -0,0 +1,26 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { ICollectionsRepository } from '../repositories/ICollectionsRepository' +import { ROOT_COLLECTION_ID } from '../models/Collection' + +export class SetDefaultContributorRole implements UseCase { + private collectionsRepository: ICollectionsRepository + + constructor(collectionsRepository: ICollectionsRepository) { + this.collectionsRepository = collectionsRepository + } + + /** + * Sets the default Role that is assigned to contributors in the given collection. + * + * @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId) + * If this parameter is not set, the default value is: ':root' + * @param {string} [roleAlias] - The alias of the role to be assigned + * @returns {Promise} + */ + async execute( + collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, + roleAlias: string + ): Promise { + return await this.collectionsRepository.setDefaultContributorRole(collectionIdOrAlias, roleAlias) + } +} diff --git a/src/collections/index.ts b/src/collections/index.ts index 59e2e50b..0849bb2a 100644 --- a/src/collections/index.ts +++ b/src/collections/index.ts @@ -16,6 +16,7 @@ import { LinkCollection } from './domain/useCases/LinkCollection' import { UnlinkCollection } from './domain/useCases/UnlinkCollection' import { GetCollectionLinks } from './domain/useCases/GetCollectionLinks' import { GetCollectionsForLinking } from './domain/useCases/GetCollectionsForLinking' +import { SetDefaultContributorRole } from './domain/useCases/SetDefaultContributorRole' const collectionsRepository = new CollectionsRepository() @@ -36,6 +37,7 @@ const linkCollection = new LinkCollection(collectionsRepository) const unlinkCollection = new UnlinkCollection(collectionsRepository) const getCollectionLinks = new GetCollectionLinks(collectionsRepository) const getCollectionsForLinking = new GetCollectionsForLinking(collectionsRepository) +const setDefaultContributorRole = new SetDefaultContributorRole(collectionsRepository) export { getCollection, @@ -54,7 +56,8 @@ export { linkCollection, unlinkCollection, getCollectionLinks, - getCollectionsForLinking + getCollectionsForLinking, + setDefaultContributorRole } export { Collection, CollectionInputLevel } from './domain/models/Collection' export { CollectionFacet } from './domain/models/CollectionFacet' diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index e0e459b0..b71a676e 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -167,6 +167,20 @@ export class CollectionsRepository extends ApiRepository implements ICollections }) } + public async setDefaultContributorRole( + collectionIdOrAlias: number | string, + roleAlias: string + ): Promise { + return this.doPut( + `/${this.collectionsResourceName}/${collectionIdOrAlias}/defaultContributorRole/${roleAlias}`, + {} + ) + .then(() => undefined) + .catch((error) => { + throw error + }) + } + public async getCollectionItems( collectionId?: string, limit?: number, From dca9254b0c56264e97a1cdb644eaa39d29953751 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 26 Jan 2026 16:23:59 +0100 Subject: [PATCH 2/9] test: add test for setting default contributor role --- .../SetDefaultContributorRole.test.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/unit/collections/SetDefaultContributorRole.test.ts diff --git a/test/unit/collections/SetDefaultContributorRole.test.ts b/test/unit/collections/SetDefaultContributorRole.test.ts new file mode 100644 index 00000000..ee95a3f2 --- /dev/null +++ b/test/unit/collections/SetDefaultContributorRole.test.ts @@ -0,0 +1,29 @@ +import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository' +import { WriteError } from '../../../src' +import { SetDefaultContributorRole } from '../../../src/collections/domain/useCases/SetDefaultContributorRole' + +describe('execute', () => { + test('should set default contributor role on repository success', async () => { + const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository + collectionRepositoryStub.setDefaultContributorRole = jest.fn().mockResolvedValue(undefined) + const testSetDefaultContributorRole = new SetDefaultContributorRole( + collectionRepositoryStub + ) + + await expect(testSetDefaultContributorRole.execute(1, "curator")).resolves.toBeUndefined() + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + }) + + test('should return error result on repository error', async () => { + const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository + collectionRepositoryStub.setDefaultContributorRole = jest + .fn() + .mockRejectedValue(new WriteError()) + const testSetDefaultContributorRole = new SetDefaultContributorRole( + collectionRepositoryStub + ) + + await expect(testSetDefaultContributorRole.execute(1, "curator")).rejects.toThrow(WriteError) + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + }) +}) From 8115382872bb39e19a2f0578d7a2539e0046e1ab Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 26 Jan 2026 16:28:47 +0100 Subject: [PATCH 3/9] docs: add docs for setting default contributor role --- docs/useCases.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/useCases.md b/docs/useCases.md index f77a40e1..94ff5f16 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -25,6 +25,7 @@ The different use cases currently available in the package are classified below, - [Update Collection Featured Items](#update-collection-featured-items) - [Delete Collection Featured Items](#delete-collection-featured-items) - [Delete a Collection Featured Item](#delete-a-collection-featured-item) + - [Set Default Contributor Role](#set-default-contributor-role) - [Templates](#Templates) - [Templates read use cases](#templates-read-use-cases) - [Get a Template](#get-a-template) @@ -576,6 +577,27 @@ deleteCollectionFeaturedItem.execute(featuredItemId) _See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem.ts)_ definition. +#### Set Default Contributor Role + +Sets the default contributor role of a collection, given a collection identifier and a role alias. + +##### Example call: + +```typescript +import { setDefaultContributorRole } from '@iqss/dataverse-client-javascript' + +/* ... */ + +const collectionIdOrAlias = 12345 +const roleAlias = 'curator' + +setDefaultContributorRole.execute(collectionIdOrAlias, roleAlias) + +/* ... */ +``` + +_See [use case](../src/collections/domain/useCases/SetDefaultContributorRole.ts)_ definition. + ## Templates ### Templates Read Use Cases From f5db976ad3a5e1deb4d813120204daa0fccedda9 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 10:41:36 +0200 Subject: [PATCH 4/9] test: update formatting in SetDefaultContributorRole tests --- .../SetDefaultContributorRole.test.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/unit/collections/SetDefaultContributorRole.test.ts b/test/unit/collections/SetDefaultContributorRole.test.ts index ee95a3f2..8fbe7810 100644 --- a/test/unit/collections/SetDefaultContributorRole.test.ts +++ b/test/unit/collections/SetDefaultContributorRole.test.ts @@ -6,12 +6,10 @@ describe('execute', () => { test('should set default contributor role on repository success', async () => { const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository collectionRepositoryStub.setDefaultContributorRole = jest.fn().mockResolvedValue(undefined) - const testSetDefaultContributorRole = new SetDefaultContributorRole( - collectionRepositoryStub - ) + const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, "curator")).resolves.toBeUndefined() - expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + await expect(testSetDefaultContributorRole.execute(1, 'curator')).resolves.toBeUndefined() + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) test('should return error result on repository error', async () => { @@ -19,11 +17,9 @@ describe('execute', () => { collectionRepositoryStub.setDefaultContributorRole = jest .fn() .mockRejectedValue(new WriteError()) - const testSetDefaultContributorRole = new SetDefaultContributorRole( - collectionRepositoryStub - ) + const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, "curator")).rejects.toThrow(WriteError) - expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + await expect(testSetDefaultContributorRole.execute(1, 'curator')).rejects.toThrow(WriteError) + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) }) From 83791c2251d4c249c3e2268f9f71ae25f75f8e02 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 10:44:10 +0200 Subject: [PATCH 5/9] docs: update CHANGELOG.md with setDefaultContributorRole use case --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4a912c..650ee39b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel - Datasets: Added `exportDatasetMetadata` use case, repository method, and `ExportedDatasetMetadata` response type to support exporting dataset metadata by numeric id or persistent id through Dataverse endpoint `GET /datasets/export`. - Collections: Added `allowedDatasetTypes` field to the [Collection](./src/collections/domain/models/Collection.ts) model. This field is optional and only populated the feature is enabled on the installation and configured on the collection. - Collections: Added theme information when retrieving a collection using `getCollection`. +- Collections: Added `setDefaultContributorRole` use case. ### Changed From c34837d1d88d8b6b38e54cc286d84c3b12ffa4e3 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 11:34:17 +0200 Subject: [PATCH 6/9] test: add unit tests for setDefaultContributorRole in CollectionsRepository --- .../collections/CollectionsRepository.test.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/unit/collections/CollectionsRepository.test.ts b/test/unit/collections/CollectionsRepository.test.ts index adcdf8cf..3d180c45 100644 --- a/test/unit/collections/CollectionsRepository.test.ts +++ b/test/unit/collections/CollectionsRepository.test.ts @@ -97,6 +97,14 @@ describe('CollectionsRepository', () => { data: createCollectionPayload() } } + const testSetDefaultContributorRoleResponse = { + data: { + status: 'OK', + data: { + message: 'Default contributor role has been set' + } + } + } const testCollectionModel = createCollectionModel() beforeEach(() => { @@ -893,4 +901,32 @@ describe('CollectionsRepository', () => { }) }) }) + + describe('setDefaultContributorRole', () => { + const testRoleAlias = 'curator' + + test('should call the API', async () => { + jest.spyOn(axios, 'put').mockResolvedValue(testSetDefaultContributorRoleResponse) + const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/dataverses/test-collection/defaultContributorRole/${testRoleAlias}` + + await sut.setDefaultContributorRole('test-collection', testRoleAlias) + + expect(axios.put).toHaveBeenCalledWith( + expectedApiEndpoint, + '{}', + TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_API_KEY + ) + }) + + test('should return error result on error response', async () => { + jest.spyOn(axios, 'put').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) + let error = undefined as unknown as WriteError + + await sut + .setDefaultContributorRole('test-collection', testRoleAlias) + .catch((e) => (error = e)) + + expect(error).toBeInstanceOf(Error) + }) + }) }) From d1383d748554fbc5acc83f6c9d06f92925027bc5 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 12:36:26 +0200 Subject: [PATCH 7/9] refactor: introduce RoleAlias enum and update setDefaultContributorRole usage across codebase --- .../domain/repositories/ICollectionsRepository.ts | 3 ++- .../domain/useCases/SetDefaultContributorRole.ts | 5 +++-- .../infra/repositories/CollectionsRepository.ts | 3 ++- src/roles/domain/models/RoleAlias.ts | 12 ++++++++++++ src/roles/index.ts | 1 + test/unit/collections/CollectionsRepository.test.ts | 3 ++- .../collections/SetDefaultContributorRole.test.ts | 5 +++-- 7 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 src/roles/domain/models/RoleAlias.ts diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index 06023f65..cf1fad5b 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -14,6 +14,7 @@ import { CollectionSummary } from '../models/CollectionSummary' import { AllowedStorageDrivers } from '../models/AllowedStorageDrivers' import { StorageDriver } from '../../../core/domain/models/StorageDriver' import { LinkingObjectType } from '../useCases/GetCollectionsForLinking' +import { RoleAlias } from '../../../roles/domain/models/RoleAlias' export interface ICollectionsRepository { getCollection(collectionIdOrAlias: number | string): Promise @@ -41,7 +42,7 @@ export interface ICollectionsRepository { ): Promise setDefaultContributorRole( collectionIdOrAlias: number | string, - roleAlias: string + roleAlias: RoleAlias | string ): Promise getCollectionItems( collectionId?: string, diff --git a/src/collections/domain/useCases/SetDefaultContributorRole.ts b/src/collections/domain/useCases/SetDefaultContributorRole.ts index 7e3f09c0..e257d9ca 100644 --- a/src/collections/domain/useCases/SetDefaultContributorRole.ts +++ b/src/collections/domain/useCases/SetDefaultContributorRole.ts @@ -1,6 +1,7 @@ import { UseCase } from '../../../core/domain/useCases/UseCase' import { ICollectionsRepository } from '../repositories/ICollectionsRepository' import { ROOT_COLLECTION_ID } from '../models/Collection' +import { RoleAlias } from '../../../roles/domain/models/RoleAlias' export class SetDefaultContributorRole implements UseCase { private collectionsRepository: ICollectionsRepository @@ -14,12 +15,12 @@ export class SetDefaultContributorRole implements UseCase { * * @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId) * If this parameter is not set, the default value is: ':root' - * @param {string} [roleAlias] - The alias of the role to be assigned + * @param {RoleAlias | string} [roleAlias] - The alias of the role to be assigned * @returns {Promise} */ async execute( collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, - roleAlias: string + roleAlias: RoleAlias | string ): Promise { return await this.collectionsRepository.setDefaultContributorRole(collectionIdOrAlias, roleAlias) } diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index a895d275..99dddaf3 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -42,6 +42,7 @@ import { CollectionSummary } from '../../domain/models/CollectionSummary' import { AllowedStorageDrivers } from '../../domain/models/AllowedStorageDrivers' import { StorageDriver } from '../../../core/domain/models/StorageDriver' import { LinkingObjectType } from '../../domain/useCases/GetCollectionsForLinking' +import { RoleAlias } from '../../../roles/domain/models/RoleAlias' export interface NewCollectionRequestPayload { alias: string @@ -227,7 +228,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections public async setDefaultContributorRole( collectionIdOrAlias: number | string, - roleAlias: string + roleAlias: RoleAlias | string ): Promise { return this.doPut( `/${this.collectionsResourceName}/${collectionIdOrAlias}/defaultContributorRole/${roleAlias}`, diff --git a/src/roles/domain/models/RoleAlias.ts b/src/roles/domain/models/RoleAlias.ts new file mode 100644 index 00000000..23e35fff --- /dev/null +++ b/src/roles/domain/models/RoleAlias.ts @@ -0,0 +1,12 @@ +// Aliases of built-in roles +export enum RoleAlias { + ADMIN = 'admin', + FILE_DOWNLOADER = 'fileDownloader', + FULL_CONTRIBUTOR = 'fullContributor', + DV_CONTRIBUTOR = 'dvContributor', + DS_CONTRIBUTOR = 'dsContributor', + EDITOR = 'contributor', + MANAGER = 'manager', + CURATOR = 'curator', + MEMBER = 'member' +} diff --git a/src/roles/index.ts b/src/roles/index.ts index 8bd9e276..3f6c1528 100644 --- a/src/roles/index.ts +++ b/src/roles/index.ts @@ -8,3 +8,4 @@ const getUserSelectableRoles = new GetUserSelectableRoles(rolesRepository) export { getUserSelectableRoles } export { Role } from './domain/models/Role' +export { RoleAlias } from './domain/models/RoleAlias' \ No newline at end of file diff --git a/test/unit/collections/CollectionsRepository.test.ts b/test/unit/collections/CollectionsRepository.test.ts index 3d180c45..075034cc 100644 --- a/test/unit/collections/CollectionsRepository.test.ts +++ b/test/unit/collections/CollectionsRepository.test.ts @@ -48,6 +48,7 @@ import { OrderType, SortType } from '../../../src/collections/domain/models/CollectionSearchCriteria' +import { RoleAlias } from '../../../src/roles/domain/models/RoleAlias' describe('CollectionsRepository', () => { const sut: CollectionsRepository = new CollectionsRepository() @@ -903,7 +904,7 @@ describe('CollectionsRepository', () => { }) describe('setDefaultContributorRole', () => { - const testRoleAlias = 'curator' + const testRoleAlias = RoleAlias.CURATOR test('should call the API', async () => { jest.spyOn(axios, 'put').mockResolvedValue(testSetDefaultContributorRoleResponse) diff --git a/test/unit/collections/SetDefaultContributorRole.test.ts b/test/unit/collections/SetDefaultContributorRole.test.ts index 8fbe7810..042b0141 100644 --- a/test/unit/collections/SetDefaultContributorRole.test.ts +++ b/test/unit/collections/SetDefaultContributorRole.test.ts @@ -1,6 +1,7 @@ import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository' import { WriteError } from '../../../src' import { SetDefaultContributorRole } from '../../../src/collections/domain/useCases/SetDefaultContributorRole' +import { RoleAlias } from '../../../src/roles/domain/models/RoleAlias' describe('execute', () => { test('should set default contributor role on repository success', async () => { @@ -8,7 +9,7 @@ describe('execute', () => { collectionRepositoryStub.setDefaultContributorRole = jest.fn().mockResolvedValue(undefined) const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, 'curator')).resolves.toBeUndefined() + await expect(testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR)).resolves.toBeUndefined() expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) @@ -19,7 +20,7 @@ describe('execute', () => { .mockRejectedValue(new WriteError()) const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, 'curator')).rejects.toThrow(WriteError) + await expect(testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR)).rejects.toThrow(WriteError) expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) }) From 68e4ce0d24c0da9ab405a1281b6fe6288e1bdcbd Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 12:51:45 +0200 Subject: [PATCH 8/9] test: add integration tests for SetDefaultContributorRole use case --- .../SetDefaultContributorRole.test.ts | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/integration/collections/SetDefaultContributorRole.test.ts diff --git a/test/integration/collections/SetDefaultContributorRole.test.ts b/test/integration/collections/SetDefaultContributorRole.test.ts new file mode 100644 index 00000000..8f3d96e6 --- /dev/null +++ b/test/integration/collections/SetDefaultContributorRole.test.ts @@ -0,0 +1,55 @@ +import { SetDefaultContributorRole } from '../../../src/collections/domain/useCases/SetDefaultContributorRole' +import { CollectionsRepository } from '../../../src/collections/infra/repositories/CollectionsRepository' +import { ApiConfig } from '../../../src' +import { TestConstants } from '../../testHelpers/TestConstants' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' +import { + createCollectionViaApi, + deleteCollectionViaApi +} from '../../testHelpers/collections/collectionHelper' +import { RoleAlias } from '../../../src/roles/domain/models/RoleAlias' +import { WriteError } from '../../../src/core/domain/repositories/WriteError' + +describe('SetDefaultContributorRole', () => { + const collectionsRepository = new CollectionsRepository() + const useCase = new SetDefaultContributorRole(collectionsRepository) + const testCollectionAlias = 'setDefaultContributorRoleTestCollection' + + beforeAll(async () => { + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + await createCollectionViaApi(testCollectionAlias) + }) + + afterAll(async () => { + await deleteCollectionViaApi(testCollectionAlias) + }) + + test('should successfully set the default contributor role', async () => { + const roleAlias = RoleAlias.CURATOR + + await expect(useCase.execute(testCollectionAlias, roleAlias)).resolves.toBeUndefined() + }) + + test('should successfully set the default contributor role for the root collection', async () => { + const roleAlias = RoleAlias.CURATOR + + await expect(useCase.execute(undefined, roleAlias)).resolves.toBeUndefined() + }) + + test('should throw an error when the collection does not exist', async () => { + const nonExistentCollection = 'nonExistentCollection' + const roleAlias = RoleAlias.CURATOR + + await expect(useCase.execute(nonExistentCollection, roleAlias)).rejects.toThrow(WriteError) + }) + + test('should throw an error when the role alias does not exist', async () => { + const nonExistentRoleAlias = 'invalidRoleAlias' + + await expect(useCase.execute(testCollectionAlias, nonExistentRoleAlias)).rejects.toThrow(WriteError) + }) +}) From 41f5337cd92e8f10c2f3cf8223d755a8e5366dd3 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 19 Aug 2026 11:00:25 +0200 Subject: [PATCH 9/9] style: improve formatting in SetDefaultContributorRole use case and tests --- .../domain/useCases/SetDefaultContributorRole.ts | 5 ++++- src/roles/index.ts | 2 +- .../collections/SetDefaultContributorRole.test.ts | 4 +++- test/unit/collections/SetDefaultContributorRole.test.ts | 8 ++++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/collections/domain/useCases/SetDefaultContributorRole.ts b/src/collections/domain/useCases/SetDefaultContributorRole.ts index e257d9ca..e2aa9beb 100644 --- a/src/collections/domain/useCases/SetDefaultContributorRole.ts +++ b/src/collections/domain/useCases/SetDefaultContributorRole.ts @@ -22,6 +22,9 @@ export class SetDefaultContributorRole implements UseCase { collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, roleAlias: RoleAlias | string ): Promise { - return await this.collectionsRepository.setDefaultContributorRole(collectionIdOrAlias, roleAlias) + return await this.collectionsRepository.setDefaultContributorRole( + collectionIdOrAlias, + roleAlias + ) } } diff --git a/src/roles/index.ts b/src/roles/index.ts index 3f6c1528..51617c3d 100644 --- a/src/roles/index.ts +++ b/src/roles/index.ts @@ -8,4 +8,4 @@ const getUserSelectableRoles = new GetUserSelectableRoles(rolesRepository) export { getUserSelectableRoles } export { Role } from './domain/models/Role' -export { RoleAlias } from './domain/models/RoleAlias' \ No newline at end of file +export { RoleAlias } from './domain/models/RoleAlias' diff --git a/test/integration/collections/SetDefaultContributorRole.test.ts b/test/integration/collections/SetDefaultContributorRole.test.ts index 8f3d96e6..79cc9be2 100644 --- a/test/integration/collections/SetDefaultContributorRole.test.ts +++ b/test/integration/collections/SetDefaultContributorRole.test.ts @@ -50,6 +50,8 @@ describe('SetDefaultContributorRole', () => { test('should throw an error when the role alias does not exist', async () => { const nonExistentRoleAlias = 'invalidRoleAlias' - await expect(useCase.execute(testCollectionAlias, nonExistentRoleAlias)).rejects.toThrow(WriteError) + await expect(useCase.execute(testCollectionAlias, nonExistentRoleAlias)).rejects.toThrow( + WriteError + ) }) }) diff --git a/test/unit/collections/SetDefaultContributorRole.test.ts b/test/unit/collections/SetDefaultContributorRole.test.ts index 042b0141..f3587b6e 100644 --- a/test/unit/collections/SetDefaultContributorRole.test.ts +++ b/test/unit/collections/SetDefaultContributorRole.test.ts @@ -9,7 +9,9 @@ describe('execute', () => { collectionRepositoryStub.setDefaultContributorRole = jest.fn().mockResolvedValue(undefined) const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR)).resolves.toBeUndefined() + await expect( + testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR) + ).resolves.toBeUndefined() expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) @@ -20,7 +22,9 @@ describe('execute', () => { .mockRejectedValue(new WriteError()) const testSetDefaultContributorRole = new SetDefaultContributorRole(collectionRepositoryStub) - await expect(testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR)).rejects.toThrow(WriteError) + await expect(testSetDefaultContributorRole.execute(1, RoleAlias.CURATOR)).rejects.toThrow( + WriteError + ) expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, 'curator') }) })