|
| 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