Successful simple link traversal

main
Jackson Morgan 4 months ago
parent fabd0c0c58
commit 0b19f695b5
  1. 6
      packages/connected/src/ConnectedLdoDataset.ts
  2. 3
      packages/connected/src/linkTraversal/exploreLinks.ts
  3. 20
      packages/connected/test/LinkTraversalData.ts
  4. 58
      packages/connected/test/LinkTraversalIntegration.test.ts

@ -153,10 +153,6 @@ export class ConnectedLdoDataset<
if (!plugin) return new InvalidIdentifierResource(uri) as any; if (!plugin) return new InvalidIdentifierResource(uri) as any;
const normalizedUri = plugin.normalizeUri?.(uri) ?? uri; const normalizedUri = plugin.normalizeUri?.(uri) ?? uri;
console.log("plugin", plugin);
console.log("func", plugin.normalizeUri);
console.log(normalizedUri);
let resource = this.resourceMap.get(normalizedUri); let resource = this.resourceMap.get(normalizedUri);
if (!resource) { if (!resource) {
resource = plugin.getResource(uri, this.context); resource = plugin.getResource(uri, this.context);
@ -167,8 +163,6 @@ export class ConnectedLdoDataset<
} }
getResources(): GetResourceReturnType<Plugins[number], string>[] { getResources(): GetResourceReturnType<Plugins[number], string>[] {
console.log("IM IN HERE");
console.log(this.resourceMap);
return Array.from(this.resourceMap.values()); return Array.from(this.resourceMap.values());
} }

@ -90,7 +90,7 @@ export async function exploreLinksRecursive<
); );
}), }),
); );
} } else {
await exploreLinksRecursive( await exploreLinksRecursive(
dataset, dataset,
ldObject[queryKey], ldObject[queryKey],
@ -99,6 +99,7 @@ export async function exploreLinksRecursive<
options, options,
); );
} }
}
}), }),
); );
} }

