Merge pull request #2078 from famedly/td/prev_batch_after_limited

fix: make sure prev_batch is updated after a limited timeline
This commit is contained in:
td 2025-05-06 11:38:26 +02:00 committed by GitHub
commit 479d4ac401
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 112 additions and 2 deletions

View File

@ -1759,6 +1759,10 @@ class FakeMatrixApi extends BaseClient {
(var req) => messagesResponsePast,
'/client/v3/rooms/!1234%3Aexample.com/messages?from=1234&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
(var req) => messagesResponsePast,
'/client/v3/rooms/!1234%3Aexample.com/messages?from=room_preset_1234&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
(var req) => messagesResponsePast,
'/client/v3/rooms/!1234%3Aexample.com/messages?from=room_preset_1234_after_limited&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
(var req) => messagesResponsePast,
'/client/v3/rooms/!localpart%3Aserver.abc/messages?from=t456&dir=f&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
(var req) => messagesResponseFuture,
'/client/v3/rooms/!1234%3Aexample.com/messages?from=t456&dir=f&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':

View File

@ -2991,7 +2991,9 @@ class Client extends MatrixApi {
chatUpdate.timeline?.prevBatch != null)) {
/// [InvitedRoomUpdate] doesn't have prev_batch, so we want to set it in case
/// the room first appeared in sync update when membership was invite.
if (rooms[roomIndex].membership == Membership.invite &&
if ((rooms[roomIndex].membership == Membership.invite ||
chatUpdate.timeline?.limited == true ||
rooms[roomIndex].prev_batch == null) &&
chatUpdate.timeline?.prevBatch != null) {
rooms[roomIndex].prev_batch = chatUpdate.timeline?.prevBatch;
}

View File

@ -78,7 +78,7 @@ void main() {
room = Room(
id: roomID,
client: client,
prev_batch: '1234',
prev_batch: 'room_preset_1234',
roomAccountData: {},
);
timeline = Timeline(
@ -1203,6 +1203,110 @@ void main() {
'edit 11',
);
});
test('make sure a limited timeline resets the prev_batch', () async {
timeline.events.clear();
await client.handleSync(
SyncUpdate(
nextBatch: 'something',
rooms: RoomsUpdate(
join: {
timeline.room.id: JoinedRoomUpdate(
timeline: TimelineUpdate(
prevBatch: 'null',
events: [
MatrixEvent.fromJson({
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'Testcase'},
'event_id': '11',
'sender': '@alice:example.com',
'origin_server_ts': DateTime.now().millisecondsSinceEpoch,
}),
MatrixEvent.fromJson({
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'Testcase'},
'event_id': '22',
'sender': '@alice:example.com',
'origin_server_ts': DateTime.now().millisecondsSinceEpoch,
}),
],
),
),
},
),
),
);
Timeline t = await room.getTimeline();
expect(t.events.length, 2);
expect(t.room.prev_batch, 'room_preset_1234');
await client.handleSync(
SyncUpdate(
nextBatch: 'something2',
rooms: RoomsUpdate(
join: {
timeline.room.id: JoinedRoomUpdate(
timeline: TimelineUpdate(
prevBatch: 'room_preset_1234_after_limited',
limited: true,
events: [
MatrixEvent.fromJson({
'type': 'm.room.message',
'content': {
'msgtype': 'm.text',
'body': '* edit 11',
'm.new_content': {
'msgtype': 'm.text',
'body': 'edit 11',
'm.mentions': {},
},
'm.mentions': {},
'm.relates_to': {
'rel_type': 'm.replace',
'event_id': '11',
},
},
'event_id': '33',
'sender': '@alice:example.com',
'origin_server_ts': DateTime.now().millisecondsSinceEpoch,
}),
MatrixEvent.fromJson({
'type': 'm.room.message',
'content': {
'msgtype': 'm.text',
'body': '* edit 22',
'm.new_content': {
'msgtype': 'm.text',
'body': 'edit 22',
'm.mentions': {},
},
'm.mentions': {},
'm.relates_to': {
'rel_type': 'm.replace',
'event_id': '22',
},
},
'event_id': '44',
'sender': '@alice:example.com',
'origin_server_ts': DateTime.now().millisecondsSinceEpoch,
}),
],
),
),
},
),
),
);
t = await room.getTimeline();
expect(t.events.length, 2);
expect(t.room.prev_batch, 'room_preset_1234_after_limited');
await t.requestHistory();
expect(t.room.prev_batch, 't47409-4357353_219380_26003_2265');
});
test('logout', () async {
await client.logout();
});