Skip to content
This repository has been archived by the owner on Mar 4, 2024. It is now read-only.

Commit

Permalink
feat(adapter-mock): update mock
Browse files Browse the repository at this point in the history
  • Loading branch information
bsdayo committed Jun 15, 2023
1 parent 2d8d4f4 commit eb3bb0f
Show file tree
Hide file tree
Showing 12 changed files with 76 additions and 64 deletions.
2 changes: 1 addition & 1 deletion src/Flandre.Adapters.Mock/Flandre.Adapters.Mock.csproj
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<Title>Flandre.Adapters.Mock</Title>
<PackageVersion>1.0.0-rc.3</PackageVersion>
<PackageVersion>1.0.0-rc.4</PackageVersion>
<Authors>FlandreDevs,bsdayo</Authors>
<Description>Mock client for Project Flandre.</Description>
<PackageTags>bot;chatbot;flandre;adapter</PackageTags>
Expand Down
5 changes: 0 additions & 5 deletions src/Flandre.Adapters.Mock/MockBot.cs
Expand Up @@ -25,11 +25,6 @@ internal void ReceiveMessage(Message message)
MessageReceived?.Invoke(this, new BotMessageReceivedEvent(message));
}

internal void ReceiveMessageToReply(Message message)
{
MessageReceived?.Invoke(this, new BotMessageReceivedEvent(message));
}

private void Send(MessageContent? content)
{
ReplyTarget?.Tcs.TrySetResult(content);
Expand Down
10 changes: 6 additions & 4 deletions src/Flandre.Adapters.Mock/MockClient.cs
Expand Up @@ -45,17 +45,19 @@ public void SendMessage(string message)
_adapter.Bot.ReceiveMessage(msg);
}

public Task<MessageContent?> SendMessageForReply(string message) =>
SendMessageForReply(message, TimeSpan.FromSeconds(10));
public Task<MessageContent?> SendMessageForReplyAsync(string message)
{
return SendMessageForReplyAsync(message, TimeSpan.FromSeconds(10));
}

