Skip to content

Commit b743a4e

Browse files
committed
add use case and unit test
1 parent 9cd2389 commit b743a4e

File tree

7 files changed

+108
-0
lines changed

7 files changed

+108
-0
lines changed

src/roles/domain/models/Role.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface Role {
2+
id: number
3+
name: string
4+
alias: string
5+
description: string
6+
permissions: string[]
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Role } from '../models/Role'
2+
3+
export interface IRolesRepository {
4+
getUserSelectableRoles(): Promise<Role[]>
5+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { AxiosResponse } from 'axios'
2+
import { Role } from '../../models/Role'
3+
4+
export const transformRolesUserSelectableResponseToRoles = (response: AxiosResponse): Role[] => {
5+
const roleUserSelectablePayload = response.data.data
6+
7+
return roleUserSelectablePayload.map((role: any) => ({
8+
id: role.id,
9+
name: role.name,
10+
alias: role.alias,
11+
description: role.description,
12+
permissions: role.permissions
13+
}))
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { Role } from '../models/Role'
3+
import { IRolesRepository } from '../repositories/IRolesRepository'
4+
5+
export class GetUserSelectableRoles implements UseCase<Role[]> {
6+
constructor(private readonly rolesRepository: IRolesRepository) {}
7+
8+
/**
9+
* Returns an array of Roles, for the currently logged in user.
10+
*
11+
* @returns {Promise<Role[]>} - A promise that resolves to an array of Role instances that the user can select.
12+
*/
13+
async execute(): Promise<Role[]> {
14+
return (await this.rolesRepository.getUserSelectableRoles()) as Role[]
15+
}
16+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
2+
import { IRolesRepository } from '../../domain/repositories/IRolesRepository'
3+
import { Role } from '../../domain/models/Role'
4+
import { transformRolesUserSelectableResponseToRoles } from '../../domain/repositories/transformers/roleTransformers'
5+
6+
export class RolesRepository extends ApiRepository implements IRolesRepository {
7+
private readonly rolesResourceName: string = 'roles'
8+
public async getUserSelectableRoles(): Promise<Role[]> {
9+
return this.doGet(`/${this.rolesResourceName}/userSelectable`, true)
10+
.then((response) => transformRolesUserSelectableResponseToRoles(response.data.data))
11+
.catch((error) => {
12+
throw error
13+
})
14+
}
15+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Role } from '../../../src/roles/domain/models/Role'
2+
3+
export const createRoleModel = (): Role => {
4+
return {
5+
id: 1,
6+
name: 'admin',
7+
alias: 'Admin',
8+
description:
9+
'A person who has all permissions for dataverses, datasets, and files, including approving requests for restricted data.',
10+
permissions: [
11+
'AddDataverse',
12+
'AddDataset',
13+
'ViewUnpublishedDataverse',
14+
'ViewUnpublishedDataset'
15+
]
16+
}
17+
}
18+
export const createRoleModelArray = (count: number): Role[] => {
19+
return Array.from({ length: count }, (_, index) => ({
20+
id: index + 1,
21+
name: `role${index + 1}`,
22+
alias: `Role ${index + 1}`,
23+
description: `Description for role ${index + 1}`,
24+
permissions: [`Permission${index + 1}`]
25+
}))
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { ReadError } from '../../../src'
2+
import { IRolesRepository } from '../../../src/roles/domain/repositories/IRolesRepository'
3+
import { createRoleModelArray } from '../../testHelpers/roles/roleHelper'
4+
import { GetUserSelectableRoles } from '../../../src/roles/domain/useCases/GetUserSelectableRoles'
5+
6+
describe('execute', () => {
7+
test('should return roles array on repository success', async () => {
8+
const rolesRepositoryStub: IRolesRepository = {} as IRolesRepository
9+
const testRoles = createRoleModelArray(5)
10+
rolesRepositoryStub.getUserSelectableRoles = jest.fn().mockResolvedValue(testRoles)
11+
const sut = new GetUserSelectableRoles(rolesRepositoryStub)
12+
13+
const actual = await sut.execute()
14+
15+
expect(actual).toEqual(testRoles)
16+
})
17+
18+
test('should return error result on repository error', async () => {
19+
const rolesRepositoryStub: IRolesRepository = {} as IRolesRepository
20+
rolesRepositoryStub.getUserSelectableRoles = jest.fn().mockRejectedValue(new ReadError())
21+
const sut = new GetUserSelectableRoles(rolesRepositoryStub)
22+
23+
await expect(sut.execute()).rejects.toThrow(ReadError)
24+
})
25+
})

0 commit comments

Comments
 (0)