solid-logic 1.3.17-9d25ceb7 → 1.3.17-a4538ffc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/lib/acl/aclLogic.d.ts +3 -30
  2. package/lib/acl/aclLogic.d.ts.map +1 -1
  3. package/lib/acl/aclLogic.js +152 -119
  4. package/lib/acl/aclLogic.js.map +1 -1
  5. package/lib/authn/SolidAuthnLogic.d.ts.map +1 -1
  6. package/lib/authn/SolidAuthnLogic.js +2 -2
  7. package/lib/authn/SolidAuthnLogic.js.map +1 -1
  8. package/lib/chat/chatLogic.d.ts +3 -0
  9. package/lib/chat/chatLogic.d.ts.map +1 -0
  10. package/lib/chat/{ChatLogic.js → chatLogic.js} +82 -86
  11. package/lib/chat/chatLogic.js.map +1 -0
  12. package/lib/inbox/inboxLogic.d.ts +3 -0
  13. package/lib/inbox/inboxLogic.d.ts.map +1 -0
  14. package/lib/inbox/{InboxLogic.js → inboxLogic.js} +58 -64
  15. package/lib/inbox/inboxLogic.js.map +1 -0
  16. package/lib/index.d.ts +6 -11
  17. package/lib/index.d.ts.map +1 -1
  18. package/lib/index.js +5 -25
  19. package/lib/index.js.map +1 -1
  20. package/lib/issuer/issuerLogic.js +1 -1
  21. package/lib/issuer/issuerLogic.js.map +1 -1
  22. package/lib/logic/CustomError.d.ts +4 -0
  23. package/lib/logic/CustomError.d.ts.map +1 -1
  24. package/lib/logic/CustomError.js +17 -1
  25. package/lib/logic/CustomError.js.map +1 -1
  26. package/lib/logic/solidLogic.d.ts +6 -0
  27. package/lib/logic/solidLogic.d.ts.map +1 -0
  28. package/lib/logic/solidLogic.js +92 -0
  29. package/lib/logic/solidLogic.js.map +1 -0
  30. package/lib/logic/solidLogicSingleton.d.ts +1 -2
  31. package/lib/logic/solidLogicSingleton.d.ts.map +1 -1
  32. package/lib/logic/solidLogicSingleton.js +3 -3
  33. package/lib/logic/solidLogicSingleton.js.map +1 -1
  34. package/lib/profile/profileLogic.d.ts +3 -0
  35. package/lib/profile/profileLogic.d.ts.map +1 -0
  36. package/lib/profile/profileLogic.js +246 -0
  37. package/lib/profile/profileLogic.js.map +1 -0
  38. package/lib/typeIndex/typeIndexLogic.d.ts +2 -21
  39. package/lib/typeIndex/typeIndexLogic.d.ts.map +1 -1
  40. package/lib/typeIndex/typeIndexLogic.js +304 -296
  41. package/lib/typeIndex/typeIndexLogic.js.map +1 -1
  42. package/lib/types.d.ts +82 -1
  43. package/lib/types.d.ts.map +1 -1
  44. package/lib/util/containerLogic.d.ts +11 -0
  45. package/lib/util/containerLogic.d.ts.map +1 -0
  46. package/lib/{profile/ProfileLogic.js → util/containerLogic.js} +53 -44
  47. package/lib/util/containerLogic.js.map +1 -0
  48. package/lib/util/ns.d.ts +2 -0
  49. package/lib/util/ns.d.ts.map +1 -0
  50. package/lib/util/ns.js +34 -0
  51. package/lib/util/ns.js.map +1 -0
  52. package/lib/util/utilityLogic.d.ts +15 -0
  53. package/lib/util/utilityLogic.d.ts.map +1 -0
  54. package/lib/util/utilityLogic.js +272 -0
  55. package/lib/util/utilityLogic.js.map +1 -0
  56. package/lib/util/utils.d.ts +8 -0
  57. package/lib/util/utils.d.ts.map +1 -0
  58. package/lib/util/utils.js +48 -0
  59. package/lib/util/utils.js.map +1 -0
  60. package/package.json +15 -13
  61. package/src/acl/aclLogic.ts +137 -118
  62. package/src/authn/SolidAuthnLogic.ts +3 -2
  63. package/src/chat/chatLogic.ts +225 -0
  64. package/src/inbox/inboxLogic.ts +58 -0
  65. package/src/index.ts +11 -29
  66. package/src/issuer/issuerLogic.ts +1 -1
  67. package/src/logic/CustomError.ts +5 -1
  68. package/src/logic/solidLogic.ts +75 -0
  69. package/src/logic/solidLogicSingleton.ts +3 -3
  70. package/src/profile/profileLogic.ts +126 -0
  71. package/src/typeIndex/typeIndexLogic.ts +175 -182
  72. package/src/types.ts +83 -4
  73. package/src/util/containerLogic.ts +54 -0
  74. package/src/util/ns.ts +5 -0
  75. package/src/util/utilityLogic.ts +155 -0
  76. package/src/util/utils.ts +52 -0
  77. package/test/aclLogic.test.ts +13 -4
  78. package/test/chatLogic.test.ts +70 -71
  79. package/test/container.test.ts +56 -0
  80. package/test/helpers/dataSetup.ts +134 -0
  81. package/test/helpers/setup.ts +4 -0
  82. package/test/inboxLogic.test.ts +39 -38
  83. package/test/logic.test.ts +10 -9
  84. package/test/profileLogic.test.ts +246 -0
  85. package/test/typeIndexLogic.test.ts +487 -30
  86. package/test/utilityLogic.test.ts +172 -126
  87. package/test/utils.test.ts +32 -0
  88. package/lib/chat/ChatLogic.d.ts +0 -26
  89. package/lib/chat/ChatLogic.d.ts.map +0 -1
  90. package/lib/chat/ChatLogic.js.map +0 -1
  91. package/lib/chat/determineChatContainer.d.ts +0 -3
  92. package/lib/chat/determineChatContainer.d.ts.map +0 -1
  93. package/lib/chat/determineChatContainer.js +0 -12
  94. package/lib/chat/determineChatContainer.js.map +0 -1
  95. package/lib/discovery/discoveryLogic.d.ts +0 -37
  96. package/lib/discovery/discoveryLogic.d.ts.map +0 -1
  97. package/lib/discovery/discoveryLogic.js +0 -507
  98. package/lib/discovery/discoveryLogic.js.map +0 -1
  99. package/lib/inbox/InboxLogic.d.ts +0 -18
  100. package/lib/inbox/InboxLogic.d.ts.map +0 -1
  101. package/lib/inbox/InboxLogic.js.map +0 -1
  102. package/lib/logic/SolidLogic.d.ts +0 -48
  103. package/lib/logic/SolidLogic.d.ts.map +0 -1
  104. package/lib/logic/SolidLogic.js +0 -321
  105. package/lib/logic/SolidLogic.js.map +0 -1
  106. package/lib/profile/ProfileLogic.d.ts +0 -13
  107. package/lib/profile/ProfileLogic.d.ts.map +0 -1
  108. package/lib/profile/ProfileLogic.js.map +0 -1
  109. package/lib/util/UtilityLogic.d.ts +0 -33
  110. package/lib/util/UtilityLogic.d.ts.map +0 -1
  111. package/lib/util/UtilityLogic.js +0 -240
  112. package/lib/util/UtilityLogic.js.map +0 -1
  113. package/lib/util/uri.d.ts +0 -3
  114. package/lib/util/uri.d.ts.map +0 -1
  115. package/lib/util/uri.js +0 -9
  116. package/lib/util/uri.js.map +0 -1
  117. package/src/chat/ChatLogic.ts +0 -244
  118. package/src/chat/determineChatContainer.ts +0 -14
  119. package/src/discovery/discoveryLogic.ts +0 -288
  120. package/src/inbox/InboxLogic.ts +0 -66
  121. package/src/logic/SolidLogic.ts +0 -262
  122. package/src/profile/ProfileLogic.ts +0 -44
  123. package/src/util/UtilityLogic.ts +0 -161
  124. package/src/util/uri.ts +0 -5
  125. package/test/discoveryLogic.test.ts +0 -712
