Skip to content

Commit d3a83c8

Browse files
fix: [UIE-9134] - IAM RBAC: fetch all entities client-side to avoid missing items (linode#12888)
* fetch all entities * changeset * add CRUD MSW support for entities --------- Co-authored-by: Alban Bailly <abailly@akamai.com>
1 parent 9af32a7 commit d3a83c8

File tree

21 files changed

+211
-82
lines changed

21 files changed

+211
-82
lines changed

packages/manager/src/dev-tools/load.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export async function loadDevTools() {
9292
...initialContext.firewalls,
9393
...(seedContext?.firewalls || []),
9494
],
95+
entities: [...initialContext.entities, ...(seedContext?.entities || [])],
9596
kubernetesClusters: [
9697
...initialContext.kubernetesClusters,
9798
...(seedContext?.kubernetesClusters || []),

packages/manager/src/features/IAM/Shared/AssignedPermissionsPanel/AssignedPermissionsPanel.test.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@ import { fireEvent, screen } from '@testing-library/react';
22
import React from 'react';
33

44
import { accountEntityFactory } from 'src/factories/accountEntities';
5-
import { makeResourcePage } from 'src/mocks/serverHandlers';
65
import { renderWithTheme } from 'src/utilities/testHelpers';
76

87
import { AssignedPermissionsPanel } from './AssignedPermissionsPanel';
98

109
import type { ExtendedRole } from '../utilities';
1110

1211
const queryMocks = vi.hoisted(() => ({
13-
useAccountEntities: vi.fn().mockReturnValue({}),
12+
useAllAccountEntities: vi.fn().mockReturnValue({}),
1413
}));
1514

1615
vi.mock('src/queries/entities/entities', async () => {
1716
const actual = await vi.importActual('src/queries/entities/entities');
1817
return {
1918
...actual,
20-
useAccountEntities: queryMocks.useAccountEntities,
19+
useAllAccountEntities: queryMocks.useAllAccountEntities,
2120
};
2221
});
2322

@@ -84,8 +83,8 @@ describe('AssignedPermissionsPanel', () => {
8483
});
8584

8685
it('renders with the correct context when the access is an entity', () => {
87-
queryMocks.useAccountEntities.mockReturnValue({
88-
data: makeResourcePage(mockEntities),
86+
queryMocks.useAllAccountEntities.mockReturnValue({
87+
data: mockEntities,
8988
});
9089
renderWithTheme(
9190
<AssignedPermissionsPanel role={mockEntitiesAcceessRole} />
@@ -107,8 +106,8 @@ describe('AssignedPermissionsPanel', () => {
107106
});
108107

109108
it('renders the Autocomplete when the access is an entity', () => {
110-
queryMocks.useAccountEntities.mockReturnValue({
111-
data: makeResourcePage(mockEntities),
109+
queryMocks.useAllAccountEntities.mockReturnValue({
110+
data: mockEntities,
112111
});
113112
renderWithTheme(
114113
<AssignedPermissionsPanel role={mockEntitiesAcceessRole} />

packages/manager/src/features/IAM/Shared/AssignedRolesTable/AssignedRolesTable.test.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ import React from 'react';
55
import { accountEntityFactory } from 'src/factories/accountEntities';
66
import { accountRolesFactory } from 'src/factories/accountRoles';
77
import { userRolesFactory } from 'src/factories/userRoles';
8-
import { makeResourcePage } from 'src/mocks/serverHandlers';
98
import { renderWithTheme } from 'src/utilities/testHelpers';
109

1110
import { AssignedRolesTable } from './AssignedRolesTable';
1211

1312
const queryMocks = vi.hoisted(() => ({
14-
useAccountEntities: vi.fn().mockReturnValue({}),
13+
useAllAccountEntities: vi.fn().mockReturnValue({}),
1514
useParams: vi.fn().mockReturnValue({}),
1615
useAccountRoles: vi.fn().mockReturnValue({}),
1716
useUserRoles: vi.fn().mockReturnValue({}),
@@ -30,7 +29,7 @@ vi.mock('src/queries/entities/entities', async () => {
3029
const actual = await vi.importActual<any>('src/queries/entities/entities');
3130
return {
3231
...actual,
33-
useAccountEntities: queryMocks.useAccountEntities,
32+
useAllAccountEntities: queryMocks.useAllAccountEntities,
3433
};
3534
});
3635

@@ -80,8 +79,8 @@ describe('AssignedRolesTable', () => {
8079
data: accountRolesFactory.build(),
8180
});
8281

83-
queryMocks.useAccountEntities.mockReturnValue({
84-
data: makeResourcePage(mockEntities),
82+
queryMocks.useAllAccountEntities.mockReturnValue({
83+
data: mockEntities,
8584
});
8685

8786
renderWithTheme(<AssignedRolesTable />);
@@ -108,8 +107,8 @@ describe('AssignedRolesTable', () => {
108107
data: accountRolesFactory.build(),
109108
});
110109

111-
queryMocks.useAccountEntities.mockReturnValue({
112-
data: makeResourcePage(mockEntities),
110+
queryMocks.useAllAccountEntities.mockReturnValue({
111+
data: mockEntities,
113112
});
114113

115114
renderWithTheme(<AssignedRolesTable />);
@@ -131,8 +130,8 @@ describe('AssignedRolesTable', () => {
131130
data: accountRolesFactory.build(),
132131
});
133132

134-
queryMocks.useAccountEntities.mockReturnValue({
135-
data: makeResourcePage(mockEntities),
133+
queryMocks.useAllAccountEntities.mockReturnValue({
134+
data: mockEntities,
136135
});
137136

138137
renderWithTheme(<AssignedRolesTable />);
@@ -154,8 +153,8 @@ describe('AssignedRolesTable', () => {
154153
data: accountRolesFactory.build(),
155154
});
156155

157-
queryMocks.useAccountEntities.mockReturnValue({
158-
data: makeResourcePage(mockEntities),
156+
queryMocks.useAllAccountEntities.mockReturnValue({
157+
data: mockEntities,
159158
});
160159

161160
renderWithTheme(<AssignedRolesTable />);

packages/manager/src/features/IAM/Shared/AssignedRolesTable/AssignedRolesTable.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { TableRow } from 'src/components/TableRow';
1515
import { TableRowEmpty } from 'src/components/TableRowEmpty/TableRowEmpty';
1616
import { TableSortCell } from 'src/components/TableSortCell/TableSortCell';
1717
import { usePaginationV2 } from 'src/hooks/usePaginationV2';
18-
import { useAccountEntities } from 'src/queries/entities/entities';
18+
import { useAllAccountEntities } from 'src/queries/entities/entities';
1919

2020
import { usePermissions } from '../../hooks/usePermissions';
2121
import { AssignedEntities } from '../../Users/UserRoles/AssignedEntities';
@@ -135,11 +135,13 @@ export const AssignedRolesTable = () => {
135135

136136
const { data: accountRoles, isLoading: accountPermissionsLoading } =
137137
useAccountRoles();
138-
const { data: entities, isLoading: entitiesLoading } = useAccountEntities();
138+
const { data: entities, isLoading: entitiesLoading } = useAllAccountEntities(
139+
{}
140+
);
141+
139142
const { data: assignedRoles, isLoading: assignedRolesLoading } = useUserRoles(
140143
username ?? ''
141144
);
142-
143145
const { filterableOptions, roles } = React.useMemo(() => {
144146
if (!assignedRoles || !accountRoles) {
145147
return { filterableOptions: [], roles: [] };
@@ -154,7 +156,7 @@ export const AssignedRolesTable = () => {
154156
];
155157

156158
if (entities) {
157-
const transformedEntities = groupAccountEntitiesByType(entities.data);
159+
const transformedEntities = groupAccountEntitiesByType(entities);
158160

159161
roles = addEntitiesNamesToRoles(roles, transformedEntities);
160162
}

packages/manager/src/features/IAM/Shared/AssignedRolesTable/UpdateEntitiesDrawer.test.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ import userEvent from '@testing-library/user-event';
33
import React from 'react';
44

55
import { accountEntityFactory } from 'src/factories/accountEntities';
6-
import { makeResourcePage } from 'src/mocks/serverHandlers';
76
import { renderWithTheme } from 'src/utilities/testHelpers';
87

98
import { UpdateEntitiesDrawer } from './UpdateEntitiesDrawer';
109

1110
import type { ExtendedRoleView } from '../types';
1211

1312
const queryMocks = vi.hoisted(() => ({
14-
useAccountEntities: vi.fn().mockReturnValue({}),
13+
useAllAccountEntities: vi.fn().mockReturnValue({}),
1514
useParams: vi.fn().mockReturnValue({}),
1615
useAccountRoles: vi.fn().mockReturnValue({}),
1716
useUserRoles: vi.fn().mockReturnValue({}),
@@ -51,7 +50,7 @@ vi.mock('src/queries/entities/entities', async () => {
5150
const actual = await vi.importActual('src/queries/entities/entities');
5251
return {
5352
...actual,
54-
useAccountEntities: queryMocks.useAccountEntities,
53+
useAllAccountEntities: queryMocks.useAllAccountEntities,
5554
};
5655
});
5756

@@ -113,8 +112,8 @@ describe('UpdateEntitiesDrawer', () => {
113112
});
114113

115114
it('should allow updating entities', async () => {
116-
queryMocks.useAccountEntities.mockReturnValue({
117-
data: makeResourcePage(mockEntities),
115+
queryMocks.useAllAccountEntities.mockReturnValue({
116+
data: mockEntities,
118117
});
119118
queryMocks.useUserRoles.mockReturnValue({
120119
data: {

packages/manager/src/features/IAM/Shared/Entities/Entities.test.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,21 @@ import userEvent from '@testing-library/user-event';
33
import React from 'react';
44

55
import { accountEntityFactory } from 'src/factories/accountEntities';
6-
import { makeResourcePage } from 'src/mocks/serverHandlers';
76
import { renderWithTheme } from 'src/utilities/testHelpers';
87

98
import { Entities } from './Entities';
109

1110
import type { EntitiesOption } from '../types';
1211

1312
const queryMocks = vi.hoisted(() => ({
14-
useAccountEntities: vi.fn().mockReturnValue({}),
13+
useAllAccountEntities: vi.fn().mockReturnValue({}),
1514
}));
1615

1716
vi.mock('src/queries/entities/entities', async () => {
1817
const actual = await vi.importActual('src/queries/entities/entities');
1918
return {
2019
...actual,
21-
useAccountEntities: queryMocks.useAccountEntities,
20+
useAllAccountEntities: queryMocks.useAllAccountEntities,
2221
};
2322
});
2423

@@ -82,8 +81,8 @@ describe('Entities', () => {
8281
});
8382

8483
it('renders correct data when it is an entity access', () => {
85-
queryMocks.useAccountEntities.mockReturnValue({
86-
data: makeResourcePage(mockEntities),
84+
queryMocks.useAllAccountEntities.mockReturnValue({
85+
data: mockEntities,
8786
});
8887

8988
renderWithTheme(
@@ -108,8 +107,8 @@ describe('Entities', () => {
108107
});
109108

110109
it('renders correct data when it is an entity access', () => {
111-
queryMocks.useAccountEntities.mockReturnValue({
112-
data: makeResourcePage(mockEntities),
110+
queryMocks.useAllAccountEntities.mockReturnValue({
111+
data: mockEntities,
113112
});
114113

115114
renderWithTheme(
@@ -134,8 +133,8 @@ describe('Entities', () => {
134133
});
135134

136135
it('renders correct options in Autocomplete dropdown when it is an entity access', async () => {
137-
queryMocks.useAccountEntities.mockReturnValue({
138-
data: makeResourcePage(mockEntities),
136+
queryMocks.useAllAccountEntities.mockReturnValue({
137+
data: mockEntities,
139138
});
140139

141140
renderWithTheme(
@@ -156,8 +155,8 @@ describe('Entities', () => {
156155
});
157156

158157
it('updates selected options when Autocomplete value changes when it is an entity access', async () => {
159-
queryMocks.useAccountEntities.mockReturnValue({
160-
data: makeResourcePage(mockEntities),
158+
queryMocks.useAllAccountEntities.mockReturnValue({
159+
data: mockEntities,
161160
});
162161

163162
renderWithTheme(

packages/manager/src/features/IAM/Shared/Entities/Entities.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import React from 'react';
44

55
import { FormLabel } from 'src/components/FormLabel';
66
import { Link } from 'src/components/Link';
7-
import { useAccountEntities } from 'src/queries/entities/entities';
7+
import { useAllAccountEntities } from 'src/queries/entities/entities';
88

99
import { getFormattedEntityType } from '../utilities';
1010
import {
@@ -34,14 +34,15 @@ export const Entities = ({
3434
type,
3535
value,
3636
}: Props) => {
37-
const { data: entities } = useAccountEntities();
37+
const { data: entities } = useAllAccountEntities({});
3838
const theme = useTheme();
3939

4040
const memoizedEntities = React.useMemo(() => {
4141
if (access !== 'entity_access' || !entities) {
4242
return [];
4343
}
44-
const typeEntities = getEntitiesByType(type, entities.data);
44+
const typeEntities = getEntitiesByType(type, entities);
45+
4546
return typeEntities ? mapEntitiesToOptions(typeEntities) : [];
4647
}, [entities, access, type]);
4748

packages/manager/src/features/IAM/Users/UserEntities/AssignedEntitiesTable.test.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import React from 'react';
44

55
import { accountEntityFactory } from 'src/factories/accountEntities';
66
import { userRolesFactory } from 'src/factories/userRoles';
7-
import { makeResourcePage } from 'src/mocks/serverHandlers';
87
import { renderWithTheme } from 'src/utilities/testHelpers';
98

109
import { AssignedEntitiesTable } from '../../Users/UserEntities/AssignedEntitiesTable';
1110

1211
const queryMocks = vi.hoisted(() => ({
13-
useAccountEntities: vi.fn().mockReturnValue({}),
12+
useAllAccountEntities: vi.fn().mockReturnValue({}),
1413
useParams: vi.fn().mockReturnValue({}),
1514
useSearch: vi.fn().mockReturnValue({}),
1615
useUserRoles: vi.fn().mockReturnValue({}),
@@ -28,7 +27,7 @@ vi.mock('src/queries/entities/entities', async () => {
2827
const actual = await vi.importActual('src/queries/entities/entities');
2928
return {
3029
...actual,
31-
useAccountEntities: queryMocks.useAccountEntities,
30+
useAllAccountEntities: queryMocks.useAllAccountEntities,
3231
};
3332
});
3433

@@ -74,8 +73,8 @@ describe('AssignedEntitiesTable', () => {
7473
data: userRolesFactory.build(),
7574
});
7675

77-
queryMocks.useAccountEntities.mockReturnValue({
78-
data: makeResourcePage(mockEntities),
76+
queryMocks.useAllAccountEntities.mockReturnValue({
77+
data: mockEntities,
7978
});
8079

8180
renderWithTheme(<AssignedEntitiesTable />);
@@ -99,8 +98,8 @@ describe('AssignedEntitiesTable', () => {
9998
data: userRolesFactory.build(),
10099
});
101100

102-
queryMocks.useAccountEntities.mockReturnValue({
103-
data: makeResourcePage(mockEntities),
101+
queryMocks.useAllAccountEntities.mockReturnValue({
102+
data: mockEntities,
104103
});
105104

106105
renderWithTheme(<AssignedEntitiesTable />);
@@ -118,8 +117,8 @@ describe('AssignedEntitiesTable', () => {
118117
data: userRolesFactory.build(),
119118
});
120119

121-
queryMocks.useAccountEntities.mockReturnValue({
122-
data: makeResourcePage(mockEntities),
120+
queryMocks.useAllAccountEntities.mockReturnValue({
121+
data: mockEntities,
123122
});
124123

125124
renderWithTheme(<AssignedEntitiesTable />);
@@ -137,8 +136,8 @@ describe('AssignedEntitiesTable', () => {
137136
data: userRolesFactory.build(),
138137
});
139138

140-
queryMocks.useAccountEntities.mockReturnValue({
141-
data: makeResourcePage(mockEntities),
139+
queryMocks.useAllAccountEntities.mockReturnValue({
140+
data: mockEntities,
142141
});
143142

144143
renderWithTheme(<AssignedEntitiesTable />);

packages/manager/src/features/IAM/Users/UserEntities/AssignedEntitiesTable.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { TableRowError } from 'src/components/TableRowError/TableRowError';
1818
import { TableRowLoading } from 'src/components/TableRowLoading/TableRowLoading';
1919
import { TableSortCell } from 'src/components/TableSortCell';
2020
import { usePaginationV2 } from 'src/hooks/usePaginationV2';
21-
import { useAccountEntities } from 'src/queries/entities/entities';
21+
import { useAllAccountEntities } from 'src/queries/entities/entities';
2222

2323
import { usePermissions } from '../../hooks/usePermissions';
2424
import { ENTITIES_TABLE_PREFERENCE_KEY } from '../../Shared/constants';
@@ -90,7 +90,7 @@ export const AssignedEntitiesTable = () => {
9090
data: entities,
9191
error: entitiesError,
9292
isLoading: entitiesLoading,
93-
} = useAccountEntities();
93+
} = useAllAccountEntities({});
9494

9595
const {
9696
data: assignedRoles,
@@ -102,7 +102,7 @@ export const AssignedEntitiesTable = () => {
102102
if (!assignedRoles || !entities) {
103103
return { filterableOptions: [], roles: [] };
104104
}
105-
const transformedEntities = groupAccountEntitiesByType(entities.data);
105+
const transformedEntities = groupAccountEntitiesByType(entities);
106106

107107
const roles = addEntityNamesToRoles(assignedRoles, transformedEntities);
108108

0 commit comments

Comments
 (0)