@webiny/app-admin 6.1.0 → 6.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base/Admin.js +2 -0
- package/base/Admin.js.map +1 -1
- package/base/Base/DefaultFieldRenderers.d.ts +2 -0
- package/base/Base/DefaultFieldRenderers.js +15 -0
- package/base/Base/DefaultFieldRenderers.js.map +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/SelectRenderer.js +24 -0
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/TextRenderer.js +21 -0
- package/base/Base/FieldRenderers/TextRenderer.js.map +1 -0
- package/base/Base/Menus.js +7 -0
- package/base/Base/Menus.js.map +1 -1
- package/base/Base.js +2 -1
- package/base/Base.js.map +1 -1
- package/base/createRootContainer.js +2 -0
- package/base/createRootContainer.js.map +1 -1
- package/components/Dialogs/DialogParamsContext.d.ts +6 -0
- package/components/Dialogs/DialogParamsContext.js +11 -0
- package/components/Dialogs/DialogParamsContext.js.map +1 -0
- package/components/Dialogs/DialogsContext.d.ts +2 -0
- package/components/Dialogs/DialogsContext.js +32 -4
- package/components/Dialogs/DialogsContext.js.map +1 -1
- package/components/OptionsMenu/OptionsMenu.d.ts +6 -0
- package/components/OptionsMenu/OptionsMenu.js +3 -3
- package/components/OptionsMenu/OptionsMenu.js.map +1 -1
- package/components/RegisterFeature.js +5 -5
- package/components/RegisterFeature.js.map +1 -1
- package/components/Wcp.d.ts +2 -0
- package/components/Wcp.js +7 -0
- package/components/Wcp.js.map +1 -1
- package/config/AdminConfig/Dialog.d.ts +10 -0
- package/config/AdminConfig/Dialog.js +21 -0
- package/config/AdminConfig/Dialog.js.map +1 -0
- package/config/AdminConfig/FieldRenderer.d.ts +11 -0
- package/config/AdminConfig/FieldRenderer.js +21 -0
- package/config/AdminConfig/FieldRenderer.js.map +1 -0
- package/config/AdminConfig/Form.d.ts +3 -0
- package/config/AdminConfig/Form.js +6 -0
- package/config/AdminConfig/Form.js.map +1 -0
- package/config/AdminConfig.d.ts +10 -0
- package/config/AdminConfig.js +7 -1
- package/config/AdminConfig.js.map +1 -1
- package/exports/admin/security.d.ts +6 -0
- package/exports/admin/security.js +5 -0
- package/exports/admin/security.js.map +1 -1
- package/exports/admin/ui.d.ts +2 -0
- package/exports/admin/ui.js +2 -0
- package/exports/admin/ui.js.map +1 -1
- package/exports/admin.d.ts +0 -3
- package/exports/admin.js +0 -3
- package/exports/admin.js.map +1 -1
- package/features/formModel/Field.d.ts +52 -0
- package/features/formModel/Field.js +201 -0
- package/features/formModel/Field.js.map +1 -0
- package/features/formModel/FieldBuilder.d.ts +45 -0
- package/features/formModel/FieldBuilder.js +158 -0
- package/features/formModel/FieldBuilder.js.map +1 -0
- package/features/formModel/FieldBuilder.test.js +106 -0
- package/features/formModel/FieldBuilder.test.js.map +1 -0
- package/features/formModel/FormModel.d.ts +61 -0
- package/features/formModel/FormModel.js +573 -0
- package/features/formModel/FormModel.js.map +1 -0
- package/features/formModel/FormModel.test.d.ts +1 -0
- package/features/formModel/FormModel.test.js +1140 -0
- package/features/formModel/FormModel.test.js.map +1 -0
- package/features/formModel/FormModelFactory.d.ts +9 -0
- package/features/formModel/FormModelFactory.js +13 -0
- package/features/formModel/FormModelFactory.js.map +1 -0
- package/features/formModel/FormView.d.ts +23 -0
- package/features/formModel/FormView.js +138 -0
- package/features/formModel/FormView.js.map +1 -0
- package/features/formModel/abstractions.d.ts +286 -0
- package/features/formModel/abstractions.js +54 -0
- package/features/formModel/abstractions.js.map +1 -0
- package/features/formModel/feature.d.ts +3 -0
- package/features/formModel/feature.js +16 -0
- package/features/formModel/feature.js.map +1 -0
- package/features/formModel/index.d.ts +10 -0
- package/features/formModel/index.js +14 -0
- package/features/formModel/index.js.map +1 -0
- package/features/formModel/useFieldRenderers.d.ts +2 -0
- package/features/formModel/useFieldRenderers.js +19 -0
- package/features/formModel/useFieldRenderers.js.map +1 -0
- package/features/security/LogIn/LogInGateway.d.ts +2 -2
- package/features/security/LogIn/LogInGateway.js +2 -2
- package/features/security/LogIn/LogInGateway.js.map +1 -1
- package/features/wcp/WcpGateway.d.ts +2 -2
- package/features/wcp/WcpGateway.js +2 -2
- package/features/wcp/WcpGateway.js.map +1 -1
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +1 -0
- package/hooks/index.js.map +1 -1
- package/hooks/useDialog.d.ts +9 -29
- package/hooks/useDialog.js +16 -24
- package/hooks/useDialog.js.map +1 -1
- package/hooks/useOpenDialog.d.ts +7 -0
- package/hooks/useOpenDialog.js +18 -0
- package/hooks/useOpenDialog.js.map +1 -0
- package/index.d.ts +5 -0
- package/index.js +5 -0
- package/index.js.map +1 -1
- package/package.json +30 -30
- package/permissions/createHasPermission.d.ts +3 -2
- package/permissions/createHasPermission.js +4 -8
- package/permissions/createHasPermission.js.map +1 -1
- package/permissions/createPermissions.d.ts +6 -0
- package/permissions/createPermissions.js +201 -0
- package/permissions/createPermissions.js.map +1 -0
- package/permissions/createPermissions.test.d.ts +1 -0
- package/permissions/createPermissions.test.js +177 -0
- package/permissions/createPermissions.test.js.map +1 -0
- package/permissions/index.d.ts +1 -0
- package/permissions/index.js +1 -0
- package/permissions/index.js.map +1 -1
- package/permissions/types.d.ts +5 -0
- package/permissions/types.js.map +1 -1
- package/permissions/usePermissions.d.ts +2 -1
- package/permissions/usePermissions.js +4 -175
- package/permissions/usePermissions.js.map +1 -1
- package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.d.ts +2 -2
- package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js +2 -2
- package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js.map +1 -1
- package/permissions/createHasPermission.test.js +0 -206
- package/permissions/createHasPermission.test.js.map +0 -1
- /package/{permissions/createHasPermission.test.d.ts → features/formModel/FieldBuilder.test.d.ts} +0 -0
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { render, screen, cleanup } from "@testing-library/react";
|
|
4
|
-
import { createHasPermission } from "./createHasPermission.js";
|
|
5
|
-
import { createPermissionSchema } from "./createPermissionSchema.js";
|
|
6
|
-
import { Identity } from "../domain/Identity.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Mutable ref updated before each test so the mock always reflects the current identity.
|
|
10
|
-
* Using a ref (not a plain variable) keeps the mock factory closure stable across tests.
|
|
11
|
-
*/
|
|
12
|
-
const identityRef = {
|
|
13
|
-
current: Identity.createAnonymous()
|
|
14
|
-
};
|
|
15
|
-
vi.mock("~/presentation/security/hooks/useIdentity.js", () => ({
|
|
16
|
-
useIdentity: () => ({
|
|
17
|
-
identity: identityRef.current,
|
|
18
|
-
isAuthenticated: true
|
|
19
|
-
})
|
|
20
|
-
}));
|
|
21
|
-
const TEST_SCHEMA = createPermissionSchema({
|
|
22
|
-
prefix: "test",
|
|
23
|
-
fullAccess: true,
|
|
24
|
-
entities: [{
|
|
25
|
-
id: "page",
|
|
26
|
-
title: "Page",
|
|
27
|
-
permission: "test.page",
|
|
28
|
-
scopes: ["full"],
|
|
29
|
-
actions: [{
|
|
30
|
-
name: "rwd"
|
|
31
|
-
}, {
|
|
32
|
-
name: "pw"
|
|
33
|
-
}]
|
|
34
|
-
}]
|
|
35
|
-
});
|
|
36
|
-
const HasPermission = createHasPermission(TEST_SCHEMA);
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Each call increments the counter so every test gets a fresh identity id,
|
|
40
|
-
* avoiding hits on the module-level permission cache in usePermissions.ts.
|
|
41
|
-
*/
|
|
42
|
-
let idCounter = 0;
|
|
43
|
-
function makeIdentity(permissions) {
|
|
44
|
-
return Identity.createAuthenticated({
|
|
45
|
-
id: `test-identity-${++idCounter}`,
|
|
46
|
-
displayName: "Test User",
|
|
47
|
-
type: "admin",
|
|
48
|
-
roles: [],
|
|
49
|
-
teams: [],
|
|
50
|
-
permissions,
|
|
51
|
-
profile: {
|
|
52
|
-
external: false
|
|
53
|
-
},
|
|
54
|
-
currentTenant: {
|
|
55
|
-
id: "root",
|
|
56
|
-
name: "Root"
|
|
57
|
-
},
|
|
58
|
-
defaultTenant: {
|
|
59
|
-
id: "root",
|
|
60
|
-
name: "Root"
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
const CHILD_TEXT = "protected content";
|
|
65
|
-
const withPermissions = (permissions, jsx) => {
|
|
66
|
-
identityRef.current = makeIdentity(permissions);
|
|
67
|
-
return render(jsx);
|
|
68
|
-
};
|
|
69
|
-
afterEach(() => {
|
|
70
|
-
cleanup();
|
|
71
|
-
});
|
|
72
|
-
describe("createHasPermission", () => {
|
|
73
|
-
describe("single action", () => {
|
|
74
|
-
it("renders children when the user has the required action", () => {
|
|
75
|
-
withPermissions([{
|
|
76
|
-
name: "test.page",
|
|
77
|
-
pw: "p"
|
|
78
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
79
|
-
entity: "page",
|
|
80
|
-
action: "publish"
|
|
81
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
82
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
83
|
-
});
|
|
84
|
-
it("renders nothing when the user lacks the required action", () => {
|
|
85
|
-
withPermissions([{
|
|
86
|
-
name: "test.page",
|
|
87
|
-
pw: "u"
|
|
88
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
89
|
-
entity: "page",
|
|
90
|
-
action: "publish"
|
|
91
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
92
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
93
|
-
});
|
|
94
|
-
it("renders nothing when the user has no permissions at all", () => {
|
|
95
|
-
withPermissions([], /*#__PURE__*/React.createElement(HasPermission, {
|
|
96
|
-
entity: "page",
|
|
97
|
-
action: "publish"
|
|
98
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
99
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe("someActions (OR semantics)", () => {
|
|
103
|
-
it("renders children when the user has all actions in the array", () => {
|
|
104
|
-
withPermissions([{
|
|
105
|
-
name: "test.page",
|
|
106
|
-
pw: "pu"
|
|
107
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
108
|
-
entity: "page",
|
|
109
|
-
someActions: ["publish", "unpublish"]
|
|
110
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
111
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
112
|
-
});
|
|
113
|
-
it("renders children when the user has only one of the actions", () => {
|
|
114
|
-
withPermissions([{
|
|
115
|
-
name: "test.page",
|
|
116
|
-
pw: "p"
|
|
117
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
118
|
-
entity: "page",
|
|
119
|
-
someActions: ["publish", "unpublish"]
|
|
120
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
121
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
122
|
-
});
|
|
123
|
-
it("renders children when only the last action in the array is allowed", () => {
|
|
124
|
-
withPermissions([{
|
|
125
|
-
name: "test.page",
|
|
126
|
-
rwd: "rw"
|
|
127
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
128
|
-
entity: "page",
|
|
129
|
-
someActions: ["publish", "unpublish", "edit"]
|
|
130
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
131
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
132
|
-
});
|
|
133
|
-
it("renders nothing when the user has none of the actions", () => {
|
|
134
|
-
withPermissions([{
|
|
135
|
-
name: "test.page",
|
|
136
|
-
rwd: "r"
|
|
137
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
138
|
-
entity: "page",
|
|
139
|
-
someActions: ["publish", "unpublish"]
|
|
140
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
141
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
describe("allActions (AND semantics)", () => {
|
|
145
|
-
it("renders children when the user has all actions in the array", () => {
|
|
146
|
-
withPermissions([{
|
|
147
|
-
name: "test.page",
|
|
148
|
-
pw: "pu"
|
|
149
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
150
|
-
entity: "page",
|
|
151
|
-
allActions: ["publish", "unpublish"]
|
|
152
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
153
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
154
|
-
});
|
|
155
|
-
it("renders nothing when the user has only one of the required actions", () => {
|
|
156
|
-
withPermissions([{
|
|
157
|
-
name: "test.page",
|
|
158
|
-
pw: "p"
|
|
159
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
160
|
-
entity: "page",
|
|
161
|
-
allActions: ["publish", "unpublish"]
|
|
162
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
163
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
164
|
-
});
|
|
165
|
-
it("renders nothing when the user has none of the required actions", () => {
|
|
166
|
-
withPermissions([{
|
|
167
|
-
name: "test.page",
|
|
168
|
-
rwd: "r"
|
|
169
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
170
|
-
entity: "page",
|
|
171
|
-
allActions: ["publish", "unpublish"]
|
|
172
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
173
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
describe("no action (entity access only)", () => {
|
|
177
|
-
it("renders children when the user has any permission for the entity", () => {
|
|
178
|
-
withPermissions([{
|
|
179
|
-
name: "test.page",
|
|
180
|
-
rwd: "r"
|
|
181
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
182
|
-
entity: "page"
|
|
183
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
184
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
185
|
-
});
|
|
186
|
-
it("renders nothing when the user has no permission for the entity", () => {
|
|
187
|
-
withPermissions([], /*#__PURE__*/React.createElement(HasPermission, {
|
|
188
|
-
entity: "page"
|
|
189
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
190
|
-
expect(screen.queryByText(CHILD_TEXT)).toBeNull();
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
describe("full access", () => {
|
|
194
|
-
it("renders children regardless of the action when the user has full access", () => {
|
|
195
|
-
withPermissions([{
|
|
196
|
-
name: "test.*"
|
|
197
|
-
}], /*#__PURE__*/React.createElement(HasPermission, {
|
|
198
|
-
entity: "page",
|
|
199
|
-
allActions: ["publish", "unpublish"]
|
|
200
|
-
}, /*#__PURE__*/React.createElement("span", null, CHILD_TEXT)));
|
|
201
|
-
expect(screen.getByText(CHILD_TEXT)).toBeTruthy();
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
//# sourceMappingURL=createHasPermission.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["describe","it","expect","vi","afterEach","React","render","screen","cleanup","createHasPermission","createPermissionSchema","Identity","identityRef","current","createAnonymous","mock","useIdentity","identity","isAuthenticated","TEST_SCHEMA","prefix","fullAccess","entities","id","title","permission","scopes","actions","name","HasPermission","idCounter","makeIdentity","permissions","createAuthenticated","displayName","type","roles","teams","profile","external","currentTenant","defaultTenant","CHILD_TEXT","withPermissions","jsx","pw","createElement","entity","action","getByText","toBeTruthy","queryByText","toBeNull","someActions","rwd","allActions"],"sources":["createHasPermission.test.tsx"],"sourcesContent":["import { describe, it, expect, vi, afterEach } from \"vitest\";\nimport React from \"react\";\nimport { render, screen, cleanup } from \"@testing-library/react\";\nimport { createHasPermission } from \"./createHasPermission.js\";\nimport { createPermissionSchema } from \"./createPermissionSchema.js\";\nimport { Identity } from \"~/domain/Identity.js\";\n\n/**\n * Mutable ref updated before each test so the mock always reflects the current identity.\n * Using a ref (not a plain variable) keeps the mock factory closure stable across tests.\n */\nconst identityRef = { current: Identity.createAnonymous() };\n\nvi.mock(\"~/presentation/security/hooks/useIdentity.js\", () => ({\n useIdentity: () => ({ identity: identityRef.current, isAuthenticated: true })\n}));\n\nconst TEST_SCHEMA = createPermissionSchema({\n prefix: \"test\",\n fullAccess: true,\n entities: [\n {\n id: \"page\",\n title: \"Page\",\n permission: \"test.page\",\n scopes: [\"full\"],\n actions: [{ name: \"rwd\" }, { name: \"pw\" }]\n }\n ]\n} as const);\n\nconst HasPermission = createHasPermission(TEST_SCHEMA);\n\n/**\n * Each call increments the counter so every test gets a fresh identity id,\n * avoiding hits on the module-level permission cache in usePermissions.ts.\n */\nlet idCounter = 0;\n\nfunction makeIdentity(permissions: Array<{ name: string; [key: string]: any }>) {\n return Identity.createAuthenticated({\n id: `test-identity-${++idCounter}`,\n displayName: \"Test User\",\n type: \"admin\",\n roles: [],\n teams: [],\n permissions,\n profile: { external: false },\n currentTenant: { id: \"root\", name: \"Root\" },\n defaultTenant: { id: \"root\", name: \"Root\" }\n });\n}\n\nconst CHILD_TEXT = \"protected content\";\n\nconst withPermissions = (\n permissions: Array<{ name: string; [key: string]: any }>,\n jsx: React.ReactElement\n) => {\n identityRef.current = makeIdentity(permissions);\n return render(jsx);\n};\n\nafterEach(() => {\n cleanup();\n});\n\ndescribe(\"createHasPermission\", () => {\n describe(\"single action\", () => {\n it(\"renders children when the user has the required action\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"p\" }],\n <HasPermission entity={\"page\"} action={\"publish\"}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders nothing when the user lacks the required action\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"u\" }],\n <HasPermission entity={\"page\"} action={\"publish\"}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n\n it(\"renders nothing when the user has no permissions at all\", () => {\n withPermissions(\n [],\n <HasPermission entity={\"page\"} action={\"publish\"}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n });\n\n describe(\"someActions (OR semantics)\", () => {\n it(\"renders children when the user has all actions in the array\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"pu\" }],\n <HasPermission entity={\"page\"} someActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders children when the user has only one of the actions\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"p\" }],\n <HasPermission entity={\"page\"} someActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders children when only the last action in the array is allowed\", () => {\n withPermissions(\n [{ name: \"test.page\", rwd: \"rw\" }],\n <HasPermission entity={\"page\"} someActions={[\"publish\", \"unpublish\", \"edit\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders nothing when the user has none of the actions\", () => {\n withPermissions(\n [{ name: \"test.page\", rwd: \"r\" }],\n <HasPermission entity={\"page\"} someActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n });\n\n describe(\"allActions (AND semantics)\", () => {\n it(\"renders children when the user has all actions in the array\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"pu\" }],\n <HasPermission entity={\"page\"} allActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders nothing when the user has only one of the required actions\", () => {\n withPermissions(\n [{ name: \"test.page\", pw: \"p\" }],\n <HasPermission entity={\"page\"} allActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n\n it(\"renders nothing when the user has none of the required actions\", () => {\n withPermissions(\n [{ name: \"test.page\", rwd: \"r\" }],\n <HasPermission entity={\"page\"} allActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n });\n\n describe(\"no action (entity access only)\", () => {\n it(\"renders children when the user has any permission for the entity\", () => {\n withPermissions(\n [{ name: \"test.page\", rwd: \"r\" }],\n <HasPermission entity={\"page\"}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n\n it(\"renders nothing when the user has no permission for the entity\", () => {\n withPermissions(\n [],\n <HasPermission entity={\"page\"}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.queryByText(CHILD_TEXT)).toBeNull();\n });\n });\n\n describe(\"full access\", () => {\n it(\"renders children regardless of the action when the user has full access\", () => {\n withPermissions(\n [{ name: \"test.*\" }],\n <HasPermission entity={\"page\"} allActions={[\"publish\", \"unpublish\"]}>\n <span>{CHILD_TEXT}</span>\n </HasPermission>\n );\n expect(screen.getByText(CHILD_TEXT)).toBeTruthy();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
/package/{permissions/createHasPermission.test.d.ts → features/formModel/FieldBuilder.test.d.ts}
RENAMED
|
File without changes
|