@@ -0,0 +1,75 @@
|
||||
using System.Reflection;
|
||||
using GmRelay.Shared.Domain;
|
||||
|
||||
namespace GmRelay.Bot.Tests.Domain;
|
||||
|
||||
public sealed class SessionStatusTests
|
||||
{
|
||||
[Fact]
|
||||
public void All_ShouldContainOnlyCanonicalSessionStatuses()
|
||||
{
|
||||
var allProperty = typeof(SessionStatus).GetProperty(
|
||||
"All",
|
||||
BindingFlags.Public | BindingFlags.Static);
|
||||
|
||||
Assert.NotNull(allProperty);
|
||||
|
||||
var allStatusValues = Assert.IsAssignableFrom<IReadOnlySet<string>>(allProperty.GetValue(null));
|
||||
var expectedStatusValues = new[]
|
||||
{
|
||||
SessionStatus.Planned,
|
||||
SessionStatus.ConfirmationSent,
|
||||
SessionStatus.Confirmed,
|
||||
SessionStatus.Cancelled
|
||||
}
|
||||
.Order(StringComparer.Ordinal);
|
||||
|
||||
Assert.Equal(expectedStatusValues, allStatusValues.Order(StringComparer.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ProductionSources_ShouldNotReferenceLegacySessionStatuses()
|
||||
{
|
||||
var repositoryRoot = FindRepositoryRoot();
|
||||
var productionFiles = Directory.EnumerateFiles(repositoryRoot, "*.*", SearchOption.AllDirectories)
|
||||
.Where(path => IsProductionSource(path))
|
||||
.ToList();
|
||||
|
||||
var legacyStatuses = new[] { "Recruit" + "ing", "Recruitment" + "Closed" };
|
||||
var offenders = productionFiles
|
||||
.SelectMany(path => legacyStatuses
|
||||
.Where(status => File.ReadAllText(path).Contains(status, StringComparison.Ordinal))
|
||||
.Select(status => $"{Path.GetRelativePath(repositoryRoot, path)} contains {status}"))
|
||||
.ToList();
|
||||
|
||||
Assert.Empty(offenders);
|
||||
}
|
||||
|
||||
private static bool IsProductionSource(string path)
|
||||
{
|
||||
var extension = Path.GetExtension(path);
|
||||
var separator = Path.DirectorySeparatorChar;
|
||||
|
||||
return path.Contains($"{separator}src{separator}", StringComparison.Ordinal)
|
||||
&& !path.Contains($"{separator}bin{separator}", StringComparison.Ordinal)
|
||||
&& !path.Contains($"{separator}obj{separator}", StringComparison.Ordinal)
|
||||
&& extension is ".cs" or ".razor" or ".sql";
|
||||
}
|
||||
|
||||
private static string FindRepositoryRoot()
|
||||
{
|
||||
var current = new DirectoryInfo(AppContext.BaseDirectory);
|
||||
|
||||
while (current is not null)
|
||||
{
|
||||
if (File.Exists(Path.Combine(current.FullName, "GM-Relay.slnx")))
|
||||
{
|
||||
return current.FullName;
|
||||
}
|
||||
|
||||
current = current.Parent;
|
||||
}
|
||||
|
||||
throw new InvalidOperationException("Could not find repository root.");
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ namespace GmRelay.Bot.Tests.Rendering;
|
||||
public sealed class SessionBatchRendererTests
|
||||
{
|
||||
[Fact]
|
||||
public void Render_ShouldOrderSessionsAndSkipButtonsForClosedStatuses()
|
||||
public void Render_ShouldOrderSessionsAndSkipButtonsForCancelledSessions()
|
||||
{
|
||||
var firstSessionId = Guid.NewGuid();
|
||||
var secondSessionId = Guid.NewGuid();
|
||||
@@ -14,9 +14,9 @@ public sealed class SessionBatchRendererTests
|
||||
|
||||
var sessions = new[]
|
||||
{
|
||||
new SessionBatchDto(secondSessionId, new DateTime(2026, 4, 27, 18, 0, 0, DateTimeKind.Utc), "Planned"),
|
||||
new SessionBatchDto(cancelledSessionId, new DateTime(2026, 4, 28, 18, 0, 0, DateTimeKind.Utc), "Cancelled"),
|
||||
new SessionBatchDto(firstSessionId, new DateTime(2026, 4, 26, 18, 0, 0, DateTimeKind.Utc), "RecruitmentClosed")
|
||||
new SessionBatchDto(secondSessionId, new DateTime(2026, 4, 27, 18, 0, 0, DateTimeKind.Utc), SessionStatus.Planned),
|
||||
new SessionBatchDto(cancelledSessionId, new DateTime(2026, 4, 28, 18, 0, 0, DateTimeKind.Utc), SessionStatus.Cancelled),
|
||||
new SessionBatchDto(firstSessionId, new DateTime(2026, 4, 26, 18, 0, 0, DateTimeKind.Utc), SessionStatus.Planned)
|
||||
};
|
||||
var participants = new[]
|
||||
{
|
||||
@@ -37,9 +37,12 @@ public sealed class SessionBatchRendererTests
|
||||
Assert.True(secondIndex < thirdIndex);
|
||||
Assert.Contains("@alice", text);
|
||||
Assert.Contains("Bob", text);
|
||||
Assert.Single(result.Markup.InlineKeyboard);
|
||||
Assert.Equal(2, result.Markup.InlineKeyboard.Count());
|
||||
Assert.Collection(
|
||||
buttons.Select(button => button.CallbackData),
|
||||
callbackData => Assert.Equal($"join_session:{firstSessionId}", callbackData),
|
||||
callbackData => Assert.Equal($"cancel_session:{firstSessionId}", callbackData),
|
||||
callbackData => Assert.Equal($"reschedule_session:{firstSessionId}", callbackData),
|
||||
callbackData => Assert.Equal($"join_session:{secondSessionId}", callbackData),
|
||||
callbackData => Assert.Equal($"cancel_session:{secondSessionId}", callbackData),
|
||||
callbackData => Assert.Equal($"reschedule_session:{secondSessionId}", callbackData));
|
||||
|
||||
Reference in New Issue
Block a user