solid-logic 3.0.9-f51524a8 → 3.0.9-ff53d0a

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 (127) hide show
  1. package/README.md +103 -2
  2. package/dist/acl/aclLogic.js +118 -0
  3. package/dist/acl/aclLogic.js.map +1 -0
  4. package/{lib → dist}/authSession/authSession.d.ts.map +1 -1
  5. package/dist/authSession/authSession.js +3 -0
  6. package/dist/authSession/authSession.js.map +1 -0
  7. package/{lib → dist}/authn/SolidAuthnLogic.d.ts.map +1 -1
  8. package/dist/authn/SolidAuthnLogic.js +110 -0
  9. package/dist/authn/SolidAuthnLogic.js.map +1 -0
  10. package/dist/authn/authUtil.js +67 -0
  11. package/dist/authn/authUtil.js.map +1 -0
  12. package/dist/chat/chatLogic.js +157 -0
  13. package/dist/chat/chatLogic.js.map +1 -0
  14. package/dist/inbox/inboxLogic.js +52 -0
  15. package/dist/inbox/inboxLogic.js.map +1 -0
  16. package/dist/index.js +13 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/issuer/issuerLogic.js +37 -0
  19. package/dist/issuer/issuerLogic.js.map +1 -0
  20. package/dist/logic/CustomError.js +28 -0
  21. package/dist/logic/CustomError.js.map +1 -0
  22. package/dist/logic/solidLogic.js +65 -0
  23. package/dist/logic/solidLogic.js.map +1 -0
  24. package/dist/logic/solidLogicSingleton.js +18 -0
  25. package/dist/logic/solidLogicSingleton.js.map +1 -0
  26. package/dist/profile/profileLogic.js +129 -0
  27. package/dist/profile/profileLogic.js.map +1 -0
  28. package/dist/solid-logic.esm.js +8560 -0
  29. package/dist/solid-logic.esm.js.map +1 -0
  30. package/dist/solid-logic.esm.min.js +32 -0
  31. package/dist/solid-logic.esm.min.js.map +1 -0
  32. package/dist/solid-logic.umd.js +8597 -0
  33. package/dist/solid-logic.umd.js.map +1 -0
  34. package/dist/solid-logic.umd.min.js +32 -0
  35. package/dist/solid-logic.umd.min.js.map +1 -0
  36. package/dist/typeIndex/typeIndexLogic.js +186 -0
  37. package/dist/typeIndex/typeIndexLogic.js.map +1 -0
  38. package/dist/types.js +2 -0
  39. package/dist/types.js.map +1 -0
  40. package/{src/util/containerLogic.ts → dist/util/containerLogic.js} +18 -26
  41. package/dist/util/containerLogic.js.map +1 -0
  42. package/dist/util/debug.js +14 -0
  43. package/dist/util/debug.js.map +1 -0
  44. package/dist/util/ns.js +5 -0
  45. package/dist/util/ns.js.map +1 -0
  46. package/dist/util/utilityLogic.js +144 -0
  47. package/dist/util/utilityLogic.js.map +1 -0
  48. package/dist/util/utils.js +39 -0
  49. package/dist/util/utils.js.map +1 -0
  50. package/package.json +28 -9
  51. package/babel.config.js +0 -6
  52. package/eslint.config.js +0 -28
  53. package/jest.config.js +0 -17
  54. package/lib/solid-logic.js +0 -107
  55. package/lib/solid-logic.js.map +0 -1
  56. package/rollup.config.js +0 -29
  57. package/src/acl/aclLogic.ts +0 -156
  58. package/src/authSession/authSession.ts +0 -13
  59. package/src/authn/SolidAuthnLogic.ts +0 -126
  60. package/src/authn/authUtil.ts +0 -70
  61. package/src/chat/chatLogic.ts +0 -226
  62. package/src/inbox/inboxLogic.ts +0 -59
  63. package/src/index.ts +0 -21
  64. package/src/issuer/issuerLogic.ts +0 -40
  65. package/src/logic/CustomError.ts +0 -29
  66. package/src/logic/solidLogic.ts +0 -76
  67. package/src/logic/solidLogicSingleton.ts +0 -20
  68. package/src/profile/profileLogic.ts +0 -125
  69. package/src/typeIndex/typeIndexLogic.ts +0 -198
  70. package/src/types.ts +0 -122
  71. package/src/util/debug.ts +0 -16
  72. package/src/util/ns.ts +0 -5
  73. package/src/util/utilityLogic.ts +0 -156
  74. package/src/util/utils.ts +0 -52
  75. package/src/versionInfo.ts +0 -32
  76. package/test/aclLogic.test.ts +0 -24
  77. package/test/authUtil.test.ts +0 -23
  78. package/test/chatLogic.test.ts +0 -322
  79. package/test/container.test.ts +0 -58
  80. package/test/helpers/dataSetup.ts +0 -135
  81. package/test/helpers/setup.ts +0 -22
  82. package/test/inboxLogic.test.ts +0 -209
  83. package/test/logic.test.ts +0 -29
  84. package/test/profileLogic.test.ts +0 -248
  85. package/test/solidAuthLogic.test.ts +0 -49
  86. package/test/typeIndexLogic.test.ts +0 -255
  87. package/test/utilityLogic.test.ts +0 -180
  88. package/test/utils.test.ts +0 -32
  89. package/timestamp.sh +0 -13
  90. package/tsconfig.json +0 -77
  91. package/tsconfig.test.json +0 -8
  92. /package/{lib → dist}/acl/aclLogic.d.ts +0 -0
  93. /package/{lib → dist}/acl/aclLogic.d.ts.map +0 -0
  94. /package/{lib → dist}/authSession/authSession.d.ts +0 -0
  95. /package/{lib → dist}/authn/SolidAuthnLogic.d.ts +0 -0
  96. /package/{lib → dist}/authn/authUtil.d.ts +0 -0
  97. /package/{lib → dist}/authn/authUtil.d.ts.map +0 -0
  98. /package/{lib → dist}/chat/chatLogic.d.ts +0 -0
  99. /package/{lib → dist}/chat/chatLogic.d.ts.map +0 -0
  100. /package/{lib → dist}/inbox/inboxLogic.d.ts +0 -0
  101. /package/{lib → dist}/inbox/inboxLogic.d.ts.map +0 -0
  102. /package/{lib → dist}/index.d.ts +0 -0
  103. /package/{lib → dist}/index.d.ts.map +0 -0
  104. /package/{lib → dist}/issuer/issuerLogic.d.ts +0 -0
  105. /package/{lib → dist}/issuer/issuerLogic.d.ts.map +0 -0
  106. /package/{lib → dist}/logic/CustomError.d.ts +0 -0
  107. /package/{lib → dist}/logic/CustomError.d.ts.map +0 -0
  108. /package/{lib → dist}/logic/solidLogic.d.ts +0 -0
  109. /package/{lib → dist}/logic/solidLogic.d.ts.map +0 -0
  110. /package/{lib → dist}/logic/solidLogicSingleton.d.ts +0 -0
  111. /package/{lib → dist}/logic/solidLogicSingleton.d.ts.map +0 -0
  112. /package/{lib → dist}/profile/profileLogic.d.ts +0 -0
  113. /package/{lib → dist}/profile/profileLogic.d.ts.map +0 -0
  114. /package/{lib → dist}/typeIndex/typeIndexLogic.d.ts +0 -0
  115. /package/{lib → dist}/typeIndex/typeIndexLogic.d.ts.map +0 -0
  116. /package/{lib → dist}/types.d.ts +0 -0
  117. /package/{lib → dist}/types.d.ts.map +0 -0
  118. /package/{lib → dist}/util/containerLogic.d.ts +0 -0
  119. /package/{lib → dist}/util/containerLogic.d.ts.map +0 -0
  120. /package/{lib → dist}/util/debug.d.ts +0 -0
  121. /package/{lib → dist}/util/debug.d.ts.map +0 -0
  122. /package/{lib → dist}/util/ns.d.ts +0 -0
  123. /package/{lib → dist}/util/ns.d.ts.map +0 -0
  124. /package/{lib → dist}/util/utilityLogic.d.ts +0 -0
  125. /package/{lib → dist}/util/utilityLogic.d.ts.map +0 -0
  126. /package/{lib → dist}/util/utils.d.ts +0 -0
  127. /package/{lib → dist}/util/utils.d.ts.map +0 -0
