graphdb-workbench-tests 2.6.0-TR4 → 2.6.0-TR6
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/fixtures/locale-en.json +31 -7
- package/integration/setup/aclmanagement/create-rule.spec.js +87 -10
- package/integration/setup/aclmanagement/delete-rule.spec.js +4 -2
- package/integration/setup/aclmanagement/edit-rule.spec.js +12 -7
- package/integration/setup/aclmanagement/render-rules.spec.js +4 -2
- package/integration/setup/aclmanagement/reorder-rules.spec.js +5 -3
- package/integration/setup/aclmanagement/revert-rules.spec.js +4 -3
- package/integration/setup/aclmanagement/scopes.spec.js +220 -0
- package/integration/setup/aclmanagement/update-rules.spec.js +17 -9
- package/package.json +1 -1
- package/steps/application-steps.js +4 -0
- package/steps/setup/acl-management-steps.js +175 -29
- package/support/repository-commands.js +5 -5
package/fixtures/locale-en.json
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
"delete_cluster_tooltip": "Delete existing cluster",
|
|
6
6
|
"add_nodes_btn": "Add nodes",
|
|
7
7
|
"add_nodes_btn_tooltip": "Add nodes to existing cluster",
|
|
8
|
+
"replace_nodes_btn": "Replace nodes",
|
|
9
|
+
"replace_nodes_btn_tooltip": "Replace nodes in cluster",
|
|
8
10
|
"remove_nodes_btn": "Remove nodes",
|
|
9
11
|
"remove_nodes_btn_tooltip": "Remove nodes from existing cluster",
|
|
10
12
|
"edit_cluster": "Edit configuration",
|
|
@@ -72,6 +74,7 @@
|
|
|
72
74
|
"edit_page_title": "Edit cluster configuration",
|
|
73
75
|
"creating_cluster_loader": "Creating cluster...",
|
|
74
76
|
"add_nodes_loader": "Adding nodes to cluster...",
|
|
77
|
+
"replace_nodes_loader": "Replacing nodes in cluster...",
|
|
75
78
|
"remove_nodes_loader": "Removing nodes from cluster...",
|
|
76
79
|
"updating_cluster_loader": "Updating cluster...",
|
|
77
80
|
"cluster_nodes_list": "Cluster nodes list",
|
|
@@ -86,6 +89,7 @@
|
|
|
86
89
|
"only_positive_integers": "Enter only positive integers",
|
|
87
90
|
"small_transaction_log_max_size": "Transaction log maximum size must be at least 1 GB or a negative number",
|
|
88
91
|
"at_least_two_nodes": "Must have at least two nodes",
|
|
92
|
+
"cant_replace_majority_of_nodes": "Can't replace majority of cluster nodes",
|
|
89
93
|
"no_rpc_address": "Error retrieving RPC address: {{error}}",
|
|
90
94
|
"nodes_status_label": "Nodes status",
|
|
91
95
|
"preconditions_failed": {
|
|
@@ -106,6 +110,8 @@
|
|
|
106
110
|
"form_invalid": "The form data is invalid",
|
|
107
111
|
"add_nodes_success": "Nodes added successfully",
|
|
108
112
|
"add_nodes_fail": "Adding nodes failed",
|
|
113
|
+
"replace_nodes_success": "Nodes replaced successfully",
|
|
114
|
+
"replace_nodes_fail": "Replacing nodes failed",
|
|
109
115
|
"remove_nodes_success": "Nodes removed successfully",
|
|
110
116
|
"remove_nodes_fail": "Removing nodes failed"
|
|
111
117
|
}
|
|
@@ -122,6 +128,11 @@
|
|
|
122
128
|
"fail_delete": "Can not delete cluster"
|
|
123
129
|
}
|
|
124
130
|
},
|
|
131
|
+
"replace_nodes_dialog": {
|
|
132
|
+
"title": "Replace nodes in cluster",
|
|
133
|
+
"nodes_to_replace_label": "Nodes to add to cluster",
|
|
134
|
+
"cluster_nodes_list": "Select nodes to be removed from existing cluster"
|
|
135
|
+
},
|
|
125
136
|
"add_nodes_dialog": {
|
|
126
137
|
"title": "Add nodes to cluster",
|
|
127
138
|
"nodes_to_add_label": "Nodes to add to cluster"
|
|
@@ -133,21 +144,30 @@
|
|
|
133
144
|
},
|
|
134
145
|
"acl_management": {
|
|
135
146
|
"rulestable": {
|
|
147
|
+
"tab": {
|
|
148
|
+
"statement": "Statement",
|
|
149
|
+
"clear_graph": "Clear graph",
|
|
150
|
+
"plugin": "Plugin",
|
|
151
|
+
"system": "System"
|
|
152
|
+
},
|
|
136
153
|
"column": {
|
|
137
154
|
"index": "#",
|
|
155
|
+
"policy": "Policy",
|
|
156
|
+
"role": "Role",
|
|
157
|
+
"operation": "Operation",
|
|
138
158
|
"subject": "Subject",
|
|
139
159
|
"predicate": "Predicate",
|
|
140
160
|
"object": "Object",
|
|
141
161
|
"context": "Context",
|
|
142
|
-
"
|
|
143
|
-
"policy": "Policy"
|
|
162
|
+
"plugin": "Plugin"
|
|
144
163
|
},
|
|
145
164
|
"field_placeholders": {
|
|
146
165
|
"subject": "Subject",
|
|
147
166
|
"predicate": "Predicate",
|
|
148
167
|
"object": "Object",
|
|
149
168
|
"context": "Context",
|
|
150
|
-
"role": "
|
|
169
|
+
"role": "Custom role",
|
|
170
|
+
"plugin": "Plugin"
|
|
151
171
|
},
|
|
152
172
|
"actions": {
|
|
153
173
|
"move_up": "Move the rule up",
|
|
@@ -319,6 +339,7 @@
|
|
|
319
339
|
"new.sentence.start": "New",
|
|
320
340
|
"no.connectors.available": "No connectors available",
|
|
321
341
|
"current.repo.no.connector.support": "The current repository does not support any connectors. Please check the type of the repository or select another one.",
|
|
342
|
+
"edit.select.query": "Edit select query",
|
|
322
343
|
"edit.search.query": "Edit search query",
|
|
323
344
|
"edit.analogical.query": "Edit analogical query",
|
|
324
345
|
"current.repo.error": "The currently selected repository cannot be used for queries due to an error:",
|
|
@@ -1327,7 +1348,7 @@
|
|
|
1327
1348
|
"similarity.could.not.get.indexes.error": "Could not get indexes",
|
|
1328
1349
|
"similarity.empty.index.name.error": "Index name cannot be empty",
|
|
1329
1350
|
"similarity.index.name.constraint": "Index name can contain only letters (a-z, A-Z), numbers (0-9), \"-\" and \"_\"",
|
|
1330
|
-
"similarity.query.type.DATA.name": "
|
|
1351
|
+
"similarity.query.type.DATA.name": "Data",
|
|
1331
1352
|
"similarity.query.type.SEARCH.name": "Search",
|
|
1332
1353
|
"similarity.query.type.ANALOGICAL.name": "Analogical",
|
|
1333
1354
|
"similarity.error.query.empty": "The '{{queryType}}' query cannot be empty.",
|
|
@@ -1351,6 +1372,7 @@
|
|
|
1351
1372
|
"similarity.get.resource.error": "Could not get resource!",
|
|
1352
1373
|
"similarity.delete.index.warning": "Are you sure you want to delete the index '{{name}}'?",
|
|
1353
1374
|
"similarity.rebuild.index.warning": "Are you sure you want to rebuild the whole index '{{name}}'?<br>You will still be able to use the latest successful build!",
|
|
1375
|
+
"similarity.copy_of.prefix": "Copy_of",
|
|
1354
1376
|
"similarity.warning.unsaved.changes": "You have unsaved changes. Are you sure that you want to exit?",
|
|
1355
1377
|
"sparql.template.get.templates.error": "Could not get SPARQL templates",
|
|
1356
1378
|
"sparql.template.delete.template.warning": "Are you sure you want to delete the SPARQL template '{{templateID}}'?",
|
|
@@ -1362,11 +1384,11 @@
|
|
|
1362
1384
|
"update.sparql.template.success.msg": "Updated SPARQL template",
|
|
1363
1385
|
"save.sparql.template.failure.msg": "Could not save {{templateID}} template",
|
|
1364
1386
|
"sparql.template.query.constraint": "The template query must be an UPDATE query",
|
|
1387
|
+
"sparql.template.query.invalid": "Invalid query",
|
|
1365
1388
|
"save.sparql.template.success.msg": "Saved SPARQL template",
|
|
1366
1389
|
"attach.remote.gdb.instance": "Attach a remote GraphDB instance",
|
|
1367
1390
|
"remote.location.url": "Location URL*",
|
|
1368
1391
|
"remote.location.enter.url.msg": "Enter a URL to a remote GraphDB instance",
|
|
1369
|
-
"similarity.copy_of.prefix": "Copy_of",
|
|
1370
1392
|
"valid.remote.location.warning": "Note that the location should be a URL that points to a remote GraphDB installation, e.g.",
|
|
1371
1393
|
"auth.type.header": "Authentication type",
|
|
1372
1394
|
"remote.location.no.auth.used.tooltip": "No authentication used with remote location",
|
|
@@ -1464,7 +1486,6 @@
|
|
|
1464
1486
|
"index.building.interrupted.tooltip": "Index build interrupted.",
|
|
1465
1487
|
"index.obsolete.tooltip": "Index cannot be recovered. Please, rebuild.",
|
|
1466
1488
|
"edit.search.analogical.query.title": "Edit Search, Analogical queries",
|
|
1467
|
-
"edit.select.query": "Edit select query",
|
|
1468
1489
|
"edit.search.query.title": "Edit Search query",
|
|
1469
1490
|
"create.index.from.existing.tooltip": "Create index from existing one.",
|
|
1470
1491
|
"rebuild.index.tooltip": "Rebuild index",
|
|
@@ -1662,6 +1683,7 @@
|
|
|
1662
1683
|
"visual.config.search.box.starting.point": "Starting point - Search box",
|
|
1663
1684
|
"visual.config.query.results.starting.point": "Starting point - Query results",
|
|
1664
1685
|
"visual.config.fixed.resource.starting.point": "Starting point - Fixed resource",
|
|
1686
|
+
"visual.config.warning.unsaved.changes": "You have unsaved changes. Are you sure that you want to exit?",
|
|
1665
1687
|
"visual.edit.config": "Edit configuration",
|
|
1666
1688
|
"visual.delete.config": "Delete configuration",
|
|
1667
1689
|
"visual.saved.graphs": "Saved graphs",
|
|
@@ -1950,5 +1972,7 @@
|
|
|
1950
1972
|
"global.operations_statuses.IN_SYNC.title": "In sync",
|
|
1951
1973
|
"global.operations_statuses.RECOVERING.title": "Recovering",
|
|
1952
1974
|
"global.operations_statuses.OUT_OF_SYNC.title": "Out of sync",
|
|
1953
|
-
"global.operations_statuses.UNAVAILABLE_NODES.title": "Unavailable nodes"
|
|
1975
|
+
"global.operations_statuses.UNAVAILABLE_NODES.title": "Unavailable nodes",
|
|
1976
|
+
"view.sparql-editor.title": "Ontotext Yasgui SPARQL Query & Update",
|
|
1977
|
+
"view.sparql-editor.helpInfo": "The SPARQL Query & Update view is a unified editor for queries and updates. Enter any SPARQL query or update and click Run to execute it. The view also allows you to save queries for future retrieval and execution in the SPARQL editor."
|
|
1954
1978
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
-
import {
|
|
3
|
-
import {ToasterSteps} from "../../../steps/toaster-steps";
|
|
2
|
+
import {ACL_VIEW} from "../../../steps/setup/acl-management-steps";
|
|
4
3
|
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
5
4
|
|
|
6
5
|
describe('ACL Management: create rule', () => {
|
|
@@ -19,6 +18,7 @@ describe('ACL Management: create rule', () => {
|
|
|
19
18
|
cy.enableAutocomplete(repositoryId);
|
|
20
19
|
AclManagementSteps.importRules(repositoryId);
|
|
21
20
|
AclManagementSteps.visit();
|
|
21
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
22
22
|
// ensure rules are rendered
|
|
23
23
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
24
24
|
});
|
|
@@ -41,6 +41,9 @@ describe('ACL Management: create rule', () => {
|
|
|
41
41
|
it('Should add a new rule in the list', () => {
|
|
42
42
|
// When I add a new rule
|
|
43
43
|
AclManagementSteps.addRule(1);
|
|
44
|
+
// When I fill in the role field
|
|
45
|
+
AclManagementSteps.getRoleField(2).should('have.value', '');
|
|
46
|
+
AclManagementSteps.fillRole(2, 'ROLE1');
|
|
44
47
|
// Then I expect that the save rule button should be enabled because all fields have some default values
|
|
45
48
|
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
46
49
|
// When I fill in the subject field
|
|
@@ -63,30 +66,103 @@ describe('ACL Management: create rule', () => {
|
|
|
63
66
|
AclManagementSteps.fillContext(2, '*');
|
|
64
67
|
// Then I expect that the save rule button should be enabled
|
|
65
68
|
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
66
|
-
// When I fill in the role field
|
|
67
|
-
AclManagementSteps.getRoleField(2).should('have.value', 'CUSTOM_');
|
|
68
|
-
AclManagementSteps.fillRole(2, 'CUSTOM_ROLE1');
|
|
69
69
|
// Then I expect that the save rule button should be enabled
|
|
70
70
|
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
71
71
|
// When I change the policy
|
|
72
72
|
AclManagementSteps.selectPolicy(2, 'deny');
|
|
73
73
|
// Then I expect that the save rule button should be enabled
|
|
74
74
|
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
75
|
+
// When I change the operation
|
|
76
|
+
AclManagementSteps.selectOperation(2, 'write');
|
|
77
|
+
// Then I expect that the save rule button should be enabled
|
|
78
|
+
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
75
79
|
// When I save the rule
|
|
76
80
|
AclManagementSteps.saveRule(2);
|
|
77
81
|
// Then the rule should be saved
|
|
78
82
|
AclManagementSteps.getAclRules().should('have.length', 6);
|
|
79
83
|
const newRule = {
|
|
84
|
+
"scope": "statement",
|
|
85
|
+
"policy": "deny",
|
|
86
|
+
"role": "ROLE1",
|
|
80
87
|
"subject": "<urn:John>",
|
|
81
88
|
"predicate": "*",
|
|
82
89
|
"object": "*",
|
|
83
90
|
"context": "*",
|
|
84
|
-
"
|
|
85
|
-
"policy": "deny",
|
|
91
|
+
"operation": "write",
|
|
86
92
|
"moveUp": true,
|
|
87
93
|
"moveDown": true
|
|
88
94
|
};
|
|
89
|
-
AclManagementSteps.
|
|
95
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[0], ACL_VIEW[1], newRule, ACL_VIEW[2], ACL_VIEW[3], ACL_VIEW[4]]);
|
|
96
|
+
|
|
97
|
+
cy.intercept('PUT', '/rest/repositories/acl-management-*/acl').as('putCall');
|
|
98
|
+
// When I save the rules
|
|
99
|
+
AclManagementSteps.saveAcl();
|
|
100
|
+
// Then wait for the PUT call to occur and assert the request body
|
|
101
|
+
cy.wait('@putCall').then((interception) => {
|
|
102
|
+
const expected = [
|
|
103
|
+
{
|
|
104
|
+
"scope": "statement",
|
|
105
|
+
"policy": "allow",
|
|
106
|
+
"role": "!CUSTOM_ROLE2",
|
|
107
|
+
"operation": "write",
|
|
108
|
+
"subject": "<urn:Mary>",
|
|
109
|
+
"predicate": "*",
|
|
110
|
+
"object": "*",
|
|
111
|
+
"context": "*"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"scope": "statement",
|
|
115
|
+
"policy": "deny",
|
|
116
|
+
"role": "CUSTOM_ROLE1",
|
|
117
|
+
"operation": "read",
|
|
118
|
+
"subject": "*",
|
|
119
|
+
"predicate": "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>",
|
|
120
|
+
"object": "*",
|
|
121
|
+
"context": "*"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"scope": "statement",
|
|
125
|
+
"policy": "deny",
|
|
126
|
+
"role": "CUSTOM_ROLE1",
|
|
127
|
+
"operation": "write",
|
|
128
|
+
"subject": "<urn:John>",
|
|
129
|
+
"predicate": "*",
|
|
130
|
+
"object": "*",
|
|
131
|
+
"context": "*"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"scope": "statement",
|
|
135
|
+
"policy": "deny",
|
|
136
|
+
"role": "CUSTOM_ROLE3",
|
|
137
|
+
"operation": "read",
|
|
138
|
+
"subject": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
139
|
+
"predicate": "*",
|
|
140
|
+
"object": "\"test aber auf Deutsch\"@en",
|
|
141
|
+
"context": "<http://example.com/graph1>"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"scope": "statement",
|
|
145
|
+
"policy": "allow",
|
|
146
|
+
"role": "CUSTOM_ROLE3",
|
|
147
|
+
"operation": "write",
|
|
148
|
+
"subject": "*",
|
|
149
|
+
"predicate": "*",
|
|
150
|
+
"object": "\"15\"^^<http://www.w3.org/2001/XMLSchema#int>",
|
|
151
|
+
"context": "*"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"scope": "statement",
|
|
155
|
+
"policy": "deny",
|
|
156
|
+
"role": "CUSTOM_ROLE4",
|
|
157
|
+
"operation": "write",
|
|
158
|
+
"subject": "<urn:Cat>",
|
|
159
|
+
"predicate": "*",
|
|
160
|
+
"object": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
161
|
+
"context": "*"
|
|
162
|
+
}
|
|
163
|
+
];
|
|
164
|
+
expect(interception.request.body).to.deep.eq(expected);
|
|
165
|
+
});
|
|
90
166
|
});
|
|
91
167
|
|
|
92
168
|
it('Should hide all unnecessary actions during rule creation', () => {
|
|
@@ -110,12 +186,13 @@ describe('ACL Management: create rule', () => {
|
|
|
110
186
|
it('should not allow creating of a new rule if it is not unique', () => {
|
|
111
187
|
// When I am on "ACL Management" page and create a rule that exist,
|
|
112
188
|
AclManagementSteps.addRuleInBeginning();
|
|
189
|
+
AclManagementSteps.selectPolicy(0, 'allow');
|
|
190
|
+
AclManagementSteps.fillRole(0, '!ROLE2');
|
|
191
|
+
AclManagementSteps.selectOperation(0, 'write');
|
|
113
192
|
AclManagementSteps.fillSubject(0, '<urn:Mary>');
|
|
114
193
|
AclManagementSteps.fillPredicate(0, '*');
|
|
115
194
|
AclManagementSteps.fillObject(0, '*');
|
|
116
195
|
AclManagementSteps.fillContext(0, '*');
|
|
117
|
-
AclManagementSteps.fillRole(0, '!CUSTOM_ROLE2');
|
|
118
|
-
AclManagementSteps.selectPolicy(0, 'allow');
|
|
119
196
|
// and try to save it.
|
|
120
197
|
AclManagementSteps.saveRule(0);
|
|
121
198
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
-
import {
|
|
2
|
+
import {ACL_VIEW} from "../../../steps/setup/acl-management-steps";
|
|
3
3
|
import {ModalDialogSteps} from "../../../steps/modal-dialog-steps";
|
|
4
|
+
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
4
5
|
|
|
5
6
|
describe('ACL Management: delete rule', () => {
|
|
6
7
|
|
|
@@ -18,6 +19,7 @@ describe('ACL Management: delete rule', () => {
|
|
|
18
19
|
cy.enableAutocomplete(repositoryId);
|
|
19
20
|
AclManagementSteps.importRules(repositoryId);
|
|
20
21
|
AclManagementSteps.visit();
|
|
22
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
21
23
|
// ensure rules are rendered
|
|
22
24
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
23
25
|
});
|
|
@@ -41,6 +43,6 @@ describe('ACL Management: delete rule', () => {
|
|
|
41
43
|
// Then I expect the rule to be removed from the list
|
|
42
44
|
ModalDialogSteps.getDialog().should('not.exist');
|
|
43
45
|
AclManagementSteps.getAclRules().should('have.length', 4);
|
|
44
|
-
AclManagementSteps.
|
|
46
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[0], ACL_VIEW[1], ACL_VIEW[2], ACL_VIEW[3]]);
|
|
45
47
|
});
|
|
46
48
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
-
import {
|
|
2
|
+
import {ACL_VIEW} from "../../../steps/setup/acl-management-steps";
|
|
3
|
+
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
4
|
|
|
4
5
|
describe('ACL Management: edit rule', () => {
|
|
5
6
|
|
|
@@ -17,6 +18,7 @@ describe('ACL Management: edit rule', () => {
|
|
|
17
18
|
cy.enableAutocomplete(repositoryId);
|
|
18
19
|
AclManagementSteps.importRules(repositoryId);
|
|
19
20
|
AclManagementSteps.visit();
|
|
21
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
20
22
|
// ensure rules are rendered
|
|
21
23
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
22
24
|
});
|
|
@@ -50,7 +52,7 @@ describe('ACL Management: edit rule', () => {
|
|
|
50
52
|
predicate: '*',
|
|
51
53
|
object: '"test aber auf Deutsch"@en',
|
|
52
54
|
context: '<http://example.com/graph1>',
|
|
53
|
-
role: '
|
|
55
|
+
role: 'ROLE3',
|
|
54
56
|
policy: 'deny'
|
|
55
57
|
});
|
|
56
58
|
AclManagementSteps.checkIfRuleSavingIsAllowed(2);
|
|
@@ -58,7 +60,7 @@ describe('ACL Management: edit rule', () => {
|
|
|
58
60
|
AclManagementSteps.cancelRuleEditing(2);
|
|
59
61
|
// Then I expect that the rule will be opened in preview mode again with the same values
|
|
60
62
|
AclManagementSteps.getAclRules().should('have.length', 5);
|
|
61
|
-
AclManagementSteps.
|
|
63
|
+
AclManagementSteps.checkStatementRules(ACL_VIEW);
|
|
62
64
|
// When I edit the rule again
|
|
63
65
|
AclManagementSteps.editRule(2);
|
|
64
66
|
AclManagementSteps.fillSubject(2, '<urn:Me>');
|
|
@@ -68,18 +70,21 @@ describe('ACL Management: edit rule', () => {
|
|
|
68
70
|
AclManagementSteps.fillContext(2, '*');
|
|
69
71
|
AclManagementSteps.fillRole(2, 'TEST');
|
|
70
72
|
AclManagementSteps.selectPolicy(2, 'allow');
|
|
73
|
+
AclManagementSteps.selectOperation(2, 'write');
|
|
71
74
|
// And I save the rule
|
|
72
75
|
AclManagementSteps.saveRule(2);
|
|
73
76
|
// Then I expect the rule to be saved with the new data
|
|
74
77
|
const editedRule = {
|
|
78
|
+
scope: "statement",
|
|
79
|
+
policy: 'allow',
|
|
80
|
+
role: 'TEST',
|
|
81
|
+
operation: "write",
|
|
75
82
|
subject: '<urn:Me>',
|
|
76
83
|
predicate: '<http://www.w3.org/1999/02/22-rdf-syntax-ns#>',
|
|
77
84
|
object: '*',
|
|
78
|
-
context: '*'
|
|
79
|
-
role: 'TEST',
|
|
80
|
-
policy: 'allow'
|
|
85
|
+
context: '*'
|
|
81
86
|
};
|
|
82
|
-
AclManagementSteps.
|
|
87
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[0], ACL_VIEW[1], editedRule, ACL_VIEW[3], ACL_VIEW[4]]);
|
|
83
88
|
});
|
|
84
89
|
});
|
|
85
90
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
-
import {
|
|
2
|
+
import {ACL_VIEW} from "../../../steps/setup/acl-management-steps";
|
|
3
|
+
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
4
|
|
|
4
5
|
describe('ACL Management: render rules', () => {
|
|
5
6
|
|
|
@@ -16,6 +17,7 @@ describe('ACL Management: render rules', () => {
|
|
|
16
17
|
cy.presetRepository(repositoryId);
|
|
17
18
|
cy.initializeRepository(repositoryId);
|
|
18
19
|
AclManagementSteps.visit();
|
|
20
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
19
21
|
});
|
|
20
22
|
|
|
21
23
|
it('Should render empty ACL rules table', () => {
|
|
@@ -42,7 +44,7 @@ describe('ACL Management: render rules', () => {
|
|
|
42
44
|
it('Should render ACL rules in a table', () => {
|
|
43
45
|
AclManagementSteps.getAclRules().should('have.length', 5);
|
|
44
46
|
AclManagementSteps.getAddFirstRuleButton().should('be.visible');
|
|
45
|
-
AclManagementSteps.
|
|
47
|
+
AclManagementSteps.checkStatementRules(ACL_VIEW);
|
|
46
48
|
});
|
|
47
49
|
});
|
|
48
50
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
-
import {
|
|
2
|
+
import {ACL_VIEW} from "../../../steps/setup/acl-management-steps";
|
|
3
|
+
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
4
|
|
|
4
5
|
describe('ACL Management: reorder rules', () => {
|
|
5
6
|
|
|
@@ -16,17 +17,18 @@ describe('ACL Management: reorder rules', () => {
|
|
|
16
17
|
cy.initializeRepository(repositoryId);
|
|
17
18
|
AclManagementSteps.importRules(repositoryId);
|
|
18
19
|
AclManagementSteps.visit();
|
|
20
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
19
21
|
// ensure rules are rendered
|
|
20
22
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
it('Should move rule up', () => {
|
|
24
26
|
AclManagementSteps.moveRuleUp(1);
|
|
25
|
-
AclManagementSteps.
|
|
27
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[1], ACL_VIEW[0], ACL_VIEW[2], ACL_VIEW[3], ACL_VIEW[4]]);
|
|
26
28
|
});
|
|
27
29
|
|
|
28
30
|
it('Should move rule down', () => {
|
|
29
31
|
AclManagementSteps.moveRuleDown(1);
|
|
30
|
-
AclManagementSteps.
|
|
32
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[0], ACL_VIEW[2], ACL_VIEW[1], ACL_VIEW[3], ACL_VIEW[4]]);
|
|
31
33
|
});
|
|
32
34
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {ACL_VIEW, AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
2
|
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
3
|
import {ModalDialogSteps} from "../../../steps/modal-dialog-steps";
|
|
4
4
|
|
|
@@ -18,13 +18,14 @@ describe('ACL Management: revert rules', () => {
|
|
|
18
18
|
cy.enableAutocomplete(repositoryId);
|
|
19
19
|
AclManagementSteps.importRules(repositoryId);
|
|
20
20
|
AclManagementSteps.visit();
|
|
21
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
21
22
|
// ensure rules are rendered
|
|
22
23
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
it('Should be able to revert changes in the ACL', () => {
|
|
26
27
|
// Given I have opened ACL management page
|
|
27
|
-
AclManagementSteps.
|
|
28
|
+
AclManagementSteps.checkStatementRules(ACL_VIEW);
|
|
28
29
|
// When I add a new rule
|
|
29
30
|
AclManagementSteps.addRule(1);
|
|
30
31
|
AclManagementSteps.fillSubject(2, '<urn:John>');
|
|
@@ -52,7 +53,7 @@ describe('ACL Management: revert rules', () => {
|
|
|
52
53
|
// Then I expect that all changes in the ACL should be reverted
|
|
53
54
|
ApplicationSteps.getSuccessNotifications().should('be.visible');
|
|
54
55
|
AclManagementSteps.getAclRules().should('have.length', 5);
|
|
55
|
-
AclManagementSteps.
|
|
56
|
+
AclManagementSteps.checkStatementRules(ACL_VIEW);
|
|
56
57
|
// And the model should become pristine again after the revert
|
|
57
58
|
// I should be able to navigate away from the page without any confirmation
|
|
58
59
|
ApplicationSteps.openImportPage();
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import {AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
|
+
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
|
+
|
|
4
|
+
describe('ACL Management: rule scopes', () => {
|
|
5
|
+
|
|
6
|
+
let repositoryId;
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
cy.deleteRepository(repositoryId);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
repositoryId = 'acl-management-' + Date.now();
|
|
14
|
+
cy.createRepository({id: repositoryId});
|
|
15
|
+
cy.presetRepository(repositoryId);
|
|
16
|
+
cy.initializeRepository(repositoryId);
|
|
17
|
+
cy.enableAutocomplete(repositoryId);
|
|
18
|
+
AclManagementSteps.visit();
|
|
19
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
it('Should render empty tabs', () => {
|
|
24
|
+
// I expect 4 tabs
|
|
25
|
+
AclManagementSteps.getAclTabs().should('have.length', 4);
|
|
26
|
+
// I expect empty rules table
|
|
27
|
+
AclManagementSteps.getAclTable().should('be.visible');
|
|
28
|
+
AclManagementSteps.getAclTabs().should('be.visible');
|
|
29
|
+
AclManagementSteps.getNoDataMessage().should('be.visible');
|
|
30
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Statement ');
|
|
31
|
+
// When I select Clear graph tab
|
|
32
|
+
AclManagementSteps.selectTab(1);
|
|
33
|
+
// I expect empty rules table
|
|
34
|
+
AclManagementSteps.getAclTabs().should('be.visible');
|
|
35
|
+
AclManagementSteps.getNoDataMessage().should('be.visible');
|
|
36
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Clear graph ');
|
|
37
|
+
// When I select Plugins tab
|
|
38
|
+
AclManagementSteps.selectTab(2);
|
|
39
|
+
// I expect empty rules table
|
|
40
|
+
AclManagementSteps.getAclTabs().should('be.visible');
|
|
41
|
+
AclManagementSteps.getNoDataMessage().should('be.visible');
|
|
42
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Plugin ');
|
|
43
|
+
// When I select System tab
|
|
44
|
+
AclManagementSteps.selectTab(3);
|
|
45
|
+
// I expect empty rules table
|
|
46
|
+
AclManagementSteps.getAclTabs().should('be.visible');
|
|
47
|
+
AclManagementSteps.getNoDataMessage().should('be.visible');
|
|
48
|
+
AclManagementSteps.getActiveTab().should('have.text', 'System ');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('Should create rules', () => {
|
|
52
|
+
// I select Clear graph tab
|
|
53
|
+
AclManagementSteps.selectTab(1);
|
|
54
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Clear graph ');
|
|
55
|
+
// I can create rule
|
|
56
|
+
AclManagementSteps.addRuleInBeginning();
|
|
57
|
+
// I fill the policy
|
|
58
|
+
AclManagementSteps.selectPolicy(0, 'deny');
|
|
59
|
+
// I fill in the role field
|
|
60
|
+
AclManagementSteps.fillRole(0, 'ROLE1');
|
|
61
|
+
// I fill in the context field
|
|
62
|
+
AclManagementSteps.fillContext(0, '*');
|
|
63
|
+
// I save the rule
|
|
64
|
+
AclManagementSteps.saveRule(0);
|
|
65
|
+
// Then the tab label is changed
|
|
66
|
+
AclManagementSteps.getActiveTab().should('contain', '*');
|
|
67
|
+
|
|
68
|
+
// I select Plugin tab
|
|
69
|
+
AclManagementSteps.selectTab(2);
|
|
70
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Plugin ');
|
|
71
|
+
// I can create rule
|
|
72
|
+
AclManagementSteps.addRuleInBeginning();
|
|
73
|
+
// I fill the policy
|
|
74
|
+
AclManagementSteps.selectPolicy(0, 'deny');
|
|
75
|
+
// I fill in the role field
|
|
76
|
+
AclManagementSteps.fillRole(0, 'ROLE2');
|
|
77
|
+
// I select the operation
|
|
78
|
+
AclManagementSteps.selectOperation(0, 'write');
|
|
79
|
+
// I fill in the plugin field
|
|
80
|
+
AclManagementSteps.fillPlugin(0, '*');
|
|
81
|
+
// I save the rule
|
|
82
|
+
AclManagementSteps.saveRule(0);
|
|
83
|
+
// Then the tab label is changed
|
|
84
|
+
AclManagementSteps.getActiveTab().should('contain', '*');
|
|
85
|
+
|
|
86
|
+
// I select System tab
|
|
87
|
+
AclManagementSteps.selectTab(3);
|
|
88
|
+
AclManagementSteps.getActiveTab().should('have.text', 'System ');
|
|
89
|
+
// I can create rule
|
|
90
|
+
AclManagementSteps.addRuleInBeginning();
|
|
91
|
+
// I fill the policy
|
|
92
|
+
AclManagementSteps.selectPolicy(0, 'allow');
|
|
93
|
+
// I fill in the role field
|
|
94
|
+
AclManagementSteps.fillRole(0, 'ROLE3');
|
|
95
|
+
// I select the operation
|
|
96
|
+
AclManagementSteps.selectOperation(0, 'write');
|
|
97
|
+
// I save the rule
|
|
98
|
+
AclManagementSteps.saveRule(0);
|
|
99
|
+
// Then the tab label is changed
|
|
100
|
+
AclManagementSteps.getActiveTab().should('contain', '*');
|
|
101
|
+
|
|
102
|
+
// I select Statement tab
|
|
103
|
+
AclManagementSteps.selectTab(0);
|
|
104
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Statement ');
|
|
105
|
+
// I can create rule
|
|
106
|
+
AclManagementSteps.addRuleInBeginning();
|
|
107
|
+
// I fill the policy
|
|
108
|
+
AclManagementSteps.selectPolicy(0, 'deny');
|
|
109
|
+
// I fill in the role field
|
|
110
|
+
AclManagementSteps.fillRole(0, 'ROLE4');
|
|
111
|
+
// I select the operation
|
|
112
|
+
AclManagementSteps.selectOperation(0, 'write');
|
|
113
|
+
// I fill in the subject field
|
|
114
|
+
AclManagementSteps.fillSubject(0, '*');
|
|
115
|
+
// I fill in the predicate field
|
|
116
|
+
AclManagementSteps.fillPredicate(0, '*');
|
|
117
|
+
// I fill in the object field
|
|
118
|
+
AclManagementSteps.fillObject(0, '*');
|
|
119
|
+
// I fill in the context field
|
|
120
|
+
AclManagementSteps.fillContext(0, '*');
|
|
121
|
+
// I save the rule
|
|
122
|
+
AclManagementSteps.saveRule(0);
|
|
123
|
+
// Then the tab label is changed
|
|
124
|
+
AclManagementSteps.getActiveTab().should('contain', '*');
|
|
125
|
+
|
|
126
|
+
cy.intercept('PUT', '/rest/repositories/acl-management-*/acl').as('putCall');
|
|
127
|
+
|
|
128
|
+
// And I save the ACL
|
|
129
|
+
AclManagementSteps.saveAcl();
|
|
130
|
+
// Then wait for the PUT call to occur and assert the request body
|
|
131
|
+
cy.wait('@putCall').then((interception) => {
|
|
132
|
+
const expectedPayload = [
|
|
133
|
+
{
|
|
134
|
+
"scope": "clear_graph",
|
|
135
|
+
"policy": "deny",
|
|
136
|
+
"role": "CUSTOM_ROLE1",
|
|
137
|
+
"context": "*"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"scope": "plugin",
|
|
141
|
+
"policy": "deny",
|
|
142
|
+
"role": "CUSTOM_ROLE2",
|
|
143
|
+
"operation": "write",
|
|
144
|
+
"plugin": "*"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"scope": "system",
|
|
148
|
+
"policy": "allow",
|
|
149
|
+
"role": "CUSTOM_ROLE3",
|
|
150
|
+
"operation": "write"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"scope": "statement",
|
|
154
|
+
"policy": "deny",
|
|
155
|
+
"role": "CUSTOM_ROLE4",
|
|
156
|
+
"operation": "write",
|
|
157
|
+
"subject": "*",
|
|
158
|
+
"predicate": "*",
|
|
159
|
+
"object": "*",
|
|
160
|
+
"context": "*"
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
expect(interception.request.body).to.deep.eq(expectedPayload);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
167
|
+
// Then I expect the ACL to be saved
|
|
168
|
+
ApplicationSteps.getSuccessNotifications().should('be.visible');
|
|
169
|
+
|
|
170
|
+
// I expect to be on Statement tab
|
|
171
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Statement ');
|
|
172
|
+
// I expect to have one statement rule
|
|
173
|
+
AclManagementSteps.getAclRules().should('have.length', 1);
|
|
174
|
+
const expectedStatementRule = {
|
|
175
|
+
"scope": "statement",
|
|
176
|
+
"policy": "deny",
|
|
177
|
+
"role": "ROLE4",
|
|
178
|
+
"operation": "write",
|
|
179
|
+
"subject": "*",
|
|
180
|
+
"predicate": "*",
|
|
181
|
+
"object": "*",
|
|
182
|
+
"context": "*"
|
|
183
|
+
};
|
|
184
|
+
AclManagementSteps.checkStatementRules([expectedStatementRule]);
|
|
185
|
+
|
|
186
|
+
// I visit Clear graph tab
|
|
187
|
+
AclManagementSteps.selectTab(1);
|
|
188
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Clear graph ');
|
|
189
|
+
const expectedClearGraphRule = {
|
|
190
|
+
"scope": "clear_graph",
|
|
191
|
+
"policy": "deny",
|
|
192
|
+
"role": "ROLE1",
|
|
193
|
+
"context": "*"
|
|
194
|
+
};
|
|
195
|
+
AclManagementSteps.checkClearGraphRules([expectedClearGraphRule]);
|
|
196
|
+
|
|
197
|
+
// I visit Plugin tab
|
|
198
|
+
AclManagementSteps.selectTab(2);
|
|
199
|
+
AclManagementSteps.getActiveTab().should('have.text', 'Plugin ');
|
|
200
|
+
const expectedPluginRule = {
|
|
201
|
+
"scope": "plugin",
|
|
202
|
+
"policy": "deny",
|
|
203
|
+
"role": "ROLE2",
|
|
204
|
+
"operation": "write",
|
|
205
|
+
"plugin": "*"
|
|
206
|
+
};
|
|
207
|
+
AclManagementSteps.checkPluginRules([expectedPluginRule]);
|
|
208
|
+
|
|
209
|
+
// I visit System tab
|
|
210
|
+
AclManagementSteps.selectTab(3);
|
|
211
|
+
AclManagementSteps.getActiveTab().should('have.text', 'System ');
|
|
212
|
+
const expectedSystemRule = {
|
|
213
|
+
"scope": "system",
|
|
214
|
+
"policy": "allow",
|
|
215
|
+
"role": "ROLE3",
|
|
216
|
+
"operation": "write"
|
|
217
|
+
};
|
|
218
|
+
AclManagementSteps.checkSystemRules([expectedSystemRule]);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {ACL_VIEW, AclManagementSteps} from "../../../steps/setup/acl-management-steps";
|
|
2
2
|
import {ApplicationSteps} from "../../../steps/application-steps";
|
|
3
3
|
import {ModalDialogSteps} from "../../../steps/modal-dialog-steps";
|
|
4
4
|
|
|
@@ -18,21 +18,23 @@ describe('ACL Management: update rules', () => {
|
|
|
18
18
|
cy.enableAutocomplete(repositoryId);
|
|
19
19
|
AclManagementSteps.importRules(repositoryId);
|
|
20
20
|
AclManagementSteps.visit();
|
|
21
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
21
22
|
// ensure rules are rendered
|
|
22
23
|
AclManagementSteps.getAclRules().should('have.length.gt', 0);
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
it('Should be able to edit and save ACL', () => {
|
|
26
27
|
// Given I have opened ACL management page
|
|
27
|
-
AclManagementSteps.
|
|
28
|
+
AclManagementSteps.checkStatementRules(ACL_VIEW);
|
|
28
29
|
// When I add a new rule
|
|
29
30
|
AclManagementSteps.addRule(1);
|
|
30
31
|
AclManagementSteps.fillSubject(2, '<urn:John>');
|
|
31
32
|
AclManagementSteps.fillPredicate(2, '*');
|
|
32
33
|
AclManagementSteps.fillObject(2, '*');
|
|
33
34
|
AclManagementSteps.fillContext(2, '*');
|
|
34
|
-
AclManagementSteps.fillRole(2, '
|
|
35
|
+
AclManagementSteps.fillRole(2, 'ROLE1');
|
|
35
36
|
AclManagementSteps.selectPolicy(2, 'deny');
|
|
37
|
+
AclManagementSteps.selectOperation(2, 'write');
|
|
36
38
|
AclManagementSteps.saveRule(2);
|
|
37
39
|
// And I edit an existing rule
|
|
38
40
|
AclManagementSteps.editRule(1);
|
|
@@ -40,38 +42,44 @@ describe('ACL Management: update rules', () => {
|
|
|
40
42
|
AclManagementSteps.fillPredicate(1, '*');
|
|
41
43
|
AclManagementSteps.fillObject(1, '*');
|
|
42
44
|
AclManagementSteps.fillContext(1, '*');
|
|
43
|
-
AclManagementSteps.fillRole(1, '
|
|
45
|
+
AclManagementSteps.fillRole(1, 'TEST');
|
|
44
46
|
AclManagementSteps.selectPolicy(1, 'allow');
|
|
47
|
+
AclManagementSteps.selectOperation(1, 'write');
|
|
45
48
|
AclManagementSteps.saveRule(1);
|
|
46
49
|
// And I delete an existing rule
|
|
47
50
|
AclManagementSteps.deleteRule(5);
|
|
48
51
|
ModalDialogSteps.clickOnConfirmButton();
|
|
49
52
|
// And I save the ACL list
|
|
50
53
|
AclManagementSteps.saveAcl();
|
|
54
|
+
ApplicationSteps.geLoader().should('not.exist');
|
|
51
55
|
// Then I expect the ACL to be saved
|
|
52
56
|
ApplicationSteps.getSuccessNotifications().should('be.visible');
|
|
53
57
|
AclManagementSteps.getAclRules().should('have.length', 5);
|
|
54
58
|
const editedRule = {
|
|
59
|
+
"scope": "statement",
|
|
60
|
+
"policy": "deny",
|
|
61
|
+
"role": "ROLE1",
|
|
62
|
+
"operation": "write",
|
|
55
63
|
"subject": "<urn:John>",
|
|
56
64
|
"predicate": "*",
|
|
57
65
|
"object": "*",
|
|
58
66
|
"context": "*",
|
|
59
|
-
"role": "CUSTOM_ROLE1",
|
|
60
|
-
"policy": "deny",
|
|
61
67
|
"moveUp": true,
|
|
62
68
|
"moveDown": true
|
|
63
69
|
};
|
|
64
70
|
const newRule = {
|
|
71
|
+
"scope": "statement",
|
|
72
|
+
"policy": "allow",
|
|
73
|
+
"role": "TEST",
|
|
74
|
+
"operation": "write",
|
|
65
75
|
"subject": "<urn:Me>",
|
|
66
76
|
"predicate": "*",
|
|
67
77
|
"object": "*",
|
|
68
78
|
"context": "*",
|
|
69
|
-
"role": "CUSTOM_TEST",
|
|
70
|
-
"policy": "allow",
|
|
71
79
|
"moveUp": true,
|
|
72
80
|
"moveDown": true
|
|
73
81
|
};
|
|
74
|
-
AclManagementSteps.
|
|
82
|
+
AclManagementSteps.checkStatementRules([ACL_VIEW[0], newRule, editedRule, ACL_VIEW[2], ACL_VIEW[3]]);
|
|
75
83
|
});
|
|
76
84
|
|
|
77
85
|
it('Should prevent leaving the page when there is new rule added', () => {
|
package/package.json
CHANGED
|
@@ -57,6 +57,18 @@ export class AclManagementSteps {
|
|
|
57
57
|
return this.getAclTable().find('.no-data');
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
static getAclTabs() {
|
|
61
|
+
return cy.get('.nav-tabs.acl-tabs .nav-item');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static getActiveTab() {
|
|
65
|
+
return this.getAclTabs().find('.active');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static selectTab(index) {
|
|
69
|
+
return this.getAclTabs().eq(index).click();
|
|
70
|
+
}
|
|
71
|
+
|
|
60
72
|
static addRuleInBeginning() {
|
|
61
73
|
this.getAddFirstRuleButton().click();
|
|
62
74
|
}
|
|
@@ -106,7 +118,7 @@ export class AclManagementSteps {
|
|
|
106
118
|
}
|
|
107
119
|
|
|
108
120
|
static getSubjectField(index) {
|
|
109
|
-
return this.getRule(index).find('.subject-cell
|
|
121
|
+
return this.getRule(index).find('.subject-cell textarea');
|
|
110
122
|
}
|
|
111
123
|
|
|
112
124
|
static fillSubject(index, value) {
|
|
@@ -114,7 +126,7 @@ export class AclManagementSteps {
|
|
|
114
126
|
}
|
|
115
127
|
|
|
116
128
|
static getPredicateField(index) {
|
|
117
|
-
return this.getRule(index).find('.predicate-cell
|
|
129
|
+
return this.getRule(index).find('.predicate-cell textarea');
|
|
118
130
|
}
|
|
119
131
|
|
|
120
132
|
static fillPredicate(index, value) {
|
|
@@ -122,7 +134,7 @@ export class AclManagementSteps {
|
|
|
122
134
|
}
|
|
123
135
|
|
|
124
136
|
static getObjectField(index) {
|
|
125
|
-
return this.getRule(index).find('.object-cell
|
|
137
|
+
return this.getRule(index).find('.object-cell textarea');
|
|
126
138
|
}
|
|
127
139
|
|
|
128
140
|
static fillObject(index, value) {
|
|
@@ -130,7 +142,7 @@ export class AclManagementSteps {
|
|
|
130
142
|
}
|
|
131
143
|
|
|
132
144
|
static getContextField(index) {
|
|
133
|
-
return this.getRule(index).find('.context-cell
|
|
145
|
+
return this.getRule(index).find('.context-cell textarea');
|
|
134
146
|
}
|
|
135
147
|
|
|
136
148
|
static fillContext(index, value) {
|
|
@@ -145,6 +157,14 @@ export class AclManagementSteps {
|
|
|
145
157
|
this.getRoleField(index).clear().type(value);
|
|
146
158
|
}
|
|
147
159
|
|
|
160
|
+
static getPluginField(index) {
|
|
161
|
+
return this.getRule(index).find('.plugin-cell textarea');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
static fillPlugin(index, value) {
|
|
165
|
+
this.getPluginField(index).clear().type(value);
|
|
166
|
+
}
|
|
167
|
+
|
|
148
168
|
static getPolicySelectorField(index) {
|
|
149
169
|
return this.getRule(index).find('.policy-cell select');
|
|
150
170
|
}
|
|
@@ -153,6 +173,14 @@ export class AclManagementSteps {
|
|
|
153
173
|
this.getPolicySelectorField(index).select(value);
|
|
154
174
|
}
|
|
155
175
|
|
|
176
|
+
static getOperationSelectorField(index) {
|
|
177
|
+
return this.getRule(index).find('.operation-cell select');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
static selectOperation(index, value) {
|
|
181
|
+
this.getOperationSelectorField(index).select(value);
|
|
182
|
+
}
|
|
183
|
+
|
|
156
184
|
static getMoveUpButtons() {
|
|
157
185
|
return this.getAclTable().find('.move-up-btn');
|
|
158
186
|
}
|
|
@@ -189,7 +217,29 @@ export class AclManagementSteps {
|
|
|
189
217
|
this.getCancelAclSavingButton().click();
|
|
190
218
|
}
|
|
191
219
|
|
|
192
|
-
static
|
|
220
|
+
static checkStatementRules(rules = []) {
|
|
221
|
+
rules.forEach((rule, index) => {
|
|
222
|
+
AclManagementSteps.getRule(index).within(() => {
|
|
223
|
+
cy.get('td:nth-child(1)').should('contain.text', index);
|
|
224
|
+
const moveUpVisibilityCommand = index > 0 ? 'be.visible' : 'not.exist';
|
|
225
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-up-btn').should(moveUpVisibilityCommand);
|
|
226
|
+
const moveDownVisibilityCommand = index < rules.length - 1 ? 'be.visible' : 'not.exist';
|
|
227
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-down-btn').should(moveDownVisibilityCommand);
|
|
228
|
+
cy.get('td:nth-child(3)').should('contain.text', rule.policy);
|
|
229
|
+
cy.get('td:nth-child(4)').should('contain.text', rule.role);
|
|
230
|
+
cy.get('td:nth-child(5)').should('contain.text', rule.operation);
|
|
231
|
+
cy.get('td:nth-child(6)').should('contain.text', rule.subject);
|
|
232
|
+
cy.get('td:nth-child(7)').should('contain.text', rule.predicate);
|
|
233
|
+
cy.get('td:nth-child(8)').should('contain.text', rule.object);
|
|
234
|
+
cy.get('td:nth-child(9)').should('contain.text', rule.context);
|
|
235
|
+
cy.get('td:nth-child(10)').scrollIntoView().find('.delete-rule-btn').should('be.visible');
|
|
236
|
+
cy.get('td:nth-child(10)').scrollIntoView().find('.edit-rule-btn').should('be.visible');
|
|
237
|
+
cy.get('td:nth-child(10)').scrollIntoView().find('.add-rule-btn').should('be.visible');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
static checkClearGraphRules(rules = []) {
|
|
193
243
|
rules.forEach((rule, index) => {
|
|
194
244
|
AclManagementSteps.getRule(index).within(() => {
|
|
195
245
|
cy.get('td:nth-child(1)').should('contain.text', index);
|
|
@@ -197,15 +247,49 @@ export class AclManagementSteps {
|
|
|
197
247
|
cy.get('td:nth-child(2)').scrollIntoView().find('.move-up-btn').should(moveUpVisibilityCommand);
|
|
198
248
|
const moveDownVisibilityCommand = index < rules.length - 1 ? 'be.visible' : 'not.exist';
|
|
199
249
|
cy.get('td:nth-child(2)').scrollIntoView().find('.move-down-btn').should(moveDownVisibilityCommand);
|
|
200
|
-
cy.get('td:nth-child(3)').should('contain.text', rule.
|
|
201
|
-
cy.get('td:nth-child(4)').should('contain.text', rule.
|
|
202
|
-
cy.get('td:nth-child(5)').should('contain.text', rule.
|
|
203
|
-
cy.get('td:nth-child(6)').should('
|
|
204
|
-
cy.get('td:nth-child(
|
|
205
|
-
cy.get('td:nth-child(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
250
|
+
cy.get('td:nth-child(3)').should('contain.text', rule.policy);
|
|
251
|
+
cy.get('td:nth-child(4)').should('contain.text', rule.role);
|
|
252
|
+
cy.get('td:nth-child(5)').should('contain.text', rule.context);
|
|
253
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.delete-rule-btn').should('be.visible');
|
|
254
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.edit-rule-btn').should('be.visible');
|
|
255
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.add-rule-btn').should('be.visible');
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static checkPluginRules(rules = []) {
|
|
261
|
+
rules.forEach((rule, index) => {
|
|
262
|
+
AclManagementSteps.getRule(index).within(() => {
|
|
263
|
+
cy.get('td:nth-child(1)').should('contain.text', index);
|
|
264
|
+
const moveUpVisibilityCommand = index > 0 ? 'be.visible' : 'not.exist';
|
|
265
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-up-btn').should(moveUpVisibilityCommand);
|
|
266
|
+
const moveDownVisibilityCommand = index < rules.length - 1 ? 'be.visible' : 'not.exist';
|
|
267
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-down-btn').should(moveDownVisibilityCommand);
|
|
268
|
+
cy.get('td:nth-child(3)').should('contain.text', rule.policy);
|
|
269
|
+
cy.get('td:nth-child(4)').should('contain.text', rule.role);
|
|
270
|
+
cy.get('td:nth-child(5)').should('contain.text', rule.operation);
|
|
271
|
+
cy.get('td:nth-child(6)').should('contain.text', rule.plugin);
|
|
272
|
+
cy.get('td:nth-child(7)').scrollIntoView().find('.delete-rule-btn').should('be.visible');
|
|
273
|
+
cy.get('td:nth-child(7)').scrollIntoView().find('.edit-rule-btn').should('be.visible');
|
|
274
|
+
cy.get('td:nth-child(7)').scrollIntoView().find('.add-rule-btn').should('be.visible');
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
static checkSystemRules(rules = []) {
|
|
280
|
+
rules.forEach((rule, index) => {
|
|
281
|
+
AclManagementSteps.getRule(index).within(() => {
|
|
282
|
+
cy.get('td:nth-child(1)').should('contain.text', index);
|
|
283
|
+
const moveUpVisibilityCommand = index > 0 ? 'be.visible' : 'not.exist';
|
|
284
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-up-btn').should(moveUpVisibilityCommand);
|
|
285
|
+
const moveDownVisibilityCommand = index < rules.length - 1 ? 'be.visible' : 'not.exist';
|
|
286
|
+
cy.get('td:nth-child(2)').scrollIntoView().find('.move-down-btn').should(moveDownVisibilityCommand);
|
|
287
|
+
cy.get('td:nth-child(3)').should('contain.text', rule.policy);
|
|
288
|
+
cy.get('td:nth-child(4)').should('contain.text', rule.role);
|
|
289
|
+
cy.get('td:nth-child(5)').should('contain.text', rule.operation);
|
|
290
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.delete-rule-btn').should('be.visible');
|
|
291
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.edit-rule-btn').should('be.visible');
|
|
292
|
+
cy.get('td:nth-child(6)').scrollIntoView().find('.add-rule-btn').should('be.visible');
|
|
209
293
|
});
|
|
210
294
|
});
|
|
211
295
|
}
|
|
@@ -230,45 +314,107 @@ export class AclManagementSteps {
|
|
|
230
314
|
}
|
|
231
315
|
}
|
|
232
316
|
|
|
233
|
-
export const
|
|
317
|
+
export const ACL_VIEW = [
|
|
234
318
|
{
|
|
319
|
+
"scope": "statement",
|
|
320
|
+
"policy": "allow",
|
|
321
|
+
"role": "!ROLE2",
|
|
322
|
+
"operation": "write",
|
|
235
323
|
"subject": "<urn:Mary>",
|
|
236
324
|
"predicate": "*",
|
|
237
325
|
"object": "*",
|
|
238
|
-
"context": "*"
|
|
239
|
-
"role": "!CUSTOM_ROLE2",
|
|
240
|
-
"policy": "allow"
|
|
326
|
+
"context": "*"
|
|
241
327
|
},
|
|
242
328
|
{
|
|
329
|
+
"scope": "statement",
|
|
330
|
+
"policy": "deny",
|
|
331
|
+
"role": "ROLE1",
|
|
332
|
+
"operation": "read",
|
|
243
333
|
"subject": "*",
|
|
244
334
|
"predicate": "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>",
|
|
245
335
|
"object": "*",
|
|
246
|
-
"context": "*"
|
|
247
|
-
"role": "CUSTOM_ROLE1",
|
|
248
|
-
"policy": "deny"
|
|
336
|
+
"context": "*"
|
|
249
337
|
},
|
|
250
338
|
{
|
|
339
|
+
"scope": "statement",
|
|
340
|
+
"policy": "deny",
|
|
341
|
+
"role": "ROLE3",
|
|
342
|
+
"operation": "read",
|
|
251
343
|
"subject": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
252
344
|
"predicate": "*",
|
|
253
345
|
"object": "\"test aber auf Deutsch\"@en",
|
|
254
|
-
"context": "<http://example.com/graph1>"
|
|
255
|
-
"role": "CUSTOM_ROLE3",
|
|
256
|
-
"policy": "deny"
|
|
346
|
+
"context": "<http://example.com/graph1>"
|
|
257
347
|
},
|
|
258
348
|
{
|
|
349
|
+
"scope": "statement",
|
|
350
|
+
"policy": "allow",
|
|
351
|
+
"role": "ROLE3",
|
|
352
|
+
"operation": "write",
|
|
259
353
|
"subject": "*",
|
|
260
354
|
"predicate": "*",
|
|
261
355
|
"object": "\"15\"^^<http://www.w3.org/2001/XMLSchema#int>",
|
|
262
|
-
"context": "*"
|
|
263
|
-
"role": "CUSTOM_ROLE3",
|
|
264
|
-
"policy": "allow"
|
|
356
|
+
"context": "*"
|
|
265
357
|
},
|
|
266
358
|
{
|
|
359
|
+
"scope": "statement",
|
|
360
|
+
"policy": "deny",
|
|
361
|
+
"role": "ROLE4",
|
|
362
|
+
"operation": "write",
|
|
267
363
|
"subject": "<urn:Cat>",
|
|
268
364
|
"predicate": "*",
|
|
269
365
|
"object": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
270
|
-
"context": "*"
|
|
366
|
+
"context": "*"
|
|
367
|
+
}
|
|
368
|
+
];
|
|
369
|
+
export const ACL = [
|
|
370
|
+
{
|
|
371
|
+
"scope": "statement",
|
|
372
|
+
"policy": "allow",
|
|
373
|
+
"role": "!CUSTOM_ROLE2",
|
|
374
|
+
"operation": "write",
|
|
375
|
+
"subject": "<urn:Mary>",
|
|
376
|
+
"predicate": "*",
|
|
377
|
+
"object": "*",
|
|
378
|
+
"context": "*"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"scope": "statement",
|
|
382
|
+
"policy": "deny",
|
|
383
|
+
"role": "CUSTOM_ROLE1",
|
|
384
|
+
"operation": "read",
|
|
385
|
+
"subject": "*",
|
|
386
|
+
"predicate": "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>",
|
|
387
|
+
"object": "*",
|
|
388
|
+
"context": "*"
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
"scope": "statement",
|
|
392
|
+
"policy": "deny",
|
|
393
|
+
"role": "CUSTOM_ROLE3",
|
|
394
|
+
"operation": "read",
|
|
395
|
+
"subject": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
396
|
+
"predicate": "*",
|
|
397
|
+
"object": "\"test aber auf Deutsch\"@en",
|
|
398
|
+
"context": "<http://example.com/graph1>"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"scope": "statement",
|
|
402
|
+
"policy": "allow",
|
|
403
|
+
"role": "CUSTOM_ROLE3",
|
|
404
|
+
"operation": "write",
|
|
405
|
+
"subject": "*",
|
|
406
|
+
"predicate": "*",
|
|
407
|
+
"object": "\"15\"^^<http://www.w3.org/2001/XMLSchema#int>",
|
|
408
|
+
"context": "*"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"scope": "statement",
|
|
412
|
+
"policy": "deny",
|
|
271
413
|
"role": "CUSTOM_ROLE4",
|
|
272
|
-
"
|
|
414
|
+
"operation": "write",
|
|
415
|
+
"subject": "<urn:Cat>",
|
|
416
|
+
"predicate": "*",
|
|
417
|
+
"object": "<<<http://example.com/test> <http://www.w3.org/2000/01/rdf-schema#label> \"test aber auf Deutsch\"@de>>",
|
|
418
|
+
"context": "*"
|
|
273
419
|
}
|
|
274
420
|
];
|
|
@@ -71,12 +71,12 @@ Cypress.Commands.add('getNamespaces', (id) => {
|
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
const toggleAutocomplete = (repositoryId, enable) => {
|
|
75
75
|
cy.request({
|
|
76
76
|
method: 'POST',
|
|
77
77
|
url: `${AUTOCOMPLETE_URL}enabled?enabled=${enable}`,
|
|
78
78
|
headers: {
|
|
79
|
-
'X-GraphDB-Repository': repositoryId
|
|
79
|
+
'X-GraphDB-Repository': repositoryId
|
|
80
80
|
}
|
|
81
81
|
}).then((response) => {
|
|
82
82
|
cy.waitUntil(() => response && response.body === `Autocomplete was ${enable ? 'enabled' : 'disabled'}`);
|
|
@@ -84,13 +84,13 @@ let toggleAutocomplete = (repositoryId, enable) => {
|
|
|
84
84
|
waitAutocomplete(repositoryId);
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
const waitAutocomplete = function (repositoryId) {
|
|
88
88
|
cy.waitUntil(() =>
|
|
89
89
|
cy.request({
|
|
90
90
|
method: 'GET',
|
|
91
91
|
url: AUTOCOMPLETE_URL + 'status',
|
|
92
92
|
headers: {
|
|
93
93
|
'X-GraphDB-Repository': repositoryId
|
|
94
|
-
}
|
|
95
|
-
}).then(response => response.status === 200 && (response.body === 'READY' || response.body === 'NONE')));
|
|
94
|
+
}
|
|
95
|
+
}).then((response) => response.status === 200 && (response.body === 'READY' || response.body === 'NONE')));
|
|
96
96
|
};
|