using System; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json.Linq; using SyncEngine.MySql; namespace SyncEngine.Tests { [TestClass] public class ShopSyncLogLocalWriterTests { private string _tempDir; [TestInitialize] public void SetUp() { _tempDir = Path.Combine(Path.GetTempPath(), "sync-coordinator-test-" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(_tempDir); ShopSyncLogLocalWriter.SetLogDirectoryProviderForTests(() => _tempDir); } [TestCleanup] public void TearDown() { ShopSyncLogLocalWriter.ResetLogDirectoryProviderForTests(); if (Directory.Exists(_tempDir)) { Directory.Delete(_tempDir, recursive: true); } } [TestMethod] public void WriteFailedApiPost_AppendsJsonLineWithPayload() { var entry = new ShopSyncLogEntry { RunStartedAt = new DateTime(2026, 6, 8, 2, 0, 0, DateTimeKind.Utc), RunFinishedAt = new DateTime(2026, 6, 8, 2, 1, 0, DateTimeKind.Utc), Status = "failed", SourceReachable = false, ProductsUpserted = 0, ProductsWithdrawn = 0, Message = "MySQL down" }; var path = ShopSyncLogLocalWriter.WriteFailedApiPost( entry, new InvalidOperationException("mysql error"), new InvalidOperationException("api error")); Assert.IsTrue(File.Exists(path)); StringAssert.Contains(path, "shop-sync-log-failed-"); StringAssert.EndsWith(path, ".jsonl"); var line = File.ReadAllText(path).Trim(); var obj = JObject.Parse(line); Assert.AreEqual("mysql error", (string)obj["mysql_error"]); Assert.AreEqual("api error", (string)obj["api_error"]); Assert.AreEqual("failed", (string)obj["payload"]["status"]); Assert.AreEqual("MySQL down", (string)obj["payload"]["message"]); } } }