@@ -1,37 +1,38 @@
1
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import solidNamespace from "solid-namespace";
3
- import * as rdf from "rdflib";
4
- import { UpdateManager } from "rdflib";
5
- import { ProfileLogic } from "../src/profile/ProfileLogic";
6
- import { UtilityLogic } from "../src/util/UtilityLogic";
7
- import { InboxLogic } from "../src/inbox/InboxLogic";
8
- import { SolidNamespace } from "../src/types";
1
+ /**
2
+ * @jest-environment jsdom
3
+ *
4
+ */
5
+ import { UpdateManager, Store, Fetcher, sym } from "rdflib";
6
+ import { createAclLogic } from "../src/acl/aclLogic";
7
+ import { createInboxLogic } from '../src/inbox/inboxLogic';
8
+ import { createProfileLogic } from "../src/profile/profileLogic";
9
+ import { createContainerLogic } from "../src/util/containerLogic";
10
+ import { createUtilityLogic } from "../src/util/utilityLogic";
9
11
 
10
- const ns: SolidNamespace = solidNamespace(rdf);
11
-
12
- const alice = rdf.sym("https://alice.example/profile/card#me");
13
- const bob = rdf.sym("https://bob.example/profile/card#me");
12
+ const alice = sym("https://alice.example.com/profile/card#me");
13
+ const bob = sym("https://bob.example.com/profile/card#me");
14
14
 
