using Deal.Telegram.Dialogs; namespace Deal.Telegram.Tests.Telegram; /// /// Unit-тесты зеркала каталога/мониторинга диалогов. /// public sealed class DialogCatalogTests { private const string TenantA = "tenant-a"; private const string TenantB = "tenant-b"; private const string ChannelId = "-1001234567890"; private const string GroupId = "-456789"; private const string UserId = "+12345"; /// /// SetMonitored включает/выключает диалог; IsMonitored повторяет решение. /// [Fact] public void SetMonitored_TogglesDialog() { var catalog = new DialogCatalog(); Assert.False(catalog.IsMonitored(TenantA, ChannelId)); catalog.SetMonitored(TenantA, ChannelId, enabled: true); Assert.True(catalog.IsMonitored(TenantA, ChannelId)); catalog.SetMonitored(TenantA, ChannelId, enabled: false); Assert.False(catalog.IsMonitored(TenantA, ChannelId)); } /// /// Мониторинг изолирован по тенантам /// [Fact] public void Monitored_IsIsolatedPerTenant() { var catalog = new DialogCatalog(); catalog.SetMonitored(TenantA, ChannelId, enabled: true); Assert.True(catalog.IsMonitored(TenantA, ChannelId)); Assert.False(catalog.IsMonitored(TenantB, ChannelId)); } /// /// SetMonitorAll(true) мониторит каталог и возвращает его размер; false — снимает всё. /// [Fact] public void SetAllMonitored_EnablesKnownDialogs_AndReturnsCount() { var catalog = new DialogCatalog(); catalog.ReplaceKnown(TenantA, [ChannelId, GroupId, UserId]); int count = catalog.SetAllMonitored(TenantA, enabled: true); Assert.Equal(3, count); Assert.True(catalog.IsMonitored(TenantA, ChannelId)); Assert.True(catalog.IsMonitored(TenantA, GroupId)); Assert.True(catalog.IsMonitored(TenantA, UserId)); catalog.SetAllMonitored(TenantA, enabled: false); Assert.False(catalog.IsMonitored(TenantA, ChannelId)); Assert.False(catalog.IsMonitored(TenantA, GroupId)); Assert.Equal(3, catalog.KnownCount(TenantA)); } /// /// SetMonitorAll(true) сохраняет мониторинг записей вне каталога /// [Fact] public void SetAllMonitored_TrueKeepsExistingMonitoredOutsideKnown() { var catalog = new DialogCatalog(); catalog.SetMonitored(TenantA, UserId, enabled: true); catalog.SetAllMonitored(TenantA, enabled: true); Assert.True(catalog.IsMonitored(TenantA, UserId)); } /// /// Актуализация ответом SyncDialogs /// [Fact] public void ReplaceMonitored_OverridesMirror_WithCoreReply() { var catalog = new DialogCatalog(); catalog.SetMonitored(TenantA, GroupId, enabled: true); catalog.SetMonitored(TenantA, UserId, enabled: true); catalog.ReplaceKnown(TenantA, [ChannelId, GroupId]); catalog.ReplaceMonitored(TenantA, [GroupId]); Assert.False(catalog.IsMonitored(TenantA, UserId)); // ядро сняло мониторинг (нет в каталоге) Assert.True(catalog.IsMonitored(TenantA, GroupId)); Assert.False(catalog.IsMonitored(TenantA, ChannelId)); } /// /// Reset (Logout) очищает каталог и мониторинг тенанта (`.clear`). /// [Fact] public void Reset_ClearsTenantState() { var catalog = new DialogCatalog(); catalog.ReplaceKnown(TenantA, [ChannelId]); catalog.SetMonitored(TenantA, ChannelId, enabled: true); catalog.Reset(TenantA); Assert.Equal(0, catalog.KnownCount(TenantA)); Assert.False(catalog.IsMonitored(TenantA, ChannelId)); } /// /// Каталог пустого тенанта /// [Fact] public void UnknownTenant_ReportsEmptyState() { var catalog = new DialogCatalog(); Assert.Equal(0, catalog.KnownCount(TenantB)); Assert.False(catalog.IsMonitored(TenantB, ChannelId)); Assert.Empty(catalog.SnapshotMonitored(TenantB)); } }