Page MenuHomePhorge

send-test.cpp
No OneTemporary

Size
6 KB
Referenced Files
None
Subscribers
None

send-test.cpp

/*
* This file is part of libkazv.
* SPDX-FileCopyrightText: 2021-2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <libkazv-config.hpp>
#include <lager/event_loop/boost_asio.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 "factory.hpp"
using namespace Kazv::Factory;
TEST_CASE("Send a message", "[client][send]")
{
ClientModel loggedInModel = makeClient({});
auto [resModel, dontCareEffect] = ClientModel::update(
loggedInModel, SendMessageAction{"!foo:tusooa.xyz", json{
{"type", "m.room.message"},
{"content", {{"foo", "bar"}}},
}});
assert1Job(resModel);
for1stJob(resModel, [] (const auto &job) {
REQUIRE(job.jobId() == "SendMessage");
REQUIRE(job.dataStr("roomId") == "!foo:tusooa.xyz");
REQUIRE(job.dataStr("txnId") != "");
});
}
TEST_CASE("Send a message with specified txnId", "[client][send]")
{
ClientModel loggedInModel = makeClient({});
auto [resModel, dontCareEffect] = ClientModel::update(
loggedInModel, SendMessageAction{"!foo:tusooa.xyz", json{
{"type", "m.room.message"},
{"content", {{"foo", "bar"}}},
}, "some-txn-id"});
assert1Job(resModel);
for1stJob(resModel, [] (const auto &job) {
REQUIRE(job.jobId() == "SendMessage");
REQUIRE(job.dataStr("roomId") == "!foo:tusooa.xyz");
REQUIRE(job.dataStr("txnId") == "some-txn-id");
});
}
TEST_CASE("Refuse to send unencrypted event to encrypted room", "[client][send]")
{
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
ClientModel m = makeClient(
withCrypto(makeCrypto({}))
| withRoom(makeRoom(
withRoomId("!exampleroomid:example.com")
| withRoomEncrypted(true)
))
);
auto store = createTestClientStoreFrom(m, ph);
store.dispatch(SendMessageAction{
"!exampleroomid:example.com",
Event{json{{"content", {{"foo", "bar"}}}, {"type", "m.room.message"}}},
})
.then([](auto status) {
REQUIRE(!status.success());
REQUIRE(status.dataStr("errorCode") == "MOE_KAZV_MXC_SENDING_UNENCRYPTED_EVENT_TO_ENCRYPTED_ROOM");
});
io.run();
}
TEST_CASE("Ok to send unencrypted state event to encrypted room", "[client][send]")
{
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
ClientModel m = makeClient(
withCrypto(makeCrypto({}))
| withRoom(makeRoom(
withRoomId("!exampleroomid:example.com")
| withRoomEncrypted(true)
))
);
auto store = createTestClientStoreFrom(m, ph);
store.dispatch(SendMessageAction{
"!exampleroomid:example.com",
Event{json{
{"content", {{"foo", "bar"}}},
{"type", "m.room.xxx"},
{"state_key", ""},
}},
})
.then([](auto status) {
REQUIRE(status.success());
});
io.run();
}
TEST_CASE("Refuse to send unencrypted m.room_key event", "[client][send]")
{
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
ClientModel m = makeClient(
withCrypto(makeCrypto({}))
| withRoom(makeRoom(
withRoomId("!exampleroomid:example.com")
| withRoomEncrypted(true)
))
);
auto store = createTestClientStoreFrom(m, ph);
store.dispatch(SendToDeviceMessageAction{
Event{json{{"content", {{"foo", "bar"}}}, {"type", "m.room_key"}}},
{},
})
.then([](auto status) {
REQUIRE(!status.success());
REQUIRE(status.dataStr("errorCode") == "MOE_KAZV_MXC_SENDING_ROOM_KEY_EVENT_UNENCRYPTED");
});
io.run();
}
TEST_CASE("UpdateLocalEchoStatusAction: update one does not exist", "[client][send]")
{
ClientModel loggedInModel = makeClient(
withRoom(makeRoom(
withRoomId("!foo:tusooa.xyz")
| withRoomEncrypted(true)
))
);
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
auto store = createTestClientStoreFrom(loggedInModel, ph);
auto client = Client(store.reader().map([](auto c) { return SdkModel{c}; }), store,
std::nullopt);
auto room = client.room("!foo:tusooa.xyz");
store.dispatch(UpdateLocalEchoStatusAction{
"!foo:tusooa.xyz",
"some-txn-id",
LocalEchoDesc::Failed,
})
.then([](auto status) {
REQUIRE(!status.success());
});
io.run();
auto localEchoes = room.localEchoes().make().get();
REQUIRE(localEchoes.size() == 0);
}
TEST_CASE("UpdateLocalEchoStatusAction: update one that exists", "[client][send]")
{
ClientModel loggedInModel = makeClient(
withRoom(makeRoom(
withRoomId("!foo:tusooa.xyz")
| withAttr(&RoomModel::localEchoes, {{"some-txn-id", Event()}})
))
);
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
auto store = createTestClientStoreFrom(loggedInModel, ph);
auto client = Client(store.reader().map([](auto c) { return SdkModel{c}; }), store,
std::nullopt);
auto room = client.room("!foo:tusooa.xyz");
store.dispatch(UpdateLocalEchoStatusAction{
"!foo:tusooa.xyz",
"some-txn-id",
LocalEchoDesc::Failed,
})
.then([](auto status) {
REQUIRE(status.success());
});
io.run();
auto localEchoes = room.localEchoes().make().get();
REQUIRE(localEchoes.size() == 1);
REQUIRE(localEchoes[0].txnId == "some-txn-id");
REQUIRE(localEchoes[0].status == LocalEchoDesc::Failed);
}
TEST_CASE("UpdateLocalEchoStatusAction: room does not exist", "[client][send]")
{
ClientModel loggedInModel = makeClient({});
boost::asio::io_context io;
SingleTypePromiseInterface<EffectStatus> ph{AsioPromiseHandler{io.get_executor()}};
auto store = createTestClientStoreFrom(loggedInModel, ph);
auto client = Client(store.reader().map([](auto c) { return SdkModel{c}; }), store,
std::nullopt);
auto room = client.room("!foo:tusooa.xyz");
store.dispatch(UpdateLocalEchoStatusAction{
"!foo:tusooa.xyz",
"some-txn-id",
LocalEchoDesc::Failed,
})
.then([](auto status) {
REQUIRE(!status.success());
});
io.run();
auto localEchoes = room.localEchoes().make().get();
REQUIRE(localEchoes.size() == 0);
}

File Metadata

Mime Type
text/x-c
Expires
Thu, Oct 2, 2:19 AM (20 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
471816
Default Alt Text
send-test.cpp (6 KB)

Event Timeline