Page MenuHomePhorge

No OneTemporary

Size
11 KB
Referenced Files
None
Subscribers
None
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 0d08740..3d6c9a1 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -1,66 +1,79 @@
include(CTest)
set(KAZVTEST_RESPATH ${CMAKE_CURRENT_SOURCE_DIR}/resources)
configure_file(kazvtest-respath.hpp.in kazvtest-respath.hpp)
+add_library(kazvtestfixtures
+ client/factory.cpp
+)
+target_include_directories(
+ kazvtestfixtures
+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/client)
+target_link_libraries(
+ kazvtestfixtures
+ PUBLIC kazvclient
+)
+
add_executable(kazvtest
testmain.cpp
basejobtest.cpp
event-test.cpp
cursorutiltest.cpp
base/serialization-test.cpp
base/types-test.cpp
base/immer-utils-test.cpp
client/client-test-util.cpp
client/discovery-test.cpp
client/sync-test.cpp
client/content-test.cpp
client/paginate-test.cpp
client/util-test.cpp
client/serialization-test.cpp
client/encrypted-file-test.cpp
client/sdk-test.cpp
client/thread-safety-test.cpp
client/room-test.cpp
client/random-generator-test.cpp
client/profile-test.cpp
client/kick-test.cpp
client/ban-test.cpp
client/join-test.cpp
client/keys-test.cpp
client/device-ops-test.cpp
client/send-test.cpp
client/encryption-test.cpp
client/redact-test.cpp
client/tagging-test.cpp
client/account-data-test.cpp
client/room/room-actions-test.cpp
client/room/local-echo-test.cpp
kazvjobtest.cpp
event-emitter-test.cpp
crypto-test.cpp
crypto/deterministic-test.cpp
promise-test.cpp
store-test.cpp
file-desc-test.cpp
)
target_include_directories(
kazvtest
PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/client)
target_link_libraries(kazvtest
PRIVATE Catch2::Catch2WithMain
PRIVATE kazv
PRIVATE kazveventemitter
PRIVATE kazvjob
PRIVATE nlohmann_json::nlohmann_json
PRIVATE immer
PRIVATE lager
- PRIVATE zug)
+ PRIVATE zug
+ PRIVATE kazvtestfixtures
+)
add_test(NAME kazvtest COMMAND kazvtest "~[needs-internet]")
diff --git a/src/tests/client/client-test-util.cpp b/src/tests/client/client-test-util.cpp
index 8837e72..b1b415d 100644
--- a/src/tests/client/client-test-util.cpp
+++ b/src/tests/client/client-test-util.cpp
@@ -1,59 +1,54 @@
/*
* This file is part of libkazv.
- * SPDX-FileCopyrightText: 2020 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2020 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <libkazv-config.hpp>
#include "client-test-util.hpp"
#include <asio-promise-handler.hpp>
+#include "factory.hpp"
ClientModel createTestClientModel()
{
- ClientModel m;
- m.serverUrl = "example.com";
- m.userId = "@bob:example.com";
- m.token = "exampletoken";
- m.deviceId = "exampledevice";
- m.loggedIn = true;
+ auto m = Factory::makeClient({});
return m;
}
-
bool hasAccessToken(const BaseJob &job)
{
auto header = job.requestHeader();
return header->find("Authorization") != header->end();
}
struct DumbPromise : public TypelessPromise
{
using DataT = EffectStatus;
template<class Func>
DumbPromise then(Func &&) { return DumbPromise(); }
bool ready() const { return true; }
DataT get() const { return DataT(); }
};
struct DumbPromiseHandler
{
using DataT = EffectStatus;
template<class Data, class Func>
auto create(Func &&) { return DumbPromise(); }
template<class Ignore>
auto createResolved(Ignore &&) { return DumbPromise(); }
};
Context<SdkAction> dumbContext()
{
return Context<SdkAction>(
[](auto &&) { return DumbPromise(); },
DumbPromiseHandler(),
lager::make_deps()
);
}
diff --git a/src/tests/client/factory.cpp b/src/tests/client/factory.cpp
new file mode 100644
index 0000000..08e6d4e
--- /dev/null
+++ b/src/tests/client/factory.cpp
@@ -0,0 +1,170 @@
+/*
+ * This file is part of libkazv.
+ * SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include "factory.hpp"
+
+namespace Kazv::Factory
+{
+ static std::string generateUserId()
+ {
+ static std::size_t next = 0;
+ ++next;
+ return "@u" + std::to_string(next) + ":example.com";
+ }
+
+ static std::string generateEventId()
+ {
+ static std::size_t next = 0;
+ ++next;
+ return "$" + std::to_string(next);
+ }
+
+ static std::string generateRoomId()
+ {
+ static std::size_t next = 0;
+ ++next;
+ return "!" + std::to_string(next) + ":example.com";
+ }
+
+ ClientModel makeClient(const ComposedModifier<ClientModel> &mod)
+ {
+ ClientModel m;
+ m.serverUrl = "example.com";
+ m.userId = "@bob:example.com";
+ m.token = "exampletoken";
+ m.deviceId = "exampledevice";
+ m.loggedIn = true;
+ mod(m);
+ return m;
+ }
+
+ ComposedModifier<ClientModel> withRoom(RoomModel room)
+ {
+ return [room](ClientModel &m) {
+ m.roomList.rooms = m.roomList.rooms.set(room.roomId, room);
+ };
+ }
+
+ RoomModel makeRoom(const ComposedModifier<RoomModel> &mod)
+ {
+ RoomModel room;
+ room.roomId = generateRoomId();
+ mod(room);
+ return room;
+ }
+
+ ComposedModifier<RoomModel> withRoomId(std::string id)
+ {
+ return [id](RoomModel &m) { m.roomId = id; };
+ }
+
+ ComposedModifier<RoomModel> withRoomAccountData(immer::flex_vector<Event> accountDataEvent)
+ {
+ return [accountDataEvent](RoomModel &m) {
+ m.accountData = merge(std::move(m.accountData), accountDataEvent, keyOfAccountData);
+ };
+ }
+
+ ComposedModifier<RoomModel> withRoomState(immer::flex_vector<Event> stateEvent)
+ {
+ return [stateEvent](RoomModel &m) {
+ m.stateEvents = merge(std::move(m.stateEvents), stateEvent, keyOfState);
+ };
+ }
+
+ ComposedModifier<RoomModel> withRoomTimeline(immer::flex_vector<Event> timelineEvents)
+ {
+ return [timelineEvents](RoomModel &m) {
+ m = RoomModel::update(m, AddToTimelineAction{timelineEvents, std::nullopt, std::nullopt, std::nullopt});
+ };
+ }
+
+ ComposedModifier<RoomModel> withRoomMembership(RoomMembership membership)
+ {
+ return [membership](RoomModel &m) {
+ m.membership = membership;
+ };
+ }
+
+ Event makeEvent(const ComposedModifier<Event> &mod)
+ {
+ Event e = json{
+ {"type", "m.room.message"},
+ {"sender", "@foo:tusooa.xyz"},
+ {"content", {
+ {"msgtype", "m.text"},
+ {"body", "test"},
+ }},
+ {"origin_server_ts", 1000},
+ {"event_id", generateEventId()},
+ };
+ mod(e);
+ return e;
+ }
+
+ Event makeMemberEvent(const ComposedModifier<Event> &mod)
+ {
+ auto userId = generateUserId();
+ return makeEvent(
+ withEventType("m.room.member")
+ | withStateKey(userId)
+ | withEventContent(json::object())
+ | withMembership("join")
+ | mod
+ );
+ }
+
+ ComposedModifier<Event> withEventJson(const json &j)
+ {
+ return [j](Event &e) {
+ e = Event(j);
+ };
+ }
+
+ ComposedModifier<Event> withEventKV(const json::json_pointer &k, const json &v)
+ {
+ return [k, v](Event &e) {
+ auto j = e.originalJson().get();
+ j[k] = v;
+ withEventJson(j)(e);
+ };
+ }
+
+ ComposedModifier<Event> withEventId(std::string id)
+ {
+ return withEventKV("/event_id"_json_pointer, id);
+ }
+
+ ComposedModifier<Event> withEventType(std::string type)
+ {
+ return withEventKV("/type"_json_pointer, type);
+ }
+
+ ComposedModifier<Event> withEventContent(const json &content)
+ {
+ return withEventKV("/content"_json_pointer, content);
+ }
+
+ ComposedModifier<Event> withStateKey(std::string id)
+ {
+ return withEventKV("/state_key"_json_pointer, id);
+ }
+
+ ComposedModifier<Event> withMembership(std::string membership)
+ {
+ return withEventKV("/content/membership"_json_pointer, membership);
+ }
+
+ ComposedModifier<Event> withMemberDisplayName(std::string displayName)
+ {
+ return withEventKV("/content/displayname"_json_pointer, displayName);
+ }
+
+ ComposedModifier<Event> withMemberAvatarUrl(std::string avatarUrl)
+ {
+ return withEventKV("/content/avatar_url"_json_pointer, avatarUrl);
+ }
+}
diff --git a/src/tests/client/factory.hpp b/src/tests/client/factory.hpp
new file mode 100644
index 0000000..a312196
--- /dev/null
+++ b/src/tests/client/factory.hpp
@@ -0,0 +1,59 @@
+/*
+ * This file is part of libkazv.
+ * SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#pragma once
+#include <libkazv-config.hpp>
+
+#include <client-model.hpp>
+
+namespace Kazv
+{
+ namespace Factory
+ {
+ template<class ModelType>
+ struct ComposedModifier : std::function<void(ModelType &)>
+ {
+ using BaseT = std::function<void(ModelType &)>;
+ using BaseT::BaseT;
+ using BaseT::operator();
+
+ ComposedModifier() : BaseT([](ModelType &) {}) {}
+
+ ComposedModifier operator|(const ComposedModifier &that) const
+ {
+ return ComposedModifier([that, *this](ModelType &model) {
+ (*this)(model);
+ that(model);
+ });
+ }
+ };
+
+ ClientModel makeClient(const ComposedModifier<ClientModel> &mod);
+ ComposedModifier<ClientModel> withRoom(RoomModel room);
+
+ RoomModel makeRoom(const ComposedModifier<RoomModel> &mod);
+
+ ComposedModifier<RoomModel> withRoomId(std::string id);
+ ComposedModifier<RoomModel> withRoomAccountData(immer::flex_vector<Event> accountDataEvent);
+ ComposedModifier<RoomModel> withRoomState(immer::flex_vector<Event> stateEvent);
+ ComposedModifier<RoomModel> withRoomInviteState(immer::flex_vector<Event> stateEvent);
+ ComposedModifier<RoomModel> withRoomTimeline(immer::flex_vector<Event> timelineEvents);
+ ComposedModifier<RoomModel> withRoomMembership(RoomMembership membership);
+ ComposedModifier<RoomModel> withRoomEncrypted(bool encrypted);
+
+ Event makeEvent(const ComposedModifier<Event> &mod);
+ Event makeMemberEvent(const ComposedModifier<Event> &mod);
+ ComposedModifier<Event> withEventJson(const json &j);
+ ComposedModifier<Event> withEventKV(const json::json_pointer &k, const json &v);
+ ComposedModifier<Event> withEventId(std::string id);
+ ComposedModifier<Event> withEventType(std::string type);
+ ComposedModifier<Event> withEventContent(const json &content);
+ ComposedModifier<Event> withStateKey(std::string id);
+ ComposedModifier<Event> withMembership(std::string membership);
+ ComposedModifier<Event> withMemberDisplayName(std::string displayName);
+ ComposedModifier<Event> withMemberAvatarUrl(std::string avatarUrl);
+ }
+}

File Metadata

Mime Type
text/x-diff
Expires
Sat, Sep 19, 6:55 AM (1 d, 13 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1769046
Default Alt Text
(11 KB)

Event Timeline