From 40c10402a8713f0656c7de02b057a0a96f16afc6 Mon Sep 17 00:00:00 2001
From: Petar Hristov <hristov@itc.rwth-aachen.de>
Date: Fri, 30 May 2025 13:35:10 +0000
Subject: [PATCH] Refactor: Integrate ProjectCacheService into Resource and
 User Reporting tests, replacing direct API calls with cached project
 retrieval

---
 .../ResourceReportingTests.cs                 | 41 +++++++------------
 src/KpiGenerator.Tests/UserReportingTests.cs  | 24 +++--------
 .../Reportings/Project/ProjectReporting.cs    |  6 +--
 3 files changed, 20 insertions(+), 51 deletions(-)

diff --git a/src/KpiGenerator.Tests/ResourceReportingTests.cs b/src/KpiGenerator.Tests/ResourceReportingTests.cs
index ebd6030..652e4c9 100644
--- a/src/KpiGenerator.Tests/ResourceReportingTests.cs
+++ b/src/KpiGenerator.Tests/ResourceReportingTests.cs
@@ -26,7 +26,7 @@ public class ResourceReportingTests
     private IOptionsMonitor<ReportingConfiguration> _reportingConfiguration = null!;
 
     private IAdminApi _adminApi = null!;
-
+    private IProjectCacheService _projectCacheService = null!;
     private ResourceReporting _resourceReporting = null!; // System Under Test
 
     [SetUp]
@@ -68,8 +68,9 @@ public class ResourceReportingTests
         };
         _reportingConfiguration = Substitute.For<IOptionsMonitor<ReportingConfiguration>>();
         _reportingConfiguration.CurrentValue.Returns(reportingConfig);
-        
+
         _adminApi = Substitute.For<IAdminApi>();
+        _projectCacheService = Substitute.For<IProjectCacheService>();
     }
 
     #region GenerateReportingAsync Tests
@@ -81,18 +82,9 @@ public class ResourceReportingTests
         var projects = TestData.ProjectAdminDtos;
         var resources = TestData.ResourceAdminDtos;
 