@@ -1,135 +0,0 @@
1
- import { sym } from 'rdflib'
2
- import * as rdf from "rdflib";
3
- import solidNamespace from "solid-namespace";
4
- import { SolidNamespace } from '../../src/types';
5
- const ns: SolidNamespace = solidNamespace(rdf);
6
-
7
- //------ Club -------------------------------------------------------
8
- const club = sym('https://club.example.com/profile/card.ttl#it')
9
- const ClubPreferencesFile = sym('https://club.example.com/settings/prefs.ttl')
10
- const ClubPublicTypeIndex = sym('https://club.example.com/profile/public-type-index.ttl')
11
- const ClubPrivateTypeIndex = sym('https://club.example.com/settings/private-type-index.ttl')
12
-
13
- const ClubProfile = `
14
-
15
- <#it> a vcard:Organization;
16
- space:preferencesFile ${ClubPreferencesFile};
17
- solid:publicTypeIndex ${ClubPublicTypeIndex};
18
- vcard:fn "Card Club" .
19
- `
20
- const ClubPreferences = `
21
- ${club} solid:privateTypeIndex ${ClubPrivateTypeIndex} .
22
- `
23
- const ClubPublicTypes = `
24
-
25
- :chat1 solid:forClass meeting:LongChat; solid:instance <../publicStuff/ourChat.ttl#this> .
26
-
27
- :todo solid:forClass wf:Tracker; solid:instance <../publicStuff/actionItems.ttl#this>.
28
-
29
- :issues solid:forClass wf:Tracker; solid:instance <../project4/clubIssues.ttl#this>.
30
- `;
31
-
32
- const ClubPrivateTypes = `
33
- :id1592319218311 solid:forClass wf:Tracker; solid:instance <../privateStuff/ToDo.ttl#this>.
34
-
35
- :id1592319391415 solid:forClass wf:Tracker; solid:instance <../privateStuff/Goals.ttl#this>.
36
-
37
- :id1595595377864 solid:forClass wf:Tracker; solid:instance <../privateStuff/tasks.ttl#this>.
38
-
39
- :id1596123375929 solid:forClass meeting:Meeting; solid:instance <../project4/clubMeeting.ttl#this>.
40
-
41
- `;
42
-
43
- //------ Alice -------------------------------------------------------
44
- const alice = sym("https://alice.example.com/profile/card.ttl#me")
45
- const AliceProfileFile = alice.doc()
46
- const AlicePreferencesFile = sym('https://alice.example.com/settings/prefs.ttl')
47
- const AlicePublicTypeIndex = sym('https://alice.example.com/profile/public-type-index.ttl')
48
- const AlicePrivateTypeIndex = sym('https://alice.example.com/settings/private-type-index.ttl')
49
- const aliceDir = alice.dir();
50
- const AlicePhotoFolder = sym((aliceDir && aliceDir.uri ? aliceDir.uri : "") + "Photos/")
51
- const AliceProfile = `
52
- <#me> a vcard:Individual;
53
- space:preferencesFile ${AlicePreferencesFile};
54
- solid:publicTypeIndex ${AlicePublicTypeIndex};
55
- vcard:fn "Alice" .
56
- `
57
- const AlicePreferences = `
58
- ${alice} solid:privateTypeIndex ${AlicePrivateTypeIndex};
59
- solid:community ${club} .
60
- `
61
- const AlicePublicTypes = `
62
-
63
- :chat1 solid:forClass meeting:LongChat; solid:instance <../publicStuff/myChat.ttl#this> .
64
-
65
- :todo solid:forClass wf:Tracker; solid:instance <../publicStuff/actionItems.ttl#this>.
66
-
67
- :issues solid:forClass wf:Tracker; solid:instance <../project4/issues.ttl#this>.
68
-
69
- :photos solid:forClass schema:Image; solid:instanceContainer ${AlicePhotoFolder} .
70
- `;
71
-
72
- const AlicePrivateTypes = `
73
- :id1592319218311 solid:forClass wf:Tracker; solid:instance <../privateStuff/ToDo.ttl#this>.
74
-
75
- :id1592319391415 solid:forClass wf:Tracker; solid:instance <../privateStuff/Goals.ttl#this>.
76
-
77
- :id1595595377864 solid:forClass wf:Tracker; solid:instance <../privateStuff/workingOn.ttl#this>.
78
-
79
- :id1596123375929 solid:forClass meeting:Meeting; solid:instance <../project4/meeting1.ttl#this>.
80
-
81
- `;
82
-
83
- const AlicePhotos = `
84
- <>
85
- a ldp:BasicContainer, ldp:Container;
86
- dct:modified "2021-04-26T05:34:16Z"^^xsd:dateTime;
87
- ldp:contains
88
- <photo1.png>, <photo2.png>, <photo3.png> ;
89
- stat:mtime 1619415256.541;
90
- stat:size 4096 .
91
- `
92
-
93
- //------ Bob -------------------------------------------------------
94
- const bob = sym('https://bob.example.com/profile/card.ttl#me')
95
-
96
- const BobProfile = `
97
- <#me> a vcard:Individual;
98
- vcard:fn "Bob" .
99
- `
100
-
101
- //------ Boby -------------------------------------------------------
102
- const boby = sym('https://boby.example.com/profile/card.ttl#me')
103
-
104
- const BobyProfile = `
105
- <#me> a vcard:Individual;
106
- vcard:fn "Boby" .
107
- `
108
- export function loadWebObject() {
109
- const web = {}
110
- web[alice.doc().uri] = AliceProfile
111
- web[AlicePreferencesFile.uri] = AlicePreferences
112
- web[AlicePrivateTypeIndex.uri] = AlicePrivateTypes
113
- web[AlicePublicTypeIndex.uri] = AlicePublicTypes
114
- web[AlicePhotoFolder.uri] = AlicePhotos
115
- web[bob.doc().uri] = BobProfile
116
- web[boby.doc().uri] = BobyProfile
117
-
118
- web[club.doc().uri] = ClubProfile
119
- web[ClubPreferencesFile.uri] = ClubPreferences
120
- web[ClubPrivateTypeIndex.uri] = ClubPrivateTypes
121
- web[ClubPublicTypeIndex.uri] = ClubPublicTypes
122
- return web
123
- }
124
-
125
- function clearLocalStore(store) {
126
- store.statements.slice().forEach(store.remove.bind(store))
127
- }
128
-
129
- export {
130
- alice, bob, boby, club,
131
- AlicePhotoFolder, AlicePreferences, AlicePhotos, AlicePreferencesFile, AlicePrivateTypeIndex, AlicePrivateTypes, AliceProfile, AliceProfileFile, AlicePublicTypeIndex, AlicePublicTypes,
132
- BobProfile,
133
- ClubPreferences, ClubPreferencesFile, ClubPrivateTypeIndex, ClubPrivateTypes, ClubProfile, ClubPublicTypeIndex, ClubPublicTypes,
134
- clearLocalStore
135
- }
@@ -1,22 +0,0 @@
1
- import { error, log, trace, warn } from '../../src/util/debug'
2
- import fetchMock from "jest-fetch-mock";
3
- import { TextEncoder as UtilTextEncoder, TextDecoder as UtilTextDecoder } from 'util'
4
-
5
- if (typeof global.TextEncoder === 'undefined') {
6
- global.TextEncoder = UtilTextEncoder as unknown as { new (): TextEncoder; prototype: TextEncoder }
7
- }
8
- if (typeof global.TextDecoder === 'undefined') {
9
- global.TextDecoder = UtilTextDecoder as unknown as { new (): TextDecoder; prototype: TextDecoder }
10
- }
11
-
12
-
13
- fetchMock.enableMocks();
14
- // We don't want to output debug messages to console as part of the tests
15
- jest.mock('../../src/util/debug')
16
-
17
- export function silenceDebugMessages () {
18
- (log as any).mockImplementation(() => null)
19
- ;(warn as any).mockImplementation(() => null)
20
- ;(error as any).mockImplementation(() => null)
21
- ;(trace as any).mockImplementation(() => null)
22
- }
@@ -1,209 +0,0 @@
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'
11
-
12
- const alice = sym('https://alice.example.com/profile/card#me')
13
- const bob = sym('https://bob.example.com/profile/card#me')
14
-
15
- describe('Inbox logic', () => {
16
- let store
17
- let inboxLogic
18
- beforeEach(() => {
19
- fetchMock.resetMocks()
20
- fetchMock.mockResponse('Not Found', {
21
- status: 404,
22
- })
23
- store = new Store()
24
- store.fetcher = new Fetcher(store, { fetch: fetch })
25
- store.updater = new UpdateManager(store)
26
- const authn = {
27
- currentUser: () => {
28
- return alice
29
- },
30
- }
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)
36
- })
37
-
38
- describe('getNewMessages', () => {
39
- describe('When inbox is empty', () => {
40
- let result
41
- beforeEach(async () => {
42
- bobHasAnInbox()
43
- inboxIsEmpty()
44
- result = await inboxLogic.getNewMessages(bob)
45
- })
46
- it('Resolves to an empty array', () => {
47
- expect(result).toEqual([])
48
- })
49
- })
50
- describe('When container has some containment triples', () => {
51
- let result
52
- beforeEach(async () => {
53
- bobHasAnInbox()
54
- inboxHasSomeContainmentTriples()
55
- const messages = await inboxLogic.getNewMessages(bob)
56
- result = messages.map(oneMessage => oneMessage.value)
57
- })
58
- it('Resolves to an array with URLs of non-container resources in inbox', () => {
59
- expect(result.sort()).toEqual([
60
- 'https://container.com/foo.txt'
61
- ].sort())
62
- })
63
- })
64
- })
65
- describe('createInboxFor', () => {
66
- beforeEach(async () => {
67
- aliceHasValidProfile()
68
- // First for the PUT:
69
- fetchMock.mockOnceIf(
70
- 'https://alice.example.com/p2p-inboxes/Peer%20Person/',
71
- 'Created', {
72
- status: 201
73
- }
74
- )
75
- // Then for the GET to read the ACL link:
76
- fetchMock.mockOnceIf(
77
- 'https://alice.example.com/p2p-inboxes/Peer%20Person/',
78
- ' ', {
79
- status: 200,
80
- headers: {
81
- Link: '<https://some/acl>; rel="acl"',
82
- }
83
- }
84
- )
85
- fetchMock.mockIf('https://some/acl', 'Created', { status: 201 })
86
-
87
- await inboxLogic.createInboxFor('https://peer.com/#me', 'Peer Person')
88
- })
89
- it('creates the inbox', () => {
90
- expect(fetchMock.mock.calls).toEqual([
91
- [ 'https://alice.example.com/profile/card', fetchMock.mock.calls[0][1] ],
92
- [ 'https://alice.example.com/p2p-inboxes/Peer%20Person/', {
93
- body: ' ',
94
- headers: {
95
- 'Content-Type': 'text/turtle',
96
- 'If-None-Match': '*',
97
- Link: '<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"',
98
- },
99
- method: 'PUT'
100
- }],
101
- [ 'https://alice.example.com/p2p-inboxes/Peer%20Person/', fetchMock.mock.calls[2][1] ],
102
- [ 'https://some/acl', {
103
- body: '@prefix acl: <http://www.w3.org/ns/auth/acl#>.\n' +
104
- '\n' +
105
- '<#alice> a acl:Authorization;\n' +
106
- ' acl:agent <https://alice.example.com/profile/card#me>;\n' +
107
- ' acl:accessTo <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
108
- ' acl:default <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
109
- ' acl:mode acl:Read, acl:Write, acl:Control.\n' +
110
- '<#bobAccessTo> a acl:Authorization;\n' +
111
- ' acl:agent <https://peer.com/#me>;\n' +
112
- ' acl:accessTo <https://alice.example.com/p2p-inboxes/Peer%20Person/>;\n' +
113
- ' acl:mode acl:Append.\n',
114
- headers: [
115
- [ 'Content-Type', 'text/turtle' ]
116
- ],
117
- method: 'PUT'
118
- }]
119
- ])
120
- })
121
-
122
- })
123
- describe('markAsRead', () => {
124
- beforeEach(async () => {
125
- fetchMock.mockOnceIf(
126
- 'https://container.com/item.ttl',
127
- '<#some> <#inbox> <#item> .',
128
- {
129
- headers: { 'Content-Type': 'text/turtle' },
130
- }
131
- )
132
- fetchMock.mockOnceIf(
133
- 'https://container.com/archive/2111/03/31/item.ttl',
134
- 'Created',
135
- {
136
- status: 201,
137
- headers: { 'Content-Type': 'text/turtle' },
138
- }
139
- )
140
- await inboxLogic.markAsRead('https://container.com/item.ttl', new Date('31 March 2111 UTC'))
141
- })
142
- it('moves the item to archive', async () => {
143
- expect(fetchMock.mock.calls).toEqual([
144
- [ 'https://container.com/item.ttl' ],
145
- [
146
- 'https://container.com/archive/2111/03/31/item.ttl',
147
- {
148
- 'body': '<#some> <#inbox> <#item> .',
149
- 'headers': [
150
- [
151
- 'Content-Type',
152
- 'text/turtle',
153
- ],
154
- ],
155
- 'method': 'PUT',
156
- },
157
- ],
158
- [ 'https://container.com/item.ttl', { method: 'DELETE' } ],
159
- ])
160
- })
161
- })
162
-
163
- function aliceHasValidProfile() {
164
- fetchMock.mockOnceIf(
165
- 'https://alice.example.com/profile/card',
166
- `
167
- <https://alice.example.com/profile/card#me>
168
- <http://www.w3.org/ns/pim/space#storage> <https://alice.example.com/> ;
169
- <http://www.w3.org/ns/solid/terms#privateTypeIndex> <https://alice.example.com/settings/privateTypeIndex.ttl> ;
170
- .`,
171
- {
172
- headers: {
173
- 'Content-Type': 'text/turtle',
174
- },
175
- }
176
- )
177
- }
178
-
179
- function bobHasAnInbox() {
180
- fetchMock.mockOnceIf(
181
- 'https://bob.example.com/profile/card',
182
- '<https://bob.example.com/profile/card#me><http://www.w3.org/ns/ldp#inbox><https://container.com/>.',
183
- {
184
- headers: { 'Content-Type': 'text/turtle' },
185
- }
186
- )
187
- }
188
-
189
- function inboxIsEmpty() {
190
- fetchMock.mockOnceIf(
191
- 'https://container.com/',
192
- ' ', // FIXME: https://github.com/jefflau/jest-fetch-mock/issues/189
193
- {
194
- headers: { 'Content-Type': 'text/turtle' },
195
- }
196
- )
197
- }
198
-
199
- function inboxHasSomeContainmentTriples() {
200
- fetchMock.mockOnceIf(
201
- 'https://container.com/',
202
- '<.> <http://www.w3.org/ns/ldp#contains> <./foo.txt>, <./bar/> .',
203
- {
204
- headers: { 'Content-Type': 'text/turtle' },
205
- }
206
- )
207
- }
208
-
209
- })
@@ -1,29 +0,0 @@
1
- import { solidLogicSingleton } from '../src/logic/solidLogicSingleton'
2
- import { silenceDebugMessages } from './helpers/setup'
3
-
4
- silenceDebugMessages()
5
-
6
- describe('store', () => {
7
- it('exists', () => {
8
- expect(solidLogicSingleton.store).toBeInstanceOf(Object)
9
- })
10
- })
11
-
12
- describe('store.fetcher', () => {
13
- it('exists', () => {
14
- expect(solidLogicSingleton.store.fetcher).toBeInstanceOf(Object)
15
- })
16
- })
17
-
18
- describe('store.updater', () => {
19
- it('exists', () => {
20
- expect(solidLogicSingleton.store.updater).toBeInstanceOf(Object)
21
- })
22
- })
23
-
24
- describe('authn', () => {
25
- it('exists', () => {
26
- expect(solidLogicSingleton.authn).toBeInstanceOf(Object)
27
- })
28
- })
29
-
@@ -1,248 +0,0 @@
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: Request[] = []
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
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
151
- const result = await profileLogic.silencedLoadPreferences(bob)
152
-
153
- const patchRequest = requests[0]
154
- expect(patchRequest.method).toEqual('PATCH')
155
- expect(patchRequest.url).toEqual(bob.doc().uri)
156
- const text = await patchRequest.text()
157
- 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> .')
158
-
159
- const putRequest = requests[1]
160
- expect(putRequest.method).toEqual('PUT')
161
- expect(putRequest.url).toEqual('https://bob.example.com/Settings/Preferences.ttl')
162
- expect(web[putRequest.url]).toEqual('')
163
-
164
- })
165
- })
166
-
167
-
168
- describe('loadPreferences', () => {
169
- window.$SolidTestEnvironment = { username: boby.uri }
170
- let store
171
- requests = []
172
- const statustoBeReturned = 200
173
- let web = {}
174
- const authn = {
175
- currentUser: () => {
176
- return boby
177
- },
178
- }
179
- beforeEach(() => {
180
- fetchMock.resetMocks()
181
- web = loadWebObject()
182
- requests = []
183
- fetchMock.mockIf(/^https?.*$/, async req => {
184
-
185
- if (req.method !== 'GET') {
186
- requests.push(req)
187
- if (req.method === 'PUT') {
188
- const contents = await req.text()
189
- web[req.url] = contents // Update our dummy web
190
- console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`)
191
- }
192
- return { status: statustoBeReturned }
193
- }
194
- const contents = web[req.url]
195
- if (contents !== undefined) { //
196
- return {
197
- body: prefixes + contents, // Add namespaces to anything
198
- status: 200,
199
- headers: {
200
- 'Content-Type': 'text/turtle',
201
- 'WAC-Allow': 'user="write", public="read"',
202
- 'Accept-Patch': 'application/sparql-update'
203
- }
204
- }
205
- } // if contents
206
- return {
207
- status: 404,
208
- body: 'Not Found'
209
- }
210
- })
211
-
212
- store = new Store()
213
- store.fetcher = new Fetcher(store, { fetch: fetch })
214
- store.updater = new UpdateManager(store)
215
- const util = createUtilityLogic(store, createAclLogic(store), createContainerLogic(store))
216
- profileLogic = createProfileLogic(store, authn, util)
217
- })
218
- it('exists', () => {
219
- expect(profileLogic.loadPreferences).toBeInstanceOf(Function)
220
- })
221
- it('loads data', async () => {
222
- const result = await profileLogic.loadPreferences(alice)
223
- expect(result).toBeInstanceOf(Object)
224
- expect(result.uri).toEqual(AlicePreferencesFile.uri)
225
- expect(store.holds(user, ns.rdf('type'), ns.vcard('Individual'), profile)).toEqual(true)
226
- expect(store.statementsMatching(null, null, null, profile).length).toEqual(4)
227
-
228
- expect(store.statementsMatching(null, null, null, AlicePreferencesFile).length).toEqual(2)
229
- expect(store.holds(user, ns.solid('privateTypeIndex'), AlicePrivateTypeIndex, AlicePreferencesFile)).toEqual(true)
230
- })
231
- it('creates new file', async () => {
232
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
233
- const result = await profileLogic.loadPreferences(boby)
234
-
235
- const patchRequest = requests[0]
236
- expect(patchRequest.method).toEqual('PATCH')
237
- expect(patchRequest.url).toEqual(boby.doc().uri)
238
- const text = await patchRequest.text()
239
- 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> .')
240
-
241
- const putRequest = requests[1]
242
- expect(putRequest.method).toEqual('PUT')
243
- expect(putRequest.url).toEqual('https://boby.example.com/Settings/Preferences.ttl')
244
- expect(web[putRequest.url]).toEqual('')
245
-
246
- })
247
- })
248
- })