@ -5,6 +5,8 @@ export const MAIN_PROFILE_URI = `${BASE_CONTAINER}mainProfile.ttl`;
export const MAIN_PROFILE_SUBJECT = `${MAIN_PROFILE_URI}#me`; export const MAIN_PROFILE_SUBJECT = `${MAIN_PROFILE_URI}#me`;
export const OTHER_PROFILE_URI = `${BASE_CONTAINER}otherProfile.ttl`; export const OTHER_PROFILE_URI = `${BASE_CONTAINER}otherProfile.ttl`;
export const OTHER_PROFILE_SUBJECT = `${OTHER_PROFILE_URI}#me`; export const OTHER_PROFILE_SUBJECT = `${OTHER_PROFILE_URI}#me`;
export const THIRD_PROFILE_URI = `${BASE_CONTAINER}otherProfile.ttl`;
export const THIRD_PROFILE_SUBJECT = `${THIRD_PROFILE_URI}#me`;
export const linkTraversalData: ResourceInfo = { export const linkTraversalData: ResourceInfo = {
slug: "test-container/", slug: "test-container/",
@ -13,7 +15,7 @@ export const linkTraversalData: ResourceInfo = {
{ {
slug: "mainProfile.ttl", slug: "mainProfile.ttl",
isContainer: false, isContainer: false,
mimeType: "text/ttl", mimeType: "text/turtle",
data: ` data: `
@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix : <#> . @prefix : <#> .
@ -27,7 +29,7 @@ export const linkTraversalData: ResourceInfo = {
{ {
slug: "otherProfile.ttl", slug: "otherProfile.ttl",
isContainer: false, isContainer: false,
mimeType: "text/ttl", mimeType: "text/turtle",
data: ` data: `
@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix : <#> . @prefix : <#> .
@ -38,5 +40,19 @@ export const linkTraversalData: ResourceInfo = {
foaf:knows <http://localhost:3005/test-container/mainProfile.ttl#me> . foaf:knows <http://localhost:3005/test-container/mainProfile.ttl#me> .
`, `,
}, },
{
slug: "thirdProfile.ttl",
isContainer: false,
mimeType: "text/turtle",
data: `
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix : <#> .
:me a foaf:Person ;
foaf:name "Third User" ;
foaf:mbox <mailto:other@example.org> ;
foaf:knows <http://localhost:3005/test-container/mainProfile.ttl#me> .
`,
},
], ],
}; };

@ -1,5 +1,5 @@
import type { ConnectedLdoDataset } from "../src/ConnectedLdoDataset"; import type { ConnectedLdoDataset } from "../src/ConnectedLdoDataset";
import { createConnectedLdoDataset } from "../src"; import { changeData, commitData, createConnectedLdoDataset } from "../src";
import { import {
solidConnectedPlugin, solidConnectedPlugin,
type SolidConnectedPlugin, type SolidConnectedPlugin,
@ -10,6 +10,8 @@ import {
MAIN_PROFILE_SUBJECT, MAIN_PROFILE_SUBJECT,
MAIN_PROFILE_URI, MAIN_PROFILE_URI,
OTHER_PROFILE_URI, OTHER_PROFILE_URI,
THIRD_PROFILE_SUBJECT,
THIRD_PROFILE_URI,
} from "./LinkTraversalData"; } from "./LinkTraversalData";
import { SolidProfileShapeShapeType } from "./.ldo/solidProfile.shapeTypes"; import { SolidProfileShapeShapeType } from "./.ldo/solidProfile.shapeTypes";
@ -41,11 +43,61 @@ describe("Link Traversal", () => {
const resourceUris = solidLdoDataset const resourceUris = solidLdoDataset
.getResources() .getResources()
.map((resource) => resource.uri); .map((resource) => resource.uri);
console.log(resourceUris); expect(resourceUris.length).toBe(3);
expect(resourceUris.length).toBe(2);
expect(resourceUris).toContain(MAIN_PROFILE_URI); expect(resourceUris).toContain(MAIN_PROFILE_URI);
expect(resourceUris).toContain(OTHER_PROFILE_URI); expect(resourceUris).toContain(OTHER_PROFILE_URI);
expect(data.name).toBe("Main User"); expect(data.name).toBe("Main User");
expect(data.knows?.toArray()[0].name).toBe("Other User"); expect(data.knows?.toArray()[0].name).toBe("Other User");
}); });
it("handles subscriptions if data changes", async () => {
const mainProfileResource = solidLdoDataset.getResource(MAIN_PROFILE_URI);
await solidLdoDataset
.usingType(SolidProfileShapeShapeType)
.startLinkQuery(mainProfileResource, MAIN_PROFILE_SUBJECT, {
name: true,
knows: {
name: true,
},
})
.subscribe();
// Should have regular information
let mainProfile = solidLdoDataset
.usingType(SolidProfileShapeShapeType)
.fromSubject(MAIN_PROFILE_SUBJECT);
let resourceUris = solidLdoDataset
.getResources()
.map((resource) => resource.uri);
expect(resourceUris.length).toBe(3);
expect(resourceUris).toContain(MAIN_PROFILE_URI);
expect(resourceUris).toContain(OTHER_PROFILE_URI);
expect(mainProfile.name).toBe("Main User");
expect(mainProfile.knows?.size).toBe(1);
expect(mainProfile.knows?.toArray()[0].name).toBe("Other User");
// Update to include a new document
const cMainProfile = changeData(mainProfile, mainProfileResource);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
cMainProfile.knows?.add({ "@id": THIRD_PROFILE_SUBJECT });
await commitData(cMainProfile);
// After the data is committed, the third profile should be present
mainProfile = solidLdoDataset
.usingType(SolidProfileShapeShapeType)
.fromSubject(MAIN_PROFILE_SUBJECT);
resourceUris = solidLdoDataset
.getResources()
.map((resource) => resource.uri);
expect(resourceUris.length).toBe(4);
expect(resourceUris).toContain(MAIN_PROFILE_URI);
expect(resourceUris).toContain(OTHER_PROFILE_URI);
expect(resourceUris).toContain(THIRD_PROFILE_URI);
expect(mainProfile.name).toBe("Main User");
expect(mainProfile.knows?.size).toBe(2);
const knowNames = mainProfile.knows?.map((knowsPerson) => knowsPerson.name);
expect(knowNames).toContain("Other User");
expect(knowNames).toContain("Third User");
});
}); });

Loading…
Cancel
Save