-        _adminApi
-            .GetAllProjectsAsync(
-                includeDeleted: Arg.Any<bool>(),
-                pageNumber: Arg.Any<int>(),
-                pageSize: Arg.Any<int>()
-            )
-            .Returns(ci =>
-            {
-                // Return the test projects data, single page
-                var pagination = new Pagination(currentPage: 1, pageSize: 2, totalCount: 2, totalPages: 1);
-                return Task.FromResult(new ProjectAdminDtoPagedResponse(data: projects, pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
-            });            
+        _projectCacheService
+            .GetAllProjectsAsync()
+            .Returns(ci => Task.FromResult(projects));
         _adminApi
             .GetAllResourcesAsync(
                 includeDeleted: Arg.Any<bool>(),
@@ -106,7 +98,7 @@ public class ResourceReportingTests
                 var pagination = new Pagination(currentPage: 1, pageSize: 2, totalCount: 2, totalPages: 1);
                 return Task.FromResult(new ResourceAdminDtoPagedResponse(data: resources, pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
             });
-        _resourceReporting = new ResourceReporting(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = new ResourceReporting(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
 
         // Act
         var result = await _resourceReporting.GenerateReportingAsync();
@@ -130,14 +122,9 @@ public class ResourceReportingTests
     public async Task GenerateReportingAsync_ReturnsOnlyGeneralFile_WhenNoProjects()
     {
         // Arrange
-        _adminApi
+        _projectCacheService
             .GetAllProjectsAsync()
-            .Returns(ci =>
-            {
-                // No projects, empty data
-                var pagination = new Pagination(currentPage: 1, pageSize: 0, totalCount: 0, totalPages: 1);
-                return Task.FromResult(new ProjectAdminDtoPagedResponse(data: [], pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
-            });
+            .Returns(ci => Task.FromResult(new List<ProjectAdminDto>()));
         _adminApi
             .GetAllResourcesAsync()
             .Returns(ci =>
@@ -146,7 +133,7 @@ public class ResourceReportingTests
                 var pagination = new Pagination(currentPage: 1, pageSize: 0, totalCount: 0, totalPages: 1);
                 return Task.FromResult(new ResourceAdminDtoPagedResponse(data: [], pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
             });
-        _resourceReporting = new ResourceReporting(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = new ResourceReporting(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
 
         // Act
         var result = await _resourceReporting.GenerateReportingAsync();
@@ -173,7 +160,7 @@ public class ResourceReportingTests
             };
 
         // We want to ensure that GenerateReportingAsync returns some test objects
-        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
         _resourceReporting
             .Configure()
             .GenerateReportingAsync()
@@ -213,7 +200,7 @@ public class ResourceReportingTests
             };
 
         // Partial mock to override GenerateReportingAsync
-        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
         _resourceReporting
             .Configure()
             .GenerateReportingAsync()
@@ -253,7 +240,7 @@ public class ResourceReportingTests
             };
 
         // Partial mock to override GenerateReportingAsync
-        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
         _resourceReporting
             .Configure()
             .GenerateReportingAsync()
@@ -290,7 +277,7 @@ public class ResourceReportingTests
             };
 
         // Partial mock
-        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi);
+        _resourceReporting = Substitute.ForPartsOf<ResourceReporting>(_mapper, _logger, _gitlabStorageService, _localStorageService, _kpiConfiguration, _reportingConfiguration, _adminApi, _projectCacheService);
         _resourceReporting
             .Configure()
             .GenerateReportingAsync()
diff --git a/src/KpiGenerator.Tests/UserReportingTests.cs b/src/KpiGenerator.Tests/UserReportingTests.cs
index ec78546..e17434c 100644
--- a/src/KpiGenerator.Tests/UserReportingTests.cs
+++ b/src/KpiGenerator.Tests/UserReportingTests.cs
@@ -85,18 +85,9 @@ public class UserReportingTests
         var users = TestData.UserDtos;
         var roles = TestData.RoleDtos;
 
-        _adminApi
-            .GetAllProjectsAsync(
-                includeDeleted: Arg.Any<bool>(),
-                pageNumber: Arg.Any<int>(),
-                pageSize: Arg.Any<int>()
-            )
-            .Returns(ci =>
-            {
-                // Return the test projects data, single page
-                var pagination = new Pagination(currentPage: 1, pageSize: 2, totalCount: 2, totalPages: 1);
-                return Task.FromResult(new ProjectAdminDtoPagedResponse(data: projects, pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
-            });
+        _projectCacheService
+            .GetAllProjectsAsync()
+            .Returns(ci => Task.FromResult(projects));
         _adminApi
             .GetAllUsersAsync(
                 tosAccepted: Arg.Any<bool>(),
@@ -144,14 +135,9 @@ public class UserReportingTests
     public async Task GenerateReportingAsync_ReturnsOnlyGeneralFile_WhenNoProjects()
     {
         // Arrange
-        _adminApi
+        _projectCacheService
             .GetAllProjectsAsync()
-            .Returns(ci =>
-            {
-                // No projects, empty data
-                var pagination = new Pagination(currentPage: 1, pageSize: 0, totalCount: 0, totalPages: 1);
-                return Task.FromResult(new ProjectAdminDtoPagedResponse(data: [], pagination: pagination, statusCode: 200, traceId: "dummy-trace-id"));
-            });
+            .Returns(ci => Task.FromResult(new List<ProjectAdminDto>()));
         _adminApi
             .GetAllUsersAsync()
             .Returns(ci =>
diff --git a/src/KpiGenerator/Reportings/Project/ProjectReporting.cs b/src/KpiGenerator/Reportings/Project/ProjectReporting.cs
index 876926b..08787f7 100644
--- a/src/KpiGenerator/Reportings/Project/ProjectReporting.cs
+++ b/src/KpiGenerator/Reportings/Project/ProjectReporting.cs
@@ -86,11 +86,7 @@ public class ProjectReporting
         _logger.LogDebug("Working on projects asynchronously...");
         var projects = await _projectCacheService.GetAllProjectsAsync();
         _logger.LogInformation("Found {count} projects.", projects.Count);
-        if (projects.Count == 0)
-        {
-            _logger.LogWarning("No projects found. Exiting project reporting generation.");
-            return [];
-        }
+        
         // Filter out projects that are deleted
         projects = [.. projects.Where(p => !p.Deleted)];
         _logger.LogInformation("Filtered out deleted projects. Remaining projects: {count}", projects.Count);
-- 
GitLab