diff --git a/SlpModularCms.sln b/SlpModularCms.sln index 666877f..3100f36 100644 --- a/SlpModularCms.sln +++ b/SlpModularCms.sln @@ -14,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlpModularCms.Modules.Avail EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlpModularCms.Modules.Identity", "src\SlpModularCms.Modules.Identity\SlpModularCms.Modules.Identity.csproj", "{ABAC72E0-DFA2-4E98-8A39-BDB1023861AB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlpModularCms.Modules.Identity.Tests", "src\SlpModularCms.Modules.Identity.Tests\SlpModularCms.Modules.Identity.Tests.csproj", "{50951BA1-EC62-49BE-86F5-1CCB76342552}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -96,6 +98,18 @@ Global {ABAC72E0-DFA2-4E98-8A39-BDB1023861AB}.Release|x64.Build.0 = Release|Any CPU {ABAC72E0-DFA2-4E98-8A39-BDB1023861AB}.Release|x86.ActiveCfg = Release|Any CPU {ABAC72E0-DFA2-4E98-8A39-BDB1023861AB}.Release|x86.Build.0 = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|x64.ActiveCfg = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|x64.Build.0 = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|x86.ActiveCfg = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Debug|x86.Build.0 = Debug|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|Any CPU.Build.0 = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|x64.ActiveCfg = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|x64.Build.0 = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|x86.ActiveCfg = Release|Any CPU + {50951BA1-EC62-49BE-86F5-1CCB76342552}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -107,5 +121,6 @@ Global {BABECABB-E664-4BC5-9B5F-F645D19F1B12} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} {3D0192D6-6893-4295-A508-077D60D15D6E} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} {ABAC72E0-DFA2-4E98-8A39-BDB1023861AB} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {50951BA1-EC62-49BE-86F5-1CCB76342552} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} EndGlobalSection EndGlobal diff --git a/TestResults/938881e9-d093-477d-a0b2-826995ff82f0/coverage.cobertura.xml b/TestResults/938881e9-d093-477d-a0b2-826995ff82f0/coverage.cobertura.xml new file mode 100644 index 0000000..acefdd2 --- /dev/null +++ b/TestResults/938881e9-d093-477d-a0b2-826995ff82f0/coverage.cobertura.xml @@ -0,0 +1,5430 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults/adb1064a-c12b-409e-bea8-67537e91f39b/coverage.cobertura.xml b/TestResults/adb1064a-c12b-409e-bea8-67537e91f39b/coverage.cobertura.xml new file mode 100644 index 0000000..2b45bcb --- /dev/null +++ b/TestResults/adb1064a-c12b-409e-bea8-67537e91f39b/coverage.cobertura.xml @@ -0,0 +1,4880 @@ + + + + K:\Development\Projects\SlpModularCms\src\SlpModularCms.Core\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults2/29c9f8f3-8906-449a-87d8-df4584553278/coverage.cobertura.xml b/TestResults2/29c9f8f3-8906-449a-87d8-df4584553278/coverage.cobertura.xml new file mode 100644 index 0000000..7f14ea6 --- /dev/null +++ b/TestResults2/29c9f8f3-8906-449a-87d8-df4584553278/coverage.cobertura.xml @@ -0,0 +1,5430 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults2/73a46473-f598-4c63-8f03-75611b3aba85/coverage.cobertura.xml b/TestResults2/73a46473-f598-4c63-8f03-75611b3aba85/coverage.cobertura.xml new file mode 100644 index 0000000..b1400b3 --- /dev/null +++ b/TestResults2/73a46473-f598-4c63-8f03-75611b3aba85/coverage.cobertura.xml @@ -0,0 +1,4880 @@ + + + + K:\Development\Projects\SlpModularCms\src\SlpModularCms.Core\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults3/524f968a-26d6-4c70-8c00-e827ed0d7bfb/coverage.cobertura.xml b/TestResults3/524f968a-26d6-4c70-8c00-e827ed0d7bfb/coverage.cobertura.xml new file mode 100644 index 0000000..f523934 --- /dev/null +++ b/TestResults3/524f968a-26d6-4c70-8c00-e827ed0d7bfb/coverage.cobertura.xml @@ -0,0 +1,8924 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults3/56c5c848-c4d2-4e07-ba09-c1404c978e93/coverage.cobertura.xml b/TestResults3/56c5c848-c4d2-4e07-ba09-c1404c978e93/coverage.cobertura.xml new file mode 100644 index 0000000..f7e35d7 --- /dev/null +++ b/TestResults3/56c5c848-c4d2-4e07-ba09-c1404c978e93/coverage.cobertura.xml @@ -0,0 +1,8924 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults3/72f5868c-d16b-4feb-9514-00cff2d9e9d0/coverage.cobertura.xml b/TestResults3/72f5868c-d16b-4feb-9514-00cff2d9e9d0/coverage.cobertura.xml new file mode 100644 index 0000000..a1efecb --- /dev/null +++ b/TestResults3/72f5868c-d16b-4feb-9514-00cff2d9e9d0/coverage.cobertura.xml @@ -0,0 +1,8924 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults4/3fdf6d52-dc2f-4d70-ba33-27030316bd97/coverage.cobertura.xml b/TestResults4/3fdf6d52-dc2f-4d70-ba33-27030316bd97/coverage.cobertura.xml new file mode 100644 index 0000000..4773786 --- /dev/null +++ b/TestResults4/3fdf6d52-dc2f-4d70-ba33-27030316bd97/coverage.cobertura.xml @@ -0,0 +1,7802 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults4/aac7925a-ab07-4003-9911-9cb80424c696/coverage.cobertura.xml b/TestResults4/aac7925a-ab07-4003-9911-9cb80424c696/coverage.cobertura.xml new file mode 100644 index 0000000..1b8dcf5 --- /dev/null +++ b/TestResults4/aac7925a-ab07-4003-9911-9cb80424c696/coverage.cobertura.xml @@ -0,0 +1,4670 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults4/c7f0c1e4-fdbb-4fa0-8f1d-5d7b6384b90a/coverage.cobertura.xml b/TestResults4/c7f0c1e4-fdbb-4fa0-8f1d-5d7b6384b90a/coverage.cobertura.xml new file mode 100644 index 0000000..85bf3ea --- /dev/null +++ b/TestResults4/c7f0c1e4-fdbb-4fa0-8f1d-5d7b6384b90a/coverage.cobertura.xml @@ -0,0 +1,4186 @@ + + + + K:\Development\Projects\SlpModularCms\src\SlpModularCms.Core\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults5/7b41b099-3023-491c-823c-3dd256c0ac65/coverage.cobertura.xml b/TestResults5/7b41b099-3023-491c-823c-3dd256c0ac65/coverage.cobertura.xml new file mode 100644 index 0000000..2b0c0af --- /dev/null +++ b/TestResults5/7b41b099-3023-491c-823c-3dd256c0ac65/coverage.cobertura.xml @@ -0,0 +1,5610 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults5/939c9642-2e43-4ade-9e32-6c8cbd5d3a55/coverage.cobertura.xml b/TestResults5/939c9642-2e43-4ade-9e32-6c8cbd5d3a55/coverage.cobertura.xml new file mode 100644 index 0000000..ae724e9 --- /dev/null +++ b/TestResults5/939c9642-2e43-4ade-9e32-6c8cbd5d3a55/coverage.cobertura.xml @@ -0,0 +1,2478 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults5/c6d5e910-a645-4e29-81fd-e11e1ca72304/coverage.cobertura.xml b/TestResults5/c6d5e910-a645-4e29-81fd-e11e1ca72304/coverage.cobertura.xml new file mode 100644 index 0000000..edd9e2f --- /dev/null +++ b/TestResults5/c6d5e910-a645-4e29-81fd-e11e1ca72304/coverage.cobertura.xml @@ -0,0 +1,1994 @@ + + + + K:\Development\Projects\SlpModularCms\src\SlpModularCms.Core\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults6/61c779ad-ad38-425a-9fd2-60abcac76679/coverage.cobertura.xml b/TestResults6/61c779ad-ad38-425a-9fd2-60abcac76679/coverage.cobertura.xml new file mode 100644 index 0000000..40217e5 --- /dev/null +++ b/TestResults6/61c779ad-ad38-425a-9fd2-60abcac76679/coverage.cobertura.xml @@ -0,0 +1,1688 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults6/8a3a1659-8aa8-4d21-98e1-168d6d301340/coverage.cobertura.xml b/TestResults6/8a3a1659-8aa8-4d21-98e1-168d6d301340/coverage.cobertura.xml new file mode 100644 index 0000000..f52c258 --- /dev/null +++ b/TestResults6/8a3a1659-8aa8-4d21-98e1-168d6d301340/coverage.cobertura.xml @@ -0,0 +1,1204 @@ + + + + K:\Development\Projects\SlpModularCms\src\SlpModularCms.Core\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults6/e8dd349e-c617-4958-b15b-396279d887e8/coverage.cobertura.xml b/TestResults6/e8dd349e-c617-4958-b15b-396279d887e8/coverage.cobertura.xml new file mode 100644 index 0000000..369107c --- /dev/null +++ b/TestResults6/e8dd349e-c617-4958-b15b-396279d887e8/coverage.cobertura.xml @@ -0,0 +1,4820 @@ + + + + K:\Development\Projects\SlpModularCms\src\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults7/751b74c4-2cca-4c30-90af-a5c10a63ef48/coverage.cobertura.xml b/TestResults7/751b74c4-2cca-4c30-90af-a5c10a63ef48/coverage.cobertura.xml new file mode 100644 index 0000000..a30a337 --- /dev/null +++ b/TestResults7/751b74c4-2cca-4c30-90af-a5c10a63ef48/coverage.cobertura.xml @@ -0,0 +1,1688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults7/9f4a43b3-084b-433e-9018-6407c5074f04/coverage.cobertura.xml b/TestResults7/9f4a43b3-084b-433e-9018-6407c5074f04/coverage.cobertura.xml new file mode 100644 index 0000000..5e63db3 --- /dev/null +++ b/TestResults7/9f4a43b3-084b-433e-9018-6407c5074f04/coverage.cobertura.xml @@ -0,0 +1,1204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestResults7/b77ee9d6-f9a5-4202-bbf6-3e4f93b824c4/coverage.cobertura.xml b/TestResults7/b77ee9d6-f9a5-4202-bbf6-3e4f93b824c4/coverage.cobertura.xml new file mode 100644 index 0000000..4c31d7d --- /dev/null +++ b/TestResults7/b77ee9d6-f9a5-4202-bbf6-3e4f93b824c4/coverage.cobertura.xml @@ -0,0 +1,3196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coverlet.runsettings b/coverlet.runsettings new file mode 100644 index 0000000..ecc98f4 --- /dev/null +++ b/coverlet.runsettings @@ -0,0 +1,25 @@ + + + + + + + + + [Microsoft.AspNetCore.OpenApi.Generated*]*, + [System.Runtime.CompilerServices*]* + + + + **/Migrations/*.cs, + **/obj/**/*.cs + + + ExcludeFromCodeCoverage,GeneratedCodeAttribute + false + true + + + + + diff --git a/frontend/src/api/useInvitation.test.ts b/frontend/src/api/useInvitation.test.ts new file mode 100644 index 0000000..8e5fd68 --- /dev/null +++ b/frontend/src/api/useInvitation.test.ts @@ -0,0 +1,116 @@ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { createElement } from 'react'; +import { http, HttpResponse } from 'msw'; +import { describe, expect, it } from 'vitest'; +import { server } from '@/mocks/server'; +import { API_BASE } from '@/mocks/auth/fixtures'; +import { useValidateInvitation, useCompleteInvitation } from '@/api/useInvitation'; + +function createWrapper() { + const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: false }, mutations: { retry: false } }, + }); + return ({ children }: { children: React.ReactNode }) => + createElement(QueryClientProvider, { client: queryClient }, children); +} + +describe('useValidateInvitation', () => { + it('returns isValid=true for a valid token', async () => { + const { result } = renderHook(() => useValidateInvitation('valid-token'), { + wrapper: createWrapper(), + }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + expect(result.current.data?.isValid).toBe(true); + expect(result.current.data?.email).toBe('invited@example.com'); + }); + + it('returns isValid=false for an expired or unknown token', async () => { + const { result } = renderHook(() => useValidateInvitation('expired-token'), { + wrapper: createWrapper(), + }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + expect(result.current.data?.isValid).toBe(false); + }); + + it('does not fetch when token is null', () => { + const { result } = renderHook(() => useValidateInvitation(null), { + wrapper: createWrapper(), + }); + + expect(result.current.isPending).toBe(true); + expect(result.current.fetchStatus).toBe('idle'); + }); + + it('enters error state on server error', async () => { + server.use( + http.get(`${API_BASE}/api/v1/Invitation/validate`, () => + HttpResponse.json({}, { status: 500 }), + ), + ); + + const { result } = renderHook(() => useValidateInvitation('any-token'), { + wrapper: createWrapper(), + }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + expect(result.current.isError).toBe(true); + }); +}); + +describe('useCompleteInvitation', () => { + it('succeeds with valid token, name, and password', async () => { + const { result } = renderHook(() => useCompleteInvitation(), { + wrapper: createWrapper(), + }); + + await act(async () => { + await result.current.mutateAsync({ + token: 'valid-token', + name: 'New User', + password: 'Password1!', + }); + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + }); + + it('enters error state when token is invalid', async () => { + const { result } = renderHook(() => useCompleteInvitation(), { + wrapper: createWrapper(), + }); + + await act(async () => { + await result.current + .mutateAsync({ token: 'bad-token', name: 'User', password: 'Password1!' }) + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); + + it('enters error state on server error', async () => { + server.use( + http.post(`${API_BASE}/api/v1/Invitation/complete`, () => + HttpResponse.json({}, { status: 500 }), + ), + ); + + const { result } = renderHook(() => useCompleteInvitation(), { + wrapper: createWrapper(), + }); + + await act(async () => { + await result.current + .mutateAsync({ token: 'valid-token', name: 'User', password: 'Password1!' }) + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); +}); diff --git a/frontend/src/api/useProfile.test.ts b/frontend/src/api/useProfile.test.ts new file mode 100644 index 0000000..a62670f --- /dev/null +++ b/frontend/src/api/useProfile.test.ts @@ -0,0 +1,86 @@ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { createElement } from 'react'; +import { http, HttpResponse } from 'msw'; +import { describe, expect, it } from 'vitest'; +import { server } from '@/mocks/server'; +import { API_BASE } from '@/mocks/auth/fixtures'; +import { useUpdateProfile, useChangePassword } from '@/api/useProfile'; +import { AuthProvider } from '@/contexts/AuthProvider'; +import i18n from '@/i18n/config'; +import { I18nextProvider } from 'react-i18next'; +import type { ReactNode } from 'react'; + +function createWrapper() { + const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: false }, mutations: { retry: false } }, + }); + return ({ children }: { children: ReactNode }) => + createElement( + QueryClientProvider, + { client: queryClient }, + createElement( + I18nextProvider, + { i18n }, + createElement(AuthProvider, null, children), + ), + ); +} + +describe('useUpdateProfile', () => { + it('succeeds and returns updated user', async () => { + const { result } = renderHook(() => useUpdateProfile(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current.mutateAsync({ name: 'New Name', email: 'new@example.com' }); + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(result.current.data?.name).toBe('New Name'); + }); + + it('enters error state on server failure', async () => { + server.use( + http.put(`${API_BASE}/api/v1/Users/me`, () => + HttpResponse.json({ title: 'Bad Request', status: 400 }, { status: 400 }), + ), + ); + + const { result } = renderHook(() => useUpdateProfile(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current + .mutateAsync({ name: 'Bad', email: 'bad@example.com' }) + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); +}); + +describe('useChangePassword', () => { + it('succeeds with correct current password', async () => { + const { result } = renderHook(() => useChangePassword(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current.mutateAsync({ + currentPassword: 'Password123!', + newPassword: 'NewPassword1!', + }); + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + }); + + it('enters error state when current password is wrong', async () => { + const { result } = renderHook(() => useChangePassword(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current + .mutateAsync({ currentPassword: 'WrongPassword!', newPassword: 'NewPassword1!' }) + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); +}); diff --git a/frontend/src/api/useSetup.test.ts b/frontend/src/api/useSetup.test.ts new file mode 100644 index 0000000..fe93038 --- /dev/null +++ b/frontend/src/api/useSetup.test.ts @@ -0,0 +1,91 @@ +import { act, renderHook } from '@testing-library/react'; +import { http, HttpResponse } from 'msw'; +import { describe, expect, it } from 'vitest'; +import { server } from '@/mocks/server'; +import { API_BASE } from '@/mocks/auth/fixtures'; +import { useSetup } from '@/api/useSetup'; + +const validSetupData = { + name: 'Test Owner', + email: 'owner@example.com', + password: 'Password1!', + language: 'nl' as const, +}; + +describe('useSetup', () => { + it('starts with isPending=false and no error', () => { + const { result } = renderHook(() => useSetup()); + + expect(result.current.isPending).toBe(false); + expect(result.current.error).toBeNull(); + }); + + it('returns setup response on success', async () => { + const { result } = renderHook(() => useSetup()); + + let response: Awaited> | undefined; + await act(async () => { + response = await result.current.mutateAsync(validSetupData); + }); + + expect(response?.message).toBe('System initialized'); + expect(response?.user.role).toBe('Owner'); + expect(result.current.isPending).toBe(false); + expect(result.current.error).toBeNull(); + }); + + it('sets error and rethrows when API fails', async () => { + server.use( + http.post(`${API_BASE}/api/v1/Setup/owner`, () => + HttpResponse.json( + { title: 'Conflict', detail: 'Already initialized', status: 409 }, + { status: 409 }, + ), + ), + ); + + const { result } = renderHook(() => useSetup()); + + let thrown: Error | undefined; + await act(async () => { + try { + await result.current.mutateAsync(validSetupData); + } catch (err) { + thrown = err as Error; + } + }); + + expect(thrown).toBeDefined(); + expect(result.current.error).not.toBeNull(); + expect(result.current.isPending).toBe(false); + }); + + it('resets error state on subsequent successful call', async () => { + server.use( + http.post(`${API_BASE}/api/v1/Setup/owner`, () => + HttpResponse.json({ title: 'Error', status: 500 }, { status: 500 }), + ), + ); + + const { result } = renderHook(() => useSetup()); + + await act(async () => { + try { + await result.current.mutateAsync(validSetupData); + } catch { + // expected + } + }); + + expect(result.current.error).not.toBeNull(); + + // Restore success handler and retry + server.resetHandlers(); + + await act(async () => { + await result.current.mutateAsync(validSetupData); + }); + + expect(result.current.error).toBeNull(); + }); +}); diff --git a/frontend/src/api/useUsers.test.ts b/frontend/src/api/useUsers.test.ts index 736031d..ec51b14 100644 --- a/frontend/src/api/useUsers.test.ts +++ b/frontend/src/api/useUsers.test.ts @@ -6,7 +6,7 @@ import { describe, expect, it } from 'vitest'; import { server } from '@/mocks/server'; import { API_BASE } from '@/mocks/auth/fixtures'; import { getMockUsers } from '@/mocks/users/handlers'; -import { useUsers, useInviteUser, useChangeRole } from './useUsers'; +import { useUsers, useInviteUser, useChangeRole, useSetUserActive, useDeleteUser } from './useUsers'; function createWrapper() { const queryClient = new QueryClient({ @@ -102,3 +102,67 @@ describe('useChangeRole', () => { await waitFor(() => expect(result.current.isError).toBe(true)); }); }); + +describe('useSetUserActive', () => { + it('succeeds when server returns 200', async () => { + const { result } = renderHook(() => useSetUserActive(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current.mutateAsync({ + userId: '22222222-2222-2222-2222-222222222222', + isActive: false, + }); + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + }); + + it('fails when server returns 400', async () => { + server.use( + http.put(`${USERS_URL}/:userId/active`, () => new HttpResponse(null, { status: 400 })), + ); + + const { result } = renderHook(() => useSetUserActive(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current + .mutateAsync({ userId: 'any-id', isActive: false }) + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); +}); + +describe('useDeleteUser', () => { + it('succeeds when server returns 204', async () => { + const { result } = renderHook(() => useDeleteUser(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current.mutateAsync('22222222-2222-2222-2222-222222222222'); + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + }); + + it('fails when server returns 400 (last owner)', async () => { + server.use( + http.delete(`${USERS_URL}/:userId`, () => + HttpResponse.json( + { title: 'Bad Request', detail: 'At least one Owner must remain.', status: 400 }, + { status: 400 }, + ), + ), + ); + + const { result } = renderHook(() => useDeleteUser(), { wrapper: createWrapper() }); + + await act(async () => { + await result.current + .mutateAsync('11111111-1111-1111-1111-111111111111') + .catch(() => {}); + }); + + await waitFor(() => expect(result.current.isError).toBe(true)); + }); +}); diff --git a/frontend/src/auth/useInitGuard.test.ts b/frontend/src/auth/useInitGuard.test.ts new file mode 100644 index 0000000..d227c4f --- /dev/null +++ b/frontend/src/auth/useInitGuard.test.ts @@ -0,0 +1,78 @@ +import { renderHook, waitFor } from '@testing-library/react'; +import { http, HttpResponse } from 'msw'; +import { beforeEach, describe, expect, it } from 'vitest'; +import { server } from '@/mocks/server'; +import { API_BASE } from '@/mocks/auth/fixtures'; +import { useInitGuard, _resetSetupStatusCache } from '@/auth/useInitGuard'; + +const SETUP_STATUS_URL = `${API_BASE}/Setup/status`; + +beforeEach(() => { + _resetSetupStatusCache(); +}); + +describe('useInitGuard', () => { + it('starts in loading state', () => { + const { result } = renderHook(() => useInitGuard()); + + expect(result.current.isLoading).toBe(true); + expect(result.current.initialized).toBeNull(); + expect(result.current.error).toBeNull(); + }); + + it('returns initialized=true when system is set up', async () => { + server.use( + http.get(SETUP_STATUS_URL, () => HttpResponse.json({ initialized: true })), + ); + + const { result } = renderHook(() => useInitGuard()); + + await waitFor(() => expect(result.current.isLoading).toBe(false)); + + expect(result.current.initialized).toBe(true); + expect(result.current.error).toBeNull(); + }); + + it('returns initialized=false when system is not yet set up', async () => { + server.use( + http.get(SETUP_STATUS_URL, () => HttpResponse.json({ initialized: false })), + ); + + const { result } = renderHook(() => useInitGuard()); + + await waitFor(() => expect(result.current.isLoading).toBe(false)); + + expect(result.current.initialized).toBe(false); + expect(result.current.error).toBeNull(); + }); + + it('sets error when the API request fails', async () => { + server.use(http.get(SETUP_STATUS_URL, () => HttpResponse.error())); + + const { result } = renderHook(() => useInitGuard()); + + await waitFor(() => expect(result.current.isLoading).toBe(false)); + + expect(result.current.error).not.toBeNull(); + expect(result.current.initialized).toBeNull(); + }); + + it('uses cached result on second call without re-fetching', async () => { + let callCount = 0; + server.use( + http.get(SETUP_STATUS_URL, () => { + callCount += 1; + return HttpResponse.json({ initialized: true }); + }), + ); + + const { result: first } = renderHook(() => useInitGuard()); + await waitFor(() => expect(first.current.isLoading).toBe(false)); + + const { result: second } = renderHook(() => useInitGuard()); + await waitFor(() => expect(second.current.isLoading).toBe(false)); + + expect(callCount).toBe(1); // Only one fetch due to cache + expect(second.current.initialized).toBe(true); + }); +}); diff --git a/frontend/src/components/auth/RoleGuard.test.tsx b/frontend/src/components/auth/RoleGuard.test.tsx new file mode 100644 index 0000000..1e2068d --- /dev/null +++ b/frontend/src/components/auth/RoleGuard.test.tsx @@ -0,0 +1,38 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { screen } from '@testing-library/react'; +import { http, HttpResponse } from 'msw'; +import { renderApp } from '@/test/utils'; +import { server } from '@/mocks/server'; +import { API_BASE, makeAuthResponse, mockUser } from '@/mocks/auth/fixtures'; +import { _resetSetupStatusCache } from '@/router'; + +beforeEach(() => { + _resetSetupStatusCache(); +}); + +describe('RoleGuard', () => { + it('renders protected content when user has an allowed role (Owner on /users)', async () => { + // Default auth mock returns Owner role, /users requires Owner or Administrator + server.use( + http.post(`${API_BASE}/api/v1/auth/refresh`, () => + HttpResponse.json(makeAuthResponse()), + ), + ); + renderApp('/users'); + + expect(await screen.findByTestId('users-title')).toBeInTheDocument(); + }); + + it('shows access denied message when user lacks the required role', async () => { + // Authenticate with 'User' role — /users requires Owner or Administrator + server.use( + http.post(`${API_BASE}/api/v1/auth/refresh`, () => + HttpResponse.json(makeAuthResponse({ user: { ...mockUser, role: 'User' } })), + ), + ); + renderApp('/users'); + + expect(await screen.findByTestId('access-denied-message')).toBeInTheDocument(); + expect(screen.queryByTestId('users-title')).not.toBeInTheDocument(); + }); +}); diff --git a/frontend/src/components/layout/AppLayout.test.tsx b/frontend/src/components/layout/AppLayout.test.tsx index f8ce53d..f749cd8 100644 --- a/frontend/src/components/layout/AppLayout.test.tsx +++ b/frontend/src/components/layout/AppLayout.test.tsx @@ -56,3 +56,29 @@ describe('AppLayout auth guard', () => { expect(await screen.findByTestId('login-form-submit-button')).toBeInTheDocument(); }); }); + +describe('UserMenu', () => { + it('shows user name in menu after opening', async () => { + mockAuthenticated(); + const user = userEvent.setup(); + renderApp('/dashboard'); + + await screen.findByTestId('user-menu-button'); + await user.click(screen.getByTestId('user-menu-button')); + + expect(await screen.findByTestId('user-menu-name')).toBeInTheDocument(); + }); + + it('logs out and redirects to login when logout is clicked', async () => { + mockAuthenticated(); + const user = userEvent.setup(); + renderApp('/dashboard'); + + await screen.findByTestId('user-menu-button'); + await user.click(screen.getByTestId('user-menu-button')); + await screen.findByTestId('user-menu-logout'); + await user.click(screen.getByTestId('user-menu-logout')); + + expect(await screen.findByTestId('login-form-submit-button')).toBeInTheDocument(); + }); +}); diff --git a/frontend/src/components/ui/FormBannerError.test.tsx b/frontend/src/components/ui/FormBannerError.test.tsx new file mode 100644 index 0000000..bc72fa1 --- /dev/null +++ b/frontend/src/components/ui/FormBannerError.test.tsx @@ -0,0 +1,36 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { FormBannerError } from '@/components/ui/FormBannerError'; + +describe('FormBannerError', () => { + it('renders nothing when error is null', () => { + const { container } = render( + , + ); + expect(container.firstChild).toBeNull(); + }); + + it('renders the error message when error is provided', () => { + render( + , + ); + expect(screen.getByTestId('form-error-banner')).toBeInTheDocument(); + expect(screen.getByText('Something went wrong')).toBeInTheDocument(); + }); + + it('calls onDismiss when the dismiss button is clicked', async () => { + const onDismiss = vi.fn(); + render( + , + ); + await userEvent.click(screen.getByRole('button', { name: /dismiss/i })); + expect(onDismiss).toHaveBeenCalledOnce(); + }); +}); diff --git a/frontend/src/lib/api-client.test.ts b/frontend/src/lib/api-client.test.ts new file mode 100644 index 0000000..daa2b64 --- /dev/null +++ b/frontend/src/lib/api-client.test.ts @@ -0,0 +1,186 @@ +import { describe, expect, it, vi } from 'vitest'; +import { http, HttpResponse } from 'msw'; +import { server } from '@/mocks/server'; +import { ApiClient, ProblemDetailsError, NetworkError } from '@/lib/api-client'; + +const BASE = 'http://localhost:5000'; + +function makeClient() { + return new ApiClient(BASE); +} + +describe('ApiClient', () => { + it('makes a GET request and parses JSON response', async () => { + server.use(http.get(`${BASE}/test`, () => HttpResponse.json({ ok: true }))); + + const client = makeClient(); + const result = await client.get<{ ok: boolean }>('/test'); + + expect(result).toEqual({ ok: true }); + }); + + it('makes a POST request with JSON body', async () => { + server.use( + http.post(`${BASE}/test`, async ({ request }) => { + const body = (await request.json()) as { name: string }; + return HttpResponse.json({ received: body.name }); + }), + ); + + const client = makeClient(); + const result = await client.post<{ received: string }>('/test', { name: 'hello' }); + + expect(result.received).toBe('hello'); + }); + + it('makes a PUT request', async () => { + server.use(http.put(`${BASE}/item/1`, () => HttpResponse.json({ updated: true }))); + + const client = makeClient(); + const result = await client.put<{ updated: boolean }>('/item/1', { value: 'x' }); + + expect(result.updated).toBe(true); + }); + + it('returns undefined for 204 No Content responses', async () => { + server.use(http.delete(`${BASE}/item/1`, () => new HttpResponse(null, { status: 204 }))); + + const client = makeClient(); + const result = await client.delete('/item/1'); + + expect(result).toBeUndefined(); + }); + + it('throws ProblemDetailsError on non-2xx response', async () => { + server.use( + http.get(`${BASE}/notfound`, () => + HttpResponse.json({ title: 'Not Found', status: 404 }, { status: 404 }), + ), + ); + + const client = makeClient(); + await expect(client.get('/notfound')).rejects.toThrow(ProblemDetailsError); + }); + + it('ProblemDetailsError carries status and problem details', async () => { + server.use( + http.get(`${BASE}/bad`, () => + HttpResponse.json({ title: 'Bad Request', status: 400, detail: 'Invalid input' }, { status: 400 }), + ), + ); + + const client = makeClient(); + try { + await client.get('/bad'); + expect.fail('should have thrown'); + } catch (err) { + expect(err).toBeInstanceOf(ProblemDetailsError); + const pde = err as ProblemDetailsError; + expect(pde.status).toBe(400); + expect(pde.problem.title).toBe('Bad Request'); + } + }); + + it('injects Bearer token when access token is set', async () => { + let capturedAuth: string | null = null; + server.use( + http.get(`${BASE}/secured`, ({ request }) => { + capturedAuth = request.headers.get('Authorization'); + return HttpResponse.json({}); + }), + ); + + const client = makeClient(); + client.setAccessToken('my-token'); + await client.get('/secured'); + + expect(capturedAuth).toBe('Bearer my-token'); + }); + + it('does not inject auth header when no access token is set', async () => { + let capturedAuth: string | null = null; + server.use( + http.get(`${BASE}/public`, ({ request }) => { + capturedAuth = request.headers.get('Authorization'); + return HttpResponse.json({}); + }), + ); + + const client = makeClient(); + await client.get('/public'); + + expect(capturedAuth).toBeNull(); + }); + + it('clears token when setAccessToken(null) is called', async () => { + let capturedAuth: string | null = null; + server.use( + http.get(`${BASE}/cleared`, ({ request }) => { + capturedAuth = request.headers.get('Authorization'); + return HttpResponse.json({}); + }), + ); + + const client = makeClient(); + client.setAccessToken('my-token'); + client.setAccessToken(null); + await client.get('/cleared'); + + expect(capturedAuth).toBeNull(); + }); + + it('retries once with new token after 401', async () => { + let callCount = 0; + server.use( + http.get(`${BASE}/protected`, () => { + callCount += 1; + if (callCount === 1) return new HttpResponse(null, { status: 401 }); + return HttpResponse.json({ secret: 'data' }); + }), + ); + + const client = makeClient(); + client.setRefreshHandler(async () => 'new-token'); + const result = await client.get<{ secret: string }>('/protected'); + + expect(result.secret).toBe('data'); + expect(callCount).toBe(2); + }); + + it('calls authFailureHandler and throws when refresh returns null', async () => { + server.use(http.get(`${BASE}/protected`, () => new HttpResponse(null, { status: 401 }))); + + const client = makeClient(); + const failureFn = vi.fn(); + client.setRefreshHandler(async () => null); + client.setAuthFailureHandler(failureFn); + + await expect(client.get('/protected')).rejects.toThrow(ProblemDetailsError); + expect(failureFn).toHaveBeenCalledOnce(); + }); + + it('does not retry 401 when skipAuthRefresh is set', async () => { + let callCount = 0; + server.use( + http.get(`${BASE}/skip`, () => { + callCount += 1; + return new HttpResponse(null, { status: 401 }); + }), + ); + + const client = makeClient(); + client.setRefreshHandler(async () => 'new-token'); + await expect( + client.get('/skip', { skipAuthRefresh: true }), + ).rejects.toThrow(ProblemDetailsError); + + expect(callCount).toBe(1); + }); + + it('throws NetworkError when fetch fails', async () => { + server.use(http.get(`${BASE}/network-fail`, () => HttpResponse.error())); + + const client = makeClient(); + await expect(client.get('/network-fail')).rejects.toThrow(NetworkError); + }); +}); diff --git a/frontend/src/lib/schemas/auth.test.ts b/frontend/src/lib/schemas/auth.test.ts new file mode 100644 index 0000000..48988e2 --- /dev/null +++ b/frontend/src/lib/schemas/auth.test.ts @@ -0,0 +1,122 @@ +import { describe, expect, it } from 'vitest'; +import { + passwordSchema, + setupFormSchema, + loginFormSchema, + invitationCompleteFormSchema, +} from '@/lib/schemas/auth'; + +describe('passwordSchema', () => { + it('accepts a valid password', () => { + expect(passwordSchema.safeParse('Password1!').success).toBe(true); + }); + + it('rejects a password that is too short', () => { + expect(passwordSchema.safeParse('Pass1!').success).toBe(false); + }); + + it('rejects a password without an uppercase letter', () => { + expect(passwordSchema.safeParse('password1!').success).toBe(false); + }); + + it('rejects a password without a digit', () => { + expect(passwordSchema.safeParse('Password!').success).toBe(false); + }); + + it('rejects a password without a special character', () => { + expect(passwordSchema.safeParse('Password1').success).toBe(false); + }); +}); + +describe('setupFormSchema', () => { + const valid = { + name: 'Admin', + email: 'admin@example.com', + password: 'Password1!', + confirmPassword: 'Password1!', + language: 'nl' as const, + }; + + it('accepts valid setup data', () => { + expect(setupFormSchema.safeParse(valid).success).toBe(true); + }); + + it('rejects when passwords do not match', () => { + const result = setupFormSchema.safeParse({ ...valid, confirmPassword: 'Different1!' }); + expect(result.success).toBe(false); + }); + + it('rejects empty name', () => { + expect(setupFormSchema.safeParse({ ...valid, name: '' }).success).toBe(false); + }); + + it('rejects name exceeding 255 characters', () => { + expect(setupFormSchema.safeParse({ ...valid, name: 'a'.repeat(256) }).success).toBe(false); + }); + + it('rejects invalid email format', () => { + expect(setupFormSchema.safeParse({ ...valid, email: 'not-an-email' }).success).toBe(false); + }); + + it('rejects empty email', () => { + expect(setupFormSchema.safeParse({ ...valid, email: '' }).success).toBe(false); + }); + + it('rejects invalid language', () => { + expect(setupFormSchema.safeParse({ ...valid, language: 'fr' }).success).toBe(false); + }); + + it('accepts "en" as language', () => { + expect(setupFormSchema.safeParse({ ...valid, language: 'en' }).success).toBe(true); + }); +}); + +describe('loginFormSchema', () => { + it('accepts valid login credentials', () => { + expect(loginFormSchema.safeParse({ email: 'user@example.com', password: 'anypass' }).success).toBe(true); + }); + + it('rejects empty email', () => { + expect(loginFormSchema.safeParse({ email: '', password: 'pass' }).success).toBe(false); + }); + + it('rejects invalid email format', () => { + expect(loginFormSchema.safeParse({ email: 'not-email', password: 'pass' }).success).toBe(false); + }); + + it('rejects empty password', () => { + expect(loginFormSchema.safeParse({ email: 'user@example.com', password: '' }).success).toBe(false); + }); +}); + +describe('invitationCompleteFormSchema', () => { + const valid = { + name: 'New User', + password: 'Password1!', + confirmPassword: 'Password1!', + }; + + it('accepts valid invitation completion data', () => { + expect(invitationCompleteFormSchema.safeParse(valid).success).toBe(true); + }); + + it('rejects when passwords do not match', () => { + expect( + invitationCompleteFormSchema.safeParse({ ...valid, confirmPassword: 'Different1!' }).success, + ).toBe(false); + }); + + it('rejects empty name', () => { + expect(invitationCompleteFormSchema.safeParse({ ...valid, name: '' }).success).toBe(false); + }); + + it('rejects weak password', () => { + expect( + invitationCompleteFormSchema.safeParse({ + ...valid, + password: 'weak', + confirmPassword: 'weak', + }).success, + ).toBe(false); + }); +}); diff --git a/frontend/src/pages/DashboardPage.test.tsx b/frontend/src/pages/DashboardPage.test.tsx new file mode 100644 index 0000000..d0cd913 --- /dev/null +++ b/frontend/src/pages/DashboardPage.test.tsx @@ -0,0 +1,68 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { http, HttpResponse } from 'msw'; +import { renderApp, mockAuthenticated, mockGuest } from '@/test/utils'; +import { server } from '@/mocks/server'; +import { _resetSetupStatusCache } from '@/router'; + +beforeEach(() => { + _resetSetupStatusCache(); +}); + +describe('DashboardPage', () => { + it('renders title and welcome message for authenticated user', async () => { + mockAuthenticated(); + renderApp('/dashboard'); + + expect(await screen.findByTestId('dashboard-title')).toBeInTheDocument(); + expect(screen.getByTestId('dashboard-welcome')).toBeInTheDocument(); + }); + + it('displays the availability status badge when data loads', async () => { + mockAuthenticated(); + renderApp('/dashboard'); + + await screen.findByTestId('dashboard-title'); + + // Availability badge should eventually appear after status loads + expect(await screen.findByTestId('availability-badge')).toBeInTheDocument(); + }); + + it('shows retry button when availability fetch fails', async () => { + server.use(http.get('*/Availability/status', () => HttpResponse.error())); + + mockAuthenticated(); + renderApp('/dashboard'); + + await screen.findByTestId('dashboard-title'); + expect(await screen.findByTestId('availability-retry')).toBeInTheDocument(); + }); + + it('refetches availability when retry button is clicked', async () => { + let callCount = 0; + server.use( + http.get('*/Availability/status', () => { + callCount += 1; + if (callCount === 1) return HttpResponse.error(); + return HttpResponse.json({ status: 'Available', checkedAt: new Date().toISOString(), message: '' }); + }), + ); + + mockAuthenticated(); + renderApp('/dashboard'); + + const retryButton = await screen.findByTestId('availability-retry'); + await userEvent.click(retryButton); + + expect(callCount).toBeGreaterThanOrEqual(2); + }); + + it('redirects unauthenticated users to login', async () => { + mockGuest(); + renderApp('/dashboard'); + + expect(await screen.findByTestId('login-form-submit-button')).toBeInTheDocument(); + expect(screen.queryByTestId('dashboard-title')).not.toBeInTheDocument(); + }); +}); diff --git a/src/SlpModularCms.Api/Extensions/ServiceCollectionExtensions.cs b/src/SlpModularCms.Api/Extensions/ServiceCollectionExtensions.cs index 3be8100..c78a47b 100644 --- a/src/SlpModularCms.Api/Extensions/ServiceCollectionExtensions.cs +++ b/src/SlpModularCms.Api/Extensions/ServiceCollectionExtensions.cs @@ -15,8 +15,11 @@ using SlpModularCms.Api.Infrastructure; using System.Text; using System.Threading.RateLimiting; +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Api.Extensions; +[ExcludeFromCodeCoverage] public static class ServiceCollectionExtensions { public static IServiceCollection AddCoreInfrastructure(this IServiceCollection services, IConfiguration configuration) diff --git a/src/SlpModularCms.Api/Program.Coverage.cs b/src/SlpModularCms.Api/Program.Coverage.cs new file mode 100644 index 0000000..2d89b3d --- /dev/null +++ b/src/SlpModularCms.Api/Program.Coverage.cs @@ -0,0 +1,6 @@ +using System.Diagnostics.CodeAnalysis; + +// Excludes the top-level-statement Program class from code coverage. +// Program.cs is application bootstrapping and cannot be meaningfully unit tested. +[ExcludeFromCodeCoverage] +public partial class Program { } diff --git a/src/SlpModularCms.Core.Tests/Identity/AuthServiceTests.cs b/src/SlpModularCms.Core.Tests/Identity/AuthServiceTests.cs new file mode 100644 index 0000000..b3e6f7f --- /dev/null +++ b/src/SlpModularCms.Core.Tests/Identity/AuthServiceTests.cs @@ -0,0 +1,251 @@ +using FluentAssertions; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using NSubstitute; +using SlpModularCms.Core.Data; +using SlpModularCms.Core.Exceptions; +using SlpModularCms.Core.Identity.Entities; +using SlpModularCms.Core.Identity.Models; +using SlpModularCms.Core.Identity.Services; +using Xunit; + +namespace SlpModularCms.Core.Tests.Identity; + +public class AuthServiceTests +{ + private readonly ApplicationDbContext _context; + private readonly UserManager _userManager; + private readonly AuthService _service; + + public AuthServiceTests() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString()) + .Options; + _context = new ApplicationDbContext(options); + + var store = Substitute.For>(); + _userManager = Substitute.For>( + store, null, null, null, null, null, null, null, null); + + var jwtSettings = new JwtSettings + { + Secret = "test-signing-key-at-least-32-chars-long!", + Issuer = "test-issuer", + Audience = "test-audience", + ExpiryMinutes = 60, + RefreshTokenExpiryDays = 7 + }; + + _service = new AuthService(_userManager, _context, Options.Create(jwtSettings)); + } + + [Fact] + public async Task AuthenticateAsync_ShouldThrow_WhenUserNotFound() + { + _userManager.FindByEmailAsync(Arg.Any()).Returns((ApplicationUser?)null); + + var act = () => _service.AuthenticateAsync("nouser@example.com", "password"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task AuthenticateAsync_ShouldThrow_WhenUserIsInactive() + { + var user = new ApplicationUser { Email = "user@example.com", IsActive = false }; + _userManager.FindByEmailAsync(Arg.Any()).Returns(user); + + var act = () => _service.AuthenticateAsync("user@example.com", "password"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task AuthenticateAsync_ShouldThrow_WhenPasswordInvalid() + { + var user = new ApplicationUser { Email = "user@example.com", IsActive = true }; + _userManager.FindByEmailAsync(Arg.Any()).Returns(user); + _userManager.CheckPasswordAsync(user, Arg.Any()).Returns(false); + + var act = () => _service.AuthenticateAsync("user@example.com", "wrongpassword"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task AuthenticateAsync_ShouldReturnTokenResponse_WhenCredentialsValid() + { + var user = new ApplicationUser + { + Id = Guid.NewGuid(), + Email = "user@example.com", + IsActive = true, + DisplayName = "Test User" + }; + _userManager.FindByEmailAsync(Arg.Any()).Returns(user); + _userManager.CheckPasswordAsync(user, "Password123!").Returns(true); + _userManager.GetRolesAsync(user).Returns(new List { "User" }); + + var result = await _service.AuthenticateAsync("user@example.com", "Password123!"); + + result.Should().NotBeNull(); + result.AccessToken.Should().NotBeNullOrEmpty(); + result.RefreshToken.Should().NotBeNullOrEmpty(); + result.User.Email.Should().Be("user@example.com"); + + var savedToken = await _context.RefreshTokens.FirstOrDefaultAsync(); + savedToken.Should().NotBeNull(); + } + + [Fact] + public async Task RefreshTokenAsync_ShouldThrow_WhenTokenNotFound() + { + var act = () => _service.RefreshTokenAsync("nonexistent-token"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task RefreshTokenAsync_ShouldThrow_WhenTokenRevoked() + { + var user = new ApplicationUser { Id = Guid.NewGuid(), Email = "user@example.com" }; + _context.Users.Add(user); + await _context.SaveChangesAsync(); + + _context.RefreshTokens.Add(new RefreshToken + { + Token = "revoked-token", + UserId = user.Id, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(1), + IsRevoked = true + }); + await _context.SaveChangesAsync(); + + var act = () => _service.RefreshTokenAsync("revoked-token"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task RefreshTokenAsync_ShouldRevokeAllTokensAndThrow_WhenTokenAlreadyUsed() + { + var user = new ApplicationUser { Id = Guid.NewGuid(), Email = "user@example.com" }; + _context.Users.Add(user); + await _context.SaveChangesAsync(); + + _context.RefreshTokens.Add(new RefreshToken + { + Token = "used-token", + UserId = user.Id, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(1), + IsUsed = true + }); + await _context.SaveChangesAsync(); + + var act = () => _service.RefreshTokenAsync("used-token"); + + await act.Should().ThrowAsync(); + + var allTokens = await _context.RefreshTokens.ToListAsync(); + allTokens.Should().AllSatisfy(t => t.IsRevoked.Should().BeTrue()); + } + + [Fact] + public async Task RefreshTokenAsync_ShouldReturnNewTokens_WhenTokenValid() + { + var user = new ApplicationUser + { + Id = Guid.NewGuid(), + Email = "user@example.com", + IsActive = true + }; + _context.Users.Add(user); + await _context.SaveChangesAsync(); + + _context.RefreshTokens.Add(new RefreshToken + { + Token = "valid-refresh-token", + UserId = user.Id, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(7) + }); + await _context.SaveChangesAsync(); + + _userManager.GetRolesAsync(Arg.Any()).Returns(new List { "User" }); + + var result = await _service.RefreshTokenAsync("valid-refresh-token"); + + result.Should().NotBeNull(); + result.AccessToken.Should().NotBeNullOrEmpty(); + result.RefreshToken.Should().NotBeNullOrEmpty(); + + var oldToken = await _context.RefreshTokens.FirstAsync(t => t.Token == "valid-refresh-token"); + oldToken.IsUsed.Should().BeTrue(); + } + + [Fact] + public async Task RevokeTokenAsync_ShouldMarkTokenRevoked() + { + var user = new ApplicationUser { Id = Guid.NewGuid(), Email = "user@example.com" }; + _context.Users.Add(user); + await _context.SaveChangesAsync(); + + _context.RefreshTokens.Add(new RefreshToken + { + Token = "token-to-revoke", + UserId = user.Id, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(1) + }); + await _context.SaveChangesAsync(); + + await _service.RevokeTokenAsync("token-to-revoke"); + + var saved = await _context.RefreshTokens.FirstAsync(t => t.Token == "token-to-revoke"); + saved.IsRevoked.Should().BeTrue(); + } + + [Fact] + public async Task RevokeTokenAsync_ShouldNotThrow_WhenTokenNotFound() + { + var act = () => _service.RevokeTokenAsync("nonexistent-token"); + + await act.Should().NotThrowAsync(); + } + + [Fact] + public async Task ChangePasswordAsync_ShouldThrow_WhenUserNotFound() + { + _userManager.FindByIdAsync(Arg.Any()).Returns((ApplicationUser?)null); + + var act = () => _service.ChangePasswordAsync(Guid.NewGuid(), "old", "new"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task ChangePasswordAsync_ShouldThrow_WhenPasswordChangeFails() + { + var user = new ApplicationUser { Id = Guid.NewGuid(), Email = "user@example.com" }; + _userManager.FindByIdAsync(user.Id.ToString()).Returns(user); + _userManager.ChangePasswordAsync(user, Arg.Any(), Arg.Any()) + .Returns(IdentityResult.Failed(new IdentityError { Description = "Password too weak" })); + + var act = () => _service.ChangePasswordAsync(user.Id, "old", "weak"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task ChangePasswordAsync_ShouldSucceed_WhenValid() + { + var user = new ApplicationUser { Id = Guid.NewGuid(), Email = "user@example.com" }; + _userManager.FindByIdAsync(user.Id.ToString()).Returns(user); + _userManager.ChangePasswordAsync(user, "OldPassword1!", "NewPassword1!") + .Returns(IdentityResult.Success); + + var act = () => _service.ChangePasswordAsync(user.Id, "OldPassword1!", "NewPassword1!"); + + await act.Should().NotThrowAsync(); + } +} diff --git a/src/SlpModularCms.Core.Tests/Identity/InvitationServiceTests.cs b/src/SlpModularCms.Core.Tests/Identity/InvitationServiceTests.cs index 99ae903..bf93adf 100644 --- a/src/SlpModularCms.Core.Tests/Identity/InvitationServiceTests.cs +++ b/src/SlpModularCms.Core.Tests/Identity/InvitationServiceTests.cs @@ -88,10 +88,124 @@ public class InvitationServiceTests [Fact] public async Task CompleteInvitationAsync_ShouldThrow_WhenTokenInvalid() { - // Act var act = () => _service.CompleteInvitationAsync("invalid-token", "password"); - // Assert await act.Should().ThrowAsync(); } + + [Fact] + public async Task CreateInvitationAsync_ShouldThrow_WhenInvitationAlreadyExists() + { + await _service.CreateInvitationAsync("test@example.com", "User"); + + var act = () => _service.CreateInvitationAsync("test@example.com", "User"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateInvitationAsync_ShouldThrow_WhenUserAlreadyExists() + { + var email = "existing@example.com"; + _userManager.FindByEmailAsync(email) + .Returns(new ApplicationUser { Email = email }); + + var act = () => _service.CreateInvitationAsync(email, "User"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task ValidateInvitationAsync_ShouldReturnFalse_WhenTokenInvalid() + { + var isValid = await _service.ValidateInvitationAsync("nonexistent-token"); + + isValid.Should().BeFalse(); + } + + [Fact] + public async Task GetPendingInvitationByEmailAsync_ShouldReturnFalse_WhenNoInvitation() + { + var (isPending, token) = await _service.GetPendingInvitationByEmailAsync("nobody@example.com"); + + isPending.Should().BeFalse(); + token.Should().BeNull(); + } + + [Fact] + public async Task GetPendingInvitationByEmailAsync_ShouldReturnTrue_WhenPendingInvitationExists() + { + var invitationToken = await _service.CreateInvitationAsync("invited@example.com", "User"); + + var (isPending, token) = await _service.GetPendingInvitationByEmailAsync("invited@example.com"); + + isPending.Should().BeTrue(); + token.Should().Be(invitationToken); + } + + [Fact] + public async Task DeletePendingInvitationsByEmailAsync_ShouldRemoveMatchingInvitations() + { + await _service.CreateInvitationAsync("invited@example.com", "User"); + + await _service.DeletePendingInvitationsByEmailAsync("invited@example.com"); + + var (isPending, _) = await _service.GetPendingInvitationByEmailAsync("invited@example.com"); + isPending.Should().BeFalse(); + } + + [Fact] + public async Task GetAllPendingInvitationsAsync_ShouldReturnAllActiveInvitations() + { + await _service.CreateInvitationAsync("user1@example.com", "User"); + await _service.CreateInvitationAsync("user2@example.com", "Administrator"); + + var invitations = await _service.GetAllPendingInvitationsAsync(); + + invitations.Should().HaveCount(2); + invitations.Select(i => i.Email).Should().Contain(["user1@example.com", "user2@example.com"]); + } + + [Fact] + public async Task DeleteInvitationByIdAsync_ShouldReturnTrue_WhenFound() + { + await _service.CreateInvitationAsync("invited@example.com", "User"); + var invitations = await _service.GetAllPendingInvitationsAsync(); + var id = invitations[0].Id; + + var result = await _service.DeleteInvitationByIdAsync(id); + + result.Should().BeTrue(); + (await _service.GetAllPendingInvitationsAsync()).Should().BeEmpty(); + } + + [Fact] + public async Task DeleteInvitationByIdAsync_ShouldReturnFalse_WhenNotFound() + { + var result = await _service.DeleteInvitationByIdAsync(Guid.NewGuid()); + + result.Should().BeFalse(); + } + + [Fact] + public async Task UpdateInvitationRoleAsync_ShouldUpdateRole() + { + await _service.CreateInvitationAsync("invited@example.com", "User"); + var invitations = await _service.GetAllPendingInvitationsAsync(); + var id = invitations[0].Id; + + var result = await _service.UpdateInvitationRoleAsync(id, "Administrator"); + + result.Should().BeTrue(); + var updated = await _service.GetAllPendingInvitationsAsync(); + updated[0].Role.Should().Be("Administrator"); + } + + [Fact] + public async Task UpdateInvitationRoleAsync_ShouldReturnFalse_WhenNotFound() + { + var result = await _service.UpdateInvitationRoleAsync(Guid.NewGuid(), "Administrator"); + + result.Should().BeFalse(); + } } diff --git a/src/SlpModularCms.Core.Tests/Identity/SetupServiceTests.cs b/src/SlpModularCms.Core.Tests/Identity/SetupServiceTests.cs new file mode 100644 index 0000000..2170a32 --- /dev/null +++ b/src/SlpModularCms.Core.Tests/Identity/SetupServiceTests.cs @@ -0,0 +1,141 @@ +using FluentAssertions; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using SlpModularCms.Core.Data; +using SlpModularCms.Core.Exceptions; +using SlpModularCms.Core.Identity.Entities; +using SlpModularCms.Core.Identity.Services; +using Xunit; + +namespace SlpModularCms.Core.Tests.Identity; + +public class SetupServiceTests +{ + private static ApplicationDbContext CreateContext() => + new(new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options); + + private static UserManager CreateUserManager(ApplicationDbContext context) + { + var store = new UserStore(context); + return new UserManager( + store, + Options.Create(new IdentityOptions()), + new PasswordHasher(), + new IUserValidator[] { new UserValidator() }, + new IPasswordValidator[] { new PasswordValidator() }, + new UpperInvariantLookupNormalizer(), + new IdentityErrorDescriber(), + null!, + NullLogger>.Instance); + } + + private static RoleManager CreateRoleManager(ApplicationDbContext context) + { + var store = new RoleStore(context); + return new RoleManager( + store, + new IRoleValidator[] { new RoleValidator() }, + new UpperInvariantLookupNormalizer(), + new IdentityErrorDescriber(), + NullLogger>.Instance); + } + + [Fact] + public async Task IsSystemInitializedAsync_ShouldReturnFalse_WhenNoUsers() + { + var context = CreateContext(); + var service = new SetupService(CreateUserManager(context), CreateRoleManager(context)); + + var result = await service.IsSystemInitializedAsync(); + + result.Should().BeFalse(); + } + + [Fact] + public async Task IsSystemInitializedAsync_ShouldReturnTrue_WhenUsersExist() + { + var context = CreateContext(); + var userManager = CreateUserManager(context); + var service = new SetupService(userManager, CreateRoleManager(context)); + + await userManager.CreateAsync( + new ApplicationUser { UserName = "owner@example.com", Email = "owner@example.com" }, + "Password123!"); + + var result = await service.IsSystemInitializedAsync(); + + result.Should().BeTrue(); + } + + [Fact] + public async Task CreateInitialOwnerAsync_ShouldThrow_WhenSystemAlreadyInitialized() + { + var context = CreateContext(); + var userManager = CreateUserManager(context); + var service = new SetupService(userManager, CreateRoleManager(context)); + + await userManager.CreateAsync( + new ApplicationUser { UserName = "existing@example.com", Email = "existing@example.com" }, + "Password123!"); + + var act = () => service.CreateInitialOwnerAsync("Owner", "owner@example.com", "Password123!"); + + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateInitialOwnerAsync_ShouldCreateUserWithOwnerRole() + { + var context = CreateContext(); + var userManager = CreateUserManager(context); + var roleManager = CreateRoleManager(context); + var service = new SetupService(userManager, roleManager); + + await service.CreateInitialOwnerAsync("Test Owner", "owner@example.com", "Password123!"); + + var user = await userManager.FindByEmailAsync("owner@example.com"); + user.Should().NotBeNull(); + user!.DisplayName.Should().Be("Test Owner"); + user.IsActive.Should().BeTrue(); + + var roles = await userManager.GetRolesAsync(user); + roles.Should().Contain("Owner"); + } + + [Fact] + public async Task CreateInitialOwnerAsync_ShouldCreateAllRoles() + { + var context = CreateContext(); + var userManager = CreateUserManager(context); + var roleManager = CreateRoleManager(context); + var service = new SetupService(userManager, roleManager); + + await service.CreateInitialOwnerAsync("Test Owner", "owner@example.com", "Password123!"); + + (await roleManager.RoleExistsAsync("Owner")).Should().BeTrue(); + (await roleManager.RoleExistsAsync("Administrator")).Should().BeTrue(); + (await roleManager.RoleExistsAsync("User")).Should().BeTrue(); + } + + [Fact] + public async Task CreateInitialOwnerAsync_ShouldNotDuplicateRoles_WhenCalledAfterPartialSetup() + { + var context = CreateContext(); + var userManager = CreateUserManager(context); + var roleManager = CreateRoleManager(context); + var service = new SetupService(userManager, roleManager); + + // Pre-create the Owner role to simulate partial setup + await roleManager.CreateAsync(new ApplicationRole { Name = "Owner" }); + + await service.CreateInitialOwnerAsync("Test Owner", "owner@example.com", "Password123!"); + + var ownerRoles = await context.Roles.Where(r => r.Name == "Owner").ToListAsync(); + ownerRoles.Should().HaveCount(1); + } +} diff --git a/src/SlpModularCms.Core/Availability/AvailabilityOptions.cs b/src/SlpModularCms.Core/Availability/AvailabilityOptions.cs index 3a21412..5a88aad 100644 --- a/src/SlpModularCms.Core/Availability/AvailabilityOptions.cs +++ b/src/SlpModularCms.Core/Availability/AvailabilityOptions.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Availability; /// /// Configuratie-opties voor de Availability module. /// +[ExcludeFromCodeCoverage] public class AvailabilityOptions { /// diff --git a/src/SlpModularCms.Core/Availability/AvailabilityStatusDetails.cs b/src/SlpModularCms.Core/Availability/AvailabilityStatusDetails.cs index 29cbe61..eec1eaa 100644 --- a/src/SlpModularCms.Core/Availability/AvailabilityStatusDetails.cs +++ b/src/SlpModularCms.Core/Availability/AvailabilityStatusDetails.cs @@ -1,6 +1,9 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Availability; /// /// Status en optionele admin-melding van de systeembeschikbaarheid. /// +[ExcludeFromCodeCoverage] public record AvailabilityStatusDetails(AvailabilityStatus Status, string? Message); diff --git a/src/SlpModularCms.Core/Exceptions/InvitationOrUserAlreadyExistsException.cs b/src/SlpModularCms.Core/Exceptions/InvitationOrUserAlreadyExistsException.cs index 17e3be5..517e379 100644 --- a/src/SlpModularCms.Core/Exceptions/InvitationOrUserAlreadyExistsException.cs +++ b/src/SlpModularCms.Core/Exceptions/InvitationOrUserAlreadyExistsException.cs @@ -1,8 +1,8 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Exceptions; -/// -/// Exception die gegooid wordt bij authenticatie- of autorisatiefouten. -/// +[ExcludeFromCodeCoverage] public class InvitationOrUserAlreadyExistsException : Exception { public InvitationOrUserAlreadyExistsException(string message) : base(message) diff --git a/src/SlpModularCms.Core/Exceptions/UnauthorizedException.cs b/src/SlpModularCms.Core/Exceptions/UnauthorizedException.cs index a3406fd..8932e5b 100644 --- a/src/SlpModularCms.Core/Exceptions/UnauthorizedException.cs +++ b/src/SlpModularCms.Core/Exceptions/UnauthorizedException.cs @@ -1,8 +1,8 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Exceptions; -/// -/// Exception die gegooid wordt bij authenticatie- of autorisatiefouten. -/// +[ExcludeFromCodeCoverage] public class UnauthorizedException : Exception { public UnauthorizedException(string message) : base(message) diff --git a/src/SlpModularCms.Core/Exceptions/ValidationException.cs b/src/SlpModularCms.Core/Exceptions/ValidationException.cs index bcea6c6..b0472d9 100644 --- a/src/SlpModularCms.Core/Exceptions/ValidationException.cs +++ b/src/SlpModularCms.Core/Exceptions/ValidationException.cs @@ -1,8 +1,8 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Exceptions; -/// -/// Exception die gegooid wordt bij validatiefouten. -/// +[ExcludeFromCodeCoverage] public class ValidationException : Exception { public ValidationException(string message) : base(message) diff --git a/src/SlpModularCms.Core/Identity/Authorization/HierarchicalRoleRequirement.cs b/src/SlpModularCms.Core/Identity/Authorization/HierarchicalRoleRequirement.cs index 9f3e58f..696718c 100644 --- a/src/SlpModularCms.Core/Identity/Authorization/HierarchicalRoleRequirement.cs +++ b/src/SlpModularCms.Core/Identity/Authorization/HierarchicalRoleRequirement.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Authorization; namespace SlpModularCms.Core.Identity.Authorization; @@ -5,6 +6,7 @@ namespace SlpModularCms.Core.Identity.Authorization; /// /// Requirement voor hiërarchische rol-gebaseerde autorisatie. /// +[ExcludeFromCodeCoverage] public class HierarchicalRoleRequirement : IAuthorizationRequirement { public string MinimumRole { get; } diff --git a/src/SlpModularCms.Core/Identity/Entities/ApplicationRole.cs b/src/SlpModularCms.Core/Identity/Entities/ApplicationRole.cs index 17413d4..738af76 100644 --- a/src/SlpModularCms.Core/Identity/Entities/ApplicationRole.cs +++ b/src/SlpModularCms.Core/Identity/Entities/ApplicationRole.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Identity; namespace SlpModularCms.Core.Identity.Entities; @@ -5,6 +6,7 @@ namespace SlpModularCms.Core.Identity.Entities; /// /// Aangepaste Role entiteit voor SlpModularCms. /// +[ExcludeFromCodeCoverage] public class ApplicationRole : IdentityRole { public ApplicationRole() : base() diff --git a/src/SlpModularCms.Core/Identity/Entities/ApplicationUser.cs b/src/SlpModularCms.Core/Identity/Entities/ApplicationUser.cs index 6b19cfb..c01f43f 100644 --- a/src/SlpModularCms.Core/Identity/Entities/ApplicationUser.cs +++ b/src/SlpModularCms.Core/Identity/Entities/ApplicationUser.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Identity; namespace SlpModularCms.Core.Identity.Entities; @@ -5,6 +6,7 @@ namespace SlpModularCms.Core.Identity.Entities; /// /// Aangepaste User entiteit voor SlpModularCms. /// +[ExcludeFromCodeCoverage] public class ApplicationUser : IdentityUser { /// diff --git a/src/SlpModularCms.Core/Identity/Entities/GlobalAvailabilityState.cs b/src/SlpModularCms.Core/Identity/Entities/GlobalAvailabilityState.cs index 4eca73d..22ba12c 100644 --- a/src/SlpModularCms.Core/Identity/Entities/GlobalAvailabilityState.cs +++ b/src/SlpModularCms.Core/Identity/Entities/GlobalAvailabilityState.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using SlpModularCms.Core.Availability; namespace SlpModularCms.Core.Identity.Entities; @@ -5,6 +6,7 @@ namespace SlpModularCms.Core.Identity.Entities; /// /// Persistente opslag voor de globale systeemstatus. /// +[ExcludeFromCodeCoverage] public class GlobalAvailabilityState { public Guid Id { get; set; } diff --git a/src/SlpModularCms.Core/Identity/Entities/Invitation.cs b/src/SlpModularCms.Core/Identity/Entities/Invitation.cs index 85ca5eb..bd74d96 100644 --- a/src/SlpModularCms.Core/Identity/Entities/Invitation.cs +++ b/src/SlpModularCms.Core/Identity/Entities/Invitation.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Identity.Entities; /// /// Entiteit voor gebruikersuitnodigingen. /// +[ExcludeFromCodeCoverage] public class Invitation { public Guid Id { get; set; } diff --git a/src/SlpModularCms.Core/Identity/Entities/ModulePermission.cs b/src/SlpModularCms.Core/Identity/Entities/ModulePermission.cs index 2dd5dbb..91cb572 100644 --- a/src/SlpModularCms.Core/Identity/Entities/ModulePermission.cs +++ b/src/SlpModularCms.Core/Identity/Entities/ModulePermission.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Identity.Entities; /// /// Entiteit voor module-specifieke rechten per gebruiker. /// +[ExcludeFromCodeCoverage] public class ModulePermission { public Guid UserId { get; set; } diff --git a/src/SlpModularCms.Core/Identity/Entities/RefreshToken.cs b/src/SlpModularCms.Core/Identity/Entities/RefreshToken.cs index a146071..7376990 100644 --- a/src/SlpModularCms.Core/Identity/Entities/RefreshToken.cs +++ b/src/SlpModularCms.Core/Identity/Entities/RefreshToken.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Identity.Entities; /// /// Entiteit voor het opslaan van refresh tokens. /// +[ExcludeFromCodeCoverage] public class RefreshToken { public Guid Id { get; set; } diff --git a/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs b/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs index 7198196..58b5509 100644 --- a/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs +++ b/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs @@ -1,14 +1,17 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Identity.Models; -public record CreateOwnerRequest(string Name, string Email, string Password); -public record LoginRequest(string Email, string Password); -public record InviteUserRequest(string Email, string Role); -public record CompleteSetupRequest(string Token, string Password); -public record ChangeRoleRequest(string NewRole); -public record UpdateProfileRequest(string Name, string Email); -public record ChangePasswordRequest(string CurrentPassword, string NewPassword); -public record SetUserActiveRequest(bool IsActive); -public record PendingInvitationInfo(Guid Id, string Email, string Role, string Token, DateTimeOffset CreatedAt); +[ExcludeFromCodeCoverage] public record CreateOwnerRequest(string Name, string Email, string Password); +[ExcludeFromCodeCoverage] public record LoginRequest(string Email, string Password); +[ExcludeFromCodeCoverage] public record InviteUserRequest(string Email, string Role); +[ExcludeFromCodeCoverage] public record CompleteSetupRequest(string Token, string Password); +[ExcludeFromCodeCoverage] public record ChangeRoleRequest(string NewRole); +[ExcludeFromCodeCoverage] public record UpdateProfileRequest(string Name, string Email); +[ExcludeFromCodeCoverage] public record ChangePasswordRequest(string CurrentPassword, string NewPassword); +[ExcludeFromCodeCoverage] public record SetUserActiveRequest(bool IsActive); +[ExcludeFromCodeCoverage] public record PendingInvitationInfo(Guid Id, string Email, string Role, string Token, DateTimeOffset CreatedAt); +[ExcludeFromCodeCoverage] public record UserDto( Guid Id, string Email, diff --git a/src/SlpModularCms.Core/Identity/Models/JwtSettings.cs b/src/SlpModularCms.Core/Identity/Models/JwtSettings.cs index 48a5c01..b854455 100644 --- a/src/SlpModularCms.Core/Identity/Models/JwtSettings.cs +++ b/src/SlpModularCms.Core/Identity/Models/JwtSettings.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Identity.Models; /// /// Configuratie-instellingen voor JWT. /// +[ExcludeFromCodeCoverage] public class JwtSettings { public string Secret { get; set; } = string.Empty; diff --git a/src/SlpModularCms.Core/Identity/Models/TokenResponse.cs b/src/SlpModularCms.Core/Identity/Models/TokenResponse.cs index f371114..0ea2453 100644 --- a/src/SlpModularCms.Core/Identity/Models/TokenResponse.cs +++ b/src/SlpModularCms.Core/Identity/Models/TokenResponse.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; namespace SlpModularCms.Core.Identity.Models; @@ -5,6 +6,7 @@ namespace SlpModularCms.Core.Identity.Models; /// /// Model voor het retourneren van authenticatie tokens. /// +[ExcludeFromCodeCoverage] public record TokenResponse( string AccessToken, [property: JsonIgnore] string RefreshToken, @@ -15,6 +17,7 @@ public record TokenResponse( /// /// Model voor gebruikersinformatie in de auth response. /// +[ExcludeFromCodeCoverage] public record UserResponse( Guid Id, string Email, diff --git a/src/SlpModularCms.Core/Migrations/20260612191736_InitialCreate.cs b/src/SlpModularCms.Core/Migrations/20260612191736_InitialCreate.cs index 8d63b15..05a2b2d 100644 --- a/src/SlpModularCms.Core/Migrations/20260612191736_InitialCreate.cs +++ b/src/SlpModularCms.Core/Migrations/20260612191736_InitialCreate.cs @@ -1,4 +1,6 @@ -using System; +// +using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -6,6 +8,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace SlpModularCms.Core.Migrations { /// + [ExcludeFromCodeCoverage] public partial class InitialCreate : Migration { /// diff --git a/src/SlpModularCms.Core/Migrations/20260619130625_AddsDisplayName.cs b/src/SlpModularCms.Core/Migrations/20260619130625_AddsDisplayName.cs index 91b4146..5b97899 100644 --- a/src/SlpModularCms.Core/Migrations/20260619130625_AddsDisplayName.cs +++ b/src/SlpModularCms.Core/Migrations/20260619130625_AddsDisplayName.cs @@ -1,10 +1,13 @@ -using Microsoft.EntityFrameworkCore.Migrations; +// +using System.Diagnostics.CodeAnalysis; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace SlpModularCms.Core.Migrations { /// + [ExcludeFromCodeCoverage] public partial class AddsDisplayName : Migration { /// diff --git a/src/SlpModularCms.Core/Migrations/ApplicationDbContextModelSnapshot.cs b/src/SlpModularCms.Core/Migrations/ApplicationDbContextModelSnapshot.cs index b6adef0..e64daf1 100644 --- a/src/SlpModularCms.Core/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/SlpModularCms.Core/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1,5 +1,6 @@ // using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -11,6 +12,7 @@ using SlpModularCms.Core.Data; namespace SlpModularCms.Core.Migrations { [DbContext(typeof(ApplicationDbContext))] + [ExcludeFromCodeCoverage] partial class ApplicationDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) diff --git a/src/SlpModularCms.Core/Modules/ModuleInfo.cs b/src/SlpModularCms.Core/Modules/ModuleInfo.cs index 7066908..7282d1d 100644 --- a/src/SlpModularCms.Core/Modules/ModuleInfo.cs +++ b/src/SlpModularCms.Core/Modules/ModuleInfo.cs @@ -1,8 +1,11 @@ +using System.Diagnostics.CodeAnalysis; + namespace SlpModularCms.Core.Modules; /// /// Metadata over een geladen module. /// +[ExcludeFromCodeCoverage] public record ModuleInfo( string Name, string Version, diff --git a/src/SlpModularCms.Modules.Availability.Tests/AvailabilityMiddlewareTests.cs b/src/SlpModularCms.Modules.Availability.Tests/AvailabilityMiddlewareTests.cs index 38221e9..1c16609 100644 --- a/src/SlpModularCms.Modules.Availability.Tests/AvailabilityMiddlewareTests.cs +++ b/src/SlpModularCms.Modules.Availability.Tests/AvailabilityMiddlewareTests.cs @@ -1,10 +1,14 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using FluentAssertions; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.IdentityModel.Tokens; using NSubstitute; using SlpModularCms.Core.Availability; using SlpModularCms.Modules.Availability.Middleware; using Xunit; -using FluentAssertions; namespace SlpModularCms.Modules.Availability.Tests; @@ -24,29 +28,23 @@ public class AvailabilityMiddlewareTests [Fact] public async Task InvokeAsync_ShouldAllowRequest_WhenSystemAvailable() { - // Arrange var context = new DefaultHttpContext(); _service.IsAvailableAsync().Returns(AvailabilityStatus.Available); - // Act await _middleware.InvokeAsync(context, _service); - // Assert await _next.Received(1).Invoke(context); } [Fact] public async Task InvokeAsync_ShouldBlockRequest_WhenSystemUnavailable() { - // Arrange var context = new DefaultHttpContext(); context.Response.Body = new MemoryStream(); _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); - // Act await _middleware.InvokeAsync(context, _service); - // Assert await _next.DidNotReceive().Invoke(Arg.Any()); context.Response.StatusCode.Should().Be(StatusCodes.Status503ServiceUnavailable); } @@ -54,15 +52,124 @@ public class AvailabilityMiddlewareTests [Fact] public async Task InvokeAsync_ShouldAllowBypass_ForStatusEndpoint() { - // Arrange var context = new DefaultHttpContext(); - context.Request.Path = "/api/availability/status"; + context.Request.Path = "/api/v1/Availability/status"; _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); - // Act await _middleware.InvokeAsync(context, _service); - // Assert await _next.Received(1).Invoke(context); } + + [Fact] + public async Task InvokeAsync_ShouldAllowBypass_ForAuthEndpoints() + { + var context = new DefaultHttpContext(); + context.Request.Path = "/api/v1/Auth/login"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); + + await _middleware.InvokeAsync(context, _service); + + await _next.Received(1).Invoke(context); + } + + [Fact] + public async Task InvokeAsync_ShouldAllowBypass_ForSetupStatusEndpoint() + { + var context = new DefaultHttpContext(); + context.Request.Path = "/api/v1/Setup/status"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); + + await _middleware.InvokeAsync(context, _service); + + await _next.Received(1).Invoke(context); + } + + [Fact] + public async Task InvokeAsync_ShouldBlockRequest_WhenSystemInMaintenance() + { + var context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); + _service.IsAvailableAsync().Returns(AvailabilityStatus.Maintenance); + + await _middleware.InvokeAsync(context, _service); + + await _next.DidNotReceive().Invoke(Arg.Any()); + context.Response.StatusCode.Should().Be(StatusCodes.Status503ServiceUnavailable); + } + + [Fact] + public async Task InvokeAsync_ShouldAllowAdminBypass_WhenOwnerToken() + { + var context = new DefaultHttpContext(); + context.Request.Headers.Authorization = $"Bearer {CreateJwtWithRole("Owner")}"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.Maintenance); + + await _middleware.InvokeAsync(context, _service); + + await _next.Received(1).Invoke(context); + } + + [Fact] + public async Task InvokeAsync_ShouldAllowAdminBypass_WhenAdministratorToken() + { + var context = new DefaultHttpContext(); + context.Request.Headers.Authorization = $"Bearer {CreateJwtWithRole("Administrator")}"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.Maintenance); + + await _middleware.InvokeAsync(context, _service); + + await _next.Received(1).Invoke(context); + } + + [Fact] + public async Task InvokeAsync_ShouldNotBypass_WhenUserRoleToken() + { + var context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); + context.Request.Headers.Authorization = $"Bearer {CreateJwtWithRole("User")}"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.Maintenance); + + await _middleware.InvokeAsync(context, _service); + + await _next.DidNotReceive().Invoke(Arg.Any()); + context.Response.StatusCode.Should().Be(StatusCodes.Status503ServiceUnavailable); + } + + [Fact] + public async Task InvokeAsync_ShouldNotBypass_WhenNoAuthorizationHeader() + { + var context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); + _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); + + await _middleware.InvokeAsync(context, _service); + + await _next.DidNotReceive().Invoke(Arg.Any()); + } + + [Fact] + public async Task InvokeAsync_ShouldNotBypass_WhenInvalidJwtToken() + { + var context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); + context.Request.Headers.Authorization = "Bearer not-a-valid-jwt"; + _service.IsAvailableAsync().Returns(AvailabilityStatus.NotAvailable); + + await _middleware.InvokeAsync(context, _service); + + await _next.DidNotReceive().Invoke(Arg.Any()); + } + + private static string CreateJwtWithRole(string role) + { + var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("test-signing-key-at-least-32-chars-long!")); + var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + var token = new JwtSecurityToken( + claims: [new Claim(ClaimTypes.Role, role)], + expires: DateTime.UtcNow.AddHours(1), + signingCredentials: creds + ); + return new JwtSecurityTokenHandler().WriteToken(token); + } } diff --git a/src/SlpModularCms.Modules.Availability.Tests/Controllers/AvailabilityControllerTests.cs b/src/SlpModularCms.Modules.Availability.Tests/Controllers/AvailabilityControllerTests.cs new file mode 100644 index 0000000..78016bc --- /dev/null +++ b/src/SlpModularCms.Modules.Availability.Tests/Controllers/AvailabilityControllerTests.cs @@ -0,0 +1,69 @@ +using System.Security.Claims; +using FluentAssertions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using NSubstitute; +using SlpModularCms.Core.Availability; +using SlpModularCms.Modules.Availability.Controllers; +using SlpModularCms.Modules.Availability.Services; + +namespace SlpModularCms.Modules.Availability.Tests.Controllers; + +public class AvailabilityControllerTests +{ + private readonly IAvailabilityService _availabilityService = Substitute.For(); + + private AvailabilityController CreateController(string? callerName = null) + { + var controller = new AvailabilityController(_availabilityService); + var httpContext = new DefaultHttpContext(); + if (callerName is not null) + { + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.Name, callerName)], "TestAuth")); + } + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + return controller; + } + + [Fact] + public async Task GetStatus_ReturnsOk_WithStatusDetails() + { + _availabilityService.GetStatusDetailsAsync() + .Returns(new AvailabilityStatusDetails(AvailabilityStatus.Available, null)); + + var result = await CreateController().GetStatus(); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new + { + Status = "Available", + Message = string.Empty, + }, options => options.ExcludingMissingMembers()); + } + + [Fact] + public async Task GetStatus_ReturnsOk_WithMaintenanceMessageIncluded() + { + _availabilityService.GetStatusDetailsAsync() + .Returns(new AvailabilityStatusDetails(AvailabilityStatus.Maintenance, "Gepland onderhoud")); + + var result = await CreateController().GetStatus(); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new + { + Status = "Maintenance", + Message = "Gepland onderhoud", + }, options => options.ExcludingMissingMembers()); + } + + [Fact] + public async Task UpdateStatus_ReturnsBadRequest_WhenServiceIsNotPersistentAvailabilityService() + { + var result = await CreateController("admin@test.com") + .UpdateStatus(new UpdateStatusRequest(AvailabilityStatus.Maintenance, "Onderhoud")); + + result.Should().BeOfType(); + } +} diff --git a/src/SlpModularCms.Modules.Availability.Tests/PersistentAvailabilityServiceTests.cs b/src/SlpModularCms.Modules.Availability.Tests/PersistentAvailabilityServiceTests.cs index 929c631..b4e8ac9 100644 --- a/src/SlpModularCms.Modules.Availability.Tests/PersistentAvailabilityServiceTests.cs +++ b/src/SlpModularCms.Modules.Availability.Tests/PersistentAvailabilityServiceTests.cs @@ -57,21 +57,45 @@ public class PersistentAvailabilityServiceTests [Fact] public async Task CircuitBreaker_ShouldReturnCachedStatus_AfterDatabaseError() { - // Deze test is lastig met in-memory DB omdat deze zelden 'failt'. - // Maar we kunnen de logica testen door de context te disposen (simulatie van DB error). - - // Arrange await _service.UpdateStatusAsync(AvailabilityStatus.Available, "Reset", "System"); - _context.Dispose(); // Forceer error op volgende DB call + _context.Dispose(); // Force DB error on next call - // Act - var status1 = await _service.IsAvailableAsync(); // Deze zou moeten failen en circuit breaker activeren + var status1 = await _service.IsAvailableAsync(); + + status1.Should().Be(AvailabilityStatus.Available); // Fallback - // Assert - status1.Should().Be(AvailabilityStatus.Available); // Fallback status - - // Act 2: Circuit breaker is nu actief var status2 = await _service.IsAvailableAsync(); - status2.Should().Be(AvailabilityStatus.Available); // Direct uit cache + status2.Should().Be(AvailabilityStatus.Available); // From cache (circuit breaker active) + } + + [Fact] + public async Task GetStatusDetailsAsync_ShouldReturnAvailable_WhenNoStateInDb() + { + var details = await _service.GetStatusDetailsAsync(); + + details.Status.Should().Be(AvailabilityStatus.Available); + details.Message.Should().BeNull(); + } + + [Fact] + public async Task GetStatusDetailsAsync_ShouldReturnCorrectStatusAndMessage() + { + await _service.UpdateStatusAsync(AvailabilityStatus.Maintenance, "Scheduled maintenance", "Admin"); + + var details = await _service.GetStatusDetailsAsync(); + + details.Status.Should().Be(AvailabilityStatus.Maintenance); + details.Message.Should().Be("Scheduled maintenance"); + } + + [Fact] + public async Task GetStatusDetailsAsync_ShouldReturnFallback_WhenDatabaseError() + { + await _service.UpdateStatusAsync(AvailabilityStatus.Available, null, "System"); + _context.Dispose(); // Force DB error + + var details = await _service.GetStatusDetailsAsync(); + + details.Status.Should().Be(AvailabilityStatus.Available); // Fallback } } diff --git a/src/SlpModularCms.Modules.Availability/AvailabilityModule.cs b/src/SlpModularCms.Modules.Availability/AvailabilityModule.cs index 0006b6b..3137a98 100644 --- a/src/SlpModularCms.Modules.Availability/AvailabilityModule.cs +++ b/src/SlpModularCms.Modules.Availability/AvailabilityModule.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using SlpModularCms.Core.Availability; @@ -7,6 +8,7 @@ using SlpModularCms.Modules.Availability.Services; namespace SlpModularCms.Modules.Availability; +[ExcludeFromCodeCoverage] public class AvailabilityModule : IModule { public string Name => "Availability"; diff --git a/src/SlpModularCms.Modules.Availability/Controllers/AvailabilityController.cs b/src/SlpModularCms.Modules.Availability/Controllers/AvailabilityController.cs index 533ca6b..f481bb7 100644 --- a/src/SlpModularCms.Modules.Availability/Controllers/AvailabilityController.cs +++ b/src/SlpModularCms.Modules.Availability/Controllers/AvailabilityController.cs @@ -47,6 +47,7 @@ public class AvailabilityController : ControllerBase } } +[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public record UpdateStatusRequest( AvailabilityStatus NewStatus, string? Reason diff --git a/src/SlpModularCms.Modules.Identity.Tests/Controllers/AuthControllerTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Controllers/AuthControllerTests.cs new file mode 100644 index 0000000..2181e68 --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Controllers/AuthControllerTests.cs @@ -0,0 +1,212 @@ +using System.Security.Claims; +using FluentAssertions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using NSubstitute; +using NSubstitute.ExceptionExtensions; +using SlpModularCms.Core.Identity.Models; +using SlpModularCms.Core.Identity.Services; +using SlpModularCms.Modules.Identity.Controllers; + +namespace SlpModularCms.Modules.Identity.Tests.Controllers; + +public class AuthControllerTests +{ + private readonly IAuthService _authService = Substitute.For(); + private readonly JwtSettings _jwtSettings = new() + { + Secret = "test-secret-key-at-least-32-chars-long!", + Issuer = "test", + Audience = "test", + ExpiryMinutes = 60, + RefreshTokenExpiryDays = 7, + CookieSameSite = "Strict" + }; + + private AuthController CreateController(string? refreshTokenCookie = null, bool isAuthenticated = false, string? userId = null) + { + var options = Options.Create(_jwtSettings); + var controller = new AuthController(_authService, options); + + var httpContext = new DefaultHttpContext(); + + if (refreshTokenCookie is not null) + { + var cookiesMock = Substitute.For(); + cookiesMock["refreshToken"].Returns(refreshTokenCookie); + cookiesMock.TryGetValue("refreshToken", out Arg.Any()).Returns(x => + { + x[1] = refreshTokenCookie; + return true; + }); + // Use a real DefaultHttpContext but override with a simple helper + httpContext.Request.Headers["Cookie"] = $"refreshToken={refreshTokenCookie}"; + } + + if (isAuthenticated && userId is not null) + { + var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId) }; + httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims, "TestAuth")); + } + + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + return controller; + } + + private TokenResponse MakeTokenResponse(string refresh = "refresh-token") => + new(AccessToken: "access", RefreshToken: refresh, ExpiresAt: DateTimeOffset.UtcNow.AddHours(1), + User: new UserResponse(Guid.NewGuid(), "test@test.com", "Test", "User", true)); + + [Fact] + public async Task Login_ReturnsOk_WithTokenResponse() + { + var response = MakeTokenResponse(); + _authService.AuthenticateAsync("test@test.com", "Password1!").Returns(response); + + var controller = CreateController(); + var result = await controller.Login(new LoginRequest("test@test.com", "Password1!")); + + result.Should().BeOfType() + .Which.Value.Should().Be(response); + } + + [Fact] + public async Task Refresh_ReturnsUnauthorized_WhenNoCookie() + { + var controller = CreateController(refreshTokenCookie: null); + + var result = await controller.Refresh(); + + result.Should().BeOfType(); + } + + [Fact] + public async Task Refresh_ReturnsUnauthorized_WhenCookieIsEmpty() + { + var controller = CreateController(refreshTokenCookie: ""); + + var result = await controller.Refresh(); + + result.Should().BeOfType(); + } + + [Fact] + public async Task Refresh_ReturnsOk_WhenCookiePresent() + { + var response = MakeTokenResponse("new-refresh-token"); + _authService.RefreshTokenAsync(Arg.Any()).Returns(response); + + // Manually set cookie via IHeaderDictionary since DefaultHttpContext reads cookies from header + var options = Options.Create(_jwtSettings); + var controller = new AuthController(_authService, options); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers.Append("Cookie", "refreshToken=some-token"); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.Refresh(); + + result.Should().BeOfType() + .Which.Value.Should().Be(response); + } + + [Fact] + public async Task Revoke_ReturnsNoContent_WhenCookiePresent() + { + var options = Options.Create(_jwtSettings); + var controller = new AuthController(_authService, options); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers.Append("Cookie", "refreshToken=some-token"); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.Revoke(); + + await _authService.Received(1).RevokeTokenAsync(Arg.Any()); + result.Should().BeOfType(); + } + + [Fact] + public async Task Revoke_ReturnsNoContent_WhenNoCookie() + { + var controller = CreateController(refreshTokenCookie: null); + + var result = await controller.Revoke(); + + await _authService.DidNotReceive().RevokeTokenAsync(Arg.Any()); + result.Should().BeOfType(); + } + + [Fact] + public async Task ChangePassword_ReturnsUnauthorized_WhenNoUserIdClaim() + { + var controller = CreateController(isAuthenticated: false); + + var result = await controller.ChangePassword(new ChangePasswordRequest("Old1!", "New1!")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task ChangePassword_ReturnsUnauthorized_WhenUserIdClaimIsNotAGuid() + { + var options = Options.Create(_jwtSettings); + var controller = new AuthController(_authService, options); + var httpContext = new DefaultHttpContext(); + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, "not-a-guid")], "TestAuth")); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.ChangePassword(new ChangePasswordRequest("Old1!", "New1!")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task Login_SetsSecureCookie_WhenSameSiteIsNone() + { + // Exercises the SameSiteMode.None branch in GetCookieOptions → Secure = true + var response = MakeTokenResponse(); + _authService.AuthenticateAsync(Arg.Any(), Arg.Any()).Returns(response); + + var settings = new JwtSettings { Secret = _jwtSettings.Secret, Issuer = _jwtSettings.Issuer, Audience = _jwtSettings.Audience, CookieSameSite = "None" }; + var controller = new AuthController(_authService, Options.Create(settings)); + controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; + + var result = await controller.Login(new LoginRequest("test@test.com", "Password1!")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task Login_FallsBackToStrictSameSite_WhenCookieSameSiteIsInvalid() + { + // Exercises the Enum.TryParse failure branch → SameSiteMode.Strict + var response = MakeTokenResponse(); + _authService.AuthenticateAsync(Arg.Any(), Arg.Any()).Returns(response); + + var settings = new JwtSettings { Secret = _jwtSettings.Secret, Issuer = _jwtSettings.Issuer, Audience = _jwtSettings.Audience, CookieSameSite = "Invalid" }; + var controller = new AuthController(_authService, Options.Create(settings)); + controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; + + var result = await controller.Login(new LoginRequest("test@test.com", "Password1!")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task ChangePassword_ReturnsOk_WhenUserIdClaimIsValid() + { + var userId = Guid.NewGuid(); + var options = Options.Create(_jwtSettings); + var controller = new AuthController(_authService, options); + var httpContext = new DefaultHttpContext(); + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, userId.ToString())], "TestAuth")); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.ChangePassword(new ChangePasswordRequest("Old1!", "New1!")); + + await _authService.Received(1).ChangePasswordAsync(userId, "Old1!", "New1!"); + result.Should().BeOfType(); + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/Controllers/InvitationControllerTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Controllers/InvitationControllerTests.cs new file mode 100644 index 0000000..b5aad65 --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Controllers/InvitationControllerTests.cs @@ -0,0 +1,128 @@ +using FluentAssertions; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using NSubstitute; +using SlpModularCms.Core.Data; +using SlpModularCms.Core.Identity.Entities; +using SlpModularCms.Core.Identity.Models; +using SlpModularCms.Core.Identity.Services; +using SlpModularCms.Modules.Identity.Controllers; + +namespace SlpModularCms.Modules.Identity.Tests.Controllers; + +public class InvitationControllerTests : IDisposable +{ + private readonly ApplicationDbContext _context; + private readonly IInvitationService _invitationService = Substitute.For(); + + public InvitationControllerTests() + { + var dbOptions = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _context = new ApplicationDbContext(dbOptions); + } + + public void Dispose() => _context.Dispose(); + + private InvitationController CreateController() => + new(_invitationService, _context); + + [Fact] + public async Task Validate_ReturnsFalse_WhenTokenIsEmpty() + { + var controller = CreateController(); + + var result = await controller.Validate(string.Empty); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { isValid = false, email = (string?)null, name = (string?)null, errorCode = "NOT_FOUND" }); + } + + [Fact] + public async Task Validate_ReturnsFalse_WhenTokenNotFound() + { + var controller = CreateController(); + + var result = await controller.Validate("unknown-token"); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { isValid = false, email = (string?)null, name = (string?)null, errorCode = "NOT_FOUND" }); + } + + [Fact] + public async Task Validate_ReturnsFalse_WhenInvitationIsAlreadyAccepted() + { + var invitation = new Invitation + { + Id = Guid.NewGuid(), + Token = "used-token", + Email = "user@test.com", + Role = "User", + IsAccepted = true, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(1) + }; + _context.Invitations.Add(invitation); + await _context.SaveChangesAsync(); + + var result = await CreateController().Validate("used-token"); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { isValid = false, email = "user@test.com", name = (string?)null, errorCode = "USED" }); + } + + [Fact] + public async Task Validate_ReturnsFalse_WhenInvitationIsExpired() + { + var invitation = new Invitation + { + Id = Guid.NewGuid(), + Token = "expired-token", + Email = "user@test.com", + Role = "User", + IsAccepted = false, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(-1) // in the past + }; + _context.Invitations.Add(invitation); + await _context.SaveChangesAsync(); + + var result = await CreateController().Validate("expired-token"); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { isValid = false, email = "user@test.com", name = (string?)null, errorCode = "EXPIRED" }); + } + + [Fact] + public async Task Validate_ReturnsTrue_WhenInvitationIsValid() + { + var invitation = new Invitation + { + Id = Guid.NewGuid(), + Token = "valid-token", + Email = "user@test.com", + Role = "User", + IsAccepted = false, + ExpiryDate = DateTimeOffset.UtcNow.AddDays(1) + }; + _context.Invitations.Add(invitation); + await _context.SaveChangesAsync(); + + var result = await CreateController().Validate("valid-token"); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { isValid = true, email = "user@test.com", name = (string?)null, errorCode = (string?)null }); + } + + [Fact] + public async Task Complete_ReturnsOk_WithSuccessMessage() + { + var controller = CreateController(); + + var result = await controller.Complete(new CompleteSetupRequest("some-token", "Password1!")); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { message = "Account succesvol ingesteld. Je kunt nu inloggen." }); + await _invitationService.Received(1).CompleteInvitationAsync("some-token", "Password1!"); + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/Controllers/SetupControllerTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Controllers/SetupControllerTests.cs new file mode 100644 index 0000000..5ec4c36 --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Controllers/SetupControllerTests.cs @@ -0,0 +1,49 @@ +using FluentAssertions; +using Microsoft.AspNetCore.Mvc; +using NSubstitute; +using SlpModularCms.Core.Identity.Models; +using SlpModularCms.Core.Identity.Services; +using SlpModularCms.Modules.Identity.Controllers; + +namespace SlpModularCms.Modules.Identity.Tests.Controllers; + +public class SetupControllerTests +{ + private readonly ISetupService _setupService = Substitute.For(); + + [Fact] + public async Task GetStatus_ReturnsOk_WithInitializedTrue_WhenSystemIsSetUp() + { + _setupService.IsSystemInitializedAsync().Returns(true); + var controller = new SetupController(_setupService); + + var result = await controller.GetStatus(); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { Initialized = true }); + } + + [Fact] + public async Task GetStatus_ReturnsOk_WithInitializedFalse_WhenSystemIsNotSetUp() + { + _setupService.IsSystemInitializedAsync().Returns(false); + var controller = new SetupController(_setupService); + + var result = await controller.GetStatus(); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { Initialized = false }); + } + + [Fact] + public async Task CreateOwner_ReturnsOk_WithSuccessMessage() + { + var controller = new SetupController(_setupService); + + var result = await controller.CreateOwner(new CreateOwnerRequest("Owner", "owner@test.com", "Password1!")); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { Message = "Systeem succesvol geïnitialiseerd. De eerste eigenaar is aangemaakt." }); + await _setupService.Received(1).CreateInitialOwnerAsync("Owner", "owner@test.com", "Password1!"); + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/Controllers/UsersControllerTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Controllers/UsersControllerTests.cs new file mode 100644 index 0000000..5736d71 --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Controllers/UsersControllerTests.cs @@ -0,0 +1,311 @@ +using System.Security.Claims; +using FluentAssertions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using NSubstitute; +using SlpModularCms.Core.Data; +using SlpModularCms.Core.Identity.Entities; +using SlpModularCms.Core.Identity.Models; +using SlpModularCms.Core.Identity.Services; +using SlpModularCms.Modules.Identity.Controllers; + +namespace SlpModularCms.Modules.Identity.Tests.Controllers; + +public class UsersControllerTests : IDisposable +{ + private readonly ApplicationDbContext _context; + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + private readonly IInvitationService _invitationService = Substitute.For(); + + public UsersControllerTests() + { + var dbOptions = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _context = new ApplicationDbContext(dbOptions); + + var userStore = new UserStore(_context); + _userManager = new UserManager( + userStore, + Options.Create(new IdentityOptions()), + new PasswordHasher(), + Array.Empty>(), + Array.Empty>(), + new UpperInvariantLookupNormalizer(), + new IdentityErrorDescriber(), + null!, + NullLogger>.Instance); + + var roleStore = new RoleStore(_context); + _roleManager = new RoleManager( + roleStore, + Array.Empty>(), + new UpperInvariantLookupNormalizer(), + new IdentityErrorDescriber(), + NullLogger>.Instance); + } + + public void Dispose() + { + _userManager.Dispose(); + _roleManager.Dispose(); + _context.Dispose(); + } + + private UsersController CreateController(string? callerEmail = null) + { + var controller = new UsersController(_invitationService, _userManager); + var httpContext = new DefaultHttpContext(); + if (callerEmail is not null) + { + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.Name, callerEmail)], "TestAuth")); + } + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + return controller; + } + + private async Task CreateUser(string email, string role = "User", bool isActive = true) + { + if (!await _roleManager.RoleExistsAsync(role)) + await _roleManager.CreateAsync(new ApplicationRole { Name = role }); + + var user = new ApplicationUser + { + Id = Guid.NewGuid(), + Email = email, + UserName = email, + NormalizedEmail = email.ToUpperInvariant(), + NormalizedUserName = email.ToUpperInvariant(), + DisplayName = email, + IsActive = isActive, + CreatedAt = DateTimeOffset.UtcNow + }; + await _userManager.CreateAsync(user, "Password1!"); + await _userManager.AddToRoleAsync(user, role); + return user; + } + + // --- GetUsers --- + + [Fact] + public async Task GetUsers_ReturnsOk_WithUsersList() + { + _invitationService.GetPendingInvitationByEmailAsync(Arg.Any()).Returns((false, null)); + _invitationService.GetAllPendingInvitationsAsync().Returns([]); + + await CreateUser("user@test.com", "User"); + + var result = await CreateController().GetUsers(); + + var ok = result.Should().BeOfType().Subject; + var list = ok.Value.Should().BeAssignableTo>().Subject; + list.Should().HaveCount(1); + list.First().Email.Should().Be("user@test.com"); + } + + [Fact] + public async Task GetUsers_IncludesPendingInvitationsWithoutAccount() + { + _invitationService.GetPendingInvitationByEmailAsync(Arg.Any()).Returns((false, null)); + _invitationService.GetAllPendingInvitationsAsync().Returns([ + new PendingInvitationInfo(Guid.NewGuid(), "pending@test.com", "User", "tok", DateTimeOffset.UtcNow) + ]); + + var result = await CreateController().GetUsers(); + + var ok = result.Should().BeOfType().Subject; + var list = ok.Value.Should().BeAssignableTo>().Subject; + list.Should().Contain(u => u.Email == "pending@test.com" && u.InvitationPending); + } + + // --- UpdateProfile --- + + [Fact] + public async Task UpdateProfile_ReturnsUnauthorized_WhenNoNameIdentifierClaim() + { + var controller = new UsersController(_invitationService, _userManager); + controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; + + var result = await controller.UpdateProfile(new UpdateProfileRequest("Name", "email@test.com")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task UpdateProfile_ReturnsNotFound_WhenUserDoesNotExist() + { + var options = Options.Create(new IdentityOptions()); + var controller = new UsersController(_invitationService, _userManager); + var httpContext = new DefaultHttpContext(); + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, Guid.NewGuid().ToString())], "Test")); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.UpdateProfile(new UpdateProfileRequest("Name", "newemail@test.com")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task UpdateProfile_ReturnsBadRequest_WhenEmailAlreadyInUse() + { + var existingUser = await CreateUser("existing@test.com"); + var targetUser = await CreateUser("target@test.com"); + + var controller = new UsersController(_invitationService, _userManager); + var httpContext = new DefaultHttpContext(); + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, targetUser.Id.ToString())], "Test")); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.UpdateProfile(new UpdateProfileRequest("Name", "existing@test.com")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task UpdateProfile_ReturnsOk_WhenUpdateSucceeds() + { + var user = await CreateUser("user@test.com"); + + var controller = new UsersController(_invitationService, _userManager); + var httpContext = new DefaultHttpContext(); + httpContext.User = new ClaimsPrincipal( + new ClaimsIdentity([new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())], "Test")); + controller.ControllerContext = new ControllerContext { HttpContext = httpContext }; + + var result = await controller.UpdateProfile(new UpdateProfileRequest("New Name", "user@test.com")); + + result.Should().BeOfType() + .Which.Value.Should().BeOfType() + .Which.Name.Should().Be("New Name"); + } + + // --- Invite --- + + [Fact] + public async Task Invite_ReturnsOk_WithInviteLink() + { + _invitationService.CreateInvitationAsync("new@test.com", "User").Returns("test-token"); + + var result = await CreateController().Invite(new InviteUserRequest("new@test.com", "User")); + + var ok = result.Should().BeOfType().Subject; + ok.Value.Should().BeEquivalentTo(new { inviteLink = "/invite/complete?token=test-token" }); + } + + // --- SetUserActive --- + + [Fact] + public async Task SetUserActive_ReturnsNotFound_WhenUserDoesNotExist() + { + var result = await CreateController().SetUserActive(Guid.NewGuid(), new SetUserActiveRequest(false)); + + result.Should().BeOfType(); + } + + [Fact] + public async Task SetUserActive_ReturnsBadRequest_WhenDeactivatingSelf() + { + var user = await CreateUser("self@test.com"); + + var result = await CreateController("self@test.com").SetUserActive(user.Id, new SetUserActiveRequest(false)); + + result.Should().BeOfType(); + } + + [Fact] + public async Task SetUserActive_ReturnsOk_WhenActivatingOtherUser() + { + var user = await CreateUser("other@test.com", "User", false); + + var result = await CreateController("admin@test.com").SetUserActive(user.Id, new SetUserActiveRequest(true)); + + result.Should().BeOfType(); + } + + // --- DeleteUser --- + + [Fact] + public async Task DeleteUser_ReturnsNotFound_WhenNoUserAndNoPendingInvitation() + { + _invitationService.DeleteInvitationByIdAsync(Arg.Any()).Returns(false); + + var result = await CreateController().DeleteUser(Guid.NewGuid()); + + result.Should().BeOfType(); + } + + [Fact] + public async Task DeleteUser_ReturnsNoContent_WhenPendingInvitationIsDeleted() + { + _invitationService.DeleteInvitationByIdAsync(Arg.Any()).Returns(true); + + var result = await CreateController().DeleteUser(Guid.NewGuid()); + + result.Should().BeOfType(); + } + + [Fact] + public async Task DeleteUser_ReturnsBadRequest_WhenDeletingSelf() + { + var user = await CreateUser("self@test.com"); + + var result = await CreateController("self@test.com").DeleteUser(user.Id); + + result.Should().BeOfType(); + } + + [Fact] + public async Task DeleteUser_ReturnsNoContent_WhenDeletingOtherUser() + { + var user = await CreateUser("other@test.com"); + _invitationService.DeletePendingInvitationsByEmailAsync(Arg.Any()).Returns(Task.CompletedTask); + + var result = await CreateController("admin@test.com").DeleteUser(user.Id); + + result.Should().BeOfType(); + } + + // --- ChangeRole --- + + [Fact] + public async Task ChangeRole_ReturnsNotFound_WhenNoUserAndInvitationUpdateFails() + { + _invitationService.UpdateInvitationRoleAsync(Arg.Any(), Arg.Any()).Returns(false); + + var result = await CreateController().ChangeRole(Guid.NewGuid(), new ChangeRoleRequest("User")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task ChangeRole_ReturnsOk_WhenNoUserButInvitationUpdated() + { + _invitationService.UpdateInvitationRoleAsync(Arg.Any(), Arg.Any()).Returns(true); + + // Need a caller identity with a name to check requester role + var result = await CreateController("admin@test.com").ChangeRole(Guid.NewGuid(), new ChangeRoleRequest("User")); + + result.Should().BeOfType(); + } + + [Fact] + public async Task ChangeRole_ReturnsOk_WhenUserRoleUpdated() + { + await _roleManager.CreateAsync(new ApplicationRole { Name = "Owner" }); + await _roleManager.CreateAsync(new ApplicationRole { Name = "Administrator" }); + var user = await CreateUser("user@test.com", "User"); + + var result = await CreateController("owner@test.com").ChangeRole(user.Id, new ChangeRoleRequest("Administrator")); + + result.Should().BeOfType(); + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ApiPrefixConventionTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ApiPrefixConventionTests.cs new file mode 100644 index 0000000..33eb71d --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ApiPrefixConventionTests.cs @@ -0,0 +1,76 @@ +using System.Reflection; +using FluentAssertions; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ApplicationModels; +using SlpModularCms.Api.Infrastructure; + +namespace SlpModularCms.Modules.Identity.Tests.Infrastructure; + +public class ApiPrefixConventionTests +{ + [Fact] + public void Apply_PrependsPrefixToExistingAttributeRoute() + { + var convention = new ApiPrefixConvention("api/v1"); + var application = BuildApplicationModel("[controller]"); + + convention.Apply(application); + + var template = application.Controllers[0].Selectors[0].AttributeRouteModel!.Template; + template.Should().Be("api/v1/[controller]"); + } + + [Fact] + public void Apply_SetsPrefixAsRoute_WhenNoExistingAttributeRoute() + { + var convention = new ApiPrefixConvention("api/v1"); + var application = BuildApplicationModelWithoutRoute(); + + convention.Apply(application); + + var template = application.Controllers[0].Selectors[0].AttributeRouteModel!.Template; + template.Should().Be("api/v1"); + } + + [Fact] + public void Apply_HandlesMulitpleControllers() + { + var convention = new ApiPrefixConvention("api/v1"); + var application = new ApplicationModel(); + application.Controllers.Add(BuildController("[controller]")); + application.Controllers.Add(BuildController("other")); + + convention.Apply(application); + + application.Controllers[0].Selectors[0].AttributeRouteModel!.Template.Should().Be("api/v1/[controller]"); + application.Controllers[1].Selectors[0].AttributeRouteModel!.Template.Should().Be("api/v1/other"); + } + + private static ApplicationModel BuildApplicationModel(string routeTemplate) + { + var app = new ApplicationModel(); + app.Controllers.Add(BuildController(routeTemplate)); + return app; + } + + private static ApplicationModel BuildApplicationModelWithoutRoute() + { + var app = new ApplicationModel(); + var controller = new ControllerModel(typeof(object).GetConstructors()[0].DeclaringType!.GetTypeInfo(), []); + var selector = new SelectorModel { AttributeRouteModel = null }; + controller.Selectors.Add(selector); + app.Controllers.Add(controller); + return app; + } + + private static ControllerModel BuildController(string routeTemplate) + { + var controller = new ControllerModel(typeof(object).GetConstructors()[0].DeclaringType!.GetTypeInfo(), []); + var selector = new SelectorModel + { + AttributeRouteModel = new AttributeRouteModel(new RouteAttribute(routeTemplate)) + }; + controller.Selectors.Add(selector); + return controller; + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ModuleOrchestratorTests.cs b/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ModuleOrchestratorTests.cs new file mode 100644 index 0000000..9da8914 --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/Infrastructure/ModuleOrchestratorTests.cs @@ -0,0 +1,92 @@ +using FluentAssertions; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging.Abstractions; +using NSubstitute; +using SlpModularCms.Api.Infrastructure; +using SlpModularCms.Core.Modules; + +namespace SlpModularCms.Modules.Identity.Tests.Infrastructure; + +public class ModuleOrchestratorTests +{ + private readonly ModuleOrchestrator _orchestrator = + new(NullLogger.Instance); + + [Fact] + public void RegisterModuleServices_CallsRegisterServicesOnDiscoveredModules() + { + var module = Substitute.For(); + var services = new ServiceCollection(); + + InjectModules(_orchestrator, [module]); + _orchestrator.RegisterModuleServices(services); + + module.Received(1).RegisterServices(services); + } + + [Fact] + public void UseModules_CallsUseModuleOnDiscoveredModules() + { + var module = Substitute.For(); + var app = Substitute.For(); + app.ApplicationServices.Returns(new ServiceCollection().BuildServiceProvider()); + + InjectModules(_orchestrator, [module]); + _orchestrator.UseModules(app); + + module.Received(1).UseModule(app); + } + + [Fact] + public void RegisterModuleServices_DoesNotThrow_WhenModuleListIsEmpty() + { + var services = new ServiceCollection(); + var act = () => _orchestrator.RegisterModuleServices(services); + + act.Should().NotThrow(); + } + + [Fact] + public void UseModules_DoesNotThrow_WhenModuleListIsEmpty() + { + var app = Substitute.For(); + app.ApplicationServices.Returns(new ServiceCollection().BuildServiceProvider()); + + var act = () => _orchestrator.UseModules(app); + + act.Should().NotThrow(); + } + + [Fact] + public void DiscoverModules_RunsWithoutThrowing_InTestEnvironment() + { + var act = () => _orchestrator.DiscoverModules(); + act.Should().NotThrow(); + } + + [Fact] + public void RegisterModuleServices_ContinuesOnModuleThatThrows() + { + var badModule = Substitute.For(); + badModule.When(m => m.RegisterServices(Arg.Any())) + .Do(_ => throw new InvalidOperationException("boom")); + var goodModule = Substitute.For(); + var services = new ServiceCollection(); + + InjectModules(_orchestrator, [badModule, goodModule]); + var act = () => _orchestrator.RegisterModuleServices(services); + + act.Should().NotThrow(); + goodModule.Received(1).RegisterServices(services); + } + + // Inject modules via reflection — ModuleOrchestrator stores them in a private List + private static void InjectModules(ModuleOrchestrator orchestrator, IModule[] modules) + { + var field = typeof(ModuleOrchestrator) + .GetField("_modules", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)!; + var list = (List)field.GetValue(orchestrator)!; + list.AddRange(modules); + } +} diff --git a/src/SlpModularCms.Modules.Identity.Tests/SlpModularCms.Modules.Identity.Tests.csproj b/src/SlpModularCms.Modules.Identity.Tests/SlpModularCms.Modules.Identity.Tests.csproj new file mode 100644 index 0000000..af1870b --- /dev/null +++ b/src/SlpModularCms.Modules.Identity.Tests/SlpModularCms.Modules.Identity.Tests.csproj @@ -0,0 +1,36 @@ + + + + net10.0 + enable + enable + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/SlpModularCms.Modules.Identity/IdentityModule.cs b/src/SlpModularCms.Modules.Identity/IdentityModule.cs index 96bc310..a0cddd5 100644 --- a/src/SlpModularCms.Modules.Identity/IdentityModule.cs +++ b/src/SlpModularCms.Modules.Identity/IdentityModule.cs @@ -1,9 +1,11 @@ +using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using SlpModularCms.Core.Modules; namespace SlpModularCms.Modules.Identity; +[ExcludeFromCodeCoverage] public class IdentityModule : IModule { public string Name => "Identity";