Skip to content

Commit dba805b

Browse files
Test for non-existing resources (#95)
* Added initial tests for non-existing resources * Aadded CSS-inspired test tables * Moved test changes to existing files, merged inherited and not inherited permission tests * Added write feature files * For read tests reuse same resources and move shared code to use common utils * Allow 200 responses, restrict to 201 for PUT to create, remove redundant test Co-authored-by: surilindur <[email protected]>
1 parent 8c1702b commit dba805b

13 files changed

+952
-686
lines changed

run.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ EOF
9999
stop_css() {
100100
echo 'Stopping CSS'
101101
docker stop server
102+
echo 'Stopped CSS'
102103
docker rm server
104+
echo 'Removed CSS'
103105
docker network rm testnet
104106
}
105107

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
@ignore
2+
Feature:
3+
4+
Scenario:
5+
* def authHeaders =
6+
"""
7+
function (method, url, agent) {
8+
const agentLowerCase = agent.toLowerCase()
9+
return agentLowerCase !== 'public' ? clients[agentLowerCase].getAuthHeaders(method, url) : {}
10+
}
11+
"""
12+
* def resourcePermissions =
13+
"""
14+
function (modes) {
15+
if (modes && modes !== 'inherited' && modes !== 'no') {
16+
return Object.entries({ R: 'read', W: 'write', A: 'append', C: 'control' })
17+
.filter(([mode, permission]) => modes.includes(mode))
18+
.map(([mode, permission]) => permission)
19+
}
20+
return undefined
21+
}
22+
"""
23+
* def getRequestData =
24+
"""
25+
function (type) {
26+
switch(type) {
27+
case 'rdf':
28+
return {
29+
contentType: 'text/turtle',
30+
requestBody: '<> <http://www.w3.org/2000/01/rdf-schema#comment> "Bob replaced it." .',
31+
responseShouldNotContain: "Bob replaced it"
32+
}
33+
case 'text/n3':
34+
return {
35+
contentType: 'text/n3',
36+
requestBody: '@prefix solid: <http://www.w3.org/ns/solid/terms#>. _:insert a solid:InsertDeletePatch; solid:inserts { <> a <http://example.org#Foo> . }.',
37+
responseShouldNotContain: "http://example.org#Foo"
38+
}
39+
default:
40+
return {
41+
contentType: 'text/plain',
42+
requestBody: "Bob's text",
43+
responseShouldNotContain: "Bob's text"
44+
}
45+
}
46+
}
47+
"""
48+
* def resourceEntry =
49+
"""
50+
function (container, type) {
51+
switch (type) {
52+
case 'plain':
53+
return container.createResource('.txt', 'Hello', 'text/plain')
54+
case 'fictive':
55+
return container.reserveResource('.txt')
56+
case 'rdf':
57+
return container.createResource('.ttl', karate.readAsString('../fixtures/example.ttl'), 'text/turtle')
58+
case 'container':
59+
return container.createContainer()
60+
default:
61+
return undefined
62+
}
63+
}
64+
"""
65+
* def createResource =
66+
"""
67+
function (containerModes, resourceModes, resourceType, subject, agent) {
68+
const testContainerPermissions = resourcePermissions(containerModes)
69+
const testResourcePermissions = resourcePermissions(resourceModes)
70+
const testContainerInheritablePermissions = resourceModes === 'inherited'
71+
? testContainerPermissions
72+
: undefined
73+
74+
const testContainer = rootTestContainer.createContainer()
75+
const testResource = resourceEntry(testContainer, resourceType)
76+
77+
const testContainerAccess = testContainer.accessDatasetBuilder
78+
if (subject === 'agent') {
79+
if (testContainerPermissions) {
80+
testContainerAccess.setAgentAccess(testContainer.url, agent, testContainerPermissions)
81+
}
82+
if (testContainerInheritablePermissions) {
83+
testContainerAccess.setInheritableAgentAccess(testContainer.url, agent, testContainerInheritablePermissions)
84+
}
85+
} else if (subject === 'authenticated') {
86+
if (testContainerPermissions) {
87+
testContainerAccess.setAuthenticatedAccess(testContainer.url, testContainerPermissions)
88+
}
89+
if (testContainerInheritablePermissions) {
90+
testContainerAccess.setInheritableAuthenticatedAccess(testContainer.url, testContainerInheritablePermissions)
91+
}
92+
} else if (subject === 'public') {
93+
if (testContainerPermissions) {
94+
testContainerAccess.setPublicAccess(testContainer.url, testContainerPermissions)
95+
}
96+
if (testContainerInheritablePermissions) {
97+
testContainerAccess.setInheritablePublicAccess(testContainer.url, testContainerInheritablePermissions)
98+
}
99+
}
100+
testContainer.accessDataset = testContainerAccess.build()
101+
102+
if (resourceType !== 'fictive' && resourceModes !== 'inherited') {
103+
const testResourceAccess = testResource.accessDatasetBuilder
104+
if (testResourcePermissions) {
105+
if (subject === 'agent') {
106+
testResourceAccess.setAgentAccess(testResource.url, agent, testResourcePermissions)
107+
} else if (subject === 'authenticated') {
108+
testResourceAccess.setAuthenticatedAccess(testResource.url, testResourcePermissions)
109+
} else if (subject === 'public') {
110+
testResourceAccess.setPublicAccess(testResource.url, testResourcePermissions)
111+
}
112+
}
113+
testResource.accessDataset = testResourceAccess.build()
114+
}
115+
return testResource
116+
}
117+
"""
118+
* def getResource = (container, resource, type) => testResources[`${container}:${resource}:${type}`]
119+
* def testResources = resources.reduce((map, t) => { map[`${t.container}:${t.resource}:${t.type}`] = createResource(t.container, t.resource, t.type, subject, agent); return map;}, {})

0 commit comments

Comments
 (0)