cojson 0.10.8 → 0.11.0
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +20 -0
- package/dist/CoValuesStore.d.ts +12 -0
- package/dist/CoValuesStore.d.ts.map +1 -0
- package/dist/PeerKnownStates.d.ts +38 -0
- package/dist/PeerKnownStates.d.ts.map +1 -0
- package/dist/PeerState.d.ts +46 -0
- package/dist/PeerState.d.ts.map +1 -0
- package/dist/PriorityBasedMessageQueue.d.ts +18 -0
- package/dist/PriorityBasedMessageQueue.d.ts.map +1 -0
- package/dist/SyncStateManager.d.ts +20 -0
- package/dist/SyncStateManager.d.ts.map +1 -0
- package/dist/base64url.d.ts +3 -0
- package/dist/base64url.d.ts.map +1 -0
- package/dist/base64url.test.d.ts +2 -0
- package/dist/base64url.test.d.ts.map +1 -0
- package/dist/coValue.d.ts +52 -0
- package/dist/coValue.d.ts.map +1 -0
- package/dist/coValueCore.d.ts +143 -0
- package/dist/coValueCore.d.ts.map +1 -0
- package/dist/coValueCore.js +3 -9
- package/dist/coValueCore.js.map +1 -1
- package/dist/coValueState.d.ts +58 -0
- package/dist/coValueState.d.ts.map +1 -0
- package/dist/coValues/account.d.ts +69 -0
- package/dist/coValues/account.d.ts.map +1 -0
- package/dist/coValues/account.js +9 -10
- package/dist/coValues/account.js.map +1 -1
- package/dist/coValues/coList.d.ts +163 -0
- package/dist/coValues/coList.d.ts.map +1 -0
- package/dist/coValues/coMap.d.ts +142 -0
- package/dist/coValues/coMap.d.ts.map +1 -0
- package/dist/coValues/coPlainText.d.ts +33 -0
- package/dist/coValues/coPlainText.d.ts.map +1 -0
- package/dist/coValues/coStream.d.ts +109 -0
- package/dist/coValues/coStream.d.ts.map +1 -0
- package/dist/coValues/group.d.ts +143 -0
- package/dist/coValues/group.d.ts.map +1 -0
- package/dist/coValues/group.js +52 -6
- package/dist/coValues/group.js.map +1 -1
- package/dist/coreToCoValue.d.ts +15 -0
- package/dist/coreToCoValue.d.ts.map +1 -0
- package/dist/crypto/PureJSCrypto.d.ts +50 -0
- package/dist/crypto/PureJSCrypto.d.ts.map +1 -0
- package/dist/crypto/WasmCrypto.d.ts +49 -0
- package/dist/crypto/WasmCrypto.d.ts.map +1 -0
- package/dist/crypto/crypto.d.ts +142 -0
- package/dist/crypto/crypto.d.ts.map +1 -0
- package/dist/exports.d.ts +84 -0
- package/dist/exports.d.ts.map +1 -0
- package/dist/ids.d.ts +23 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/jsonStringify.d.ts +7 -0
- package/dist/jsonStringify.d.ts.map +1 -0
- package/dist/jsonValue.d.ts +45 -0
- package/dist/jsonValue.d.ts.map +1 -0
- package/dist/localNode.d.ts +111 -0
- package/dist/localNode.d.ts.map +1 -0
- package/dist/localNode.js +3 -5
- package/dist/localNode.js.map +1 -1
- package/dist/logger.d.ts +33 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/permissions.d.ts +24 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +5 -9
- package/dist/permissions.js.map +1 -1
- package/dist/priority.d.ts +19 -0
- package/dist/priority.d.ts.map +1 -0
- package/dist/storage/FileSystem.d.ts +37 -0
- package/dist/storage/FileSystem.d.ts.map +1 -0
- package/dist/storage/chunksAndKnownStates.d.ts +7 -0
- package/dist/storage/chunksAndKnownStates.d.ts.map +1 -0
- package/dist/storage/index.d.ts +52 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/streamUtils.d.ts +13 -0
- package/dist/streamUtils.d.ts.map +1 -0
- package/dist/sync.d.ts +97 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/tests/PeerKnownStates.test.d.ts +2 -0
- package/dist/tests/PeerKnownStates.test.d.ts.map +1 -0
- package/dist/tests/PeerKnownStates.test.js +82 -0
- package/dist/tests/PeerKnownStates.test.js.map +1 -0
- package/dist/tests/PeerState.test.d.ts +2 -0
- package/dist/tests/PeerState.test.d.ts.map +1 -0
- package/dist/tests/PeerState.test.js +188 -0
- package/dist/tests/PeerState.test.js.map +1 -0
- package/dist/tests/PriorityBasedMessageQueue.test.d.ts +2 -0
- package/dist/tests/PriorityBasedMessageQueue.test.d.ts.map +1 -0
- package/dist/tests/PriorityBasedMessageQueue.test.js +120 -0
- package/dist/tests/PriorityBasedMessageQueue.test.js.map +1 -0
- package/dist/tests/SyncStateManager.test.d.ts +2 -0
- package/dist/tests/SyncStateManager.test.d.ts.map +1 -0
- package/dist/tests/SyncStateManager.test.js +127 -0
- package/dist/tests/SyncStateManager.test.js.map +1 -0
- package/dist/tests/account.test.d.ts +2 -0
- package/dist/tests/account.test.d.ts.map +1 -0
- package/dist/tests/account.test.js +66 -0
- package/dist/tests/account.test.js.map +1 -0
- package/dist/tests/coList.test.d.ts +2 -0
- package/dist/tests/coList.test.d.ts.map +1 -0
- package/dist/tests/coList.test.js +120 -0
- package/dist/tests/coList.test.js.map +1 -0
- package/dist/tests/coMap.test.d.ts +2 -0
- package/dist/tests/coMap.test.d.ts.map +1 -0
- package/dist/tests/coMap.test.js +164 -0
- package/dist/tests/coMap.test.js.map +1 -0
- package/dist/tests/coPlainText.test.d.ts +2 -0
- package/dist/tests/coPlainText.test.d.ts.map +1 -0
- package/dist/tests/coPlainText.test.js +99 -0
- package/dist/tests/coPlainText.test.js.map +1 -0
- package/dist/tests/coStream.test.d.ts +2 -0
- package/dist/tests/coStream.test.d.ts.map +1 -0
- package/dist/tests/coStream.test.js +206 -0
- package/dist/tests/coStream.test.js.map +1 -0
- package/dist/tests/coValueCore.test.d.ts +2 -0
- package/dist/tests/coValueCore.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.test.js +164 -0
- package/dist/tests/coValueCore.test.js.map +1 -0
- package/dist/tests/coValueState.test.d.ts +2 -0
- package/dist/tests/coValueState.test.d.ts.map +1 -0
- package/dist/tests/coValueState.test.js +364 -0
- package/dist/tests/coValueState.test.js.map +1 -0
- package/dist/tests/crypto.test.d.ts +2 -0
- package/dist/tests/crypto.test.d.ts.map +1 -0
- package/dist/tests/crypto.test.js +144 -0
- package/dist/tests/crypto.test.js.map +1 -0
- package/dist/tests/cryptoImpl.test.d.ts +2 -0
- package/dist/tests/cryptoImpl.test.d.ts.map +1 -0
- package/dist/tests/cryptoImpl.test.js +144 -0
- package/dist/tests/cryptoImpl.test.js.map +1 -0
- package/dist/tests/group.test.d.ts +2 -0
- package/dist/tests/group.test.d.ts.map +1 -0
- package/dist/tests/group.test.js +576 -0
- package/dist/tests/group.test.js.map +1 -0
- package/dist/tests/logger.test.d.ts +2 -0
- package/dist/tests/logger.test.d.ts.map +1 -0
- package/dist/tests/logger.test.js +118 -0
- package/dist/tests/logger.test.js.map +1 -0
- package/dist/tests/permissions.test.d.ts +2 -0
- package/dist/tests/permissions.test.d.ts.map +1 -0
- package/dist/tests/permissions.test.js +2051 -0
- package/dist/tests/permissions.test.js.map +1 -0
- package/dist/tests/priority.test.d.ts +2 -0
- package/dist/tests/priority.test.d.ts.map +1 -0
- package/dist/tests/priority.test.js +61 -0
- package/dist/tests/priority.test.js.map +1 -0
- package/dist/tests/sync.test.d.ts +2 -0
- package/dist/tests/sync.test.d.ts.map +1 -0
- package/dist/tests/sync.test.js +1548 -0
- package/dist/tests/sync.test.js.map +1 -0
- package/dist/tests/testUtils.d.ts +142 -0
- package/dist/tests/testUtils.d.ts.map +1 -0
- package/dist/tests/testUtils.js +315 -0
- package/dist/tests/testUtils.js.map +1 -0
- package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts +4 -0
- package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts.map +1 -0
- package/dist/typeUtils/expectGroup.d.ts +4 -0
- package/dist/typeUtils/expectGroup.d.ts.map +1 -0
- package/dist/typeUtils/isAccountID.d.ts +4 -0
- package/dist/typeUtils/isAccountID.d.ts.map +1 -0
- package/dist/typeUtils/isCoValue.d.ts +4 -0
- package/dist/typeUtils/isCoValue.d.ts.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +6 -6
- package/src/coValueCore.ts +3 -9
- package/src/coValues/account.ts +15 -15
- package/src/coValues/group.ts +85 -12
- package/src/jsonValue.ts +9 -5
- package/src/localNode.ts +3 -5
- package/src/permissions.ts +5 -15
- package/src/tests/coValueCore.test.ts +2 -2
- package/src/tests/group.test.ts +187 -0
- package/src/tests/permissions.test.ts +330 -57
- package/src/tests/testUtils.ts +4 -1
- package/tsconfig.json +4 -2
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { CoValueState } from "../coValueState.js";
|
|
3
|
+
import { RawCoList } from "../coValues/coList.js";
|
|
4
|
+
import { RawCoMap } from "../coValues/coMap.js";
|
|
5
|
+
import { RawCoStream } from "../coValues/coStream.js";
|
|
6
|
+
import { RawBinaryCoStream } from "../coValues/coStream.js";
|
|
7
|
+
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
8
|
+
import { LocalNode } from "../localNode.js";
|
|
9
|
+
import { createThreeConnectedNodes, createTwoConnectedNodes, loadCoValueOrFail, randomAnonymousAccountAndSessionID, } from "./testUtils.js";
|
|
10
|
+
const Crypto = await WasmCrypto.create();
|
|
11
|
+
test("Can create a RawCoMap in a group", () => {
|
|
12
|
+
const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
|
|
13
|
+
const group = node.createGroup();
|
|
14
|
+
const map = group.createMap();
|
|
15
|
+
expect(map.core.getCurrentContent().type).toEqual("comap");
|
|
16
|
+
expect(map instanceof RawCoMap).toEqual(true);
|
|
17
|
+
});
|
|
18
|
+
test("Can create a CoList in a group", () => {
|
|
19
|
+
const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
|
|
20
|
+
const group = node.createGroup();
|
|
21
|
+
const list = group.createList();
|
|
22
|
+
expect(list.core.getCurrentContent().type).toEqual("colist");
|
|
23
|
+
expect(list instanceof RawCoList).toEqual(true);
|
|
24
|
+
});
|
|
25
|
+
test("Can create a CoStream in a group", () => {
|
|
26
|
+
const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
|
|
27
|
+
const group = node.createGroup();
|
|
28
|
+
const stream = group.createStream();
|
|
29
|
+
expect(stream.core.getCurrentContent().type).toEqual("costream");
|
|
30
|
+
expect(stream instanceof RawCoStream).toEqual(true);
|
|
31
|
+
});
|
|
32
|
+
test("Can create a FileStream in a group", () => {
|
|
33
|
+
const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
|
|
34
|
+
const group = node.createGroup();
|
|
35
|
+
const stream = group.createBinaryStream();
|
|
36
|
+
expect(stream.core.getCurrentContent().type).toEqual("costream");
|
|
37
|
+
expect(stream.headerMeta.type).toEqual("binary");
|
|
38
|
+
expect(stream instanceof RawBinaryCoStream).toEqual(true);
|
|
39
|
+
});
|
|
40
|
+
test("Remove a member from a group where the admin role is inherited", async () => {
|
|
41
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
42
|
+
const group = node1.node.createGroup();
|
|
43
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
|
|
44
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
45
|
+
await group.core.waitForSync();
|
|
46
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
47
|
+
// The account of node2 create a child group and extend the initial group
|
|
48
|
+
// This way the node1 account should become "admin" of the child group
|
|
49
|
+
// by inheriting the admin role from the initial group
|
|
50
|
+
const childGroup = node2.node.createGroup();
|
|
51
|
+
childGroup.extend(groupOnNode2);
|
|
52
|
+
const map = childGroup.createMap();
|
|
53
|
+
map.set("test", "Available to everyone");
|
|
54
|
+
const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
|
|
55
|
+
// Check that the sync between node2 and node3 worked
|
|
56
|
+
expect(mapOnNode3.get("test")).toEqual("Available to everyone");
|
|
57
|
+
// The node1 account removes the reader from the group
|
|
58
|
+
// The reader should be automatically kicked out of the child group
|
|
59
|
+
await group.removeMember(node3.node.account);
|
|
60
|
+
await group.core.waitForSync();
|
|
61
|
+
// Update the map to check that node3 can't read updates anymore
|
|
62
|
+
map.set("test", "Hidden to node3");
|
|
63
|
+
await map.core.waitForSync();
|
|
64
|
+
// Check that the value has not been updated on node3
|
|
65
|
+
expect(mapOnNode3.get("test")).toEqual("Available to everyone");
|
|
66
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
67
|
+
expect(mapOnNode1.get("test")).toEqual("Hidden to node3");
|
|
68
|
+
});
|
|
69
|
+
test("An admin should be able to rotate the readKey on child groups and keep access to new coValues", async () => {
|
|
70
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
71
|
+
const group = node1.node.createGroup();
|
|
72
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
|
|
73
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
74
|
+
await group.core.waitForSync();
|
|
75
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
76
|
+
// The account of node2 create a child group and extend the initial group
|
|
77
|
+
// This way the node1 account should become "admin" of the child group
|
|
78
|
+
// by inheriting the admin role from the initial group
|
|
79
|
+
const childGroup = node2.node.createGroup();
|
|
80
|
+
childGroup.extend(groupOnNode2);
|
|
81
|
+
await childGroup.core.waitForSync();
|
|
82
|
+
// The node1 account removes the reader from the group
|
|
83
|
+
// In this case we want to ensure that node1 is still able to read new coValues
|
|
84
|
+
// Even if some childs are not available when the readKey is rotated
|
|
85
|
+
await group.removeMember(node3.node.account);
|
|
86
|
+
await group.core.waitForSync();
|
|
87
|
+
const map = childGroup.createMap();
|
|
88
|
+
map.set("test", "Available to node1");
|
|
89
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
90
|
+
expect(mapOnNode1.get("test")).toEqual("Available to node1");
|
|
91
|
+
});
|
|
92
|
+
test("An admin should be able to rotate the readKey on child groups even if it was unavailable when kicking out a member from a parent group", async () => {
|
|
93
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
94
|
+
const group = node1.node.createGroup();
|
|
95
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
|
|
96
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
97
|
+
await group.core.waitForSync();
|
|
98
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
99
|
+
// The account of node2 create a child group and extend the initial group
|
|
100
|
+
// This way the node1 account should become "admin" of the child group
|
|
101
|
+
// by inheriting the admin role from the initial group
|
|
102
|
+
const childGroup = node2.node.createGroup();
|
|
103
|
+
childGroup.extend(groupOnNode2);
|
|
104
|
+
// The node1 account removes the reader from the group
|
|
105
|
+
// In this case we want to ensure that node1 is still able to read new coValues
|
|
106
|
+
// Even if some childs are not available when the readKey is rotated
|
|
107
|
+
await group.removeMember(node3.node.account);
|
|
108
|
+
await group.core.waitForSync();
|
|
109
|
+
const map = childGroup.createMap();
|
|
110
|
+
map.set("test", "Available to node1");
|
|
111
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
112
|
+
expect(mapOnNode1.get("test")).toEqual("Available to node1");
|
|
113
|
+
});
|
|
114
|
+
test("An admin should be able to rotate the readKey on child groups even if it was unavailable when kicking out a member from a parent group (grandChild)", async () => {
|
|
115
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
116
|
+
const group = node1.node.createGroup();
|
|
117
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
|
|
118
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
119
|
+
await group.core.waitForSync();
|
|
120
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
121
|
+
// The account of node2 create a child group and extend the initial group
|
|
122
|
+
// This way the node1 account should become "admin" of the child group
|
|
123
|
+
// by inheriting the admin role from the initial group
|
|
124
|
+
const childGroup = node2.node.createGroup();
|
|
125
|
+
childGroup.extend(groupOnNode2);
|
|
126
|
+
const grandChildGroup = node2.node.createGroup();
|
|
127
|
+
grandChildGroup.extend(childGroup);
|
|
128
|
+
// The node1 account removes the reader from the group
|
|
129
|
+
// In this case we want to ensure that node1 is still able to read new coValues
|
|
130
|
+
// Even if some childs are not available when the readKey is rotated
|
|
131
|
+
await group.removeMember(node3.node.account);
|
|
132
|
+
await group.core.waitForSync();
|
|
133
|
+
const map = childGroup.createMap();
|
|
134
|
+
map.set("test", "Available to node1");
|
|
135
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
136
|
+
expect(mapOnNode1.get("test")).toEqual("Available to node1");
|
|
137
|
+
});
|
|
138
|
+
test("A user add after a key rotation should have access to the old transactions", async () => {
|
|
139
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
140
|
+
const group = node1.node.createGroup();
|
|
141
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
142
|
+
await group.core.waitForSync();
|
|
143
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
144
|
+
const map = groupOnNode2.createMap();
|
|
145
|
+
map.set("test", "Written from node2");
|
|
146
|
+
await map.core.waitForSync();
|
|
147
|
+
await group.removeMember(node3.node.account);
|
|
148
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
149
|
+
await group.core.waitForSync();
|
|
150
|
+
const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
|
|
151
|
+
expect(mapOnNode3.get("test")).toEqual("Written from node2");
|
|
152
|
+
});
|
|
153
|
+
test("Invites should have access to the new keys", async () => {
|
|
154
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
155
|
+
const group = node1.node.createGroup();
|
|
156
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
157
|
+
const invite = group.createInvite("admin");
|
|
158
|
+
await group.removeMember(node3.node.account);
|
|
159
|
+
const map = group.createMap();
|
|
160
|
+
map.set("test", "Written from node1");
|
|
161
|
+
await map.core.waitForSync();
|
|
162
|
+
await node2.node.acceptInvite(group.id, invite);
|
|
163
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
164
|
+
expect(mapOnNode2.get("test")).toEqual("Written from node1");
|
|
165
|
+
});
|
|
166
|
+
describe("writeOnly", () => {
|
|
167
|
+
test("Admins can invite writeOnly members", async () => {
|
|
168
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
169
|
+
const group = node1.node.createGroup();
|
|
170
|
+
const invite = group.createInvite("writeOnly");
|
|
171
|
+
await node2.node.acceptInvite(group.id, invite);
|
|
172
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
173
|
+
expect(groupOnNode2.myRole()).toEqual("writeOnly");
|
|
174
|
+
});
|
|
175
|
+
test("writeOnly roles are not inherited", async () => {
|
|
176
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
177
|
+
const group = node1.node.createGroup();
|
|
178
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
179
|
+
const childGroup = node1.node.createGroup();
|
|
180
|
+
childGroup.extend(group);
|
|
181
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
|
|
182
|
+
});
|
|
183
|
+
test("writeOnly roles are not overridded by reader roles", async () => {
|
|
184
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
185
|
+
const group = node1.node.createGroup();
|
|
186
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
|
|
187
|
+
const childGroup = node1.node.createGroup();
|
|
188
|
+
childGroup.extend(group);
|
|
189
|
+
childGroup.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
190
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writeOnly");
|
|
191
|
+
});
|
|
192
|
+
test("writeOnly roles are overridded by writer roles", async () => {
|
|
193
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
194
|
+
const group = node1.node.createGroup();
|
|
195
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
196
|
+
const childGroup = node1.node.createGroup();
|
|
197
|
+
childGroup.extend(group);
|
|
198
|
+
childGroup.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
199
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
200
|
+
});
|
|
201
|
+
test("Edits by writeOnly members are visible to other members", async () => {
|
|
202
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
203
|
+
const group = node1.node.createGroup();
|
|
204
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
205
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
206
|
+
await group.core.waitForSync();
|
|
207
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
208
|
+
const map = groupOnNode2.createMap();
|
|
209
|
+
map.set("test", "Written from a writeOnly member");
|
|
210
|
+
expect(map.get("test")).toEqual("Written from a writeOnly member");
|
|
211
|
+
await map.core.waitForSync();
|
|
212
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
213
|
+
expect(mapOnNode1.get("test")).toEqual("Written from a writeOnly member");
|
|
214
|
+
const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
|
|
215
|
+
expect(mapOnNode3.get("test")).toEqual("Written from a writeOnly member");
|
|
216
|
+
});
|
|
217
|
+
test("Edits by other members are not visible to writeOnly members", async () => {
|
|
218
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
219
|
+
const group = node1.node.createGroup();
|
|
220
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
221
|
+
const map = group.createMap();
|
|
222
|
+
map.set("test", "Written from the admin");
|
|
223
|
+
await map.core.waitForSync();
|
|
224
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
225
|
+
expect(mapOnNode2.get("test")).toEqual(undefined);
|
|
226
|
+
});
|
|
227
|
+
test("Write only member keys are rotated when a member is kicked out", async () => {
|
|
228
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
229
|
+
const group = node1.node.createGroup();
|
|
230
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
231
|
+
group.addMember(await loadCoValueOrFail(node1.node, node3.accountID), "reader");
|
|
232
|
+
await group.core.waitForSync();
|
|
233
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
234
|
+
const map = groupOnNode2.createMap();
|
|
235
|
+
map.set("test", "Written from a writeOnly member");
|
|
236
|
+
await map.core.waitForSync();
|
|
237
|
+
await group.removeMember(node3.node.account);
|
|
238
|
+
await group.core.waitForSync();
|
|
239
|
+
map.set("test", "Updated after key rotation");
|
|
240
|
+
await map.core.waitForSync();
|
|
241
|
+
const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
|
|
242
|
+
expect(mapOnNode1.get("test")).toEqual("Updated after key rotation");
|
|
243
|
+
const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
|
|
244
|
+
expect(mapOnNode3.get("test")).toEqual("Written from a writeOnly member");
|
|
245
|
+
});
|
|
246
|
+
test("upgrade to writer roles should work correctly", async () => {
|
|
247
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
248
|
+
const group = node1.node.createGroup();
|
|
249
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
250
|
+
await group.core.waitForSync();
|
|
251
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
252
|
+
const map = groupOnNode2.createMap();
|
|
253
|
+
map.set("test", "Written from the writeOnly member");
|
|
254
|
+
await map.core.waitForSync();
|
|
255
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
256
|
+
group.core.waitForSync();
|
|
257
|
+
node2.node.coValuesStore.coValues.delete(map.id);
|
|
258
|
+
expect(node2.node.coValuesStore.get(map.id)).toEqual(CoValueState.Unknown(map.id));
|
|
259
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
260
|
+
// The writer role should be able to see the edits from the admin
|
|
261
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the writeOnly member");
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe("extend", () => {
|
|
265
|
+
test("inherited writer roles should work correctly", async () => {
|
|
266
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
267
|
+
const group = node1.node.createGroup();
|
|
268
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
269
|
+
const childGroup = node1.node.createGroup();
|
|
270
|
+
childGroup.extend(group);
|
|
271
|
+
childGroup.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
272
|
+
const map = childGroup.createMap();
|
|
273
|
+
map.set("test", "Written from the admin");
|
|
274
|
+
await map.core.waitForSync();
|
|
275
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
276
|
+
// The writer role should be able to see the edits from the admin
|
|
277
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin");
|
|
278
|
+
});
|
|
279
|
+
test("a user should be able to extend a group when his role on the parent group is writer", async () => {
|
|
280
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
281
|
+
const group = node1.node.createGroup();
|
|
282
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
283
|
+
await group.core.waitForSync();
|
|
284
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
285
|
+
const childGroup = node2.node.createGroup();
|
|
286
|
+
childGroup.extend(groupOnNode2);
|
|
287
|
+
const map = childGroup.createMap();
|
|
288
|
+
map.set("test", "Written from node2");
|
|
289
|
+
await map.core.waitForSync();
|
|
290
|
+
await childGroup.core.waitForSync();
|
|
291
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
292
|
+
expect(mapOnNode2.get("test")).toEqual("Written from node2");
|
|
293
|
+
});
|
|
294
|
+
test("a user should be able to extend a group when his role on the parent group is reader", async () => {
|
|
295
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
296
|
+
const group = node1.node.createGroup();
|
|
297
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
|
|
298
|
+
await group.core.waitForSync();
|
|
299
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
300
|
+
const childGroup = node2.node.createGroup();
|
|
301
|
+
childGroup.extend(groupOnNode2);
|
|
302
|
+
const map = childGroup.createMap();
|
|
303
|
+
map.set("test", "Written from node2");
|
|
304
|
+
await map.core.waitForSync();
|
|
305
|
+
await childGroup.core.waitForSync();
|
|
306
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
307
|
+
expect(mapOnNode2.get("test")).toEqual("Written from node2");
|
|
308
|
+
});
|
|
309
|
+
test("a user should be able to extend a group when his role on the parent group is writeOnly", async () => {
|
|
310
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
311
|
+
const group = node1.node.createGroup();
|
|
312
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
313
|
+
await group.core.waitForSync();
|
|
314
|
+
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
315
|
+
const childGroup = node2.node.createGroup();
|
|
316
|
+
childGroup.extend(groupOnNode2);
|
|
317
|
+
const map = childGroup.createMap();
|
|
318
|
+
map.set("test", "Written from node2");
|
|
319
|
+
await map.core.waitForSync();
|
|
320
|
+
await childGroup.core.waitForSync();
|
|
321
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
322
|
+
expect(mapOnNode2.get("test")).toEqual("Written from node2");
|
|
323
|
+
});
|
|
324
|
+
test("self-extend a group should not break anything", async () => {
|
|
325
|
+
const { node1 } = await createTwoConnectedNodes("server", "server");
|
|
326
|
+
const group = node1.node.createGroup();
|
|
327
|
+
group.extend(group);
|
|
328
|
+
const map = group.createMap();
|
|
329
|
+
map.set("test", "Hello!");
|
|
330
|
+
expect(map.get("test")).toEqual("Hello!");
|
|
331
|
+
});
|
|
332
|
+
test("should not break when introducing extend cycles", async () => {
|
|
333
|
+
const { node1 } = await createTwoConnectedNodes("server", "server");
|
|
334
|
+
const group = node1.node.createGroup();
|
|
335
|
+
const group2 = node1.node.createGroup();
|
|
336
|
+
const group3 = node1.node.createGroup();
|
|
337
|
+
group.extend(group2);
|
|
338
|
+
group2.extend(group3);
|
|
339
|
+
group3.extend(group);
|
|
340
|
+
const map = group.createMap();
|
|
341
|
+
map.set("test", "Hello!");
|
|
342
|
+
expect(map.get("test")).toEqual("Hello!");
|
|
343
|
+
});
|
|
344
|
+
test("a writerInvite role should not be inherited", async () => {
|
|
345
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
346
|
+
const group = node1.node.createGroup();
|
|
347
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writerInvite");
|
|
348
|
+
const childGroup = node1.node.createGroup();
|
|
349
|
+
childGroup.extend(group);
|
|
350
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe("unextend", () => {
|
|
354
|
+
test("should revoke roles", async () => {
|
|
355
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
356
|
+
// `parentGroup` has `alice` as a writer
|
|
357
|
+
const parentGroup = node1.node.createGroup();
|
|
358
|
+
const alice = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
359
|
+
parentGroup.addMember(alice, "writer");
|
|
360
|
+
// `alice`'s role in `parentGroup` is `"writer"`
|
|
361
|
+
expect(parentGroup.roleOf(alice.id)).toBe("writer");
|
|
362
|
+
// `childGroup` has `bob` as a reader
|
|
363
|
+
const childGroup = node1.node.createGroup();
|
|
364
|
+
const bob = await loadCoValueOrFail(node1.node, node3.accountID);
|
|
365
|
+
childGroup.addMember(bob, "reader");
|
|
366
|
+
// `bob`'s role in `childGroup` is `"reader"`
|
|
367
|
+
expect(childGroup.roleOf(bob.id)).toBe("reader");
|
|
368
|
+
// `childGroup` has `parentGroup`'s members (in this case, `alice` as a writer)
|
|
369
|
+
childGroup.extend(parentGroup);
|
|
370
|
+
expect(childGroup.roleOf(alice.id)).toBe("writer");
|
|
371
|
+
// `childGroup` no longer has `parentGroup`'s members
|
|
372
|
+
await childGroup.revokeExtend(parentGroup);
|
|
373
|
+
expect(childGroup.roleOf(bob.id)).toBe("reader");
|
|
374
|
+
expect(childGroup.roleOf(alice.id)).toBe(undefined);
|
|
375
|
+
});
|
|
376
|
+
test("should do nothing if applied to a group that is not extended", async () => {
|
|
377
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
378
|
+
const parentGroup = node1.node.createGroup();
|
|
379
|
+
const alice = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
380
|
+
parentGroup.addMember(alice, "writer");
|
|
381
|
+
const childGroup = node1.node.createGroup();
|
|
382
|
+
const bob = await loadCoValueOrFail(node1.node, node3.accountID);
|
|
383
|
+
childGroup.addMember(bob, "reader");
|
|
384
|
+
await childGroup.revokeExtend(parentGroup);
|
|
385
|
+
expect(childGroup.roleOf(bob.id)).toBe("reader");
|
|
386
|
+
expect(childGroup.roleOf(alice.id)).toBe(undefined);
|
|
387
|
+
});
|
|
388
|
+
test("should not throw if the revokeExtend is called twice", async () => {
|
|
389
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
390
|
+
const parentGroup = node1.node.createGroup();
|
|
391
|
+
const alice = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
392
|
+
parentGroup.addMember(alice, "writer");
|
|
393
|
+
const childGroup = node1.node.createGroup();
|
|
394
|
+
const bob = await loadCoValueOrFail(node1.node, node3.accountID);
|
|
395
|
+
childGroup.addMember(bob, "reader");
|
|
396
|
+
childGroup.extend(parentGroup);
|
|
397
|
+
await childGroup.revokeExtend(parentGroup);
|
|
398
|
+
await childGroup.revokeExtend(parentGroup);
|
|
399
|
+
expect(childGroup.roleOf(bob.id)).toBe("reader");
|
|
400
|
+
expect(childGroup.roleOf(alice.id)).toBe(undefined);
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
describe("extend with role mapping", () => {
|
|
404
|
+
test("mapping to writer should add the ability to write", async () => {
|
|
405
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
406
|
+
const group = node1.node.createGroup();
|
|
407
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
|
|
408
|
+
const childGroup = node1.node.createGroup();
|
|
409
|
+
childGroup.extend(group, "writer");
|
|
410
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
411
|
+
const map = childGroup.createMap();
|
|
412
|
+
map.set("test", "Written from the admin");
|
|
413
|
+
await map.core.waitForSync();
|
|
414
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
415
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin");
|
|
416
|
+
mapOnNode2.set("test", "Written from the inherited role");
|
|
417
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the inherited role");
|
|
418
|
+
await mapOnNode2.core.waitForSync();
|
|
419
|
+
expect(map.get("test")).toEqual("Written from the inherited role");
|
|
420
|
+
});
|
|
421
|
+
test("mapping to reader should remove the ability to write", async () => {
|
|
422
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
423
|
+
const group = node1.node.createGroup();
|
|
424
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
|
|
425
|
+
const childGroup = node1.node.createGroup();
|
|
426
|
+
childGroup.extend(group, "reader");
|
|
427
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
|
|
428
|
+
const map = childGroup.createMap();
|
|
429
|
+
map.set("test", "Written from the admin");
|
|
430
|
+
await map.core.waitForSync();
|
|
431
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
432
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin");
|
|
433
|
+
mapOnNode2.set("test", "Should not be visible");
|
|
434
|
+
await mapOnNode2.core.waitForSync();
|
|
435
|
+
expect(map.get("test")).toEqual("Written from the admin");
|
|
436
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin");
|
|
437
|
+
});
|
|
438
|
+
test("mapping to admin should add the ability to add members", async () => {
|
|
439
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
440
|
+
const group = node1.node.createGroup();
|
|
441
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
|
|
442
|
+
const childGroup = node1.node.createGroup();
|
|
443
|
+
childGroup.extend(group, "admin");
|
|
444
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("admin");
|
|
445
|
+
await childGroup.core.waitForSync();
|
|
446
|
+
const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
|
|
447
|
+
childGroupOnNode2.addMember(await loadCoValueOrFail(node2.node, node3.accountID), "reader");
|
|
448
|
+
expect(childGroupOnNode2.roleOf(node3.accountID)).toEqual("reader");
|
|
449
|
+
});
|
|
450
|
+
test("mapping to reader should remove the ability to add members", async () => {
|
|
451
|
+
const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
|
|
452
|
+
const group = node1.node.createGroup();
|
|
453
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
|
|
454
|
+
const childGroup = node1.node.createGroup();
|
|
455
|
+
childGroup.extend(group, "reader");
|
|
456
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
|
|
457
|
+
await childGroup.core.waitForSync();
|
|
458
|
+
const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
|
|
459
|
+
const accountToAdd = await loadCoValueOrFail(node2.node, node3.accountID);
|
|
460
|
+
expect(() => {
|
|
461
|
+
childGroupOnNode2.addMember(accountToAdd, "reader");
|
|
462
|
+
}).toThrow();
|
|
463
|
+
expect(childGroupOnNode2.roleOf(node3.accountID)).toEqual(undefined);
|
|
464
|
+
});
|
|
465
|
+
test("non-inheritable roles should not give access to the child group when role mapping is used", async () => {
|
|
466
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
467
|
+
const group = node1.node.createGroup();
|
|
468
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
|
|
469
|
+
const childGroup = node1.node.createGroup();
|
|
470
|
+
childGroup.extend(group, "reader");
|
|
471
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
|
|
472
|
+
const map = childGroup.createMap();
|
|
473
|
+
map.set("test", "Written from the admin");
|
|
474
|
+
await map.core.waitForSync();
|
|
475
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
476
|
+
expect(mapOnNode2.get("test")).toEqual(undefined);
|
|
477
|
+
});
|
|
478
|
+
test("invite roles should not give write access to the child group when role mapping is used", async () => {
|
|
479
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
480
|
+
const group = node1.node.createGroup();
|
|
481
|
+
group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writerInvite");
|
|
482
|
+
const childGroup = node1.node.createGroup();
|
|
483
|
+
childGroup.extend(group, "writer");
|
|
484
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
|
|
485
|
+
const map = childGroup.createMap();
|
|
486
|
+
map.set("test", "Written from the admin");
|
|
487
|
+
await map.core.waitForSync();
|
|
488
|
+
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
489
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin"); // The invite roles have access to the readKey hence can read the values on inherited groups
|
|
490
|
+
mapOnNode2.set("test", "Should not be visible");
|
|
491
|
+
await mapOnNode2.core.waitForSync();
|
|
492
|
+
expect(map.get("test")).toEqual("Written from the admin");
|
|
493
|
+
expect(mapOnNode2.get("test")).toEqual("Written from the admin");
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
test("roleOf should prioritize explicit account role over everyone role in same group", async () => {
|
|
497
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
498
|
+
const group = node1.node.createGroup();
|
|
499
|
+
const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
500
|
+
// Add both everyone and specific account
|
|
501
|
+
group.addMember("everyone", "reader");
|
|
502
|
+
group.addMember(account2, "writer");
|
|
503
|
+
// Should return the explicit role, not everyone's role
|
|
504
|
+
expect(group.roleOf(node2.accountID)).toEqual("writer");
|
|
505
|
+
// Change everyone's role
|
|
506
|
+
group.addMember("everyone", "writer");
|
|
507
|
+
// Should still return the explicit role
|
|
508
|
+
expect(group.roleOf(node2.accountID)).toEqual("writer");
|
|
509
|
+
});
|
|
510
|
+
test("roleOf should prioritize inherited everyone role over explicit account role", async () => {
|
|
511
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
512
|
+
const parentGroup = node1.node.createGroup();
|
|
513
|
+
const childGroup = node1.node.createGroup();
|
|
514
|
+
const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
515
|
+
// Set up inheritance
|
|
516
|
+
childGroup.extend(parentGroup);
|
|
517
|
+
// Add everyone to parent and account to child
|
|
518
|
+
parentGroup.addMember("everyone", "writer");
|
|
519
|
+
childGroup.addMember(account2, "reader");
|
|
520
|
+
// Should return the explicit role from child, not inherited everyone role
|
|
521
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
522
|
+
});
|
|
523
|
+
test("roleOf should use everyone role when no explicit role exists", async () => {
|
|
524
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
525
|
+
const group = node1.node.createGroup();
|
|
526
|
+
// Add only everyone role
|
|
527
|
+
group.addMember("everyone", "reader");
|
|
528
|
+
// Should return everyone's role when no explicit role exists
|
|
529
|
+
expect(group.roleOf(node2.accountID)).toEqual("reader");
|
|
530
|
+
});
|
|
531
|
+
test("roleOf should inherit everyone role from parent when no explicit roles exist", async () => {
|
|
532
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
533
|
+
const parentGroup = node1.node.createGroup();
|
|
534
|
+
const childGroup = node1.node.createGroup();
|
|
535
|
+
// Set up inheritance
|
|
536
|
+
childGroup.extend(parentGroup);
|
|
537
|
+
// Add everyone to parent only
|
|
538
|
+
parentGroup.addMember("everyone", "reader");
|
|
539
|
+
// Should inherit everyone's role from parent
|
|
540
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
|
|
541
|
+
});
|
|
542
|
+
test("roleOf should handle everyone role inheritance through multiple levels", async () => {
|
|
543
|
+
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
544
|
+
const grandParentGroup = node1.node.createGroup();
|
|
545
|
+
const parentGroup = node1.node.createGroup();
|
|
546
|
+
const childGroup = node1.node.createGroup();
|
|
547
|
+
const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
|
|
548
|
+
const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
|
|
549
|
+
// Set up inheritance chain
|
|
550
|
+
parentGroup.extend(grandParentGroup);
|
|
551
|
+
childGroup.extend(parentGroup);
|
|
552
|
+
// Add everyone to grandparent
|
|
553
|
+
grandParentGroup.addMember("everyone", "writer");
|
|
554
|
+
// Should inherit everyone's role from grandparent
|
|
555
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
556
|
+
// Add explicit role in parent
|
|
557
|
+
parentGroup.addMember(account2, "reader");
|
|
558
|
+
// Should use parent's explicit role instead of grandparent's everyone role
|
|
559
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
560
|
+
// Add explicit role in child
|
|
561
|
+
childGroup.addMember(account2, "admin");
|
|
562
|
+
await childGroup.core.waitForSync();
|
|
563
|
+
// Should use child's explicit role
|
|
564
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("admin");
|
|
565
|
+
// Remove child's explicit role
|
|
566
|
+
await childGroupOnNode2.removeMember(account2);
|
|
567
|
+
await childGroupOnNode2.core.waitForSync();
|
|
568
|
+
// Should fall back to parent's explicit role
|
|
569
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
570
|
+
// Remove parent's explicit role
|
|
571
|
+
await parentGroup.removeMember(account2);
|
|
572
|
+
await childGroup.core.waitForSync();
|
|
573
|
+
// Should fall back to grandparent's everyone role
|
|
574
|
+
expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
|
|
575
|
+
});
|
|
576
|
+
//# sourceMappingURL=group.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.test.js","sourceRoot":"","sources":["../../src/tests/group.test.ts"],"names":[],"mappings":"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"}
|