using Microsoft.VisualStudio.TestTools.UnitTesting; using SyncEngine.Configuration; namespace SyncEngine.Tests { [TestClass] public class SyncOptionsValidatorTests { [TestMethod] public void Validate_FailsWhenEnvMissingAndAccessEnabled() { var options = new SyncOptions { SyncAccessToSqlExpress = true, SyncSqlExpressToMySql = false, AccessDbPath = "", BatchSize = 2000 }; try { SyncOptionsValidator.Validate(options, "access", false); Assert.Fail("Expected ConfigurationException"); } catch (ConfigurationException ex) { StringAssert.Contains(ex.Message, ".env"); StringAssert.Contains(ex.Message, "ACCESS_DB_PATH"); } } [TestMethod] public void Validate_FailsOnPlaceholderAccessPath() { var options = new SyncOptions { SyncAccessToSqlExpress = true, SyncSqlExpressToMySql = false, AccessDbPath = @"c:\path\New_Annies_Angels_be.mdb", SqlExpressConnectionString = "Server=.\\SQLEXPRESS;Trusted_Connection=True", SqlExpressDatabase = "AnniesAngels", SqlExpressSchema = "dbo", BatchSize = 2000 }; try { SyncOptionsValidator.Validate(options, "access", true); Assert.Fail("Expected ConfigurationException"); } catch (ConfigurationException ex) { StringAssert.Contains(ex.Message, "ACCESS_DB_PATH"); } } [TestMethod] public void Validate_FailsWhenMySqlUserMissing() { var options = new SyncOptions { SyncAccessToSqlExpress = false, SyncSqlExpressToMySql = true, SqlExpressConnectionString = "Server=.\\SQLEXPRESS;Trusted_Connection=True", MySqlHost = "127.0.0.1", MySqlPort = 3306, MySqlUser = "", MySqlDatabase = "shop", BatchSize = 2000 }; try { SyncOptionsValidator.Validate(options, "mysql", true); Assert.Fail("Expected ConfigurationException"); } catch (ConfigurationException ex) { StringAssert.Contains(ex.Message, "MYSQL_USER"); } } [TestMethod] public void LooksLikePlaceholder_DetectsYoursite() { Assert.IsTrue(SyncOptionsValidator.LooksLikePlaceholder("https://yoursite.com/api/shop-sync/log")); } [TestMethod] public void Validate_FailsWhenShopSyncApiUrlWithoutKey() { var options = new SyncOptions { SyncAccessToSqlExpress = false, SyncSqlExpressToMySql = true, SqlExpressConnectionString = "Server=.\\SQLEXPRESS;Trusted_Connection=True", MySqlHost = "127.0.0.1", MySqlPort = 3306, MySqlUser = "root", MySqlDatabase = "shop", ShopSyncApiUrl = "https://shop.example.com/api/shop-sync/log", ShopSyncApiKey = "", BatchSize = 2000 }; try { SyncOptionsValidator.Validate(options, "mysql", true); Assert.Fail("Expected ConfigurationException"); } catch (ConfigurationException ex) { StringAssert.Contains(ex.Message, "SHOP_SYNC_API_URL"); } } [TestMethod] public void Validate_FailsWhenShopSyncApiUrlIsPlaceholder() { var options = new SyncOptions { SyncAccessToSqlExpress = false, SyncSqlExpressToMySql = true, SqlExpressConnectionString = "Server=.\\SQLEXPRESS;Trusted_Connection=True", MySqlHost = "127.0.0.1", MySqlPort = 3306, MySqlUser = "root", MySqlDatabase = "shop", ShopSyncApiUrl = "https://yoursite.com/api/shop-sync/log", ShopSyncApiKey = "secret", BatchSize = 2000 }; try { SyncOptionsValidator.Validate(options, "mysql", true); Assert.Fail("Expected ConfigurationException"); } catch (ConfigurationException ex) { StringAssert.Contains(ex.Message, "SHOP_SYNC_API_URL"); } } } }