Log complete place_order requests

This commit is contained in:
janusz committed 2026-09-18 13:44:58 +00:00
1 parent 31daea55cf
commit 6cb57ad4d1
4 files changed
+78

No files matched your search

+69
View File
@@ -1,4 +1,5 @@
using System.Collections.Concurrent;
using Newtonsoft.Json.Linq;
using SmartB2B.Optima.Adapter;
using SmartB2B.Sync.Contracts;
using SmartB2B.Sync.Service.Orders;
@@ -17,6 +18,8 @@ var tests = new (string Name, Func<Task> Run)[]
("Handler przekazuje pełny kontrakt do Optimy", HandlerMapsOptimaContract),
("Handler przyjmuje i pomija opcjonalne extraFields", HandlerMapsOptionalExtraFields),
("Handler odrzuca błędne extraFields", HandlerRejectsInvalidExtraFields),
("Handler loguje pełne wywołanie place_order", HandlerLogsFullInvocation),
("Handler loguje wywołanie przed walidacją", HandlerLogsBeforeValidation),
("Fasada przypisuje atrybuty nagłówka przed zapisem", FacadeAddsDocumentAttributes),
("Fasada odrzuca nieznany kod atrybutu", FacadeRejectsMissingAttribute),
("Fasada zgłasza odrzuconą wartość atrybutu", FacadeRejectsAttributeValue),
@@ -152,6 +155,72 @@ static async Task HandlerRejectsInvalidExtraFields()
}
}
static async Task HandlerLogsFullInvocation()
{
using var adapter = new CapturingAdapter();
var handler = new PlaceOrderHandler(adapter, CreateConfiguration());
var request = CreateInvocation(new Dictionary<string, string> { ["SOURCE"] = "B2B" });
var invocation = new RpcInvocation(["trace-id"], request.KeywordArguments);
var output = await CaptureOutputAsync(() => handler.HandleAsync(invocation, CancellationToken.None));
var logged = ReadLoggedInvocation(output);
AssertEqual("trace-id", logged["args"]?[0]?.Value<string>(), "argument pozycyjny");
AssertEqual("eur", logged["kwargs"]?["currency_iso"]?.Value<string>(), "waluta bez normalizacji");
AssertEqual("123", logged["kwargs"]?["companyErpId"]?.Value<string>(), "kontrahent");
AssertEqual("PO/OPTIMA/1", logged["kwargs"]?["purchase_order_number"]?.Value<string>(), "referencja");
AssertEqual("Test", logged["kwargs"]?["notes"]?.Value<string>(), "uwagi");
AssertEqual("TOWAR", logged["kwargs"]?["lines"]?[0]?["symbol"]?.Value<string>(), "pozycja");
AssertEqual("B2B", logged["kwargs"]?["extraFields"]?["SOURCE"]?.Value<string>(), "atrybut");
}
static async Task HandlerLogsBeforeValidation()
{
using var adapter = new CapturingAdapter();
var handler = new PlaceOrderHandler(adapter, CreateConfiguration());
var invocation = new RpcInvocation([], new Dictionary<string, object?>
{
["extraFields"] = new Dictionary<string, string> { ["SOURCE"] = "B2B" }
});
var output = await CaptureOutputAsync(async () =>
{
try
{
await handler.HandleAsync(invocation, CancellationToken.None);
throw new InvalidOperationException("Oczekiwano błędu brakującej waluty.");
}
catch (WampException exception) when (exception.ErrorUri == "eu.smartb2b.missing_currency")
{
}
});
AssertEqual("B2B", ReadLoggedInvocation(output)["kwargs"]?["extraFields"]?["SOURCE"]?.Value<string>(),
"atrybut z odrzuconego wywołania");
}
static async Task<string> CaptureOutputAsync(Func<Task> action)
{
var original = Console.Out;
using var writer = new StringWriter();
try
{
Console.SetOut(writer);
await action();
return writer.ToString();
}
finally
{
Console.SetOut(original);
}
}
static JObject ReadLoggedInvocation(string output)
{
const string prefix = "Wywołanie eu.smartb2b.place_order: ";
var line = output.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)
.SingleOrDefault(item => item.StartsWith(prefix, StringComparison.Ordinal))
?? throw new InvalidOperationException("Brak logu pełnego wywołania.");
return JObject.Parse(line[prefix.Length..]);
}
static Task FacadeAddsDocumentAttributes()
{
var session = new FakeAttributeSession(new Dictionary<string, int> { ["SOURCE"] = 7, ["NOTE"] = 8 });