05ca8061e9
PR Checks / test-and-build (pull_request) Successful in 5m46s
Add a separate GmRelay.DiscordBot worker using NetCord Gateway with startup token validation, PostgreSQL datasource registration, slash-command setup, component interaction service registration, and lifecycle logging. Wire the Discord service through Aspire AppHost, Docker Compose, PR checks, deploy image build/push/scan/pull steps, README docs, and synchronized version 2.2.0. Add TDD coverage for project isolation, token validation, startup wiring, runtime wiring, and version synchronization. Bump version -> 2.2.0
80 lines
2.5 KiB
C#
80 lines
2.5 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace GmRelay.Bot.Tests.Discord;
|
|
|
|
public sealed class DiscordStartupTests
|
|
{
|
|
private static string GetRepoRoot()
|
|
{
|
|
var dir = AppContext.BaseDirectory;
|
|
while (!string.IsNullOrEmpty(dir) && !File.Exists(Path.Combine(dir, "Directory.Build.props")))
|
|
{
|
|
dir = Directory.GetParent(dir)?.FullName;
|
|
}
|
|
|
|
return dir ?? throw new InvalidOperationException("Could not find repo root");
|
|
}
|
|
|
|
[Fact]
|
|
public void Program_ShouldValidateDiscordTokenBeforeRunning()
|
|
{
|
|
var program = ReadProgram();
|
|
|
|
Assert.Contains("GetRequiredSection(\"Discord\")", program);
|
|
Assert.Contains("DiscordOptions", program);
|
|
Assert.Contains(".Validate()", program);
|
|
}
|
|
|
|
[Fact]
|
|
public void Program_ShouldRegisterServiceDefaultsAndPostgresDataSource()
|
|
{
|
|
var program = ReadProgram();
|
|
|
|
Assert.Contains("builder.AddServiceDefaults()", program);
|
|
Assert.Contains("ConnectionStrings:gmrelaydb is required", program);
|
|
Assert.Contains("NpgsqlDataSource", program);
|
|
Assert.Contains("SecretRedactor.RedactConnectionString", program);
|
|
}
|
|
|
|
[Fact]
|
|
public void Program_ShouldRegisterNetCordGatewayApplicationCommandsAndComponents()
|
|
{
|
|
var program = ReadProgram();
|
|
|
|
Assert.Contains(".AddDiscordGateway", program);
|
|
Assert.Contains(".AddApplicationCommands", program);
|
|
Assert.Contains(".AddComponentInteractions", program);
|
|
Assert.Contains(".AddGatewayHandlers", program);
|
|
Assert.Contains("AddSlashCommand", program);
|
|
}
|
|
|
|
[Fact]
|
|
public void LifecycleLogger_ShouldLogGatewayLifecycleEventsWithoutTokenValues()
|
|
{
|
|
var repoRoot = GetRepoRoot();
|
|
var loggerPath = Path.Combine(
|
|
repoRoot,
|
|
"src",
|
|
"GmRelay.DiscordBot",
|
|
"Infrastructure",
|
|
"Logging",
|
|
"DiscordGatewayLifecycleLogger.cs");
|
|
|
|
Assert.True(File.Exists(loggerPath), "Discord gateway lifecycle logger should exist.");
|
|
|
|
var logger = File.ReadAllText(loggerPath);
|
|
Assert.Contains("IReadyGatewayHandler", logger);
|
|
Assert.Contains("IDisconnectGatewayHandler", logger);
|
|
Assert.Contains("IResumeGatewayHandler", logger);
|
|
Assert.Contains("LogInformation", logger);
|
|
Assert.DoesNotContain("Token", logger);
|
|
}
|
|
|
|
private static string ReadProgram()
|
|
{
|
|
var repoRoot = GetRepoRoot();
|
|
return File.ReadAllText(Path.Combine(repoRoot, "src", "GmRelay.DiscordBot", "Program.cs"));
|
|
}
|
|
}
|