From 94a3c64598320cd3dd3a622edb44222632121043 Mon Sep 17 00:00:00 2001 From: cd Date: Tue, 4 Nov 2025 10:05:38 +0100 Subject: [PATCH 01/12] work in progress --- .../files/FWO.Test/ReportRulesTest.cs | 89 ++++++++++++++++++- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index d96d4f74fa..95bc1d4f23 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -1,12 +1,97 @@ -using NUnit.Framework; -using FWO.Report; +using FWO.Basics; using FWO.Data; +using FWO.Data.Report; +using FWO.Report; +using FWO.Test.Mocks; +using Microsoft.AspNetCore.Routing; +using NUnit.Framework; namespace FWO.Test { [TestFixture] internal class ReportRulesTest { + [Test] + public void MockReportRules_SetupSingleManagementReportEmpty_CreatesDevice() + { + var mock = new MockReportRules(null!, null!, ReportType.Rules); + var reports = mock.SetupSingleManagementReportEmpty(); + + Assert.That(reports.Count, Is.EqualTo(1)); + Assert.That(reports[0].Devices.Count, Is.EqualTo(1)); + } + + [Test] + public void Test_SetupSingleManagementReportEmpty_CreatesDeviceWithoutRulebases() + { + var mock = new MockReportRules( + query: null!, // kann hier null sein, da Mock + userConfig: null!, + reportType: ReportType.Rules // oder ein beliebiger Enum-Wert + ); + + // Zugriff auf erzeugte ManagementData + var mgmtData = mock.ReportData.ManagementData; + + Assert.That(mgmtData, Is.Not.Empty); + Assert.That(mgmtData[0].Devices.Count, Is.EqualTo(1)); + Assert.That(mgmtData[0].Rulebases.Count, Is.EqualTo(0)); + } + + [Test] + public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() + { + int numberOfRules = 3; + var rulebaseReport = MockReportRules.CreateRulebaseReport("TestRB", numberOfRules); + + var managementReport = new ManagementReport + { + Rulebases = new[] { rulebaseReport } + }; + + var rbLink = new RulebaseLink { NextRulebaseId = rulebaseReport.Id }; + + + // Act + var result = ReportRules.GetRulesByRulebaseId(rulebaseReport.Id, managementReport); + int count = ReportRules.GetRuleCount(managementReport, rbLink, new[] { rbLink }); + + Assert.That(count, Is.EqualTo(2)); + Assert.That(result.Length, Is.EqualTo(3)); + Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebaseReport.Id}.")); + Assert.That(rulebaseReport.Rules.Length, Is.EqualTo(numberOfRules)); + Assert.That(rulebaseReport.Name, Is.EqualTo("TestRB")); + Assert.That(rulebaseReport.Rules[0].Name, Does.StartWith("Mock Rule")); + } + + + [Test] + public void Test_CreateDeviceReport_HasConsistentIds() + { + var device = MockReportRules.CreateDeviceReport(2, "Firewall-01"); + + Assert.That(device.Id, Is.EqualTo(2)); + Assert.That(device.Uid, Is.EqualTo("device-2")); + Assert.That(device.Name, Is.EqualTo("Firewall-01")); + } + + [Test] + public void Test_CreateRuleTreeItem_BuildsValidTree() + { + var child = MockReportRules.CreateRuleTreeItem(2, 1, new List { 1, 2 }); + var parent = MockReportRules.CreateRuleTreeItem(1, 1, new List { 1 }, new List> { child }); + + Assert.That(parent.Children.Count, Is.EqualTo(1)); + Assert.That(parent.Children[0].Data!.Id, Is.EqualTo(2)); + Assert.That(parent.Data!.Id, Is.EqualTo(1)); + } + + + + + + + } } From 37833429c26b8e5d5221a7fc25bf3dd98ca02b22 Mon Sep 17 00:00:00 2001 From: cd Date: Tue, 4 Nov 2025 16:40:48 +0100 Subject: [PATCH 02/12] work in progress unit tests --- .../files/FWO.Test/ReportRulesTest.cs | 288 ++++++++++++++++-- 1 file changed, 258 insertions(+), 30 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index 95bc1d4f23..ca44ea5041 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -1,41 +1,43 @@ using FWO.Basics; +using FWO.Config.Api; using FWO.Data; using FWO.Data.Report; using FWO.Report; using FWO.Test.Mocks; using Microsoft.AspNetCore.Routing; +using Moq; using NUnit.Framework; +using System.Reflection; +using System.Text; namespace FWO.Test { [TestFixture] internal class ReportRulesTest { - [Test] - public void MockReportRules_SetupSingleManagementReportEmpty_CreatesDevice() + + + + + private MockReportRules? _mockReportRules; + private List? _managementReports; + + [SetUp] + public void setUp() { - var mock = new MockReportRules(null!, null!, ReportType.Rules); - var reports = mock.SetupSingleManagementReportEmpty(); + MockReportRules.RulebaseId = 0; + MockReportRules.RuleId = 0; - Assert.That(reports.Count, Is.EqualTo(1)); - Assert.That(reports[0].Devices.Count, Is.EqualTo(1)); + _mockReportRules = new MockReportRules(new Report.Filter.DynGraphqlQuery(""), new Config.Api.UserConfig(), ReportType.Rules, null!); + _managementReports = _mockReportRules.SetupSingleManagementReportEmpty(); } [Test] - public void Test_SetupSingleManagementReportEmpty_CreatesDeviceWithoutRulebases() + public void Test_SetupSingleManagementReport_CreatesDeviceWithoutRulebases() { - var mock = new MockReportRules( - query: null!, // kann hier null sein, da Mock - userConfig: null!, - reportType: ReportType.Rules // oder ein beliebiger Enum-Wert - ); - - // Zugriff auf erzeugte ManagementData - var mgmtData = mock.ReportData.ManagementData; - - Assert.That(mgmtData, Is.Not.Empty); - Assert.That(mgmtData[0].Devices.Count, Is.EqualTo(1)); - Assert.That(mgmtData[0].Rulebases.Count, Is.EqualTo(0)); + Assert.That(_managementReports!.Count, Is.EqualTo(1)); + Assert.That(_managementReports[0].Devices.Count, Is.EqualTo(1)); + Assert.That(_managementReports[0].Rulebases.Count, Is.EqualTo(0)); } [Test] @@ -48,15 +50,13 @@ public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() { Rulebases = new[] { rulebaseReport } }; - - var rbLink = new RulebaseLink { NextRulebaseId = rulebaseReport.Id }; - + var rulebaseLink = new RulebaseLink { NextRulebaseId = rulebaseReport.Id }; // Act var result = ReportRules.GetRulesByRulebaseId(rulebaseReport.Id, managementReport); - int count = ReportRules.GetRuleCount(managementReport, rbLink, new[] { rbLink }); + int count = ReportRules.GetRuleCount(managementReport, rulebaseLink, new[] { rulebaseLink }); - Assert.That(count, Is.EqualTo(2)); + Assert.That(count, Is.EqualTo(3)); Assert.That(result.Length, Is.EqualTo(3)); Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebaseReport.Id}.")); Assert.That(rulebaseReport.Rules.Length, Is.EqualTo(numberOfRules)); @@ -64,9 +64,18 @@ public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() Assert.That(rulebaseReport.Rules[0].Name, Does.StartWith("Mock Rule")); } + [Test] + public void Test_CreateDeviceReport_HasConsistentId_And_Uid_For_Device1() + { + var device = MockReportRules.CreateDeviceReport(1, "Device1"); + + Assert.That(device.Id, Is.EqualTo(1)); + Assert.That(device.Uid, Is.EqualTo("device-1")); + Assert.That(device.Name, Is.EqualTo("Device1")); + } [Test] - public void Test_CreateDeviceReport_HasConsistentIds() + public void Test_CreateDeviceReport_HasConsistentId_And_Uid_For_Device2() { var device = MockReportRules.CreateDeviceReport(2, "Firewall-01"); @@ -78,20 +87,239 @@ public void Test_CreateDeviceReport_HasConsistentIds() [Test] public void Test_CreateRuleTreeItem_BuildsValidTree() { - var child = MockReportRules.CreateRuleTreeItem(2, 1, new List { 1, 2 }); - var parent = MockReportRules.CreateRuleTreeItem(1, 1, new List { 1 }, new List> { child }); + var ruleTreeItemChild = MockReportRules.CreateRuleTreeItem(2, 1, new List { 1, 2 }); + var ruleTreeItemParent = MockReportRules.CreateRuleTreeItem(1, 1, new List { 1 }, new List> { ruleTreeItemChild }); + + Assert.That(ruleTreeItemParent.Children.Count, Is.EqualTo(1)); + Assert.That(ruleTreeItemParent.Children[0].Data!.Id, Is.EqualTo(2)); + Assert.That(ruleTreeItemParent.Data!.Id, Is.EqualTo(1)); + } + + [Test] + public void Test_RulebaseId_SetterGetter() + { + MockReportRules.RulebaseId = 10; + Assert.That(MockReportRules.RulebaseId, Is.EqualTo(10)); + + MockReportRules.RulebaseId = 20; + Assert.That(MockReportRules.RulebaseId, Is.EqualTo(20)); + } + + [Test] + public void Test_RuleId_SetterGetter() + { + MockReportRules.RuleId = 50; + Assert.That(MockReportRules.RuleId, Is.EqualTo(50)); + + MockReportRules.RuleId = 100; + Assert.That(MockReportRules.RuleId, Is.EqualTo(100)); + } + + [Test] + public void Test_MultipleRulebases_InManagementReport() + { + var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 2); + var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 3); + var managementReport = new ManagementReport + { + Rulebases = new[] { rulebase1, rulebase2 } + }; + + Assert.That(managementReport.Rulebases.Length, Is.EqualTo(2)); + Assert.That(managementReport.Rulebases[0].Rules.Length, Is.EqualTo(2)); + Assert.That(managementReport.Rulebases[1].Rules.Length, Is.EqualTo(3)); + Assert.That(managementReport.Rulebases[0].Rules[0].Name, Is.EqualTo("Mock Rule 1")); + Assert.That(managementReport.Rulebases[1].Rules[2].Name, Is.EqualTo("Mock Rule 5")); + } + + [Test] + public void Test_DeviceWithMultipleRulebaseLinks() + { + var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 1); + var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 2); + var device = MockReportRules.CreateDeviceReport(1, "Device1", new List + { + new RulebaseLink { NextRulebaseId = rulebase1.Id }, + new RulebaseLink { NextRulebaseId = rulebase2.Id } + }); - Assert.That(parent.Children.Count, Is.EqualTo(1)); - Assert.That(parent.Children[0].Data!.Id, Is.EqualTo(2)); - Assert.That(parent.Data!.Id, Is.EqualTo(1)); + Assert.That(device.RulebaseLinks.Length, Is.EqualTo(2)); + Assert.That(device.RulebaseLinks[0].NextRulebaseId, Is.EqualTo(rulebase1.Id)); + Assert.That(device.RulebaseLinks[1].NextRulebaseId, Is.EqualTo(rulebase2.Id)); } + [Test] + public void Test_ContainsRules_Scenarios() + { + var rulebaseReport = MockReportRules.CreateRulebaseReport(); + + var managementReport = new ManagementReport + { + Rulebases = new[] { rulebaseReport } + }; + Assert.That(managementReport.ContainsRules(), Is.False); + var managementWithoutDevices = new ManagementReport { Devices = new DeviceReport[0] }; + Assert.That(managementWithoutDevices.ContainsRules(), Is.False); + + var managementWithDevicesWithoutRules = new ManagementReport + { + Devices = new DeviceReport[] { } + }; + Assert.That(managementWithDevicesWithoutRules.ContainsRules(), Is.False); + } + [Test] + public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() + { + // Arrange + var mockReportRules = new MockReportRules( + new Report.Filter.DynGraphqlQuery(""), + new Config.Api.UserConfig(), + ReportType.Rules, + null! + ); + var rulebase = MockReportRules.CreateRulebaseReport("RB1", 3); + var device = MockReportRules.CreateDeviceReport(1, "Device1", new List + { + new RulebaseLink { NextRulebaseId = rulebase.Id } + }); + var management = new ManagementReport + { + Id = 1, + Rulebases = new[] { rulebase }, + Devices = new[] { device } + }; + + mockReportRules.ReportData.ManagementData.Add(management); + + // Act (via Reflection, da Methode private ist) + var tryBuildRuleTreeMethod = typeof(ReportRules).GetMethod("TryBuildRuleTree", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + tryBuildRuleTreeMethod!.Invoke(mockReportRules, null); + + // Assert + Assert.That(mockReportRules.ReportData.ElementsCount, Is.EqualTo(3)); // 3 Rules in Rulebase + Assert.That(management.ReportedRuleIds.Count, Is.EqualTo(3)); + Assert.That(management.ReportedRuleIds, Is.EquivalentTo(rulebase.Rules.Select(r => r.Id))); + + var cacheField = typeof(ReportRules).GetField("_rulesCache", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + var cache = (Dictionary<(int, int), List>)cacheField!.GetValue(null)!; + + Assert.That(cache.ContainsKey((device.Id, management.Id)), Is.True); + Assert.That(cache[(device.Id, management.Id)].Count, Is.EqualTo(3)); + } + + [Test] + public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() + { + var management = new ManagementReport + { + Rulebases = new[] { MockReportRules.CreateRulebaseReport(numberOfRules: 2) } + }; + + var device = new DeviceReportController(DeviceReportController.FromDeviceReport(MockReportRules.CreateDeviceReport())); + + + device.GetInitialRulebaseId(management); + + var rules = ReportRules.GetInitialRulesOfGateway(device, management); + + Assert.That(rules.Length, Is.EqualTo(2)); //Fragen + Assert.That(rules.All(r => r.RulebaseId == 1)); + } + + [Test] + public void GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() + { + var management = new ManagementReport(); + var device = new DeviceReportController(DeviceReportController.FromDeviceReport(MockReportRules.CreateDeviceReport())); + + device.GetInitialRulebaseId(management); + + var rules = ReportRules.GetInitialRulesOfGateway(device, management); + + Assert.That(rules, Is.Empty); + } + + + + [Test] + public void GetAllRulesOfGateway_ReturnsRules_FromCache() + { + var device = MockReportRules.CreateDeviceReport(); + var management = new ManagementReport(); + var rules = new List { new Rule { Id = 1, RulebaseId = 1 } }; + + // Cache manuell setzen + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, management.Id)] = rules }); + + var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); + + Assert.That(result, Has.Length.EqualTo(1)); + Assert.That(result[0].Id, Is.EqualTo(1)); + } + + [Test] + public void GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() + { + var device = MockReportRules.CreateDeviceReport(); + var management = new ManagementReport(); + + // Cache leeren + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List>()); + + var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); + + Assert.That(result, Is.Empty); + } + + [Test] + public void ConstructHtmlReport_GeneratesHtmlSections() + { + // Arrange + var mockReportRules = new MockReportRules( + new Report.Filter.DynGraphqlQuery(""), + new Config.Api.UserConfig(), + ReportType.Rules, + null! + ); + + + var rulebase = MockReportRules.CreateRulebaseReport("Mock Rulebase", 3); + var device = MockReportRules.CreateDeviceReport(1, "Mock Device1", new List + { + new RulebaseLink { NextRulebaseId = rulebase.Id } + }); + + var management = new ManagementReport + { + Id = 1, + Rulebases = new[] { rulebase }, + Devices = new[] { device } + }; + mockReportRules.ReportData.ManagementData.Add(management); + + var reportBuilder = new StringBuilder(); + int chapterNumber = 0; + + // Act + mockReportRules.ConstructHtmlReport(ref reportBuilder, mockReportRules.ReportData.ManagementData, chapterNumber); + + // Assert + string html = reportBuilder.ToString(); + Assert.That(html, Does.Contain("Mock Device1")); + Assert.That(html, Does.Contain("
")); + } } } From 5c4c31821fde3ca1d3e90353543d8e8c4837e6b7 Mon Sep 17 00:00:00 2001 From: cd Date: Tue, 4 Nov 2025 17:04:16 +0100 Subject: [PATCH 03/12] wop --- .../tests-unit/files/FWO.Test/ReportRulesTest.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index ca44ea5041..c4c0b5cc1b 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -15,13 +15,18 @@ namespace FWO.Test [TestFixture] internal class ReportRulesTest { + private MockReportRules _mockReportRules = new MockReportRules( + new Report.Filter.DynGraphqlQuery(""), + new Config.Api.UserConfig(), + ReportType.Rules, + null! + ); + private List _managementReports = new List(); + private DeviceReportController _device = new DeviceReportController(); + private ManagementReport _management = new ManagementReport(); + private RulebaseReport _rulebase = new RulebaseReport(); - - - private MockReportRules? _mockReportRules; - private List? _managementReports; - [SetUp] public void setUp() { From 6a423d152cc89e330df03b3d2e775fb033e84773 Mon Sep 17 00:00:00 2001 From: cd Date: Wed, 5 Nov 2025 09:40:58 +0100 Subject: [PATCH 04/12] Add unit tests for ReportRules and MockReportRules --- .../files/FWO.Test/ReportRulesTest.cs | 118 +++++++++--------- 1 file changed, 56 insertions(+), 62 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index c4c0b5cc1b..91ce07002c 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -15,16 +15,8 @@ namespace FWO.Test [TestFixture] internal class ReportRulesTest { - private MockReportRules _mockReportRules = new MockReportRules( - new Report.Filter.DynGraphqlQuery(""), - new Config.Api.UserConfig(), - ReportType.Rules, - null! - ); - private List _managementReports = new List(); - private DeviceReportController _device = new DeviceReportController(); - private ManagementReport _management = new ManagementReport(); - private RulebaseReport _rulebase = new RulebaseReport(); + private MockReportRules _mockReportRules = null!; + private List _managementReports = new(); [SetUp] @@ -33,10 +25,39 @@ public void setUp() MockReportRules.RulebaseId = 0; MockReportRules.RuleId = 0; - _mockReportRules = new MockReportRules(new Report.Filter.DynGraphqlQuery(""), new Config.Api.UserConfig(), ReportType.Rules, null!); + _mockReportRules = new MockReportRules( + new Report.Filter.DynGraphqlQuery(""), + new Config.Api.UserConfig(), + ReportType.Rules, + null! + ); _managementReports = _mockReportRules.SetupSingleManagementReportEmpty(); } + public void TearDown() + { + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List>()); + } + + private (ManagementReport management, DeviceReport device) CreateBasicManagementSetup(int ruleCount = 3) + { + var rulebase = MockReportRules.CreateRulebaseReport("RB", ruleCount); + var device = MockReportRules.CreateDeviceReport(1, "Device1", new List + { + new RulebaseLink { NextRulebaseId = rulebase.Id } + }); + var management = new ManagementReport + { + Id = 1, + Rulebases = new[] { rulebase }, + Devices = new[] { device } + }; + return (management, device); + } + + [Test] public void Test_SetupSingleManagementReport_CreatesDeviceWithoutRulebases() { @@ -49,24 +70,20 @@ public void Test_SetupSingleManagementReport_CreatesDeviceWithoutRulebases() public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() { int numberOfRules = 3; - var rulebaseReport = MockReportRules.CreateRulebaseReport("TestRB", numberOfRules); + var (management, device) = CreateBasicManagementSetup(numberOfRules); - var managementReport = new ManagementReport - { - Rulebases = new[] { rulebaseReport } - }; - var rulebaseLink = new RulebaseLink { NextRulebaseId = rulebaseReport.Id }; + var rulebase = management.Rulebases.First(); + var result = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); - // Act - var result = ReportRules.GetRulesByRulebaseId(rulebaseReport.Id, managementReport); - int count = ReportRules.GetRuleCount(managementReport, rulebaseLink, new[] { rulebaseLink }); + var rulebaseLink = new RulebaseLink { NextRulebaseId = rulebase.Id }; + int count = ReportRules.GetRuleCount(management, rulebaseLink, new[] { rulebaseLink }); Assert.That(count, Is.EqualTo(3)); Assert.That(result.Length, Is.EqualTo(3)); - Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebaseReport.Id}.")); - Assert.That(rulebaseReport.Rules.Length, Is.EqualTo(numberOfRules)); - Assert.That(rulebaseReport.Name, Is.EqualTo("TestRB")); - Assert.That(rulebaseReport.Rules[0].Name, Does.StartWith("Mock Rule")); + Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebase.Id}.")); + Assert.That(rulebase.Rules.Length, Is.EqualTo(numberOfRules)); + Assert.That(rulebase.Name, Is.EqualTo("RB")); + Assert.That(rulebase.Rules[0].Name, Does.StartWith("Mock Rule")); } [Test] @@ -187,19 +204,7 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() null! ); - - var rulebase = MockReportRules.CreateRulebaseReport("RB1", 3); - var device = MockReportRules.CreateDeviceReport(1, "Device1", new List - { - new RulebaseLink { NextRulebaseId = rulebase.Id } - }); - - var management = new ManagementReport - { - Id = 1, - Rulebases = new[] { rulebase }, - Devices = new[] { device } - }; + var (management, device) = CreateBasicManagementSetup(3); mockReportRules.ReportData.ManagementData.Add(management); @@ -211,7 +216,7 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() // Assert Assert.That(mockReportRules.ReportData.ElementsCount, Is.EqualTo(3)); // 3 Rules in Rulebase Assert.That(management.ReportedRuleIds.Count, Is.EqualTo(3)); - Assert.That(management.ReportedRuleIds, Is.EquivalentTo(rulebase.Rules.Select(r => r.Id))); + Assert.That(management.ReportedRuleIds, Is.EquivalentTo(management.Rulebases.First().Rules.Select(r => r.Id))); var cacheField = typeof(ReportRules).GetField("_rulesCache", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); @@ -222,21 +227,20 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() } [Test] + [Ignore("GetInitialRulebaseId - RulebaseLink not in Context? / GetInitialRulesOfGateway does not get Rule[]")] public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() { - var management = new ManagementReport - { - Rulebases = new[] { MockReportRules.CreateRulebaseReport(numberOfRules: 2) } - }; + int numberOfRules = 2; + var (management, device) = CreateBasicManagementSetup(numberOfRules); + var deviceReportController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); - var device = new DeviceReportController(DeviceReportController.FromDeviceReport(MockReportRules.CreateDeviceReport())); + var rulebase = management.Rulebases.First();// + var rulesFromRulebase = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); + var rules = ReportRules.GetInitialRulesOfGateway(deviceReportController, management); //GetInitialRulebaseId - RulebaseLink not in Context - device.GetInitialRulebaseId(management); - - var rules = ReportRules.GetInitialRulesOfGateway(device, management); - - Assert.That(rules.Length, Is.EqualTo(2)); //Fragen + Assert.That(rulesFromRulebase.Length, Is.EqualTo(2)); + Assert.That(rules.Length, Is.EqualTo(2)); Assert.That(rules.All(r => r.RulebaseId == 1)); } @@ -253,8 +257,6 @@ public void GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() Assert.That(rules, Is.Empty); } - - [Test] public void GetAllRulesOfGateway_ReturnsRules_FromCache() { @@ -300,21 +302,13 @@ public void ConstructHtmlReport_GeneratesHtmlSections() null! ); + var (management, device) = CreateBasicManagementSetup(3); - var rulebase = MockReportRules.CreateRulebaseReport("Mock Rulebase", 3); - var device = MockReportRules.CreateDeviceReport(1, "Mock Device1", new List - { - new RulebaseLink { NextRulebaseId = rulebase.Id } - }); - - var management = new ManagementReport - { - Id = 1, - Rulebases = new[] { rulebase }, - Devices = new[] { device } - }; mockReportRules.ReportData.ManagementData.Add(management); + management.Rulebases.First().Name = "Mock Rulebase"; + device.Name = "Mock Device1"; + var reportBuilder = new StringBuilder(); int chapterNumber = 0; From 181bcf3cbe2dc710dd1b35d7df9c3a1ec72382c8 Mon Sep 17 00:00:00 2001 From: cd Date: Wed, 5 Nov 2025 11:35:14 +0100 Subject: [PATCH 05/12] wop - order of tests redone --- .../files/FWO.Test/ReportRulesTest.cs | 223 +++++++++--------- 1 file changed, 113 insertions(+), 110 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index 91ce07002c..685e5fe744 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -66,26 +66,6 @@ public void Test_SetupSingleManagementReport_CreatesDeviceWithoutRulebases() Assert.That(_managementReports[0].Rulebases.Count, Is.EqualTo(0)); } - [Test] - public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() - { - int numberOfRules = 3; - var (management, device) = CreateBasicManagementSetup(numberOfRules); - - var rulebase = management.Rulebases.First(); - var result = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); - - var rulebaseLink = new RulebaseLink { NextRulebaseId = rulebase.Id }; - int count = ReportRules.GetRuleCount(management, rulebaseLink, new[] { rulebaseLink }); - - Assert.That(count, Is.EqualTo(3)); - Assert.That(result.Length, Is.EqualTo(3)); - Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebase.Id}.")); - Assert.That(rulebase.Rules.Length, Is.EqualTo(numberOfRules)); - Assert.That(rulebase.Name, Is.EqualTo("RB")); - Assert.That(rulebase.Rules[0].Name, Does.StartWith("Mock Rule")); - } - [Test] public void Test_CreateDeviceReport_HasConsistentId_And_Uid_For_Device1() { @@ -106,17 +86,6 @@ public void Test_CreateDeviceReport_HasConsistentId_And_Uid_For_Device2() Assert.That(device.Name, Is.EqualTo("Firewall-01")); } - [Test] - public void Test_CreateRuleTreeItem_BuildsValidTree() - { - var ruleTreeItemChild = MockReportRules.CreateRuleTreeItem(2, 1, new List { 1, 2 }); - var ruleTreeItemParent = MockReportRules.CreateRuleTreeItem(1, 1, new List { 1 }, new List> { ruleTreeItemChild }); - - Assert.That(ruleTreeItemParent.Children.Count, Is.EqualTo(1)); - Assert.That(ruleTreeItemParent.Children[0].Data!.Id, Is.EqualTo(2)); - Assert.That(ruleTreeItemParent.Data!.Id, Is.EqualTo(1)); - } - [Test] public void Test_RulebaseId_SetterGetter() { @@ -137,6 +106,77 @@ public void Test_RuleId_SetterGetter() Assert.That(MockReportRules.RuleId, Is.EqualTo(100)); } + [Test] + public void Test_ContainsRules_Scenarios() + { + var rulebaseReport = MockReportRules.CreateRulebaseReport(); + + var managementReport = new ManagementReport + { + Rulebases = new[] { rulebaseReport } + }; + + Assert.That(managementReport.ContainsRules(), Is.False); + + var managementWithoutDevices = new ManagementReport { Devices = new DeviceReport[0] }; + Assert.That(managementWithoutDevices.ContainsRules(), Is.False); + + var managementWithDevicesWithoutRules = new ManagementReport + { + Devices = new DeviceReport[] { } + }; + Assert.That(managementWithDevicesWithoutRules.ContainsRules(), Is.False); + } + + [Test] + public void GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() + { + var device = MockReportRules.CreateDeviceReport(); + var management = new ManagementReport(); + + // Cache leeren + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List>()); + + var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); + + Assert.That(result, Is.Empty); + } + + + //Mittlere Komplexität + [Test] + public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() + { + int numberOfRules = 3; + var (management, device) = CreateBasicManagementSetup(numberOfRules); + + var rulebase = management.Rulebases.First(); + var result = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); + + var rulebaseLink = new RulebaseLink { NextRulebaseId = rulebase.Id }; + int count = ReportRules.GetRuleCount(management, rulebaseLink, new[] { rulebaseLink }); + + Assert.That(count, Is.EqualTo(3)); + Assert.That(result.Length, Is.EqualTo(3)); + Assert.That(result[0].Uid, Does.StartWith($"rule-{rulebase.Id}.")); + Assert.That(rulebase.Rules.Length, Is.EqualTo(numberOfRules)); + Assert.That(rulebase.Name, Is.EqualTo("RB")); + Assert.That(rulebase.Rules[0].Name, Does.StartWith("Mock Rule")); + } + + [Test] + public void Test_CreateRuleTreeItem_BuildsValidTree() + { + var ruleTreeItemChild = MockReportRules.CreateRuleTreeItem(2, 1, new List { 1, 2 }); + var ruleTreeItemParent = MockReportRules.CreateRuleTreeItem(1, 1, new List { 1 }, new List> { ruleTreeItemChild }); + + Assert.That(ruleTreeItemParent.Children.Count, Is.EqualTo(1)); + Assert.That(ruleTreeItemParent.Children[0].Data!.Id, Is.EqualTo(2)); + Assert.That(ruleTreeItemParent.Data!.Id, Is.EqualTo(1)); + } + [Test] public void Test_MultipleRulebases_InManagementReport() { @@ -171,28 +211,25 @@ public void Test_DeviceWithMultipleRulebaseLinks() } [Test] - public void Test_ContainsRules_Scenarios() + public void GetAllRulesOfGateway_ReturnsRules_FromCache() { - var rulebaseReport = MockReportRules.CreateRulebaseReport(); - - var managementReport = new ManagementReport - { - Rulebases = new[] { rulebaseReport } - }; + var device = MockReportRules.CreateDeviceReport(); + var management = new ManagementReport(); + var rules = new List { new Rule { Id = 1, RulebaseId = 1 } }; - Assert.That(managementReport.ContainsRules(), Is.False); + // Cache manuell setzen + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, management.Id)] = rules }); - var managementWithoutDevices = new ManagementReport { Devices = new DeviceReport[0] }; - Assert.That(managementWithoutDevices.ContainsRules(), Is.False); + var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); - var managementWithDevicesWithoutRules = new ManagementReport - { - Devices = new DeviceReport[] { } - }; - Assert.That(managementWithDevicesWithoutRules.ContainsRules(), Is.False); + Assert.That(result, Has.Length.EqualTo(1)); + Assert.That(result[0].Id, Is.EqualTo(1)); } + //Vielleicht schon Integration [Test] public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() { @@ -226,6 +263,36 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() Assert.That(cache[(device.Id, management.Id)].Count, Is.EqualTo(3)); } + [Test] + public void ConstructHtmlReport_GeneratesHtmlSections() + { + // Arrange + var mockReportRules = new MockReportRules( + new Report.Filter.DynGraphqlQuery(""), + new Config.Api.UserConfig(), + ReportType.Rules, + null! + ); + + var (management, device) = CreateBasicManagementSetup(3); + + mockReportRules.ReportData.ManagementData.Add(management); + + management.Rulebases.First().Name = "Mock Rulebase"; + device.Name = "Mock Device1"; + + var reportBuilder = new StringBuilder(); + int chapterNumber = 0; + + // Act + mockReportRules.ConstructHtmlReport(ref reportBuilder, mockReportRules.ReportData.ManagementData, chapterNumber); + + // Assert + string html = reportBuilder.ToString(); + Assert.That(html, Does.Contain("Mock Device1")); + Assert.That(html, Does.Contain("
")); + } + [Test] [Ignore("GetInitialRulebaseId - RulebaseLink not in Context? / GetInitialRulesOfGateway does not get Rule[]")] public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() @@ -256,69 +323,5 @@ public void GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() Assert.That(rules, Is.Empty); } - - [Test] - public void GetAllRulesOfGateway_ReturnsRules_FromCache() - { - var device = MockReportRules.CreateDeviceReport(); - var management = new ManagementReport(); - var rules = new List { new Rule { Id = 1, RulebaseId = 1 } }; - - // Cache manuell setzen - typeof(ReportRules) - .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, management.Id)] = rules }); - - var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); - - Assert.That(result, Has.Length.EqualTo(1)); - Assert.That(result[0].Id, Is.EqualTo(1)); - } - - [Test] - public void GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() - { - var device = MockReportRules.CreateDeviceReport(); - var management = new ManagementReport(); - - // Cache leeren - typeof(ReportRules) - .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List>()); - - var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); - - Assert.That(result, Is.Empty); - } - - [Test] - public void ConstructHtmlReport_GeneratesHtmlSections() - { - // Arrange - var mockReportRules = new MockReportRules( - new Report.Filter.DynGraphqlQuery(""), - new Config.Api.UserConfig(), - ReportType.Rules, - null! - ); - - var (management, device) = CreateBasicManagementSetup(3); - - mockReportRules.ReportData.ManagementData.Add(management); - - management.Rulebases.First().Name = "Mock Rulebase"; - device.Name = "Mock Device1"; - - var reportBuilder = new StringBuilder(); - int chapterNumber = 0; - - // Act - mockReportRules.ConstructHtmlReport(ref reportBuilder, mockReportRules.ReportData.ManagementData, chapterNumber); - - // Assert - string html = reportBuilder.ToString(); - Assert.That(html, Does.Contain("Mock Device1")); - Assert.That(html, Does.Contain("
")); - } } } From 3ea4db3e43d043a9223ee812cbec7770606b6d5a Mon Sep 17 00:00:00 2001 From: cd Date: Wed, 5 Nov 2025 17:19:48 +0100 Subject: [PATCH 06/12] one failing test - works now - Problem understand Rulebaselinks --- roles/tests-unit/files/FWO.Test/ReportRulesTest.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index 685e5fe744..b117039a7e 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -294,14 +294,15 @@ public void ConstructHtmlReport_GeneratesHtmlSections() } [Test] - [Ignore("GetInitialRulebaseId - RulebaseLink not in Context? / GetInitialRulesOfGateway does not get Rule[]")] public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() { int numberOfRules = 2; var (management, device) = CreateBasicManagementSetup(numberOfRules); var deviceReportController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); - var rulebase = management.Rulebases.First();// + management.Devices.First().RulebaseLinks.First().GatewayId = device.Id; + management.Devices.First().RulebaseLinks.First().IsInitial = true; + var rulebase = management.Rulebases.First(); var rulesFromRulebase = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); var rules = ReportRules.GetInitialRulesOfGateway(deviceReportController, management); //GetInitialRulebaseId - RulebaseLink not in Context From 8646061c2fd708d0a730f37d3ac6d2212cfa1317 Mon Sep 17 00:00:00 2001 From: cd Date: Thu, 6 Nov 2025 15:57:11 +0100 Subject: [PATCH 07/12] short update - naming and teardown tag --- roles/tests-unit/files/FWO.Test/ReportRulesTest.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index b117039a7e..72bf0b18dc 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -34,6 +34,7 @@ public void setUp() _managementReports = _mockReportRules.SetupSingleManagementReportEmpty(); } + [TearDown] public void TearDown() { typeof(ReportRules) @@ -129,7 +130,7 @@ public void Test_ContainsRules_Scenarios() } [Test] - public void GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() + public void Test_GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() { var device = MockReportRules.CreateDeviceReport(); var management = new ManagementReport(); @@ -211,7 +212,7 @@ public void Test_DeviceWithMultipleRulebaseLinks() } [Test] - public void GetAllRulesOfGateway_ReturnsRules_FromCache() + public void Test_GetAllRulesOfGateway_ReturnsRules_FromCache() { var device = MockReportRules.CreateDeviceReport(); var management = new ManagementReport(); @@ -264,7 +265,7 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() } [Test] - public void ConstructHtmlReport_GeneratesHtmlSections() + public void Test_ConstructHtmlReport_GeneratesHtmlSections() { // Arrange var mockReportRules = new MockReportRules( @@ -294,7 +295,7 @@ public void ConstructHtmlReport_GeneratesHtmlSections() } [Test] - public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() + public void Test_GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() { int numberOfRules = 2; var (management, device) = CreateBasicManagementSetup(numberOfRules); @@ -313,7 +314,7 @@ public void GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() } [Test] - public void GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() + public void Test_GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() { var management = new ManagementReport(); var device = new DeviceReportController(DeviceReportController.FromDeviceReport(MockReportRules.CreateDeviceReport())); From 44481e7f26a33a1633cfdd49a3a3d38badce2064 Mon Sep 17 00:00:00 2001 From: cd Date: Mon, 10 Nov 2025 13:43:31 +0100 Subject: [PATCH 08/12] wop --- roles/tests-unit/files/FWO.Test/ReportRulesTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index 72bf0b18dc..ddc5af1bb6 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -146,7 +146,7 @@ public void Test_GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() } - //Mittlere Komplexität + [Test] public void Test_CreateRulebaseReport_CreatesExpectedNumberOfRules() { @@ -230,7 +230,7 @@ public void Test_GetAllRulesOfGateway_ReturnsRules_FromCache() } - //Vielleicht schon Integration + [Test] public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() { From 2428995ea4f401cf17770dcef6dd8158e7bf24bb Mon Sep 17 00:00:00 2001 From: cd Date: Mon, 10 Nov 2025 16:29:40 +0100 Subject: [PATCH 09/12] wop --- .../files/FWO.Test/ReportRulesTest.cs | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index ddc5af1bb6..139e4e5336 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -306,13 +306,54 @@ public void Test_GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists var rulebase = management.Rulebases.First(); var rulesFromRulebase = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); - var rules = ReportRules.GetInitialRulesOfGateway(deviceReportController, management); //GetInitialRulebaseId - RulebaseLink not in Context + var rules = ReportRules.GetInitialRulesOfGateway(deviceReportController, management); Assert.That(rulesFromRulebase.Length, Is.EqualTo(2)); Assert.That(rules.Length, Is.EqualTo(2)); Assert.That(rules.All(r => r.RulebaseId == 1)); } + [Test] + public void Test_DeviceWithMultipleRulebaseLinks_RulesMergedInOrder() + { + // Arrange: zwei Rulebases mit Regeln + var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 2); // Regel-IDs z.B. 1,2 + var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 3); // Regel-IDs z.B. 3,4,5 + var rulebase3 = MockReportRules.CreateRulebaseReport("Rulebase2", 4); // Regel-IDs z.B. 6,7,8 + + var device = MockReportRules.CreateDeviceReport(1, "Device1", new List + { + new RulebaseLink { NextRulebaseId = rulebase1.Id }, + new RulebaseLink { NextRulebaseId = rulebase2.Id, IsInitial = true }, + new RulebaseLink { NextRulebaseId = rulebase3.Id} + }); + + var management = new ManagementReport + { + Id = 1, + Rulebases = new[] { rulebase1, rulebase2, rulebase3 }, + Devices = new[] { device } + }; + + management.Devices.First().RulebaseLinks.Where(x => x.IsInitial == true).First().GatewayId = device.Id; + + var deviceController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); + + // Act: Regeln vom Device abrufen + var rules = ReportRules.GetInitialRulesOfGateway(deviceController, management); + + // Assert: Prüfen, dass alle Regeln enthalten sind + var expectedRuleIds = rulebase2.Rules.Select(r => r.Id) + .Concat(rulebase3.Rules.Select(r => r.Id)) + .ToList(); + + Assert.That(rules.Select(r => r.Id).ToList(), Is.EquivalentTo(expectedRuleIds)); + + // Optional: Prüfen, ob die Reihenfolge der Links erhalten bleibt + var rulesInOrder = rules.Select(r => r.RulebaseId).ToList(); + Assert.That(rulesInOrder, Is.EqualTo(new List { rulebase1.Id, rulebase1.Id, rulebase2.Id, rulebase2.Id, rulebase2.Id })); + } + [Test] public void Test_GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() { From b815a983079d60ba302405af9dd0f1e7576016c0 Mon Sep 17 00:00:00 2001 From: cd Date: Thu, 13 Nov 2025 11:37:03 +0100 Subject: [PATCH 10/12] wop --- .../files/FWO.Test/ReportRulesTest.cs | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index 139e4e5336..adfc2c3cb3 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -316,17 +316,18 @@ public void Test_GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists [Test] public void Test_DeviceWithMultipleRulebaseLinks_RulesMergedInOrder() { - // Arrange: zwei Rulebases mit Regeln - var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 2); // Regel-IDs z.B. 1,2 - var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 3); // Regel-IDs z.B. 3,4,5 - var rulebase3 = MockReportRules.CreateRulebaseReport("Rulebase2", 4); // Regel-IDs z.B. 6,7,8 - + // Arrange: Management mit mehreren Rulebases + var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 2); // Regeln 1,2 + var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 3); // Regeln 3,4,5 + var rulebase3 = MockReportRules.CreateRulebaseReport("Rulebase3", 3); // Regeln 6,7,8 + + // Device mit RulebaseLinks var device = MockReportRules.CreateDeviceReport(1, "Device1", new List { - new RulebaseLink { NextRulebaseId = rulebase1.Id }, - new RulebaseLink { NextRulebaseId = rulebase2.Id, IsInitial = true }, - new RulebaseLink { NextRulebaseId = rulebase3.Id} - }); + new RulebaseLink { FromRulebaseId = rulebase1.Id, ToRulebaseId = rulebase2.Id }, + new RulebaseLink { FromRulebaseId = rulebase2.Id, ToRulebaseId = rulebase3.Id, IsInitial = true }, + new RulebaseLink { FromRulebaseId = rulebase3.Id, ToRulebaseId = null } + }); var management = new ManagementReport { @@ -335,25 +336,29 @@ public void Test_DeviceWithMultipleRulebaseLinks_RulesMergedInOrder() Devices = new[] { device } }; - management.Devices.First().RulebaseLinks.Where(x => x.IsInitial == true).First().GatewayId = device.Id; + // Sicherstellen, dass die initiale Rulebase korrekt verlinkt ist + device.RulebaseLinks.First(x => x.IsInitial).GwId = device.Id; var deviceController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); // Act: Regeln vom Device abrufen var rules = ReportRules.GetInitialRulesOfGateway(deviceController, management); - // Assert: Prüfen, dass alle Regeln enthalten sind + // Assert: Alle Regeln der relevanten Rulebases enthalten var expectedRuleIds = rulebase2.Rules.Select(r => r.Id) .Concat(rulebase3.Rules.Select(r => r.Id)) .ToList(); - Assert.That(rules.Select(r => r.Id).ToList(), Is.EquivalentTo(expectedRuleIds)); - // Optional: Prüfen, ob die Reihenfolge der Links erhalten bleibt + // Optional: Reihenfolge prüfen, dass Regeln der Rulebases in der Reihenfolge der Links zusammengeführt werden var rulesInOrder = rules.Select(r => r.RulebaseId).ToList(); - Assert.That(rulesInOrder, Is.EqualTo(new List { rulebase1.Id, rulebase1.Id, rulebase2.Id, rulebase2.Id, rulebase2.Id })); + var expectedOrder = rulebase2.Rules.Select(r => rulebase2.Id) + .Concat(rulebase3.Rules.Select(r => rulebase3.Id)) + .ToList(); + Assert.That(rulesInOrder, Is.EqualTo(expectedOrder)); } + [Test] public void Test_GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() { From 5ae68cc439a4795707edff93cee6946eaa779615 Mon Sep 17 00:00:00 2001 From: cd Date: Fri, 14 Nov 2025 14:01:50 +0100 Subject: [PATCH 11/12] added Test --- .../files/FWO.Test/ReportRulesTest.cs | 248 +++++++++++++----- 1 file changed, 179 insertions(+), 69 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index adfc2c3cb3..f7755faf2c 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -3,10 +3,12 @@ using FWO.Data; using FWO.Data.Report; using FWO.Report; +using FWO.Services.RuleTreeBuilder; using FWO.Test.Mocks; using Microsoft.AspNetCore.Routing; using Moq; using NUnit.Framework; +using NUnit.Framework.Legacy; using System.Reflection; using System.Text; @@ -264,101 +266,209 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() Assert.That(cache[(device.Id, management.Id)].Count, Is.EqualTo(3)); } + [Test] - public void Test_ConstructHtmlReport_GeneratesHtmlSections() + public void Test_GetRulesByDeviceAndRulebase_ReturnsAllRules_WithCorrectStructureAndOrder() { - // Arrange - var mockReportRules = new MockReportRules( - new Report.Filter.DynGraphqlQuery(""), - new Config.Api.UserConfig(), - ReportType.Rules, - null! + // ARRANGE ------------------------------------------------------------- + var rbInitial = MockReportRules.CreateRulebaseReport("InitialRB", 2); + var rbOther = MockReportRules.CreateRulebaseReport("OtherRB", 2); + + var device = MockReportRules.CreateDeviceReport( + deviceId: 42, + deviceName: "DeviceX", + rulebaseLinks: new List + { + new RulebaseLink + { + GatewayId = 42, + IsInitial = true, + ToRulebase = new Rulebase + { + Id = rbInitial.Id, + Name = rbInitial.Name!, + Rules = rbInitial.Rules + }, + NextRulebaseId = (int)rbInitial.Id + }, + new RulebaseLink + { + GatewayId = 42, + IsInitial = false, + ToRulebase = new Rulebase + { + Id = rbOther.Id, + Name = rbOther.Name!, + Rules = rbOther.Rules + }, + NextRulebaseId = (int)rbOther.Id + } + } ); - var (management, device) = CreateBasicManagementSetup(3); + List SetupData() => new() + { + new ManagementReport + { + Id = 1, + Name = "ManagementX", + Devices = new[] { device }, + Rulebases = new[] { rbInitial, rbOther } + } + }; - mockReportRules.ReportData.ManagementData.Add(management); + var mgmt = SetupData().First(); - management.Rulebases.First().Name = "Mock Rulebase"; - device.Name = "Mock Device1"; + // Cache manuell fill with order + var allRulesOrdered = rbInitial.Rules.Concat(rbOther.Rules).ToList(); + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, mgmt.Id)] = allRulesOrdered }); - var reportBuilder = new StringBuilder(); - int chapterNumber = 0; + var devCtrl = DeviceReportController.FromDeviceReport(device); - // Act - mockReportRules.ConstructHtmlReport(ref reportBuilder, mockReportRules.ReportData.ManagementData, chapterNumber); + // ACT ------------------------------------------------------------------ + var initialRules = ReportRules.GetInitialRulesOfGateway(devCtrl, mgmt); + var retrievedAllRules = ReportRules.GetAllRulesOfGateway(devCtrl, mgmt); - // Assert - string html = reportBuilder.ToString(); - Assert.That(html, Does.Contain("Mock Device1")); - Assert.That(html, Does.Contain("
")); + // ASSERT --------------------------------------------------------------- + + // 1. Initial Rules check + ClassicAssert.AreEqual(rbInitial.Rules.Length, initialRules.Length); + ClassicAssert.IsTrue(initialRules.All(r => r.RulebaseId == rbInitial.Id)); + + // 2. All Rules check + ClassicAssert.AreEqual(allRulesOrdered.Count, retrievedAllRules.Length); + + // 3. Order check (InitialRB first, then OtherRB) + for (int i = 0; i < retrievedAllRules.Count(); i++) + { + if (i < rbInitial.Rules.Length) + { + ClassicAssert.AreEqual(rbInitial.Id, retrievedAllRules[i].RulebaseId); + } + else + { + ClassicAssert.AreEqual(rbOther.Id, retrievedAllRules[i].RulebaseId); + } + } + + ClassicAssert.AreEqual(1, mgmt.Devices.Length); + ClassicAssert.AreEqual(2, mgmt.Rulebases.Length); + ClassicAssert.AreEqual(rbInitial.Rules.Length + rbOther.Rules.Length, retrievedAllRules.Length); } [Test] - public void Test_GetInitialRulesOfGateway_ReturnsRules_WhenInitialRulebaseExists() + public void Test_GetRulesByDeviceAndRulebase_WithThreeLinks_InitialSecond_ReturnsCorrectOrder() { - int numberOfRules = 2; - var (management, device) = CreateBasicManagementSetup(numberOfRules); - var deviceReportController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); + // ARRANGE ------------------------------------------------------------- + var rb1 = MockReportRules.CreateRulebaseReport("RB1", 2); + var rb2 = MockReportRules.CreateRulebaseReport("RB2", 3); // initial + var rb3 = MockReportRules.CreateRulebaseReport("RB3", 1); + + var device = MockReportRules.CreateDeviceReport( + deviceId: 42, + deviceName: "DeviceX", + rulebaseLinks: new List + { + new RulebaseLink + { + GatewayId = 42, + IsInitial = false, + ToRulebase = new Rulebase + { + Id = rb1.Id, + Name = rb1.Name!, + Rules = rb1.Rules + }, + NextRulebaseId = (int)rb1.Id + }, + new RulebaseLink + { + GatewayId = 42, + IsInitial = true, + ToRulebase = new Rulebase + { + Id = rb2.Id, + Name = rb2.Name!, + Rules = rb2.Rules + }, + NextRulebaseId = (int)rb2.Id + }, + new RulebaseLink + { + GatewayId = 42, + IsInitial = false, + ToRulebase = new Rulebase + { + Id = rb3.Id, + Name = rb3.Name!, + Rules = rb3.Rules + }, + NextRulebaseId = (int)rb3.Id + } + } + ); - management.Devices.First().RulebaseLinks.First().GatewayId = device.Id; - management.Devices.First().RulebaseLinks.First().IsInitial = true; - var rulebase = management.Rulebases.First(); - var rulesFromRulebase = ReportRules.GetRulesByRulebaseId(rulebase.Id, management); + List SetupData() => new() + { + new ManagementReport + { + Id = 1, + Name = "ManagementX", + Devices = new[] { device }, + Rulebases = new[] { rb1, rb2, rb3 } + } + }; - var rules = ReportRules.GetInitialRulesOfGateway(deviceReportController, management); + var mgmt = SetupData().First(); - Assert.That(rulesFromRulebase.Length, Is.EqualTo(2)); - Assert.That(rules.Length, Is.EqualTo(2)); - Assert.That(rules.All(r => r.RulebaseId == 1)); - } + // Cache manuell fill mit der Reihenfolge: RB2 (initial) zuerst + var allRulesOrdered = rb2.Rules.Concat(rb1.Rules).Concat(rb3.Rules).ToList(); + typeof(ReportRules) + .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! + .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, mgmt.Id)] = allRulesOrdered }); - [Test] - public void Test_DeviceWithMultipleRulebaseLinks_RulesMergedInOrder() - { - // Arrange: Management mit mehreren Rulebases - var rulebase1 = MockReportRules.CreateRulebaseReport("Rulebase1", 2); // Regeln 1,2 - var rulebase2 = MockReportRules.CreateRulebaseReport("Rulebase2", 3); // Regeln 3,4,5 - var rulebase3 = MockReportRules.CreateRulebaseReport("Rulebase3", 3); // Regeln 6,7,8 + var devCtrl = DeviceReportController.FromDeviceReport(device); - // Device mit RulebaseLinks - var device = MockReportRules.CreateDeviceReport(1, "Device1", new List - { - new RulebaseLink { FromRulebaseId = rulebase1.Id, ToRulebaseId = rulebase2.Id }, - new RulebaseLink { FromRulebaseId = rulebase2.Id, ToRulebaseId = rulebase3.Id, IsInitial = true }, - new RulebaseLink { FromRulebaseId = rulebase3.Id, ToRulebaseId = null } - }); - var management = new ManagementReport - { - Id = 1, - Rulebases = new[] { rulebase1, rulebase2, rulebase3 }, - Devices = new[] { device } - }; - // Sicherstellen, dass die initiale Rulebase korrekt verlinkt ist - device.RulebaseLinks.First(x => x.IsInitial).GwId = device.Id; + // ACT ------------------------------------------------------------------ + var initialRules = ReportRules.GetInitialRulesOfGateway(devCtrl, mgmt); + var retrievedAllRules = ReportRules.GetAllRulesOfGateway(devCtrl, mgmt); - var deviceController = new DeviceReportController(DeviceReportController.FromDeviceReport(device)); + // ASSERT --------------------------------------------------------------- - // Act: Regeln vom Device abrufen - var rules = ReportRules.GetInitialRulesOfGateway(deviceController, management); + // 1. Initial Rules check + ClassicAssert.AreEqual(rb2.Rules.Length, initialRules.Length); + ClassicAssert.IsTrue(initialRules.All(r => r.RulebaseId == rb2.Id)); - // Assert: Alle Regeln der relevanten Rulebases enthalten - var expectedRuleIds = rulebase2.Rules.Select(r => r.Id) - .Concat(rulebase3.Rules.Select(r => r.Id)) - .ToList(); - Assert.That(rules.Select(r => r.Id).ToList(), Is.EquivalentTo(expectedRuleIds)); + // 2. Alle Rules check + ClassicAssert.AreEqual(allRulesOrdered.Count, retrievedAllRules.Length); - // Optional: Reihenfolge prüfen, dass Regeln der Rulebases in der Reihenfolge der Links zusammengeführt werden - var rulesInOrder = rules.Select(r => r.RulebaseId).ToList(); - var expectedOrder = rulebase2.Rules.Select(r => rulebase2.Id) - .Concat(rulebase3.Rules.Select(r => rulebase3.Id)) - .ToList(); - Assert.That(rulesInOrder, Is.EqualTo(expectedOrder)); + // 3. Order check: RB2 (initial), dann RB1, dann RB3 + for (int i = 0; i < retrievedAllRules.Count(); i++) + { + if (i < rb2.Rules.Length) + { + ClassicAssert.AreEqual(rb2.Id, retrievedAllRules[i].RulebaseId); + } + else if (i < rb2.Rules.Length + rb1.Rules.Length) + { + ClassicAssert.AreEqual(rb1.Id, retrievedAllRules[i].RulebaseId); + } + else + { + ClassicAssert.AreEqual(rb3.Id, retrievedAllRules[i].RulebaseId); + } + } + + // Struktur prüfen + ClassicAssert.AreEqual(1, mgmt.Devices.Length); + ClassicAssert.AreEqual(3, mgmt.Rulebases.Length); + ClassicAssert.AreEqual(rb1.Rules.Length + rb2.Rules.Length + rb3.Rules.Length, retrievedAllRules.Length); } - [Test] public void Test_GetInitialRulesOfGateway_ReturnsEmpty_WhenNoInitialRulebase() { From c25b31ff583a07070fea6ac75a9a40a26e8084bb Mon Sep 17 00:00:00 2001 From: cd Date: Fri, 14 Nov 2025 14:24:29 +0100 Subject: [PATCH 12/12] Fix: List was written into field expecting array --- .../files/FWO.Test/ReportRulesTest.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs index f7755faf2c..412af6b6a0 100644 --- a/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs +++ b/roles/tests-unit/files/FWO.Test/ReportRulesTest.cs @@ -41,7 +41,7 @@ public void TearDown() { typeof(ReportRules) .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List>()); + .SetValue(null, new Dictionary<(int, int), Rule[]>()); } private (ManagementReport management, DeviceReport device) CreateBasicManagementSetup(int ruleCount = 3) @@ -140,7 +140,7 @@ public void Test_GetAllRulesOfGateway_ReturnsEmpty_WhenCacheEmpty() // Cache leeren typeof(ReportRules) .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List>()); + .SetValue(null, new Dictionary<(int, int), Rule[]>()); var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); @@ -218,12 +218,12 @@ public void Test_GetAllRulesOfGateway_ReturnsRules_FromCache() { var device = MockReportRules.CreateDeviceReport(); var management = new ManagementReport(); - var rules = new List { new Rule { Id = 1, RulebaseId = 1 } }; + var rules = new Rule[] { new Rule { Id = 1, RulebaseId = 1 } }; // Cache manuell setzen typeof(ReportRules) .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, management.Id)] = rules }); + .SetValue(null, new Dictionary<(int, int), Rule[]> { [(device.Id, management.Id)] = rules }); var result = ReportRules.GetAllRulesOfGateway(DeviceReportController.FromDeviceReport(device), management); @@ -260,7 +260,7 @@ public void Test_TryBuildRuleTree_FallbackWithoutRuleTreeBuilder() var cacheField = typeof(ReportRules).GetField("_rulesCache", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); - var cache = (Dictionary<(int, int), List>)cacheField!.GetValue(null)!; + var cache = (Dictionary<(int, int), Rule[]>)cacheField!.GetValue(null)!; Assert.That(cache.ContainsKey((device.Id, management.Id)), Is.True); Assert.That(cache[(device.Id, management.Id)].Count, Is.EqualTo(3)); @@ -320,10 +320,10 @@ public void Test_GetRulesByDeviceAndRulebase_ReturnsAllRules_WithCorrectStructur var mgmt = SetupData().First(); // Cache manuell fill with order - var allRulesOrdered = rbInitial.Rules.Concat(rbOther.Rules).ToList(); + var allRulesOrdered = rbInitial.Rules.Concat(rbOther.Rules).ToArray(); typeof(ReportRules) .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, mgmt.Id)] = allRulesOrdered }); + .SetValue(null, new Dictionary<(int, int), Rule[]> { [(device.Id, mgmt.Id)] = allRulesOrdered }); var devCtrl = DeviceReportController.FromDeviceReport(device); @@ -338,7 +338,7 @@ public void Test_GetRulesByDeviceAndRulebase_ReturnsAllRules_WithCorrectStructur ClassicAssert.IsTrue(initialRules.All(r => r.RulebaseId == rbInitial.Id)); // 2. All Rules check - ClassicAssert.AreEqual(allRulesOrdered.Count, retrievedAllRules.Length); + ClassicAssert.AreEqual(allRulesOrdered.Count(), retrievedAllRules.Length); // 3. Order check (InitialRB first, then OtherRB) for (int i = 0; i < retrievedAllRules.Count(); i++) @@ -424,10 +424,10 @@ public void Test_GetRulesByDeviceAndRulebase_WithThreeLinks_InitialSecond_Return var mgmt = SetupData().First(); // Cache manuell fill mit der Reihenfolge: RB2 (initial) zuerst - var allRulesOrdered = rb2.Rules.Concat(rb1.Rules).Concat(rb3.Rules).ToList(); + var allRulesOrdered = rb2.Rules.Concat(rb1.Rules).Concat(rb3.Rules).ToArray(); typeof(ReportRules) .GetField("_rulesCache", BindingFlags.NonPublic | BindingFlags.Static)! - .SetValue(null, new Dictionary<(int, int), List> { [(device.Id, mgmt.Id)] = allRulesOrdered }); + .SetValue(null, new Dictionary<(int, int), Rule[]> { [(device.Id, mgmt.Id)] = allRulesOrdered }); var devCtrl = DeviceReportController.FromDeviceReport(device); @@ -444,7 +444,7 @@ public void Test_GetRulesByDeviceAndRulebase_WithThreeLinks_InitialSecond_Return ClassicAssert.IsTrue(initialRules.All(r => r.RulebaseId == rb2.Id)); // 2. Alle Rules check - ClassicAssert.AreEqual(allRulesOrdered.Count, retrievedAllRules.Length); + ClassicAssert.AreEqual(allRulesOrdered.Count(), retrievedAllRules.Length); // 3. Order check: RB2 (initial), dann RB1, dann RB3 for (int i = 0; i < retrievedAllRules.Count(); i++)