15
15
  describe("Inbox logic", () => {
16
- let inbox;
17
16
  let store;
17
+ let inboxLogic
18
18
  beforeEach(() => {
19
19
  fetchMock.resetMocks();
20
20
  fetchMock.mockResponse("Not Found", {
21
21
  status: 404,
22
22
  });
23
- const fetcher = { fetch: fetchMock };
24
- store = rdf.graph();
25
- store.fetcher = rdf.fetcher(store, fetcher);
23
+ store = new Store()
24
+ store.fetcher = new Fetcher(store, { fetch: fetch });
26
25
  store.updater = new UpdateManager(store);
27
26
  const authn = {
28
27
  currentUser: () => {
29
28
  return alice;
30
29
  },
31
30
  };
32
- const profile = new ProfileLogic(store, ns, authn);
33
- const util = new UtilityLogic(store, ns, fetcher);
34
- inbox = new InboxLogic(store, ns, profile, util);
31
+ const containerLogic = createContainerLogic(store)
32
+ const aclLogic = createAclLogic(store)
33
+ const util = createUtilityLogic(store, aclLogic, containerLogic);
34
+ const profile = createProfileLogic(store, authn, util);
35
+ inboxLogic = createInboxLogic(store, profile, util, containerLogic, aclLogic);
35
36
  });
36
37
 
37
38
  describe("getNewMessages", () => {
@@ -40,7 +41,7 @@ describe("Inbox logic", () => {
40
41
  beforeEach(async () => {
41
42
  bobHasAnInbox();
42
43
  inboxIsEmpty();
43
- result = await inbox.getNewMessages(bob);
44
+ result = await inboxLogic.getNewMessages(bob);
44
45
  });
45
46
  it("Resolves to an empty array", () => {
46
47
  expect(result).toEqual([]);
@@ -51,7 +52,7 @@ describe("Inbox logic", () => {
51
52
  beforeEach(async () => {
52
53
  bobHasAnInbox();
53
54
  inboxHasSomeContainmentTriples();
54
- result = await inbox.getNewMessages(bob);
55
+ result = await inboxLogic.getNewMessages(bob);
55
56
  });
56
57
  it("Resolves to an array with URLs of non-container resources in inbox", () => {
57
58
  expect(result.sort()).toEqual([
@@ -65,14 +66,14 @@ describe("Inbox logic", () => {
65
66
  aliceHasValidProfile();
66
67
  // First for the PUT:
67
68
  fetchMock.mockOnceIf(
68
- "https://alice.example/p2p-inboxes/Peer%20Person/",
69
+ "https://alice.example.com/p2p-inboxes/Peer%20Person/",
69
70
  "Created", {
70
71
  status: 201
71
72
  }
72
73
  )
73
74
  // Then for the GET to read the ACL link:
74
75
  fetchMock.mockOnceIf(
75
- "https://alice.example/p2p-inboxes/Peer%20Person/",
76
+ "https://alice.example.com/p2p-inboxes/Peer%20Person/",
76
77
  " ", {
77
78
  status: 200,
78
79
  headers: {
@@ -82,12 +83,12 @@ describe("Inbox logic", () => {
82
83
  )
83
84
  fetchMock.mockIf("https://some/acl", "Created", { status: 201 });
84
85
 
85
- await inbox.createInboxFor('https://peer.com/#me', 'Peer Person');
86
+ await inboxLogic.createInboxFor('https://peer.com/#me', 'Peer Person');
86
87
  });
87
88
  it("creates the inbox", () => {
88
89
  expect(fetchMock.mock.calls).toEqual([
89
- [ "https://alice.example/profile/card", fetchMock.mock.calls[0][1] ],
90
- [ "https://alice.example/p2p-inboxes/Peer%20Person/", {
90
+ [ "https://alice.example.com/profile/card", fetchMock.mock.calls[0][1] ],
91
+ [ "https://alice.example.com/p2p-inboxes/Peer%20Person/", {
91
92
  body: " ",
92
93
  headers: {
93
94
  "Content-Type": "text/turtle",
@@ -96,18 +97,18 @@ describe("Inbox logic", () => {
96
97
  },
97
98
  method: "PUT"
98
99
  }],
99
- [ "https://alice.example/p2p-inboxes/Peer%20Person/", fetchMock.mock.calls[2][1] ],
100
+ [ "https://alice.example.com/p2p-inboxes/Peer%20Person/", fetchMock.mock.calls[2][1] ],
100
101
  [ "https://some/acl", {
101
102
  body: '@prefix acl: <http://www.w3.org/ns/auth/acl#>.\n' +
102
103
  '\n' +
103
104
  '<#alice> a acl:Authorization;\n' +
104
- ' acl:agent <https://alice.example/profile/card#me>;\n' +
105
- ' acl:accessTo <https://alice.example/p2p-inboxes/Peer%20Person/>;\n' +
106
- ' acl:default <https://alice.example/p2p-inboxes/Peer%20Person/>;\n' +
105
+ ' acl:agent <https://alice.example.com/profile/card#me>;\n' +
106
+ ' acl:accessTo <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
107
+ ' acl:default <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
107
108
  ' acl:mode acl:Read, acl:Write, acl:Control.\n' +
108
109
  '<#bobAccessTo> a acl:Authorization;\n' +
109
110
  ' acl:agent <https://peer.com/#me>;\n' +
110
- ' acl:accessTo <https://alice.example/p2p-inboxes/Peer%20Person/>;\n' +
111
+ ' acl:accessTo <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
111
112
  ' acl:mode acl:Append.\n',
112
113
  headers: [
113
114
  [ 'Content-Type', 'text/turtle' ]
@@ -135,7 +136,7 @@ describe("Inbox logic", () => {
135
136
  headers: { "Content-Type": "text/turtle" },
136
137
  }
137
138
  );
138
- await inbox.markAsRead("https://container.com/item.ttl", new Date('31 March 2111 UTC'));
139
+ await inboxLogic.markAsRead("https://container.com/item.ttl", new Date('31 March 2111 UTC'));
139
140
  });
140
141
  it('moves the item to archive', async () => {
141
142
  expect(fetchMock.mock.calls).toEqual([
@@ -160,11 +161,11 @@ describe("Inbox logic", () => {
160
161
 
161
162
  function aliceHasValidProfile() {
162
163
  fetchMock.mockOnceIf(
163
- "https://alice.example/profile/card",
164
+ "https://alice.example.com/profile/card",
164
165
  `
165
- <https://alice.example/profile/card#me>
166
- <http://www.w3.org/ns/pim/space#storage> <https://alice.example/> ;
167
- <http://www.w3.org/ns/solid/terms#privateTypeIndex> <https://alice.example/settings/privateTypeIndex.ttl> ;
166
+ <https://alice.example.com/profile/card#me>
167
+ <http://www.w3.org/ns/pim/space#storage> <https://alice.example.com/> ;
168
+ <http://www.w3.org/ns/solid/terms#privateTypeIndex> <https://alice.example.com/settings/privateTypeIndex.ttl> ;
168
169
  .`,
169
170
  {
170
171
  headers: {
@@ -176,8 +177,8 @@ describe("Inbox logic", () => {
176
177
 
177
178
  function bobHasAnInbox() {
178
179
  fetchMock.mockOnceIf(
179
- "https://bob.example/profile/card",
180
- "<https://bob.example/profile/card#me><http://www.w3.org/ns/ldp#inbox><https://container.com/>.",
180
+ "https://bob.example.com/profile/card",
181
+ "<https://bob.example.com/profile/card#me><http://www.w3.org/ns/ldp#inbox><https://container.com/>.",
181
182
  {
182
183
  headers: { "Content-Type": "text/turtle" },
183
184
  }
@@ -1,28 +1,29 @@
1
- import { solidLogicSingleton } from "../src/index"
1
+ import { solidLogicSingleton } from "../src/logic/solidLogicSingleton"
2
2
  import { silenceDebugMessages } from "./helpers/setup"
3
3
 
4
4
  silenceDebugMessages()
5
5
 
6
- describe('solidLogicSingleton (main global SolidLogic instance)', () => {
6
+ describe('store', () => {
7
7
  it('exists', () => {
8
- expect(solidLogicSingleton).toBeInstanceOf(Object)
8
+ expect(solidLogicSingleton.store).toBeInstanceOf(Object)
9
9
  })
10
10
  })
11
11
 
12
- describe('solidLogicSingleton.store', () => {
12
+ describe('store.fetcher', () => {
13
13
  it('exists', () => {
14
- expect(solidLogicSingleton.store).toBeInstanceOf(Object)
14
+ expect(solidLogicSingleton.store.fetcher).toBeInstanceOf(Object)
15
15
  })
16
16
  })
17
17
 
18
- describe('solidLogicSingleton.store.fetcher', () => {
18
+ describe('store.updater', () => {
19
19
  it('exists', () => {
20
- expect(solidLogicSingleton.store.fetcher).toBeInstanceOf(Object)
20
+ expect(solidLogicSingleton.store.updater).toBeInstanceOf(Object)
21
21
  })
22
22
  })
23
23
 
24
- describe('solidLogicSingleton.store.updater', () => {
24
+ describe('authn', () => {
25
25
  it('exists', () => {
26
- expect(solidLogicSingleton.store.updater).toBeInstanceOf(Object)
26
+ expect(solidLogicSingleton.authn).toBeInstanceOf(Object)
27
27
  })
28
28
  })
29
+
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ *
4
+ */
5
+ import { UpdateManager, Store, Fetcher } from 'rdflib';
6
+ import { createProfileLogic } from "../src/profile/profileLogic";
7
+ import { createUtilityLogic } from "../src/util/utilityLogic"
8
+ import { ns } from "../src/util/ns";
9
+ import {
10
+ alice, AlicePreferencesFile, AlicePrivateTypeIndex, AliceProfileFile, bob, boby, loadWebObject
11
+ } from './helpers/dataSetup';
12
+ import { createAclLogic } from "../src/acl/aclLogic";
13
+ import { createContainerLogic } from "../src/util/containerLogic";
14
+
15
+ const prefixes = Object.keys(ns).map(prefix => `@prefix ${prefix}: ${ns[prefix]('')}.\n`).join('') // In turtle
16
+ const user = alice
17
+ const profile = user.doc()
18
+ let requests = []
19
+ let profileLogic
20
+
21
+ describe("Profile", () => {
22
+
23
+ describe('loadProfile', () => {
24
+ window.$SolidTestEnvironment = { username: alice.uri }
25
+ let store
26
+ requests = []
27
+ const statustoBeReturned = 200
28
+ let web = {}
29
+ const authn = {
30
+ currentUser: () => {
31
+ return alice;
32
+ },
33
+ };
34
+ beforeEach(() => {
35
+ fetchMock.resetMocks();
36
+ web = loadWebObject()
37
+ requests = []
38
+ fetchMock.mockIf(/^https?.*$/, async req => {
39
+
40
+ if (req.method !== 'GET') {
41
+ requests.push(req)
42
+ if (req.method === 'PUT') {
43
+ const contents = await req.text()
44
+ web[req.url] = contents // Update our dummy web
45
+ console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`)
46
+ }
47
+ return { status: statustoBeReturned }
48
+ }
49
+ const contents = web[req.url]
50
+ if (contents !== undefined) { //
51
+ return {
52
+ body: prefixes + contents, // Add namespaces to anything
53
+ status: 200,
54
+ headers: {
55
+ "Content-Type": "text/turtle",
56
+ "WAC-Allow": 'user="write", public="read"',
57
+ "Accept-Patch": "application/sparql-update"
58
+ }
59
+ }
60
+ } // if contents
61
+ return {
62
+ status: 404,
63
+ body: 'Not Found'
64
+ }
65
+ })
66
+
67
+ store = new Store()
68
+ store.fetcher = new Fetcher(store, { fetch: fetch });
69
+ store.updater = new UpdateManager(store);
70
+ const util = createUtilityLogic(store, createAclLogic(store), createContainerLogic(store))
71
+ profileLogic = createProfileLogic(store, authn, util)
72
+ })
73
+ it('exists', () => {
74
+ expect(profileLogic.loadProfile).toBeInstanceOf(Function)
75
+ })
76
+ it('loads data', async () => {
77
+ const result = await profileLogic.loadProfile(user)
78
+ expect(result).toBeInstanceOf(Object)
79
+ expect(result.uri).toEqual(AliceProfileFile.uri)
80
+ expect(store.holds(user, ns.rdf('type'), ns.vcard('Individual'), profile)).toEqual(true)
81
+ expect(store.holds(user, ns.space('preferencesFile'), AlicePreferencesFile, profile)).toEqual(true)
82
+ expect(store.statementsMatching(null, null, null, profile).length).toEqual(4)
83
+ })
84
+ })
85
+
86
+ describe('silencedLoadPreferences', () => {
87
+ window.$SolidTestEnvironment = { username: alice.uri }
88
+ let store
89
+ requests = []
90
+ const statustoBeReturned = 200
91
+ let web = {}
92
+ const authn = {
93
+ currentUser: () => {
94
+ return alice;
95
+ },
96
+ };
97
+ beforeEach(() => {
98
+ fetchMock.resetMocks();
99
+ web = loadWebObject()
100
+ requests = []
101
+ fetchMock.mockIf(/^https?.*$/, async req => {
102
+
103
+ if (req.method !== 'GET') {
104
+ requests.push(req)
105
+ if (req.method === 'PUT') {
106
+ const contents = await req.text()
107
+ web[req.url] = contents // Update our dummy web
108
+ console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`)
109
+ }
110
+ return { status: statustoBeReturned }
111
+ }
112
+ const contents = web[req.url]
113
+ if (contents !== undefined) { //
114
+ return {
115
+ body: prefixes + contents, // Add namespaces to anything
116
+ status: 200,
117
+ headers: {
118
+ "Content-Type": "text/turtle",
119
+ "WAC-Allow": 'user="write", public="read"',
120
+ "Accept-Patch": "application/sparql-update"
121
+ }
122
+ }
123
+ } // if contents
124
+ return {
125
+ status: 404,
126
+ body: 'Not Found'
127
+ }
128
+ })
129
+
130
+ store = new Store()
131
+ store.fetcher = new Fetcher(store, { fetch: fetch });
132
+ store.updater = new UpdateManager(store);
133
+ const util = createUtilityLogic(store, createAclLogic(store), createContainerLogic(store))
134
+ profileLogic = createProfileLogic(store, authn, util)
135
+ })
136
+ it('exists', () => {
137
+ expect(profileLogic.silencedLoadPreferences).toBeInstanceOf(Function)
138
+ })
139
+ it('loads data', async () => {
140
+ const result = await profileLogic.silencedLoadPreferences(alice)
141
+ expect(result).toBeInstanceOf(Object)
142
+ expect(result.uri).toEqual(AlicePreferencesFile.uri)
143
+ expect(store.holds(user, ns.rdf('type'), ns.vcard('Individual'), profile)).toEqual(true)
144
+ expect(store.statementsMatching(null, null, null, profile).length).toEqual(4)
145
+
146
+ expect(store.statementsMatching(null, null, null, AlicePreferencesFile).length).toEqual(2)
147
+ expect(store.holds(user, ns.solid('privateTypeIndex'), AlicePrivateTypeIndex, AlicePreferencesFile)).toEqual(true)
148
+ })
149
+ it('creates new file', async () => {
150
+ const result = await profileLogic.silencedLoadPreferences(bob)
151
+
152
+ const patchRequest = requests[0]
153
+ expect(patchRequest.method).toEqual('PATCH')
154
+ expect(patchRequest.url).toEqual(bob.doc().uri)
155
+ const text = await patchRequest.text()
156
+ expect(text).toContain('INSERT DATA { <https://bob.example.com/profile/card.ttl#me> <http://www.w3.org/ns/pim/space#preferencesFile> <https://bob.example.com/Settings/Preferences.ttl> .')
157
+
158
+ const putRequest = requests[1]
159
+ expect(putRequest.method).toEqual('PUT')
160
+ expect(putRequest.url).toEqual('https://bob.example.com/Settings/Preferences.ttl')
161
+ expect(web[putRequest.url]).toEqual('')
162
+
163
+ })
164
+ })
165
+
166
+
167
+ describe('loadPreferences', () => {
168
+ window.$SolidTestEnvironment = { username: boby.uri }
169
+ let store
170
+ requests = []
171
+ const statustoBeReturned = 200
172
+ let web = {}
173
+ const authn = {
174
+ currentUser: () => {
175
+ return boby;
176
+ },
177
+ };
178
+ beforeEach(() => {
179
+ fetchMock.resetMocks();
180
+ web = loadWebObject()
181
+ requests = []
182
+ fetchMock.mockIf(/^https?.*$/, async req => {
183
+
184
+ if (req.method !== 'GET') {
185
+ requests.push(req)
186
+ if (req.method === 'PUT') {
187
+ const contents = await req.text()
188
+ web[req.url] = contents // Update our dummy web
189
+ console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`)
190
+ }
191
+ return { status: statustoBeReturned }
192
+ }
193
+ const contents = web[req.url]
194
+ if (contents !== undefined) { //
195
+ return {
196
+ body: prefixes + contents, // Add namespaces to anything
197
+ status: 200,
198
+ headers: {
199
+ "Content-Type": "text/turtle",
200
+ "WAC-Allow": 'user="write", public="read"',
201
+ "Accept-Patch": "application/sparql-update"
202
+ }
203
+ }
204
+ } // if contents
205
+ return {
206
+ status: 404,
207
+ body: 'Not Found'
208
+ }
209
+ })
210
+
211
+ store = new Store()
212
+ store.fetcher = new Fetcher(store, { fetch: fetch });
213
+ store.updater = new UpdateManager(store);
214
+ const util = createUtilityLogic(store, createAclLogic(store), createContainerLogic(store))
215
+ profileLogic = createProfileLogic(store, authn, util)
216
+ })
217
+ it('exists', () => {
218
+ expect(profileLogic.loadPreferences).toBeInstanceOf(Function)
219
+ })
220
+ it('loads data', async () => {
221
+ const result = await profileLogic.loadPreferences(alice)
222
+ expect(result).toBeInstanceOf(Object)
223
+ expect(result.uri).toEqual(AlicePreferencesFile.uri)
224
+ expect(store.holds(user, ns.rdf('type'), ns.vcard('Individual'), profile)).toEqual(true)
225
+ expect(store.statementsMatching(null, null, null, profile).length).toEqual(4)
226
+
227
+ expect(store.statementsMatching(null, null, null, AlicePreferencesFile).length).toEqual(2)
228
+ expect(store.holds(user, ns.solid('privateTypeIndex'), AlicePrivateTypeIndex, AlicePreferencesFile)).toEqual(true)
229
+ })
230
+ it('creates new file', async () => {
231
+ const result = await profileLogic.loadPreferences(boby)
232
+
233
+ const patchRequest = requests[0]
234
+ expect(patchRequest.method).toEqual('PATCH')
235
+ expect(patchRequest.url).toEqual(boby.doc().uri)
236
+ const text = await patchRequest.text()
237
+ expect(text).toContain('INSERT DATA { <https://boby.example.com/profile/card.ttl#me> <http://www.w3.org/ns/pim/space#preferencesFile> <https://boby.example.com/Settings/Preferences.ttl> .')
238
+
239
+ const putRequest = requests[1]
240
+ expect(putRequest.method).toEqual('PUT')
241
+ expect(putRequest.url).toEqual('https://boby.example.com/Settings/Preferences.ttl')
242
+ expect(web[putRequest.url]).toEqual('')
243
+
244
+ })
245
+ })
246
+ })