Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2577998
paginate-test.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
5 KB
Referenced Files
None
Subscribers
None
paginate-test.cpp
View Options
/*
* This file is part of libkazv.
* SPDX-FileCopyrightText: 2021 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include
<libkazv-config.hpp>
#include
<catch2/catch_all.hpp>
#include
<boost/asio.hpp>
#include
<asio-promise-handler.hpp>
#include
<cursorutil.hpp>
#include
<sdk-model.hpp>
#include
<client/client.hpp>
#include
"client-test-util.hpp"
#include
<iostream>
using
namespace
Kazv
;
// adapted from https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-rooms-roomid-messages
static
json
paginateResponseJson
=
R
"
(
{
"start": "prevBatchForEvent1",
"end": "anotherPrevBatch",
"chunk": [
{
"content": {
"body": "This is an example text message",
"msgtype": "m.text",
"format": "org.matrix.custom.html",
"formatted_body": "<b>This is an example text message</b>"
},
"type": "m.room.message",
"event_id": "$third:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824653,
"unsigned": {
"age": 1234
}
},
{
"content": {
"name": "The room name"
},
"type": "m.room.name",
"event_id": "$second:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824653,
"unsigned": {
"age": 1234
},
"state_key": ""
},
{
"content": {
"body": "Gangnam Style",
"url": "mxc://example.org/a526eYUSFFxlgbQYZmo442",
"info": {
"thumbnail_url": "mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe",
"thumbnail_info": {
"mimetype": "image/jpeg",
"size": 46144,
"w": 300,
"h": 300
},
"w": 480,
"h": 320,
"duration": 2140786,
"size": 1563685,
"mimetype": "video/mp4"
},
"msgtype": "m.video"
},
"type": "m.room.message",
"event_id": "$first:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824651,
"unsigned": {
"age": 1234
}
}
]
}
)
"
_json
;
static
Event
event1
=
R
"
(
{
"type": "m.room.message",
"event_id": "$event1:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824654
}
)
"
_json
;
static
Event
event2
=
R
"
(
{
"type": "m.room.message",
"event_id": "$event2:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824656
}
)
"
_json
;
static
Event
secEvent
=
R
"
(
{
"content": {
"name": "The room name"
},
"type": "m.room.name",
"event_id": "$second:example.org",
"room_id": "!foo:example.org",
"sender": "@example:example.org",
"origin_server_ts": 1432735824653,
"unsigned": {
"age": 1234
},
"state_key": ""
}
)
"
_json
;
TEST_CASE
(
"Pagination should remove the original gap and record a new one"
,
"[client][paginate]"
)
{
using
namespace
Kazv
::
CursorOp
;
boost
::
asio
::
io_context
io
;
AsioPromiseHandler
ph
{
io
.
get_executor
()};
auto
m
=
createTestClientModel
();
auto
room
=
RoomModel
{};
room
.
roomId
=
"!foo:example.org"
;
room
.
timeline
=
immer
::
flex_vector
<
std
::
string
>
{
"$event1:example.org"
,
"$event2:example.org"
};
room
.
messages
=
std
::
move
(
room
.
messages
)
.
set
(
"$event1:example.org"
,
event1
)
.
set
(
"$event2:example.org"
,
event2
);
room
.
timelineGaps
=
room
.
timelineGaps
.
set
(
"$event1:example.org"
,
"prevBatchForEvent1"
);
m
.
roomList
.
rooms
=
m
.
roomList
.
rooms
.
set
(
room
.
roomId
,
room
);
auto
store
=
createTestClientStoreFrom
(
m
,
ph
);
auto
resp
=
createResponse
(
"GetRoomEvents"
,
paginateResponseJson
,
json
{{
"roomId"
,
"!foo:example.org"
},
{
"gapEventId"
,
"$event1:example.org"
}});
auto
client
=
Client
(
store
.
reader
().
map
([](
auto
c
)
{
return
SdkModel
{
c
};
}),
store
,
std
::
nullopt
);
store
.
dispatch
(
ProcessResponseAction
{
resp
});
io
.
run
();
auto
r
=
client
.
room
(
"!foo:example.org"
);
auto
timelineGaps
=
+
r
.
timelineGaps
();
REQUIRE
(
!
timelineGaps
.
find
(
"$event1:example.org"
));
REQUIRE
(
timelineGaps
.
at
(
"$first:example.org"
)
==
"anotherPrevBatch"
);
}
TEST_CASE
(
"Pagination should erase all gaps in (start-of-fetched-batch, orig-gapped-event]"
,
"[client][paginate]"
)
{
using
namespace
Kazv
::
CursorOp
;
boost
::
asio
::
io_context
io
;
AsioPromiseHandler
ph
{
io
.
get_executor
()};
auto
m
=
createTestClientModel
();
auto
room
=
RoomModel
{};
room
.
roomId
=
"!foo:example.org"
;
room
.
timeline
=
immer
::
flex_vector
<
std
::
string
>
{
"$second:example.org"
,
"$event1:example.org"
,
"$event2:example.org"
};
room
.
messages
=
std
::
move
(
room
.
messages
)
.
set
(
"$event1:example.org"
,
event1
)
.
set
(
"$event2:example.org"
,
event2
)
.
set
(
"$second:example.org"
,
secEvent
);
room
.
timelineGaps
=
room
.
timelineGaps
.
set
(
"$event1:example.org"
,
"prevBatchForEvent1"
)
.
set
(
"$second:example.org"
,
"prevBatchForSecEvent"
);
m
.
roomList
.
rooms
=
m
.
roomList
.
rooms
.
set
(
room
.
roomId
,
room
);
auto
store
=
createTestClientStoreFrom
(
m
,
ph
);
auto
resp
=
createResponse
(
"GetRoomEvents"
,
paginateResponseJson
,
json
{{
"roomId"
,
"!foo:example.org"
},
{
"gapEventId"
,
"$event1:example.org"
}});
auto
client
=
Client
(
store
.
reader
().
map
([](
auto
c
)
{
return
SdkModel
{
c
};
}),
store
,
std
::
nullopt
);
store
.
dispatch
(
ProcessResponseAction
{
resp
});
io
.
run
();
auto
r
=
client
.
room
(
"!foo:example.org"
);
auto
timelineGaps
=
+
r
.
timelineGaps
();
REQUIRE
(
!
timelineGaps
.
find
(
"$second:example.org"
));
REQUIRE
(
timelineGaps
.
at
(
"$first:example.org"
)
==
"anotherPrevBatch"
);
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Tue, Jun 24, 6:39 PM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234972
Default Alt Text
paginate-test.cpp (5 KB)
Attached To
Mode
rL libkazv
Attached
Detach File
Event Timeline
Log In to Comment