16#if __has_include(<gmock/gmock.h>)
18#ifndef MIRAI_GMOCK_ADAPTOR_HPP_
19#define MIRAI_GMOCK_ADAPTOR_HPP_
24#include <gmock/gmock.h>
32class GMockAdaptor :
public IAdaptor
34 static constexpr std::string_view SESSION_KEY =
"SessionKey";
37 template<
typename... Args>
using Callback = std::function<void(Args...)>;
38 using string = std::string;
40 GMockAdaptor() =
default;
41 ~GMockAdaptor()
override =
default;
43 Callback<ClientConnectionEstablishedEvent> ConnectionEstablishedCallback;
44 Callback<const string&> TextCallback;
45 Callback<ClientConnectionErrorEvent> ConnectionErrorCallback;
46 Callback<ClientConnectionClosedEvent> ConnectionClosedCallback;
57 void OnConnectionEstablished(Callback<ClientConnectionEstablishedEvent> callback)
override
59 this->ConnectionEstablishedCallback = callback;
66 void OnRecv(Callback<const string&> callback)
override { this->TextCallback = callback; }
72 void OnConnectionError(Callback<ClientConnectionErrorEvent> callback)
override
74 this->ConnectionErrorCallback = callback;
81 void OnConnectionClosed(Callback<ClientConnectionClosedEvent> callback)
override
83 this->ConnectionClosedCallback = callback;
91 void Connect()
override
94 if (this->ConnectionEstablishedCallback)
96 ClientConnectionEstablishedEvent event;
99 event.headers = {{
"Date",
"Tue, 07 Mar 2023 07:35:38 GMT"}, {
"Server",
"ktor-server-core/1.6.7"}};
100 event.protocol =
"HTTP";
101 event.SessionKey = SESSION_KEY;
102 event.BotProfile.id = 12345_qq;
103 event.BotProfile.nickname =
"Elanor";
104 event.BotProfile.remark =
"Elanor";
106 this->ConnectionEstablishedCallback(std::move(event));
115 void Disconnect(
string SessionKey)
override
117 if (SessionKey != SESSION_KEY)
return;
119 if (!this->ConnectionClosedCallback)
return;
121 ClientConnectionClosedEvent event;
123 event.reason =
"Normal Closure";
124 event.remote =
false;
126 this->ConnectionClosedCallback(std::move(event));
135 MOCK_METHOD(
string, Version, (), (
override));
138 MOCK_METHOD(QQ_t, GetBotQQ, (), (
override));
141 MOCK_METHOD(std::vector<QQ_t>, BotList, (), (
override));
144 MOCK_METHOD((std::variant<FriendMessageEvent, GroupMessageEvent, TempMessageEvent, StrangerMessageEvent>),
145 MessageFromId, (
string SessionKey,
MessageId_t id, UID_t target),
150 MOCK_METHOD(std::vector<User>, FriendList, (
string SessionKey), (
override));
153 MOCK_METHOD(std::vector<Group>, GroupList, (
string SessionKey), (
override));
156 MOCK_METHOD(std::vector<GroupMember>, MemberList, (
string SessionKey, GID_t target), (
override));
159 MOCK_METHOD(std::vector<GroupMember>, LatestMemberList, (
string SessionKey, GID_t target), (
override));
163 MOCK_METHOD(UserProfile, GetBotProfile, (
string SessionKey), (
override));
166 MOCK_METHOD(UserProfile, GetFriendProfile, (
string SessionKey, QQ_t target), (
override));
169 MOCK_METHOD(UserProfile, GetMemberProfile, (
string SessionKey, GID_t target, QQ_t MemberId), (
override));
172 MOCK_METHOD(UserProfile, GetUserProfile, (
string SessionKey, QQ_t target), (
override));
177 (
string SessionKey, QQ_t qq,
const MessageChain& message, std::optional<MessageId_t> QuoteId),
181 (
string SessionKey, QQ_t qq, MessageChain&& message, std::optional<MessageId_t> QuoteId),
186 (
string SessionKey, GID_t group,
const MessageChain& message,
187 std::optional<MessageId_t> QuoteId),
191 (
string SessionKey, GID_t group, MessageChain&& message,
192 std::optional<MessageId_t> QuoteId),
197 (
string SessionKey, QQ_t qq, GID_t group,
const MessageChain& message,
198 std::optional<MessageId_t> QuoteId),
202 (
string SessionKey, QQ_t qq, GID_t group, MessageChain&& message,
203 std::optional<MessageId_t> QuoteId),
207 MOCK_METHOD(
void, SendNudge, (
string SessionKey, QQ_t target, UID_t subject,
NudgeType kind), (
override));
210 MOCK_METHOD(
void, Recall, (
string SessionKey,
MessageId_t id, UID_t target), (
override));
213 MOCK_METHOD(std::vector<MessageChain>, RoamingMessages,
214 (
string SessionKey, std::time_t TimeStart, std::time_t TimeEnd, UID_t target), (
override));
218 MOCK_METHOD(std::vector<GroupFileInfo>, FileList,
219 (
string SessionKey,
string id,
string path, UID_t target, int64_t offset,
220 int64_t size,
bool withDownloadInfo),
224 MOCK_METHOD(GroupFileInfo, GetFileInfo,
225 (
string SessionKey,
string id,
string path, UID_t target,
bool withDownloadInfo),
229 MOCK_METHOD(GroupFileInfo, FileMkdir,
230 (
string SessionKey,
string id,
string path, UID_t target,
string directory),
234 MOCK_METHOD(
void, FileDelete, (
string SessionKey,
string id,
string path, UID_t target),
238 MOCK_METHOD(
void, FileMove,
239 (
string SessionKey,
string id,
string path, UID_t target,
240 string TargetDirId,
string TargetDirPath),
244 MOCK_METHOD(
void, FileRename,
245 (
string SessionKey,
string id,
string path, UID_t target,
string name),
250 MOCK_METHOD(GroupFileInfo, FileUpload,
251 (
string SessionKey,
string path, UID_t target,
string type,
string name,
260 MOCK_METHOD(GroupFileInfo, FileUploadChunked,
261 (
string SessionKey,
string path, UID_t target,
string type,
string name,
262 std::function<
bool(
size_t offset, std::ostream& sink,
bool& finish)> ContentProvider),
266 MOCK_METHOD(MiraiImage, UploadImage, (
string SessionKey,
string type,
string image), (
override));
273 MOCK_METHOD(MiraiImage, UploadImageChunked,
274 (
string SessionKey,
string type,
275 std::function<
bool(
size_t offset, std::ostream& sink,
bool& finish)> ContentProvider),
278 MOCK_METHOD(MiraiAudio, UploadAudio, (
string SessionKey,
string type,
string Audio), (
override));
285 MOCK_METHOD(MiraiAudio, UploadAudioChunked,
286 (
string SessionKey,
string type,
287 std::function<
bool(
size_t offset, std::ostream& sink,
bool& finish)> ContentProvider),
292 MOCK_METHOD(
void, DeleteFriend, (
string SessionKey, QQ_t target), (
override));
296 MOCK_METHOD(
void, Mute, (
string SessionKey, GID_t target, QQ_t member, std::chrono::seconds time),
300 MOCK_METHOD(
void, Unmute, (
string SessionKey, GID_t target, QQ_t member), (
override));
303 MOCK_METHOD(
void, Kick, (
string SessionKey, GID_t target, QQ_t member,
string message,
bool block), (
override));
306 MOCK_METHOD(
void, Quit, (
string SessionKey, GID_t target), (
override));
309 MOCK_METHOD(
void, MuteAll, (
string SessionKey, GID_t target), (
override));
312 MOCK_METHOD(
void, UnmuteAll, (
string SessionKey, GID_t target), (
override));
315 MOCK_METHOD(
void, SetEssence, (
string SessionKey,
MessageId_t id, GID_t target), (
override));
318 MOCK_METHOD(GroupConfig, GetGroupConfig, (
string SessionKey, GID_t target), (
override));
321 MOCK_METHOD(
void, SetGroupConfig,
322 (
string SessionKey, GID_t target,
string name, std::optional<bool> AllowConfessTalk,
323 std::optional<bool> AllowMemberInvite, std::optional<bool> AutoApprove,
324 std::optional<bool> AllowAnonymousChat),
328 MOCK_METHOD(GroupMember, GetMemberInfo, (
string SessionKey, GID_t target, QQ_t member), (
override));
331 MOCK_METHOD(
void, SetMemberInfo,
332 (
string SessionKey, GID_t target, QQ_t member,
string name,
string title),
336 MOCK_METHOD(
void, MemberAdmin, (
string SessionKey, GID_t target, QQ_t member,
bool assign), (
override));
340 MOCK_METHOD(std::vector<GroupAnnouncement>, AnnoList,
341 (
string SessionKey, GID_t target, int64_t offset, int64_t size), (
override));
344 MOCK_METHOD(GroupAnnouncement, AnnoPublish,
345 (
string SessionKey, GID_t target,
string content,
string url,
string path,
346 string base64,
bool ToNewMember,
bool pinned,
bool ShowEditCard,
bool ShowPopup,
347 bool RequireConfirm),
351 MOCK_METHOD(
void, AnnoDelete, (
string SessionKey, GID_t target,
string fid), (
override));
355 MOCK_METHOD(
void, RespNewFriendRequestEvent,
356 (
string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId,
int operate,
361 MOCK_METHOD(
void, RespMemberJoinRequestEvent,
362 (
string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId,
int operate,
367 MOCK_METHOD(
void, RespBotInvitedJoinGroupRequestEvent,
368 (
string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId,
int operate,
374 MOCK_METHOD(
void, CmdExecute, (
string SessionKey,
const MessageChain& command), (
override));
376 MOCK_METHOD(
void, CmdExecute, (
string SessionKey, MessageChain&& command), (
override));
379 MOCK_METHOD(
void, CmdRegister,
380 (
string SessionKey,
string name, std::vector<string> alias,
string usage,
386 MOCK_METHOD(
string, CallAPI, (
const string& path,
const string& method,
const string& data), (
override));
389template<
typename Callable>
390auto MakeGMockAdaptor(Callable&& func)
391 -> std::enable_if_t< std::is_invocable_v<Callable, GMockAdaptor&>, std::unique_ptr<IAdaptor>>
393 auto adaptor = std::make_unique<GMockAdaptor>();
int64_t MessageId_t
消息id类型,用于撤回消息和引用消息