public Task<MessageContent?> SendMessageForReply(string message, TimeSpan timeout)
public Task<MessageContent?> SendMessageForReplyAsync(string message, TimeSpan timeout)
{
var tcs = new TaskCompletionSource<MessageContent?>();

var msg = ConstructMessage(message);

_adapter.Bot.ReplyTarget = (msg.MessageId, tcs);
_adapter.Bot.ReceiveMessageToReply(msg);
_adapter.Bot.ReceiveMessage(msg);

Task.Run(async () =>
{
Expand Down
16 changes: 16 additions & 0 deletions src/Flandre.Adapters.Mock/MockClientExtensions.cs
@@ -0,0 +1,16 @@
using Flandre.Core.Messaging;

namespace Flandre.Adapters.Mock;

public static class MockClientExtensions
{
public static MessageContent? SendMessageForReply(this MockClient client, string message)
{
return client.SendMessageForReplyAsync(message).GetAwaiter().GetResult();
}

public static MessageContent? SendMessageForReply(this MockClient client, string message, TimeSpan timeout)
{
return client.SendMessageForReplyAsync(message, timeout).GetAwaiter().GetResult();
}
}
18 changes: 16 additions & 2 deletions src/Flandre.Framework/FlandreApp.cs
Expand Up @@ -15,7 +15,7 @@ namespace Flandre.Framework;
/// <summary>
/// Flandre 应用
/// </summary>
public sealed partial class FlandreApp : IHost, ICommandRouteBuilder
public sealed partial class FlandreApp : IHost, ICommandRouteBuilder, IAsyncDisposable
{
private readonly IHost _hostApp;
private readonly IOptionsMonitor<FlandreAppOptions> _appOptions;
Expand All @@ -24,6 +24,7 @@ public sealed partial class FlandreApp : IHost, ICommandRouteBuilder
private readonly List<Func<MiddlewareContext, Func<Task>, Task>> _middleware = new();
private readonly List<Bot> _bots = new();
private bool _eventsSubscribedOnce;
private bool _isStopped = true;

/// <summary>
/// 所有机器人实例
Expand Down Expand Up @@ -206,6 +207,7 @@ public FlandreApp Use(Func<MiddlewareContext, Func<Task>, Task> middlewareAction
/// </summary>
public async Task StartAsync(CancellationToken cancellationToken = default)
{
_isStopped = false;
Starting?.Invoke(this, new AppStartingEvent());
Logger.LogDebug("Starting app...");

Expand Down Expand Up @@ -238,14 +240,26 @@ public async Task StopAsync(CancellationToken cancellationToken = default)
await _hostApp.StopAsync(cancellationToken);
Logger.LogInformation("App stopped");
Stopped?.Invoke(this, new AppStoppedEvent());
_isStopped = true;
}

/// <summary>
/// 停止应用实例并释放资源
/// </summary>
public void Dispose()
{
StopAsync().GetAwaiter().GetResult();
if (!_isStopped)
StopAsync().GetAwaiter().GetResult();
_hostApp.Dispose();
}

/// <summary>
/// 停止应用实例并释放资源
/// </summary>
public async ValueTask DisposeAsync()
{
if (!_isStopped)
await StopAsync();
_hostApp.Dispose();
}
}
2 changes: 1 addition & 1 deletion tests/Flandre.Framework.Tests/AppEventsTests.cs
Expand Up @@ -14,7 +14,7 @@ private class TestPlugin : Plugin
[Fact]
public async Task TestEvents()
{
using var app = Utils.CreateTestApp<TestPlugin>(out var client);
await using var app = Utils.CreateTestApp<TestPlugin>(out var client);

var count = 0;
string? cmdName = null;
Expand Down
4 changes: 1 addition & 3 deletions tests/Flandre.Framework.Tests/CommandNodeTests.cs
Expand Up @@ -19,7 +19,7 @@ private class TestPlugin : Plugin
}

[Fact]
public async Task TestNode()
public void TestNode()
{
using var app = Utils.StartTestApp<TestPlugin>(out _);

Expand All @@ -30,7 +30,5 @@ public async Task TestNode()
Assert.Equal("cmd-aaa.cmd-bbb", cmdService.RootNode.FindSubNode("cmd-aaa..cmd-bbb")?.FullName);
Assert.Equal("cmd-aaa.cmd-bbb", cmdService.RootNode.FindSubNode("cmd-aaa..cmd-bbb")?.Command?.FullName);
Assert.Equal("cmd-bbb", cmdService.RootNode.FindSubNode("cmd-bbb . .")?.Command?.FullName);

await app.StopAsync();
}
}
52 changes: 19 additions & 33 deletions tests/Flandre.Framework.Tests/CommandTests.cs
Expand Up @@ -78,89 +78,77 @@ public static async ValueTask<string> TestAsync()
}

[Fact]
public async Task TestCommands()
public void TestCommands()
{
using var app = Utils.CreateTestApp<TestPlugin>(out var client);
using var app = Utils.StartTestApp<TestPlugin>(out var client);

var service = app.Services.GetRequiredService<CommandService>();

await app.StartWithDefaultsAsync();

Assert.Equal(7, service.RootNode.CountCommands());

MessageContent? content;

content = await client.SendMessageForReply("OMR:114514");
content = client.SendMessageForReply("OMR:114514");
Assert.Equal("OMR:114514", content?.GetText());

content = await client.SendMessageForReply("test1 --opt 114.514 true");
content = client.SendMessageForReply("test1 --opt 114.514 true");
Assert.Equal("True 314.514", content?.GetText());
//
content = await client.SendMessageForReply("test2 -o 123 191.981 --no-opt1");
content = client.SendMessageForReply("test2 -o 123 191.981 --no-opt1");
Assert.Equal("123 191.981 False True",
content?.GetText());

// test async
content = await client.SendMessageForReply("testasync");
content = client.SendMessageForReply("testasync");
Assert.Equal("ok!", content?.GetText());

await app.StopAsync();
}

[Fact]
public async Task TestShortcuts()
public void TestShortcuts()
{
using var app = Utils.CreateTestApp<TestPlugin>(out var client);

await app.StartWithDefaultsAsync();
using var app = Utils.StartTestApp<TestPlugin>(out var client);

MessageContent? content;

content = await client.SendMessageForReply("测3试");
content = client.SendMessageForReply("测3试");
Assert.Equal("3 someStr", content?.GetText());

content = await client.SendMessageForReply("测试4");
content = client.SendMessageForReply("测试4");
Assert.Equal("123.456", content?.GetText());

content = await client.SendMessageForReply("测试4 114.514", TimeSpan.FromSeconds(2));
content = client.SendMessageForReply("测试4 114.514", TimeSpan.FromSeconds(2));
Assert.Null(content?.GetText());

content = await client.SendMessageForReply("测试5 333");
content = client.SendMessageForReply("测试5 333");
Assert.Equal("111.222 333 True", content?.GetText());
}

[Fact]
public async Task TestMapCommand()
public void TestMapCommand()
{
using var app = Utils.CreateTestApp(out var client);
using var app = Utils.StartTestApp(out var client);

app.MapCommand("test1", (int a, int b) => a + b);
app.MapCommand("test2.sub", (int x) => Math.Pow(x, 2));

await app.StartWithDefaultsAsync();

var content = await client.SendMessageForReply("test1 123 456");
var content = client.SendMessageForReply("test1 123 456");
Assert.Equal("579", content?.GetText());

content = await client.SendMessageForReply("test2 sub 12");
content = client.SendMessageForReply("test2 sub 12");
Assert.Equal("144", content?.GetText());

await app.StopAsync();
}

[Fact]
public async Task TestArrayParameter()
public void TestArrayParameter()
{
using var app = Utils.StartTestApp<TestPlugin>(out var client);

var content = await client.SendMessageForReply("test6 1.23 aaa bbb ccc ");
var content = client.SendMessageForReply("test6 1.23 aaa bbb ccc ");
Assert.Equal("1.23 | aaa,bbb,ccc", content?.GetText());

await app.StopAsync();
}

[Fact]
public async Task TestInformalAttributes()
public void TestInformalAttributes()
{
using var app = Utils.StartTestApp<TestPlugin>(out _);

Expand All @@ -172,7 +160,5 @@ public async Task TestInformalAttributes()
Assert.True(cmdService.RootNode.FindSubNode("test2")?.Command?.IsObsolete);
Assert.Equal("This command is obsoleted.",
cmdService.RootNode.FindSubNode("test2")?.Command?.ObsoleteMessage);

await app.StopAsync();
}
}
8 changes: 2 additions & 6 deletions tests/Flandre.Framework.Tests/FlandreAppTests.cs
Expand Up @@ -28,7 +28,7 @@ public static MessageContent OnTest(CommandContext ctx, bool arg1, [Option] doub
}

[Fact]
public async Task TestAliases()
public void TestAliases()
{
using var app = Utils.StartTestApp<TestPlugin>(out _);

Expand All @@ -44,20 +44,16 @@ public async Task TestAliases()
Assert.NotNull(cmdService.RootNode.FindSubNode("test111.11.45.14"));
Assert.Equal(cmdService.RootNode.FindSubNode("sssuuubbb")?.Command,
cmdService.RootNode.FindSubNode("sub.test")?.Command);

await app.StopAsync();
}

[Fact]
public async Task TestShortcutCount()
public void TestShortcutCount()
{
using var app = Utils.StartTestApp<TestPlugin>(out _);

var cmdService = app.Services.GetRequiredService<CommandService>();

Assert.Equal(2, cmdService.StringShortcuts.Count);
Assert.Single(cmdService.RegexShortcuts);

await app.StopAsync();
}
}
10 changes: 4 additions & 6 deletions tests/Flandre.Framework.Tests/MiddlewareTests.cs
Expand Up @@ -5,7 +5,7 @@ public class MiddlewareTests
[Fact]
public async Task TestMiddleware()
{
using var app = Utils.CreateTestApp(out var client);
await using var app = Utils.CreateTestApp(out var client);

// Order Note
// 1,2,3 ↓ ↑ 2
Expand Down Expand Up @@ -54,17 +54,15 @@ public async Task TestMiddleware()

await app.StartAsync();

var content1 = await client.SendMessageForReply("test (1) short me at middleware #1");
var content1 = client.SendMessageForReply("test (1) short me at middleware #1");
Assert.NotNull(content1);

var content2 = await client.SendMessageForReply("test (2) pass me through all middleware");
var content2 = client.SendMessageForReply("test (2) pass me through all middleware");
Assert.NotNull(content2);

var content3 = await client.SendMessageForReply("test (3) don't pass me", TimeSpan.FromSeconds(2));
var content3 = client.SendMessageForReply("test (3) don't pass me", TimeSpan.FromSeconds(2));
Assert.Null(content3);

await app.StopAsync();

Assert.Equal(2, count1In);
Assert.Equal(1, count2);
Assert.Equal(1, count1Out);
Expand Down
6 changes: 3 additions & 3 deletions tests/Flandre.Framework.Tests/SessionTests.cs
Expand Up @@ -17,14 +17,14 @@ private sealed class TestPlugin : Plugin
[Fact]
public async Task TestCommandSession()
{
using var app = Utils.StartTestApp<TestPlugin>(out var client);
await using var app = Utils.StartTestApp<TestPlugin>(out var client);

var task1 = client.SendMessageForReply("start-session");
var task1 = client.SendMessageForReplyAsync("start-session");
await Task.Delay(TimeSpan.FromSeconds(1));
client.SendMessage("return this");
Assert.NotNull(await task1);

var task2 = client.SendMessageForReply("start-session");
var task2 = client.SendMessageForReplyAsync("start-session");
await Task.Delay(TimeSpan.FromSeconds(3));
client.SendMessage("timeout!");
Assert.Null(await task2);
Expand Down
7 changes: 7 additions & 0 deletions tests/Flandre.Framework.Tests/Utils.cs
Expand Up @@ -39,4 +39,11 @@ public static FlandreApp StartTestApp<TPlugin>(out MockClient client, bool useFr
app.StartWithDefaultsAsync().Wait();
return app;
}

public static FlandreApp StartTestApp(out MockClient client, bool useFriendClient = false)
{
var app = CreateTestApp(out client, useFriendClient);
app.StartWithDefaultsAsync().Wait();
return app;
}
}

0 comments on commit eb3bb0f

Please sign in to comment.