diff --git a/packages/solid-react/test/.ldo/post.context.ts b/packages/solid-react/test/.ldo/post.context.ts
index dafbe33..5cb3a91 100644
--- a/packages/solid-react/test/.ldo/post.context.ts
+++ b/packages/solid-react/test/.ldo/post.context.ts
@@ -27,5 +27,6 @@ export const postContext: ContextDefinition = {
publisher: {
"@id": "http://schema.org/publisher",
"@type": "@id",
+ "@container": "@set",
},
};
diff --git a/packages/solid-react/test/.ldo/post.typings.ts b/packages/solid-react/test/.ldo/post.typings.ts
index 9ebaf71..1425a9a 100644
--- a/packages/solid-react/test/.ldo/post.typings.ts
+++ b/packages/solid-react/test/.ldo/post.typings.ts
@@ -41,5 +41,5 @@ export interface PostSh {
*/
publisher: {
"@id": string;
- };
+ }[];
}
diff --git a/packages/solid-react/test/Integration.test.tsx b/packages/solid-react/test/Integration.test.tsx
index e224a35..6120241 100644
--- a/packages/solid-react/test/Integration.test.tsx
+++ b/packages/solid-react/test/Integration.test.tsx
@@ -13,6 +13,7 @@ import { useRootContainerFor } from "../src/useRootContainer";
import { useLdo } from "../src/SolidLdoProvider";
import { PostShShapeType } from "./.ldo/post.shapeTypes";
import type { PostSh } from "./.ldo/post.typings";
+import { useSubject } from "../src/useSubject";
// Use an increased timeout, since the CSS server takes too much setup time.
jest.setTimeout(40_000);
@@ -217,4 +218,141 @@ describe("Integration Tests", () => {
expect(container.innerHTML).toBe("Cool Article");
});
});
+
+ describe("useSubject", () => {
+ it("renders the article body from the useSubject value", async () => {
+ const UseSubjectTest: FunctionComponent = () => {
+ useResource(SAMPLE_DATA_URI);
+ const post = useSubject(PostShShapeType, `${SAMPLE_DATA_URI}#Post1`);
+
+ return
{post.articleBody}
;
+ };
+ render(
+
+
+ ,
+ );
+
+ await screen.findByText("test");
+ });
+
+ it("renders the array value from the useSubject value", async () => {
+ const UseSubjectTest: FunctionComponent = () => {
+ const resource = useResource(SAMPLE_DATA_URI);
+ const post = useSubject(PostShShapeType, `${SAMPLE_DATA_URI}#Post1`);
+ if (resource.isLoading() || !post) return loading
;
+
+ return (
+
+
{post.publisher[0]["@id"]}
+
+ {post.publisher.map((publisher) => {
+ return - {publisher["@id"]}
;
+ })}
+
+
+ );
+ };
+ render(
+
+
+ ,
+ );
+
+ const single = await screen.findByRole("single");
+ expect(single.innerHTML).toBe("https://example.com/Publisher1");
+ const list = await screen.findByRole("list");
+ expect(list.children[0].innerHTML).toBe("https://example.com/Publisher1");
+ expect(list.children[1].innerHTML).toBe("https://example.com/Publisher2");
+ });
+
+ it("returns undefined in the subject URI is undefined", async () => {
+ const UseSubjectTest: FunctionComponent = () => {
+ useResource(SAMPLE_DATA_URI, { suppressInitialRead: true });
+ const post = useSubject(PostShShapeType, undefined);
+
+ return (
+
+ {post === undefined ? "Undefined" : "Not Undefined"}
+
+ );
+ };
+ render(
+
+
+ ,
+ );
+
+ const article = await screen.findByRole("article");
+ expect(article.innerHTML).toBe("Undefined");
+ });
+
+ it("returns nothing if a symbol key is provided", async () => {
+ const UseSubjectTest: FunctionComponent = () => {
+ const resource = useResource(SAMPLE_DATA_URI);
+ const post = useSubject(PostShShapeType, `${SAMPLE_DATA_URI}#Post1`);
+ if (resource.isLoading() || !post) return loading
;
+
+ return {typeof post[Symbol.hasInstance]}
;
+ };
+ render(
+
+
+ ,
+ );
+
+ const article = await screen.findByRole("value");
+ expect(article.innerHTML).toBe("undefined");
+ });
+
+ it("returns an id if an id key is provided", async () => {
+ const UseSubjectTest: FunctionComponent = () => {
+ const resource = useResource(SAMPLE_DATA_URI);
+ const post = useSubject(PostShShapeType, `${SAMPLE_DATA_URI}#Post1`);
+ if (resource.isLoading() || !post) return loading
;
+
+ return {post["@id"]}
;
+ };
+ render(
+
+
+ ,
+ );
+
+ const article = await screen.findByRole("value");
+ expect(article.innerHTML).toBe(`${SAMPLE_DATA_URI}#Post1`);
+ });
+
+ it("does not set a value if a value is attempted to be set", async () => {
+ const warn = jest.spyOn(console, "warn").mockImplementation(() => {});
+ const UseSubjectTest: FunctionComponent = () => {
+ const resource = useResource(SAMPLE_DATA_URI);
+ const post = useSubject(PostShShapeType, `${SAMPLE_DATA_URI}#Post1`);
+ if (resource.isLoading() || !post) return loading
;
+
+ return (
+
+
{post.articleBody}
+
+
+ );
+ };
+ render(
+
+
+ ,
+ );
+
+ const article = await screen.findByRole("value");
+ expect(article.innerHTML).toBe(`test`);
+ fireEvent.click(screen.getByText("Attempt Change"));
+ expect(article.innerHTML).not.toBe("bad");
+ expect(warn).toHaveBeenCalledWith(
+ "You've attempted to set a value on a Linked Data Object from the useSubject, useMatchingSubject, or useMatchingObject hooks. These linked data objects should only be used to render data, not modify it. To modify data, use the `changeData` function.",
+ );
+ warn.mockReset();
+ });
+ });
});
diff --git a/packages/solid-react/test/setUpServer.ts b/packages/solid-react/test/setUpServer.ts
index 57fabee..0551ccf 100644
--- a/packages/solid-react/test/setUpServer.ts
+++ b/packages/solid-react/test/setUpServer.ts
@@ -17,21 +17,13 @@ export const SAMPLE2_BINARY_URI =
`${TEST_CONTAINER_URI}${SAMPLE2_BINARY_SLUG}` as LeafUri;
export const SAMPLE_CONTAINER_URI =
`${TEST_CONTAINER_URI}sample_container/` as ContainerUri;
-export const SPIDER_MAN_TTL = `@base .
-@prefix rdf: .
-@prefix rdfs: .
-@prefix foaf: .
-@prefix rel: .
+export const EXAMPLE_POST_TTL = `@prefix schema: .
-<#green-goblin>
- rel:enemyOf <#spiderman> ;
- a foaf:Person ; # in the context of the Marvel universe
- foaf:name "Green Goblin" .
-
-<#spiderman>
- rel:enemyOf <#green-goblin> ;
- a foaf:Person ;
- foaf:name "Spiderman", "Человек-паук"@ru .`;
+<#Post1>
+ a schema:CreativeWork, schema:Thing, schema:SocialMediaPosting ;
+ schema:image ;
+ schema:articleBody "test" ;
+ schema:publisher , .`;
export const TEST_CONTAINER_TTL = `@prefix dc: .
@prefix ldp: .
@prefix posix: .
@@ -84,7 +76,7 @@ export function setUpServer(): SetUpServerReturn {
s.authFetch(TEST_CONTAINER_URI, {
method: "POST",
headers: { "content-type": "text/turtle", slug: "sample.ttl" },
- body: SPIDER_MAN_TTL,
+ body: EXAMPLE_POST_TTL,
}),
s.authFetch(TEST_CONTAINER_URI, {
method: "POST",
diff --git a/packages/solid-react/test/useSubject.integration.test.tsx b/packages/solid-react/test/useSubject.integration.test.tsx
deleted file mode 100644
index 6aaf84f..0000000
--- a/packages/solid-react/test/useSubject.integration.test.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { setUpServer } from "./setUpServer";
-
-describe("useSubject", () => {
- setUpServer();
-
- it("trivial", () => {
- expect(true).toBe(true);
- });
-});