Files
meezi/tests/Meezi.API.Tests/PrintingTests.cs
soroush.asadi f813cc4854
CI/CD / CI · API (dotnet build + test) (pull_request) Successful in 43s
CI/CD / CI · Admin API (dotnet build) (pull_request) Successful in 44s
CI/CD / CI · Dashboard (tsc) (pull_request) Successful in 1m7s
CI/CD / CI · Admin Web (tsc) (pull_request) Successful in 36s
CI/CD / CI · Website (tsc) (pull_request) Successful in 45s
CI/CD / CI · Koja (tsc) (pull_request) Successful in 51s
CI/CD / Deploy · all services (pull_request) Has been skipped
test: repair test suite broken by feature drift (red -> 81 passing)
The test project no longer compiled: recent feature commits changed
interfaces and DTOs without updating the test doubles/call sites, so the
whole suite (and therefore CI) was failing to build.

- NoOpInventoryService: add IInventoryService.GetPurchasesSummaryAsync and
  the new string? userId param on AdjustAsync.
- NoOpLoyaltyService: add ILoyaltyService.RedeemOnOrderAsync.
- NoOpOrderNotificationService: add NotifyCallWaiterAsync.
- New NoOpAbuseProtectionService and NoOpMediaStorageService test doubles.
- QrMenuTests: ReviewService/PublicService gained IAbuseProtectionService +
  IHttpContextAccessor (and ReviewService an IMediaStorageService); wire the
  new no-op doubles + a real HttpContextAccessor.
- PrintingTests: OrderDto gained a DisplayNumber int between CreatedAt and
  Items; pass it.
- DiscoverFilterTests: add missing `using Xunit;` and the new openNow arg on
  DiscoverFilterParams.FromQuery.

Result: dotnet test -> Passed: 81, Failed: 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 18:44:41 +03:30

122 lines
3.4 KiB
C#

using Meezi.API.Models.Orders;
using Meezi.API.Services.Printing;
using Meezi.Core.Enums;
using Xunit;
namespace Meezi.API.Tests;
public class PrintingTests
{
private static OrderDto SampleOrder() => new(
"order-abc12345",
"cafe-1",
"branch-1",
"table-1",
"5",
"Ali",
null,
null,
null,
null,
null,
OrderType.DineIn,
OrderSource.Pos,
OrderStatus.Pending,
200_000m,
18_000m,
0m,
218_000m,
0m,
DateTime.UtcNow,
1,
[
new OrderItemDto("i1", "m1", "Espresso", 2, 100_000m, null),
new OrderItemDto("i2", "m2", "Void Latte", 1, 50_000m, null, true)
],
[new PaymentDto("p1", PaymentMethod.Cash, 218_000m, PaymentStatus.Completed, null)]);
private static ReceiptPrintContext Ctx(int paper = 80) => new(
SampleOrder(),
"کافه دمو",
"شعبه اصلی",
"خوش آمدید",
"با تشکر",
"wifi1234",
paper,
true);
[Fact]
public void ReceiptBuilder_ExcludesVoidedItems()
{
var bytes = new ReceiptBuilder().BuildReceipt(Ctx());
var text = System.Text.Encoding.UTF8.GetString(bytes);
Assert.Contains("Espresso", text);
Assert.DoesNotContain("Void Latte", text);
}
[Fact]
public void ReceiptBuilder_AppliesPersianCalendarDate()
{
var bytes = new ReceiptBuilder().BuildReceipt(Ctx());
var text = System.Text.Encoding.UTF8.GetString(bytes);
Assert.Contains("تاریخ:", text);
}
[Fact]
public void ReceiptBuilder_ShowsTaxLine_WhenTaxNonZero()
{
var bytes = new ReceiptBuilder().BuildReceipt(Ctx());
var text = System.Text.Encoding.UTF8.GetString(bytes);
Assert.Contains("مالیات", text);
}
[Fact]
public void ReceiptBuilder_80mm_Uses48CharWidth()
{
var sep = new EscPosBuilder().Separator(48).Build();
var receipt = new ReceiptBuilder().BuildReceipt(Ctx(80));
Assert.NotEmpty(receipt);
Assert.Contains(sep, receipt);
}
[Fact]
public void ReceiptBuilder_58mm_Uses32CharWidth()
{
var sep = new EscPosBuilder().Separator(32).Build();
var receipt = new ReceiptBuilder().BuildReceipt(Ctx(58));
Assert.Contains(sep, receipt);
}
[Fact]
public void KitchenTicket_IncludesItemNotes()
{
var order = SampleOrder() with
{
Items =
[
new OrderItemDto("i1", "m1", "Burger", 1, 100_000m, "بدون پیاز")
]
};
var ctx = Ctx() with { Order = order };
var text = System.Text.Encoding.UTF8.GetString(new ReceiptBuilder().BuildKitchenTicket(ctx));
Assert.Contains("بدون پیاز", text);
Assert.Contains("آشپزخانه", text);
}
[Fact]
public void EscPosBuilder_Cut_AppendsCorrectBytes()
{
var bytes = new EscPosBuilder().Cut().Build();
Assert.Equal([0x1D, 0x56, 0x42, 0x03], bytes);
}
[Fact]
public void EscPosBuilder_TwoColumns_PadsCorrectly()
{
var bytes = new EscPosBuilder().TwoColumns("کالا", "1000", 10).Build();
var line = System.Text.Encoding.UTF8.GetString(bytes).TrimEnd('\n');
Assert.Equal(10, line.Length);
Assert.EndsWith("1000", line);
}
}