Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -371,4 +371,9 @@ src/terraform/.terraform*
.terraform.lock.hcl

*terraform.tfstate*
*local.tfbackend
*local.tfbackend
__azurite_db_blob__.json
__azurite_db_blob_extent__.json
__azurite_db_queue__.json
__azurite_db_queue_extent__.json
__azurite_db_table__.json
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using TheSexy6BotWorker.Helpers;
using TheSexy6BotWorker.Models;

namespace TheSexy6BotWorker.Tests.Helpers;

public class ImageCommandParserTests
{
[Fact]
public void Parse_WithPlainPrompt_UsesFluxDefault()
{
var result = ImageCommandParser.Parse("a", "small lighthouse at dawn");

Assert.True(result.Success);
Assert.NotNull(result.Request);
Assert.Equal("a small lighthouse at dawn", result.Request.Prompt);
Assert.Null(result.Request.RequestedModel);
}

[Fact]
public void Parse_WithSeedreamAlias_UsesRequestedModel()
{
var result = ImageCommandParser.Parse("seedream", "cinematic train station");

Assert.True(result.Success);
Assert.NotNull(result.Request);
Assert.Equal("cinematic train station", result.Request.Prompt);
Assert.Equal(ImageGenerationModelChoice.Seedream, result.Request.RequestedModel);
}

[Fact]
public void Parse_WithAliasAndNoPrompt_ReturnsUsageFailure()
{
var result = ImageCommandParser.Parse("flux", null);

Assert.False(result.Success);
Assert.Null(result.Request);
Assert.Equal(ImageCommandParser.Usage, result.Usage);
Assert.Contains("prompt", result.ErrorMessage, StringComparison.OrdinalIgnoreCase);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using TheSexy6BotWorker.Helpers;

namespace TheSexy6BotWorker.Tests.Helpers;

public class MessageRoutingRulesTests
{
[Theory]
[InlineData("/image a skyline", true)]
[InlineData("/tools", true)]
[InlineData("/", false)]
[InlineData("/ image", false)]
[InlineData("grok hello", false)]
public void IsLikelyCommandMessage_ClassifiesSlashCommands(string content, bool expected)
{
Assert.Equal(expected, MessageRoutingRules.IsLikelyCommandMessage(content));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using TheSexy6BotWorker.Models;
using TheSexy6BotWorker.Services;

namespace TheSexy6BotWorker.Tests.Models;

public class GeneratedImageHistoryMarkerTests
{
[Fact]
public void FromResult_RoundTripsStrictJsonMarker()
{
var createdAt = new DateTimeOffset(2026, 5, 14, 10, 30, 0, TimeSpan.Zero);
var result = ImageGenerationResult.CreateSuccess(
"a neon harbour",
"abc123",
ImageGenerationModelChoice.Flux,
ImageGenerationModelChoice.Seedream,
"bytedance-seed/seedream-4.5",
"2026/05/14/42/seedream-1K-abc123.png",
"https://images.example/seedream.png",
"image/png",
createdAt,
"Generated an image.",
usedFallback: true);
var context = new ImageGenerationExecutionContext(42, 100, 200, 300, IsAuto: true);

var marker = GeneratedImageHistoryMarker.FromResult(result, context);
var json = marker.ToJson();

Assert.True(GeneratedImageHistoryMarker.TryParse(json, out var parsed));
Assert.NotNull(parsed);
Assert.Equal("generated_image", parsed.Kind);
Assert.Equal(GeneratedImageHistoryMarker.CurrentVersion, parsed.Version);
Assert.Equal(42ul, parsed.SourceMessageId);
Assert.Equal("auto", parsed.Origin);
Assert.Equal("flux", parsed.RequestedModel);
Assert.Equal("seedream", parsed.ResolvedModel);
Assert.True(parsed.UsedFallback);
}

[Fact]
public void TryParse_RejectsWrongKind()
{
var parsed = GeneratedImageHistoryMarker.TryParse("""{"kind":"not_image","version":1}""", out var marker);

Assert.False(parsed);
Assert.Null(marker);
}
}
Loading
Loading