houdini 0.17.13 → 0.18.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/build/cmd-cjs/index.js +438 -201
- package/build/cmd-esm/index.js +438 -201
- package/build/codegen/utils/flattenSelections.d.ts +3 -1
- package/build/codegen-cjs/index.js +405 -180
- package/build/codegen-esm/index.js +405 -180
- package/build/lib/config.d.ts +8 -3
- package/build/lib-cjs/index.js +141 -81
- package/build/lib-esm/index.js +141 -81
- package/build/runtime/cache/subscription.d.ts +3 -3
- package/build/runtime/lib/config.d.ts +2 -1
- package/build/runtime/lib/scalars.d.ts +2 -2
- package/build/runtime/lib/selection.d.ts +2 -0
- package/build/runtime/lib/types.d.ts +26 -16
- package/build/runtime-cjs/cache/cache.js +38 -23
- package/build/runtime-cjs/cache/lists.js +40 -26
- package/build/runtime-cjs/cache/subscription.d.ts +3 -3
- package/build/runtime-cjs/cache/subscription.js +23 -21
- package/build/runtime-cjs/lib/config.d.ts +2 -1
- package/build/runtime-cjs/lib/scalars.d.ts +2 -2
- package/build/runtime-cjs/lib/scalars.js +9 -6
- package/build/runtime-cjs/lib/selection.d.ts +2 -0
- package/build/runtime-cjs/lib/selection.js +39 -0
- package/build/runtime-cjs/lib/types.d.ts +26 -16
- package/build/runtime-esm/cache/cache.js +38 -23
- package/build/runtime-esm/cache/lists.js +40 -26
- package/build/runtime-esm/cache/subscription.d.ts +3 -3
- package/build/runtime-esm/cache/subscription.js +23 -21
- package/build/runtime-esm/lib/config.d.ts +2 -1
- package/build/runtime-esm/lib/scalars.d.ts +2 -2
- package/build/runtime-esm/lib/scalars.js +9 -6
- package/build/runtime-esm/lib/selection.d.ts +2 -0
- package/build/runtime-esm/lib/selection.js +15 -0
- package/build/runtime-esm/lib/types.d.ts +26 -16
- package/build/test/index.d.ts +1 -2
- package/build/test-cjs/index.js +485 -195
- package/build/test-esm/index.js +485 -195
- package/build/vite-cjs/index.js +438 -193
- package/build/vite-esm/index.js +438 -193
- package/package.json +2 -2
- package/build/runtime-cjs/cache/tests/availability.test.js +0 -357
- package/build/runtime-cjs/cache/tests/gc.test.js +0 -271
- package/build/runtime-cjs/cache/tests/keys.test.js +0 -34
- package/build/runtime-cjs/cache/tests/list.test.js +0 -3390
- package/build/runtime-cjs/cache/tests/readwrite.test.js +0 -1076
- package/build/runtime-cjs/cache/tests/scalars.test.js +0 -181
- package/build/runtime-cjs/cache/tests/storage.test.js +0 -280
- package/build/runtime-cjs/cache/tests/subscriptions.test.js +0 -1469
- package/build/runtime-cjs/lib/scalars.test.js +0 -736
- package/build/runtime-esm/cache/tests/availability.test.js +0 -356
- package/build/runtime-esm/cache/tests/gc.test.js +0 -270
- package/build/runtime-esm/cache/tests/keys.test.js +0 -33
- package/build/runtime-esm/cache/tests/list.test.js +0 -3389
- package/build/runtime-esm/cache/tests/readwrite.test.js +0 -1075
- package/build/runtime-esm/cache/tests/scalars.test.js +0 -180
- package/build/runtime-esm/cache/tests/storage.test.js +0 -279
- package/build/runtime-esm/cache/tests/subscriptions.test.js +0 -1468
- package/build/runtime-esm/lib/scalars.test.js +0 -735
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "vitest";
|
|
2
|
-
import { testConfigFile } from "../../../test";
|
|
3
|
-
import { Cache, rootID } from "../cache";
|
|
4
|
-
const config = testConfigFile({
|
|
5
|
-
scalars: {
|
|
6
|
-
DateTime: {
|
|
7
|
-
type: "Date",
|
|
8
|
-
marshal(val) {
|
|
9
|
-
return val.getTime();
|
|
10
|
-
},
|
|
11
|
-
unmarshal(val) {
|
|
12
|
-
return new Date(val);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
test("extracting data with custom scalars unmarshals the value", () => {
|
|
18
|
-
const cache = new Cache(config);
|
|
19
|
-
const selection = {
|
|
20
|
-
node: {
|
|
21
|
-
type: "Node",
|
|
22
|
-
keyRaw: "node",
|
|
23
|
-
fields: {
|
|
24
|
-
date: {
|
|
25
|
-
type: "DateTime",
|
|
26
|
-
keyRaw: "date"
|
|
27
|
-
},
|
|
28
|
-
id: {
|
|
29
|
-
type: "ID",
|
|
30
|
-
keyRaw: "id"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
const data = {
|
|
36
|
-
node: {
|
|
37
|
-
id: "1",
|
|
38
|
-
date: new Date().getTime()
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
cache.write({ selection, data });
|
|
42
|
-
expect(cache.read({ parent: rootID, selection }).data).toEqual({
|
|
43
|
-
node: {
|
|
44
|
-
id: "1",
|
|
45
|
-
date: new Date(data.node.date)
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
test("can store and retrieve lists of lists of scalars", function() {
|
|
50
|
-
const cache = new Cache(config);
|
|
51
|
-
const selection = {
|
|
52
|
-
viewer: {
|
|
53
|
-
type: "User",
|
|
54
|
-
keyRaw: "viewer",
|
|
55
|
-
fields: {
|
|
56
|
-
id: {
|
|
57
|
-
type: "ID",
|
|
58
|
-
keyRaw: "id"
|
|
59
|
-
},
|
|
60
|
-
strings: {
|
|
61
|
-
type: "String",
|
|
62
|
-
keyRaw: "strings"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
cache.write({
|
|
68
|
-
selection,
|
|
69
|
-
data: {
|
|
70
|
-
viewer: {
|
|
71
|
-
id: "1",
|
|
72
|
-
strings: ["bob", "john"]
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
expect(cache.read({ parent: rootID, selection }).data).toEqual({
|
|
77
|
-
viewer: {
|
|
78
|
-
id: "1",
|
|
79
|
-
strings: ["bob", "john"]
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
test("can write list of scalars", function() {
|
|
84
|
-
const cache = new Cache(config);
|
|
85
|
-
const selection = {
|
|
86
|
-
viewer: {
|
|
87
|
-
type: "User",
|
|
88
|
-
keyRaw: "viewer",
|
|
89
|
-
fields: {
|
|
90
|
-
id: {
|
|
91
|
-
type: "ID",
|
|
92
|
-
keyRaw: "id"
|
|
93
|
-
},
|
|
94
|
-
firstName: {
|
|
95
|
-
type: "String",
|
|
96
|
-
keyRaw: "firstName"
|
|
97
|
-
},
|
|
98
|
-
friends: {
|
|
99
|
-
type: "Int",
|
|
100
|
-
keyRaw: "friends"
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
cache.write({
|
|
106
|
-
selection,
|
|
107
|
-
data: {
|
|
108
|
-
viewer: {
|
|
109
|
-
id: "1",
|
|
110
|
-
firstName: "bob",
|
|
111
|
-
friends: [1]
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
expect(cache.read({ parent: rootID, selection }).data).toEqual({
|
|
116
|
-
viewer: {
|
|
117
|
-
id: "1",
|
|
118
|
-
firstName: "bob",
|
|
119
|
-
friends: [1]
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
test("writing a scalar marked with replace", function() {
|
|
124
|
-
const cache = new Cache(config);
|
|
125
|
-
const selection = {
|
|
126
|
-
viewer: {
|
|
127
|
-
type: "User",
|
|
128
|
-
keyRaw: "viewer",
|
|
129
|
-
fields: {
|
|
130
|
-
id: {
|
|
131
|
-
type: "ID",
|
|
132
|
-
keyRaw: "id"
|
|
133
|
-
},
|
|
134
|
-
firstName: {
|
|
135
|
-
type: "String",
|
|
136
|
-
keyRaw: "firstName"
|
|
137
|
-
},
|
|
138
|
-
friends: {
|
|
139
|
-
type: "Int",
|
|
140
|
-
keyRaw: "friends",
|
|
141
|
-
update: "append"
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
cache.write({
|
|
147
|
-
selection,
|
|
148
|
-
data: {
|
|
149
|
-
viewer: {
|
|
150
|
-
id: "1",
|
|
151
|
-
firstName: "bob",
|
|
152
|
-
friends: [1]
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
expect(cache.read({ parent: rootID, selection }).data).toEqual({
|
|
157
|
-
viewer: {
|
|
158
|
-
id: "1",
|
|
159
|
-
firstName: "bob",
|
|
160
|
-
friends: [1]
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
cache.write({
|
|
164
|
-
selection,
|
|
165
|
-
data: {
|
|
166
|
-
viewer: {
|
|
167
|
-
id: "1",
|
|
168
|
-
firstName: "bob",
|
|
169
|
-
friends: [2]
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
expect(cache.read({ parent: rootID, selection }).data).toEqual({
|
|
174
|
-
viewer: {
|
|
175
|
-
id: "1",
|
|
176
|
-
firstName: "bob",
|
|
177
|
-
friends: [2]
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
});
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { test, expect, describe } from "vitest";
|
|
2
|
-
import { InMemoryStorage, OperationLocation } from "../storage";
|
|
3
|
-
describe("in memory layers", function() {
|
|
4
|
-
test("first layer written can be looked up", function() {
|
|
5
|
-
const storage = new InMemoryStorage();
|
|
6
|
-
const layer = storage.createLayer();
|
|
7
|
-
layer.writeField("User:1", "firstName", "John");
|
|
8
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
9
|
-
value: "John",
|
|
10
|
-
displayLayers: [layer.id],
|
|
11
|
-
kind: "scalar"
|
|
12
|
-
});
|
|
13
|
-
expect(storage.layerCount).toEqual(1);
|
|
14
|
-
});
|
|
15
|
-
test("non-optimistic layer overwrites base", function() {
|
|
16
|
-
const storage = new InMemoryStorage();
|
|
17
|
-
storage.writeField("User:1", "firstName", "John");
|
|
18
|
-
const layerID = storage.writeField("User:1", "firstName", "Marshal");
|
|
19
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
20
|
-
value: "Marshal",
|
|
21
|
-
displayLayers: [layerID],
|
|
22
|
-
kind: "scalar"
|
|
23
|
-
});
|
|
24
|
-
expect(storage.layerCount).toEqual(1);
|
|
25
|
-
});
|
|
26
|
-
test("optimistic layer overwrites base", function() {
|
|
27
|
-
const storage = new InMemoryStorage();
|
|
28
|
-
storage.writeField("User:1", "firstName", "John");
|
|
29
|
-
const optimisticLayerID = storage.createLayer(true).writeField("User:1", "firstName", "Marshal");
|
|
30
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
31
|
-
value: "Marshal",
|
|
32
|
-
kind: "scalar",
|
|
33
|
-
displayLayers: [optimisticLayerID]
|
|
34
|
-
});
|
|
35
|
-
expect(storage.layerCount).toEqual(2);
|
|
36
|
-
});
|
|
37
|
-
test("resolving layer merges into base", function() {
|
|
38
|
-
const storage = new InMemoryStorage();
|
|
39
|
-
const baseLayerID = storage.writeField("User:1", "firstName", "John");
|
|
40
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
41
|
-
value: "John",
|
|
42
|
-
displayLayers: [baseLayerID],
|
|
43
|
-
kind: "scalar"
|
|
44
|
-
});
|
|
45
|
-
expect(storage.layerCount).toEqual(1);
|
|
46
|
-
const optimisticLayer = storage.createLayer(true);
|
|
47
|
-
optimisticLayer.writeField("User:1", "firstName", "Marshal");
|
|
48
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
49
|
-
value: "Marshal",
|
|
50
|
-
kind: "scalar",
|
|
51
|
-
displayLayers: [optimisticLayer.id]
|
|
52
|
-
});
|
|
53
|
-
expect(storage.layerCount).toEqual(2);
|
|
54
|
-
optimisticLayer.writeField("User:1", "firstName", "Mike");
|
|
55
|
-
storage.resolveLayer(optimisticLayer.id);
|
|
56
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
57
|
-
value: "Mike",
|
|
58
|
-
displayLayers: [baseLayerID],
|
|
59
|
-
kind: "scalar"
|
|
60
|
-
});
|
|
61
|
-
expect(storage.layerCount).toEqual(1);
|
|
62
|
-
});
|
|
63
|
-
test("resolving layer merges up", function() {
|
|
64
|
-
const storage = new InMemoryStorage();
|
|
65
|
-
const baseLayerID = storage.writeField("User:1", "firstName", "John");
|
|
66
|
-
const layer1 = storage.createLayer(true);
|
|
67
|
-
layer1.writeField("User:1", "firstName", "Michael");
|
|
68
|
-
const layer2 = storage.createLayer();
|
|
69
|
-
layer2.writeField("User:1", "firstName", "Jeremy");
|
|
70
|
-
layer2.writeField("User:1", "lastName", "Michelson");
|
|
71
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
72
|
-
value: "Jeremy",
|
|
73
|
-
displayLayers: [layer2.id],
|
|
74
|
-
kind: "scalar"
|
|
75
|
-
});
|
|
76
|
-
expect(storage.layerCount).toEqual(3);
|
|
77
|
-
layer1.writeField("User:1", "firstName", "Michael");
|
|
78
|
-
layer1.writeField("User:1", "lastName", "George'");
|
|
79
|
-
layer1.writeField("User:1", "age", 5);
|
|
80
|
-
storage.resolveLayer(layer1.id);
|
|
81
|
-
expect(storage.layerCount).toEqual(1);
|
|
82
|
-
expect(storage.get("User:1", "age")).toEqual({
|
|
83
|
-
value: 5,
|
|
84
|
-
displayLayers: [baseLayerID],
|
|
85
|
-
kind: "scalar"
|
|
86
|
-
});
|
|
87
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
88
|
-
value: "Jeremy",
|
|
89
|
-
displayLayers: [baseLayerID],
|
|
90
|
-
kind: "scalar"
|
|
91
|
-
});
|
|
92
|
-
expect(storage.get("User:1", "lastName")).toEqual({
|
|
93
|
-
value: "Michelson",
|
|
94
|
-
displayLayers: [baseLayerID],
|
|
95
|
-
kind: "scalar"
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
test("can write links", function() {
|
|
99
|
-
const storage = new InMemoryStorage();
|
|
100
|
-
const layerID = storage.writeLink("User:1", "bestFriend", "User:2");
|
|
101
|
-
expect(storage.get("User:1", "bestFriend")).toEqual({
|
|
102
|
-
value: "User:2",
|
|
103
|
-
displayLayers: [layerID],
|
|
104
|
-
kind: "link"
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
test("can write list of links", function() {
|
|
108
|
-
const storage = new InMemoryStorage();
|
|
109
|
-
const layerID = storage.writeLink("User:1", "friends", ["User:1"]);
|
|
110
|
-
expect(storage.get("User:1", "friends")).toEqual({
|
|
111
|
-
value: ["User:1"],
|
|
112
|
-
displayLayers: [layerID],
|
|
113
|
-
kind: "link"
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
test("values are reset when layer is cleared", function() {
|
|
117
|
-
const storage = new InMemoryStorage();
|
|
118
|
-
const layer = storage.createLayer(true);
|
|
119
|
-
layer.writeField("User:1", "firstName", "Alec");
|
|
120
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
121
|
-
value: "Alec",
|
|
122
|
-
displayLayers: [layer.id],
|
|
123
|
-
kind: "scalar"
|
|
124
|
-
});
|
|
125
|
-
layer.clear();
|
|
126
|
-
expect(storage.get("User:1", "firstName").value).toBeUndefined();
|
|
127
|
-
});
|
|
128
|
-
test("can overwrite deletes for a specific link list", function() {
|
|
129
|
-
const storage = new InMemoryStorage();
|
|
130
|
-
storage.writeLink("User:1", "friends", ["User:2"]);
|
|
131
|
-
const layer = storage.createLayer(true);
|
|
132
|
-
layer.delete("User:2");
|
|
133
|
-
expect(storage.get("User:1", "friends").value).toEqual([]);
|
|
134
|
-
storage.resolveLayer(layer.id);
|
|
135
|
-
expect(storage.get("User:1", "friends").value).toEqual([]);
|
|
136
|
-
storage.writeLink("User:1", "friends", ["User:2"]);
|
|
137
|
-
expect(storage.get("User:1", "friends").value).toEqual(["User:2"]);
|
|
138
|
-
});
|
|
139
|
-
test("deleting specific fields removes the field", function() {
|
|
140
|
-
const storage = new InMemoryStorage();
|
|
141
|
-
storage.writeField("User:1", "firstName", "Michael");
|
|
142
|
-
storage.writeField("User:1", "lastName", "Aivazis");
|
|
143
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
144
|
-
value: "Michael",
|
|
145
|
-
displayLayers: [storage.topLayer.id],
|
|
146
|
-
kind: "scalar"
|
|
147
|
-
});
|
|
148
|
-
storage.deleteField("User:1", "firstName");
|
|
149
|
-
storage.topLayer.removeUndefinedFields();
|
|
150
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
151
|
-
value: void 0,
|
|
152
|
-
displayLayers: [],
|
|
153
|
-
kind: "unknown"
|
|
154
|
-
});
|
|
155
|
-
expect(Object.keys(storage.topLayer.fields["User:1"])).toEqual(["lastName"]);
|
|
156
|
-
});
|
|
157
|
-
test("deleting all fields of a record deletes the record", function() {
|
|
158
|
-
const storage = new InMemoryStorage();
|
|
159
|
-
storage.writeField("User:1", "firstName", "Michael");
|
|
160
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
161
|
-
value: "Michael",
|
|
162
|
-
displayLayers: [storage.topLayer.id],
|
|
163
|
-
kind: "scalar"
|
|
164
|
-
});
|
|
165
|
-
storage.deleteField("User:1", "firstName");
|
|
166
|
-
storage.topLayer.removeUndefinedFields();
|
|
167
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
168
|
-
value: void 0,
|
|
169
|
-
displayLayers: [],
|
|
170
|
-
kind: "unknown"
|
|
171
|
-
});
|
|
172
|
-
expect(storage.topLayer.fields["User:1"]).toBeUndefined();
|
|
173
|
-
});
|
|
174
|
-
test("create and resolve on base layer", function() {
|
|
175
|
-
const storage = new InMemoryStorage();
|
|
176
|
-
const layer = storage.createLayer(true);
|
|
177
|
-
layer.writeField("User:1", "firstName", "bob");
|
|
178
|
-
storage.resolveLayer(layer.id);
|
|
179
|
-
expect(storage.get("User:1", "firstName").value).toEqual("bob");
|
|
180
|
-
});
|
|
181
|
-
test.todo("links are reset when layer is cleared");
|
|
182
|
-
describe("operations", function() {
|
|
183
|
-
test("optimistic deletes", function() {
|
|
184
|
-
const storage = new InMemoryStorage();
|
|
185
|
-
storage.writeField("User:1", "firstName", "John");
|
|
186
|
-
storage.writeField("User:1", "lastName", "Schmidt");
|
|
187
|
-
const baseLayerID = storage.writeLink("User:2", "friends", ["User:1", "User:3"]);
|
|
188
|
-
const middleLayer = storage.createLayer(true);
|
|
189
|
-
middleLayer.delete("User:1");
|
|
190
|
-
const topLayerID = storage.writeField("User:1", "middleName", "Jingleheymer");
|
|
191
|
-
expect(storage.get("User:1", "middleName")).toEqual({
|
|
192
|
-
value: "Jingleheymer",
|
|
193
|
-
displayLayers: [topLayerID],
|
|
194
|
-
kind: "scalar"
|
|
195
|
-
});
|
|
196
|
-
expect(storage.get("User:2", "friends")).toEqual({
|
|
197
|
-
value: ["User:3"],
|
|
198
|
-
kind: "link",
|
|
199
|
-
displayLayers: [middleLayer.id, baseLayerID]
|
|
200
|
-
});
|
|
201
|
-
expect(storage.get("User:1", "firstName").value).toBeUndefined();
|
|
202
|
-
expect(storage.get("User:1", "lastName").value).toBeUndefined();
|
|
203
|
-
middleLayer.clear();
|
|
204
|
-
middleLayer.delete("User:3");
|
|
205
|
-
storage.resolveLayer(middleLayer.id);
|
|
206
|
-
expect(storage.layerCount).toEqual(1);
|
|
207
|
-
expect(storage.get("User:1", "firstName")).toEqual({
|
|
208
|
-
value: "John",
|
|
209
|
-
displayLayers: [baseLayerID],
|
|
210
|
-
kind: "scalar"
|
|
211
|
-
});
|
|
212
|
-
expect(storage.get("User:1", "lastName")).toEqual({
|
|
213
|
-
value: "Schmidt",
|
|
214
|
-
displayLayers: [baseLayerID],
|
|
215
|
-
kind: "scalar"
|
|
216
|
-
});
|
|
217
|
-
expect(storage.get("User:1", "middleName")).toEqual({
|
|
218
|
-
value: "Jingleheymer",
|
|
219
|
-
displayLayers: [baseLayerID],
|
|
220
|
-
kind: "scalar"
|
|
221
|
-
});
|
|
222
|
-
expect(storage.get("User:2", "friends")).toEqual({
|
|
223
|
-
value: ["User:1"],
|
|
224
|
-
displayLayers: [baseLayerID],
|
|
225
|
-
kind: "link"
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
test("insert into linked list", function() {
|
|
229
|
-
const storage = new InMemoryStorage();
|
|
230
|
-
const baseLayerID = storage.writeLink("User:1", "friends", ["User:2"]);
|
|
231
|
-
const layer = storage.createLayer(true);
|
|
232
|
-
layer.insert("User:1", "friends", OperationLocation.end, "User:3");
|
|
233
|
-
storage.insert("User:1", "friends", OperationLocation.end, "User:5");
|
|
234
|
-
expect(storage.get("User:1", "friends")).toEqual({
|
|
235
|
-
value: ["User:2", "User:3", "User:5"],
|
|
236
|
-
displayLayers: [storage.topLayer.id, layer.id, baseLayerID],
|
|
237
|
-
kind: "link"
|
|
238
|
-
});
|
|
239
|
-
layer.clear();
|
|
240
|
-
layer.insert("User:1", "friends", OperationLocation.end, "User:4");
|
|
241
|
-
storage.resolveLayer(layer.id);
|
|
242
|
-
expect(storage.get("User:1", "friends")).toEqual({
|
|
243
|
-
value: ["User:2", "User:5", "User:4"],
|
|
244
|
-
displayLayers: [baseLayerID],
|
|
245
|
-
kind: "link"
|
|
246
|
-
});
|
|
247
|
-
expect(storage.layerCount).toEqual(1);
|
|
248
|
-
});
|
|
249
|
-
test("remove from linked list", function() {
|
|
250
|
-
const storage = new InMemoryStorage();
|
|
251
|
-
const baseLayerID = storage.writeLink("User:1", "friends", [
|
|
252
|
-
"User:2",
|
|
253
|
-
"User:3",
|
|
254
|
-
"User:4"
|
|
255
|
-
]);
|
|
256
|
-
const layer = storage.createLayer(true);
|
|
257
|
-
layer.remove("User:1", "friends", "User:2");
|
|
258
|
-
expect(storage.get("User:1", "friends")).toEqual({
|
|
259
|
-
value: ["User:3", "User:4"],
|
|
260
|
-
displayLayers: [layer.id, baseLayerID],
|
|
261
|
-
kind: "link"
|
|
262
|
-
});
|
|
263
|
-
layer.clear();
|
|
264
|
-
layer.remove("User:1", "friends", "User:4");
|
|
265
|
-
layer.remove("User:1", "friends", "User:3");
|
|
266
|
-
storage.resolveLayer(layer.id);
|
|
267
|
-
expect(storage.get("User:1", "friends")).toEqual({
|
|
268
|
-
value: ["User:2"],
|
|
269
|
-
displayLayers: [baseLayerID],
|
|
270
|
-
kind: "link"
|
|
271
|
-
});
|
|
272
|
-
expect(storage.layerCount).toEqual(1);
|
|
273
|
-
});
|
|
274
|
-
test.todo(
|
|
275
|
-
"resolving layer with deletes and fields removes old data and retains the new stuff"
|
|
276
|
-
);
|
|
277
|
-
test.todo("an optimistic layer after a stack non-optimistic survives resolution");
|
|
278
|
-
});
|
|
279
|
-
});
|