From ce13a4fa76e94ae7f331db27127788a7efc3d342 Mon Sep 17 00:00:00 2001 From: jaxoncreed Date: Sat, 16 Dec 2023 14:29:56 -0500 Subject: [PATCH] Completed Container tests --- packages/solid/test/Integration.test.ts | 220 +++++++++++++++++++----- 1 file changed, 178 insertions(+), 42 deletions(-) diff --git a/packages/solid/test/Integration.test.ts b/packages/solid/test/Integration.test.ts index aeb072a..e073779 100644 --- a/packages/solid/test/Integration.test.ts +++ b/packages/solid/test/Integration.test.ts @@ -28,7 +28,10 @@ import type { UpdateDefaultGraphSuccess, UpdateSuccess, } from "../src/requester/results/success/UpdateSuccess"; -import type { ResourceSuccess } from "../src/resource/resourceResult/ResourceResult"; +import type { + ResourceResult, + ResourceSuccess, +} from "../src/resource/resourceResult/ResourceResult"; import type { AggregateError, UnexpectedResourceError, @@ -47,9 +50,12 @@ const TEST_CONTAINER_SLUG = "test_ldo/"; const TEST_CONTAINER_URI = `${ROOT_CONTAINER}${TEST_CONTAINER_SLUG}` as ContainerUri; const SAMPLE_DATA_URI = `${TEST_CONTAINER_URI}sample.ttl` as LeafUri; -const SAMPLE2_DATA_URI = `${TEST_CONTAINER_URI}sample2.ttl` as LeafUri; +const SAMPLE2_DATA_SLUG = "sample2.ttl"; +const SAMPLE2_DATA_URI = `${TEST_CONTAINER_URI}${SAMPLE2_DATA_SLUG}` as LeafUri; const SAMPLE_BINARY_URI = `${TEST_CONTAINER_URI}sample.txt` as LeafUri; -const SAMPLE2_BINARY_URI = `${TEST_CONTAINER_URI}sample2.txt` as LeafUri; +const SAMPLE2_BINARY_SLUG = `sample2.txt`; +const SAMPLE2_BINARY_URI = + `${TEST_CONTAINER_URI}${SAMPLE2_BINARY_SLUG}` as LeafUri; const SAMPLE_CONTAINER_URI = `${TEST_CONTAINER_URI}sample_container/` as ContainerUri; const SPIDER_MAN_TTL = `@base . @@ -136,14 +142,6 @@ describe("SolidLdoDataset", () => { await app.start(); authFetch = await getAuthenticatedFetch(); - - await authFetch(ROOT_CONTAINER, { - method: "POST", - headers: { - link: '; rel="type"', - slug: TEST_CONTAINER_SLUG, - }, - }); }); afterAll(async () => { @@ -154,6 +152,13 @@ describe("SolidLdoDataset", () => { fetchMock = jest.fn(authFetch); solidLdoDataset = createSolidLdoDataset({ fetch: fetchMock }); // Create a new document called sample.ttl + await authFetch(ROOT_CONTAINER, { + method: "POST", + headers: { + link: '; rel="type"', + slug: TEST_CONTAINER_SLUG, + }, + }); await Promise.all([ authFetch(TEST_CONTAINER_URI, { method: "POST", @@ -613,6 +618,18 @@ describe("SolidLdoDataset", () => { ).toBe(true); }); + it("returns and error if creating a container", async () => { + const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); + fetchMock.mockResolvedValueOnce( + new Response(TEST_CONTAINER_TTL, { + status: 500, + }), + ); + const result = await resource.createAndOverwrite(); + expect(result.isError).toBe(true); + expect(result.type).toBe("serverError"); + }); + it("returns a delete error if delete failed", async () => { const resource = solidLdoDataset.getResource(SAMPLE_DATA_URI); fetchMock.mockResolvedValueOnce( @@ -733,7 +750,7 @@ describe("SolidLdoDataset", () => { createQuad( namedNode(TEST_CONTAINER_URI), namedNode("http://www.w3.org/ns/ldp#contains"), - namedNode(SAMPLE2_DATA_URI), + namedNode(SAMPLE_CONTAINER_URI), namedNode(TEST_CONTAINER_URI), ), ), @@ -744,6 +761,18 @@ describe("SolidLdoDataset", () => { .some((child) => child.uri === SAMPLE_CONTAINER_URI), ).toBe(true); }); + + it("returns an error if creating a container", async () => { + const resource = solidLdoDataset.getResource(SAMPLE_CONTAINER_URI); + fetchMock.mockResolvedValueOnce( + new Response(TEST_CONTAINER_TTL, { + status: 500, + }), + ); + const result = await resource.createIfAbsent(); + expect(result.isError).toBe(true); + expect(result.type).toBe("serverError"); + }); }); /** @@ -780,11 +809,17 @@ describe("SolidLdoDataset", () => { it("returns an error on container read when deleting a container", async () => { const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); - fetchMock.mockResolvedValueOnce( - new Response(SAMPLE_DATA_URI, { - status: 500, - }), - ); + fetchMock.mockImplementation(async (input, init) => { + if ( + (init?.method === "get" || !init?.method) && + input === TEST_CONTAINER_URI + ) { + return new Response(SAMPLE_DATA_URI, { + status: 500, + }); + } + return authFetch(input, init); + }); const result = await resource.delete(); expect(result.isError).toBe(true); expect(result.type).toBe("aggregateError"); @@ -798,14 +833,16 @@ describe("SolidLdoDataset", () => { expect(aggregateError.errors[0].type).toBe("serverError"); }); - it("returns an error on child delete read when deleting a container", async () => { + it("returns an error on child delete when deleting a container", async () => { const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); - fetchMock.mockImplementationOnce(authFetch); - fetchMock.mockResolvedValueOnce( - new Response(SAMPLE_DATA_URI, { - status: 500, - }), - ); + fetchMock.mockImplementation(async (input, init) => { + if (init?.method === "delete" && input === SAMPLE_DATA_URI) { + return new Response(SAMPLE_DATA_URI, { + status: 500, + }); + } + return authFetch(input, init); + }); const result = await resource.delete(); expect(result.isError).toBe(true); expect(result.type).toBe("aggregateError"); @@ -819,27 +856,19 @@ describe("SolidLdoDataset", () => { expect(aggregateError.errors[0].type).toBe("serverError"); }); - it("returns an error on container delete read when deleting a container", async () => { + it("returns an error on container delete when deleting a container", async () => { const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); - fetchMock.mockImplementationOnce(authFetch); - fetchMock.mockImplementationOnce(authFetch); - fetchMock.mockImplementationOnce(authFetch); - fetchMock.mockResolvedValueOnce( - new Response(SAMPLE_DATA_URI, { - status: 500, - }), - ); + fetchMock.mockImplementation(async (input, init) => { + if (init?.method === "delete" && input === TEST_CONTAINER_URI) { + return new Response(SAMPLE_DATA_URI, { + status: 500, + }); + } + return authFetch(input, init); + }); const result = await resource.delete(); expect(result.isError).toBe(true); - expect(result.type).toBe("aggregateError"); - const aggregateError = result as AggregateError< - | ServerHttpError - | UnexpectedHttpError - | UnauthenticatedHttpError - | UnexpectedResourceError - | NoncompliantPodError - >; - expect(aggregateError.errors[0].type).toBe("serverError"); + expect(result.type).toBe("serverError"); }); }); @@ -1224,4 +1253,111 @@ describe("SolidLdoDataset", () => { * Container-Specific Methods * =========================================================================== */ + describe("container specific", () => { + it("returns the child with the child method", () => { + const container = solidLdoDataset.getResource(TEST_CONTAINER_URI); + const child = container.child(SAMPLE2_DATA_SLUG); + expect(child.uri).toBe(SAMPLE2_DATA_URI); + }); + + it("runs createAndOverwrite for a child via the createChildAndOverwrite method", async () => { + const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); + const result = await resource.createChildAndOverwrite(SAMPLE2_DATA_SLUG); + + expect(result.type).toBe("createSuccess"); + const createSuccess = result as ResourceResult; + expect(createSuccess.resource.uri).toBe(SAMPLE2_DATA_URI); + expect(createSuccess.didOverwrite).toBe(false); + expect( + solidLdoDataset.has( + createQuad( + namedNode(TEST_CONTAINER_URI), + namedNode("http://www.w3.org/ns/ldp#contains"), + namedNode(SAMPLE2_DATA_URI), + namedNode(TEST_CONTAINER_URI), + ), + ), + ).toBe(true); + expect( + resource.children().some((child) => child.uri === SAMPLE2_DATA_URI), + ).toBe(true); + }); + + it("runs createIfAbsent for a child via the createChildIfAbsent method", async () => { + const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); + const result = await resource.createChildIfAbsent(SAMPLE2_DATA_SLUG); + + expect(result.type).toBe("createSuccess"); + const createSuccess = result as ResourceResult; + expect(createSuccess.resource.uri).toBe(SAMPLE2_DATA_URI); + expect(createSuccess.didOverwrite).toBe(false); + expect( + solidLdoDataset.has( + createQuad( + namedNode(TEST_CONTAINER_URI), + namedNode("http://www.w3.org/ns/ldp#contains"), + namedNode(SAMPLE2_DATA_URI), + namedNode(TEST_CONTAINER_URI), + ), + ), + ).toBe(true); + expect( + resource.children().some((child) => child.uri === SAMPLE2_DATA_URI), + ).toBe(true); + }); + + it("runs uploadAndOverwrite for a child via the uploadChildAndOverwrite method", async () => { + const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); + const result = await resource.uploadChildAndOverwrite( + SAMPLE2_BINARY_SLUG, + Buffer.from("some text.") as unknown as Blob, + "text/plain", + ); + + expect(result.type).toBe("createSuccess"); + const createSuccess = result as ResourceResult; + expect(createSuccess.resource.uri).toBe(SAMPLE2_BINARY_URI); + expect(createSuccess.didOverwrite).toBe(false); + expect( + solidLdoDataset.has( + createQuad( + namedNode(TEST_CONTAINER_URI), + namedNode("http://www.w3.org/ns/ldp#contains"), + namedNode(SAMPLE2_BINARY_URI), + namedNode(TEST_CONTAINER_URI), + ), + ), + ).toBe(true); + expect( + resource.children().some((child) => child.uri === SAMPLE2_BINARY_URI), + ).toBe(true); + }); + + it("runs uploadIfAbsent for a child via the uploadChildIfAbsent method", async () => { + const resource = solidLdoDataset.getResource(TEST_CONTAINER_URI); + const result = await resource.uploadChildIfAbsent( + SAMPLE2_BINARY_SLUG, + Buffer.from("some text.") as unknown as Blob, + "text/plain", + ); + + expect(result.type).toBe("createSuccess"); + const createSuccess = result as ResourceResult; + expect(createSuccess.resource.uri).toBe(SAMPLE2_BINARY_URI); + expect(createSuccess.didOverwrite).toBe(false); + expect( + solidLdoDataset.has( + createQuad( + namedNode(TEST_CONTAINER_URI), + namedNode("http://www.w3.org/ns/ldp#contains"), + namedNode(SAMPLE2_BINARY_URI), + namedNode(TEST_CONTAINER_URI), + ), + ), + ).toBe(true); + expect( + resource.children().some((child) => child.uri === SAMPLE2_BINARY_URI), + ).toBe(true); + }); + }); });