You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-09-01 21:21:58 +03:00
Add more webstore unit tests.
This commit is contained in:
@@ -178,6 +178,7 @@ WebStorageStore.prototype.getRoom = function(roomId) {
|
|||||||
}
|
}
|
||||||
var timelineKeys = getTimelineIndices(this.store, roomId);
|
var timelineKeys = getTimelineIndices(this.store, roomId);
|
||||||
if (timelineKeys.indexOf("live") !== -1) {
|
if (timelineKeys.indexOf("live") !== -1) {
|
||||||
|
console.log("Syncing live");
|
||||||
this._syncTimeline(roomId, timelineKeys);
|
this._syncTimeline(roomId, timelineKeys);
|
||||||
}
|
}
|
||||||
return loadRoom(this.store, roomId, this.batchSize);
|
return loadRoom(this.store, roomId, this.batchSize);
|
||||||
@@ -240,7 +241,8 @@ WebStorageStore.prototype._syncTimeline = function(roomId, timelineIndices) {
|
|||||||
var lowestIndex = getLowestIndex(timelineIndices);
|
var lowestIndex = getLowestIndex(timelineIndices);
|
||||||
var lowKey = keyName(roomId, "timeline", lowestIndex);
|
var lowKey = keyName(roomId, "timeline", lowestIndex);
|
||||||
var lowestBatch = this.store.getItem(lowKey) || [];
|
var lowestBatch = this.store.getItem(lowKey) || [];
|
||||||
|
console.log("Live Events = %s, Low batch = %s (i=%s;b=%s)", liveEvents.length,
|
||||||
|
lowestBatch.length, lowestIndex, this.batchSize);
|
||||||
// fill up the existing batch first.
|
// fill up the existing batch first.
|
||||||
while (lowestBatch.length < this.batchSize && liveEvents.length > 0) {
|
while (lowestBatch.length < this.batchSize && liveEvents.length > 0) {
|
||||||
lowestBatch.unshift(liveEvents.shift());
|
lowestBatch.unshift(liveEvents.shift());
|
||||||
@@ -251,7 +253,7 @@ WebStorageStore.prototype._syncTimeline = function(roomId, timelineIndices) {
|
|||||||
var batch = [];
|
var batch = [];
|
||||||
while (liveEvents.length > 0) {
|
while (liveEvents.length > 0) {
|
||||||
batch.unshift(liveEvents.shift());
|
batch.unshift(liveEvents.shift());
|
||||||
if (batch.length === this.batchSize) {
|
if (batch.length === this.batchSize || liveEvents.length === 0) {
|
||||||
// persist the full batch and make another
|
// persist the full batch and make another
|
||||||
lowestIndex--;
|
lowestIndex--;
|
||||||
lowKey = keyName(roomId, "timeline", lowestIndex);
|
lowKey = keyName(roomId, "timeline", lowestIndex);
|
||||||
@@ -325,7 +327,7 @@ function loadRoom(store, roomId, numEvents) {
|
|||||||
var stateEvents = [];
|
var stateEvents = [];
|
||||||
utils.forEach(utils.keys(currentStateMap.events), function(eventType) {
|
utils.forEach(utils.keys(currentStateMap.events), function(eventType) {
|
||||||
utils.forEach(utils.keys(currentStateMap.events[eventType]), function(skey) {
|
utils.forEach(utils.keys(currentStateMap.events[eventType]), function(skey) {
|
||||||
stateEvents.push(currentStateMap[eventType][skey]);
|
stateEvents.push(currentStateMap.events[eventType][skey]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// TODO: Fix logic dupe with MatrixClient._processRoomEvents
|
// TODO: Fix logic dupe with MatrixClient._processRoomEvents
|
||||||
@@ -354,7 +356,11 @@ function loadRoom(store, roomId, numEvents) {
|
|||||||
}
|
}
|
||||||
for (i = 0; i < batch.length; i++) {
|
for (i = 0; i < batch.length; i++) {
|
||||||
recentEvents.unshift(new MatrixEvent(batch[i]));
|
recentEvents.unshift(new MatrixEvent(batch[i]));
|
||||||
|
if (recentEvents.length === numEvents) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
index++;
|
||||||
}
|
}
|
||||||
room.addEventsToTimeline(recentEvents.reverse(), true);
|
room.addEventsToTimeline(recentEvents.reverse(), true);
|
||||||
room.oldState.paginationToken = currentStateMap.pagination_token;
|
room.oldState.paginationToken = currentStateMap.pagination_token;
|
||||||
|
@@ -12,6 +12,7 @@ function MockStorageApi() {
|
|||||||
MockStorageApi.prototype = {
|
MockStorageApi.prototype = {
|
||||||
setItem: function(k, v) {
|
setItem: function(k, v) {
|
||||||
this.data[k] = v;
|
this.data[k] = v;
|
||||||
|
console.log("SetItem: %s => %s", k, JSON.stringify(v, undefined, 2));
|
||||||
this._recalc();
|
this._recalc();
|
||||||
},
|
},
|
||||||
getItem: function(k) {
|
getItem: function(k) {
|
||||||
@@ -49,19 +50,16 @@ describe("WebStorageStore", function() {
|
|||||||
room = new Room(roomId);
|
room = new Room(roomId);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("getSyncToken", function() {
|
describe("syncToken", function() {
|
||||||
it("should return the token from the store", function() {
|
it("get: should return the token from the store", function() {
|
||||||
|
var token = "flibble";
|
||||||
|
store.setSyncToken(token);
|
||||||
|
expect(store.getSyncToken()).toEqual(token);
|
||||||
|
expect(mockStorageApi.length).toEqual(1);
|
||||||
});
|
});
|
||||||
it("should return null if the token does not exist", function() {
|
it("get: should return null if the token does not exist", function() {
|
||||||
|
expect(store.getSyncToken()).toEqual(null);
|
||||||
});
|
expect(mockStorageApi.length).toEqual(0);
|
||||||
});
|
|
||||||
|
|
||||||
describe("setSyncToken", function() {
|
|
||||||
it("should store the token in the store, which is retrievable from " +
|
|
||||||
"getSyncToken", function() {
|
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -115,24 +113,168 @@ describe("WebStorageStore", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("getRoom", function() {
|
describe("getRoom", function() {
|
||||||
|
// web storage api keys
|
||||||
|
var prefix = "room_" + roomId + "_timeline_";
|
||||||
|
var stateKeyName = "room_" + roomId + "_state";
|
||||||
|
|
||||||
|
// stored state events
|
||||||
|
var stateEventMap = {
|
||||||
|
"m.room.member": {},
|
||||||
|
"m.room.name": {}
|
||||||
|
};
|
||||||
|
stateEventMap["m.room.member"][userId] = utils.mkMembership(
|
||||||
|
{user: userId, room: roomId, mship: "join"}
|
||||||
|
);
|
||||||
|
stateEventMap["m.room.name"][""] = utils.mkEvent(
|
||||||
|
{user: userId, room: roomId, type: "m.room.name",
|
||||||
|
content: {
|
||||||
|
name: "foo"
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
|
||||||
|
// stored timeline events
|
||||||
|
var timeline0 = [];
|
||||||
|
var timeline1 = [];
|
||||||
|
for (var i = 0; i < batchNum; i++) {
|
||||||
|
timeline0[i] = utils.mkMessage({user: userId, room: roomId});
|
||||||
|
if (i !== (batchNum - 1)) { // miss last one
|
||||||
|
timeline1[i] = utils.mkMessage({user: userId, room: roomId});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
it("should reconstruct room state", function() {
|
it("should reconstruct room state", function() {
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(
|
||||||
|
storedRoom.currentState.getStateEvents("m.room.name", "").event
|
||||||
|
).toEqual(stateEventMap["m.room.name"][""]);
|
||||||
|
expect(
|
||||||
|
storedRoom.currentState.getStateEvents("m.room.member", userId).event
|
||||||
|
).toEqual(stateEventMap["m.room.member"][userId]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should reconstruct the room timeline", function() {
|
it("should reconstruct the room timeline", function() {
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
mockStorageApi.setItem(prefix + "0", timeline0);
|
||||||
|
mockStorageApi.setItem(prefix + "1", timeline1);
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(storedRoom).not.toBeNull();
|
||||||
|
// should only get up to the batch num timeline events
|
||||||
|
expect(storedRoom.timeline.length).toEqual(batchNum);
|
||||||
|
for (i = 0; i < batchNum; i++) {
|
||||||
|
expect(storedRoom.timeline[batchNum - 1 - i].event).toEqual(
|
||||||
|
timeline0[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
it("should sync the timeline for any 'live' events", function() {
|
|
||||||
|
|
||||||
|
it("should sync the timeline for 'live' events " +
|
||||||
|
"(full low batch; 1+bit live batches)", function() {
|
||||||
|
var i;
|
||||||
|
var timelineLive = [
|
||||||
|
utils.mkMessage({user: userId, room: roomId}),
|
||||||
|
utils.mkMessage({user: userId, room: roomId}),
|
||||||
|
utils.mkMessage({user: userId, room: roomId}),
|
||||||
|
utils.mkMessage({user: userId, room: roomId})
|
||||||
|
];
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
mockStorageApi.setItem(prefix + "0", timeline0);
|
||||||
|
mockStorageApi.setItem(prefix + "1", timeline1);
|
||||||
|
mockStorageApi.setItem(
|
||||||
|
// deep copy the timeline via parse/stringify else items will
|
||||||
|
// be shift()ed from timelineLive and we can't compare!
|
||||||
|
prefix + "live", JSON.parse(JSON.stringify(timelineLive))
|
||||||
|
);
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(storedRoom).not.toBeNull();
|
||||||
|
// should only get up to the batch num timeline events (highest
|
||||||
|
// index of timelineLive is the newest message)
|
||||||
|
expect(storedRoom.timeline.length).toEqual(batchNum);
|
||||||
|
for (i = 0; i < batchNum; i++) {
|
||||||
|
expect(storedRoom.timeline[i].event).toEqual(
|
||||||
|
timelineLive[i + 1]
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should sync the timeline for 'live' events " +
|
||||||
|
"(no low batch; 1 live batches)", function() {
|
||||||
|
var i;
|
||||||
|
var timelineLive = [];
|
||||||
|
for (i = 0; i < batchNum; i++) {
|
||||||
|
timelineLive.push(
|
||||||
|
utils.mkMessage({user: userId, room: roomId})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
mockStorageApi.setItem(prefix + "0", []);
|
||||||
|
mockStorageApi.setItem(
|
||||||
|
// deep copy the timeline via parse/stringify else items will
|
||||||
|
// be shift()ed from timelineLive and we can't compare!
|
||||||
|
prefix + "live", JSON.parse(JSON.stringify(timelineLive))
|
||||||
|
);
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(storedRoom).not.toBeNull();
|
||||||
|
// should only get up to the batch num timeline events (highest
|
||||||
|
// index of timelineLive is the newest message)
|
||||||
|
expect(storedRoom.timeline.length).toEqual(batchNum);
|
||||||
|
for (i = 0; i < batchNum; i++) {
|
||||||
|
expect(storedRoom.timeline[i].event).toEqual(
|
||||||
|
timelineLive[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it("should be able to reconstruct the timeline with negative indices",
|
it("should be able to reconstruct the timeline with negative indices",
|
||||||
function() {
|
function() {
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
mockStorageApi.setItem(prefix + "-5", timeline0);
|
||||||
|
mockStorageApi.setItem(prefix + "-4", timeline1);
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(storedRoom).not.toBeNull();
|
||||||
|
// should only get up to the batch num timeline events
|
||||||
|
expect(storedRoom.timeline.length).toEqual(batchNum);
|
||||||
|
for (i = 0; i < batchNum; i++) {
|
||||||
|
expect(storedRoom.timeline[batchNum - 1 - i].event).toEqual(
|
||||||
|
timeline0[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should return null if the room doesn't exist", function() {
|
it("should return null if the room doesn't exist", function() {
|
||||||
|
expect(store.getRoom("nothing")).toEqual(null);
|
||||||
});
|
});
|
||||||
it("should assign a storageToken to the Room", function() {
|
|
||||||
|
|
||||||
|
xit("should assign a storageToken to the Room", function() {
|
||||||
|
mockStorageApi.setItem(stateKeyName, {
|
||||||
|
events: stateEventMap,
|
||||||
|
pagination_token: "tok"
|
||||||
|
});
|
||||||
|
mockStorageApi.setItem(prefix + "0", timeline0);
|
||||||
|
mockStorageApi.setItem(prefix + "1", timeline1);
|
||||||
|
|
||||||
|
var storedRoom = store.getRoom(roomId);
|
||||||
|
expect(storedRoom.storageToken).toBeDefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user