using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using MySqlConnector; using Newtonsoft.Json.Linq; using SyncEngine.MySql; namespace SyncEngine.Tests { [TestClass] public class ShopSyncLogApiClientTests { [TestMethod] public void BuildPayloadJson_MapsSuccessEntry() { var started = new DateTime(2026, 6, 8, 2, 0, 0, DateTimeKind.Utc); var finished = new DateTime(2026, 6, 8, 2, 1, 12, DateTimeKind.Utc); var entry = new ShopSyncLogEntry { RunStartedAt = started, RunFinishedAt = finished, Status = "success", SourceReachable = true, ProductsUpserted = 42, ProductsWithdrawn = 3, Message = null }; var json = ShopSyncLogApiClient.BuildPayloadJson(entry); var obj = JObject.Parse(json); Assert.AreEqual("success", (string)obj["status"]); Assert.AreEqual(1, (int)obj["source_reachable"]); Assert.AreEqual(42, (int)obj["products_upserted"]); Assert.AreEqual(3, (int)obj["products_withdrawn"]); Assert.AreEqual("2026-06-08 02:00:00", (string)obj["run_started_at"]); Assert.AreEqual("2026-06-08 02:01:12", (string)obj["run_finished_at"]); Assert.AreEqual(JTokenType.Null, obj["message"].Type); } [TestMethod] public void BuildPayloadJson_MapsFailedEntryWithMessage() { var entry = new ShopSyncLogEntry { RunStartedAt = DateTime.UtcNow, RunFinishedAt = DateTime.UtcNow, Status = "failed", SourceReachable = false, ProductsUpserted = 0, ProductsWithdrawn = 0, Message = "Connection refused" }; var json = ShopSyncLogApiClient.BuildPayloadJson(entry); var obj = JObject.Parse(json); Assert.AreEqual("failed", (string)obj["status"]); Assert.AreEqual(0, (int)obj["source_reachable"]); Assert.AreEqual("Connection refused", (string)obj["message"]); } [TestMethod] public void BuildPayloadJson_OmitsEmptyMessage() { var entry = new ShopSyncLogEntry { RunStartedAt = DateTime.UtcNow, RunFinishedAt = DateTime.UtcNow, Status = "success", SourceReachable = true, Message = "" }; var json = ShopSyncLogApiClient.BuildPayloadJson(entry); var obj = JObject.Parse(json); Assert.AreEqual(JTokenType.Null, obj["message"].Type); } } }