Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PATCH/PUT Append to create a new resource #56

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion run-against-nss.sh
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ export STORAGE_ROOT_ALICE=https://$USERNAME_ALICE.localhost:8443/
# npm run jest -- --json --outputFile="$RESULTS_PATH" "$@"
export INCLUDE_MAY=1
mkdir -p ../test-suite/NSS
./node_modules/.bin/jest test/surface/ --json --outputFile="$RESULTS_PATH" "$@"
./node_modules/.bin/jest test/surface/ --json --outputFile="$RESULTS_PATH" "$@" --detectOpenHandles
64 changes: 50 additions & 14 deletions test/surface/create.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,8 @@ describe('Create', () => {
testAllowed('Write', 'Write');
testAllowed('Append', 'Write');

it(`is disallowed without Write on c/r`, async () => {
const testing = `test-disallowed-default`;
it(`is allowed with Append on c/r (create new resource)`, async () => {
const testing = `allowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
Expand Down Expand Up @@ -229,6 +229,42 @@ describe('Create', () => {
'If-None-Match': '*'
}
});
expect(result.status).toEqual(201);
});

it(`is disallowed with Append on c/r (existing resource)`, async () => {
const testing = `test-disallowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
method: 'PUT',
body: 'hello',
headers: {
'Content-Type': 'text/plain',
'If-None-Match': '*'
}
});
const aclDocUrl = await solidLogicAlice.findAclDocUrl(containerUrl);
await solidLogicAlice.fetch(aclDocUrl, {
method: 'PUT',
body: makeBody({
containerModes: 'acl:Read, acl:Append, acl:Write, acl:Control',
resourceModes: 'acl:Read, acl:Append, acl:Control',
target: containerUrl
}),
headers: {
'Content-Type': 'text/turtle',
// 'If-None-Match': '*' - work around a bug in some servers that don't support If-None-Match on ACL doc URLs
}
});
const result = await solidLogicBob.fetch(`${containerUrl}test.txt`, {
method: 'PUT',
body: 'hello',
headers: {
'Content-Type': 'text/plain',
// 'If-None-Match': '*' // precondition may be tested before and return 412
}
});
expect(result.status).toEqual(403);
});

Expand Down Expand Up @@ -313,8 +349,8 @@ describe('Create', () => {
testAllowed('Write', 'Write');
testAllowed('Append', 'Write');

it(`is disallowed without Write on c/r`, async () => {
const testing = `test-disallowed-default`;
it(`is allowed with Append on c/r`, async () => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree

Copy link
Contributor

@edwardsph edwardsph Dec 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name to the test artifact below should be changed to match the test purpose to avoid future confusion:

const testing = `disallowed-default`;

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK I commit my changes to testing

const testing = `allowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
Expand Down Expand Up @@ -350,7 +386,7 @@ describe('Create', () => {
"<#patch> a solid:InsertDeletePatch;\n" +
" solid:inserts { <#hello> <#linked> <#world> .}.\n",
});
expect(result.status).toEqual(403);
expect(responseCodeGroup(result.status)).toEqual("2xx");
});

it(`is disallowed without Write or Append on c/`, async () => {
Expand Down Expand Up @@ -435,8 +471,8 @@ describe('Create', () => {
testAllowed('Write', 'Write');
testAllowed('Append', 'Write');

it(`is disallowed without Write on c/r`, async () => {
const testing = `disallowed-default`;
it(`is allowed with Append on c/r (create new resource)`, async () => {
const testing = `allowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
Expand Down Expand Up @@ -468,7 +504,7 @@ describe('Create', () => {
'If-None-Match': '*'
}
});
expect(result.status).toEqual(403);
expect(result.status).toEqual(201);
});

it(`is disallowed without Write or Append on c/`, async () => {
Expand Down Expand Up @@ -554,8 +590,8 @@ describe('Create', () => {
testAllowed('Write', 'Write');
testAllowed('Append', 'Write');

it(`is disallowed without Write on c/r`, async () => {
const testing = `disallowed-default`;
it(`is allowed with Append on c/r`, async () => {
const testing = `allowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
Expand Down Expand Up @@ -589,11 +625,11 @@ describe('Create', () => {
"<#patch> a solid:InsertDeletePatch;\n" +
" solid:inserts { <#hello> <#linked> <#world> .}.\n",
});
expect(result.status).toEqual(403);
expect(responseCodeGroup(result.status)).toEqual("2xx");
});

it(`is disallowed without Write or Append on c/`, async () => {
const testing = `disallowed-default`;
it(`is allowed with Append on c/`, async () => {
const testing = `allowed-default`;
const containerUrl = makeContainerUrl(testFolderUrl, using, testing);
// This will do mkdir-p:
await solidLogicAlice.fetch(`${containerUrl}test.txt`, {
Expand Down Expand Up @@ -627,7 +663,7 @@ describe('Create', () => {
"<#patch> a solid:InsertDeletePatch;\n" +
" solid:inserts { <#hello> <#linked> <#world> .}.\n",
});
expect(result.status).toEqual(403);
expect(result.status).toEqual(200);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if I agree. This test is about required permissions on c/, right?

Copy link
Member Author

@bourgeoa bourgeoa Dec 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@michielbdejong I should have added this link as a clarification on WAC Append solid/web-access-control-spec#122

});
});
});
8 changes: 4 additions & 4 deletions test/surface/read-logged_in.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ describe('Read-LoggedIn', () => {
it('Is allowed with accessTo Read access on container resource', async () => {
const resourceUrl = `${testFolderUrl}5/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -175,7 +175,7 @@ describe('Read-LoggedIn', () => {
it('Is disallowed with accessTo Append+Write+Control access on non-container resource', async () => {
const resourceUrl = `${testFolderUrl}6/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -200,7 +200,7 @@ describe('Read-LoggedIn', () => {
const containerUrl = `${testFolderUrl}7/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -225,7 +225,7 @@ describe('Read-LoggedIn', () => {
const containerUrl = `${testFolderUrl}8/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand Down
8 changes: 4 additions & 4 deletions test/surface/read-public.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ describe('Read-Public', () => {
it('Is allowed with accessTo Read access on container resource', async () => {
const resourceUrl = `${testFolderUrl}5/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -177,7 +177,7 @@ describe('Read-Public', () => {
it('Is disallowed with accessTo Append+Write+Control access on non-container resource', async () => {
const resourceUrl = `${testFolderUrl}6/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -202,7 +202,7 @@ describe('Read-Public', () => {
const containerUrl = `${testFolderUrl}7/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -227,7 +227,7 @@ describe('Read-Public', () => {
const containerUrl = `${testFolderUrl}8/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand Down
8 changes: 4 additions & 4 deletions test/surface/read.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ describe('Read', () => {
it('Is allowed with accessTo Read access on container resource', async () => {
const resourceUrl = `${testFolderUrl}5/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -177,7 +177,7 @@ describe('Read', () => {
it('Is disallowed with accessTo Append+Write+Control access on non-container resource', async () => {
const resourceUrl = `${testFolderUrl}6/test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -202,7 +202,7 @@ describe('Read', () => {
const containerUrl = `${testFolderUrl}7/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand All @@ -227,7 +227,7 @@ describe('Read', () => {
const containerUrl = `${testFolderUrl}8/`;
const resourceUrl = `${containerUrl}test/`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}.dummy`, {
const creationResult = await solidLogicAlice.fetch(`${resourceUrl}`, {
method: 'PUT',
body: '<#hello> <#linked> <#world> .',
headers: {
Expand Down
14 changes: 14 additions & 0 deletions test/surface/update.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ describe('Update', () => {
'If-None-Match': '*'
}
});
// expect(creationResult.status).toEqual(201);
const etagInQuotes = creationResult.headers.get('etag');
// console.log({ etag: etagInQuotes });
const aclDocUrl = await solidLogicAlice.findAclDocUrl(resourceUrl);
Expand All @@ -235,6 +236,19 @@ describe('Update', () => {
});
expect(responseCodeGroup(result.status)).toEqual("2xx");
});
it('Fails on if-none-match asterisk precondition on existing resource', async () => {
const resourceUrl = `${testFolderUrl}5/test.txt`;
// This will do mkdir-p:
const creationResult = await solidLogicAlice.fetch(resourceUrl, {
method: 'PUT',
body: 'hello',
headers: {
'Content-Type': 'text/plain',
'If-None-Match': '*'
}
});
expect(creationResult.status).toEqual(412);
})
it('Is disallowed with accessTo Read+Append+Control access on resource', async () => {
const resourceUrl = `${testFolderUrl}6/test.txt`;
// This will do mkdir-p:
Expand Down