diff --git a/ArmaForces.ArmaServerManager.Tests/Features/Mods/ModsManagerUnitTests.cs b/ArmaForces.ArmaServerManager.Tests/Features/Mods/ModsManagerUnitTests.cs index 49279ea..c240ac4 100644 --- a/ArmaForces.ArmaServerManager.Tests/Features/Mods/ModsManagerUnitTests.cs +++ b/ArmaForces.ArmaServerManager.Tests/Features/Mods/ModsManagerUnitTests.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -88,14 +89,25 @@ public async Task PrepareModset_SomeModsOutdated_UpdatedOutdatedMods() var outdatedMods = modset.Mods .Take(5) + .Select(x => { + x.LastUpdatedAt = DateTime.Now.AddDays(-10); + return x; + }) .ToList(); var upToDateMods = modset.Mods .Except(outdatedMods) + .Select(x => { + x.LastUpdatedAt = DateTime.Now.AddDays(10); + return x; + }) .ToList(); + + modset.Mods = outdatedMods.Concat(upToDateMods).ToHashSet(); - AddModsToModsCache(modset.Mods.ToList()); SetModsAsUpToDate(upToDateMods); + SetupPublishedFileDetails(modset.Mods); SetupContentDownloader(outdatedMods); + AddModsToModsCache(modset.Mods.ToList()); await _modsManager.PrepareModset(modset, cancellationToken); @@ -164,6 +176,24 @@ private void SetModsAsUpToDate(IReadOnlyCollection mods) .Returns(Task.FromResult(Result.Success(contentItem))); } } + + private void SetupPublishedFileDetails(ISet mods) + { + var modsIds = mods.Select(x => (ulong)x.WorkshopId!); + + var details = mods + .Select(x => new PublishedFileDetails + { + Title = x.Name, + PublishedFileId = x.WorkshopId!.Value, + LastUpdatedAt = DateTime.Now + }) + .ToArray(); + + _steamRemoteStorageMock + .Setup(x => x.GetPublishedFileDetails(modsIds, It.IsAny())) + .Returns(Task.FromResult(Result.Success(details))); + } private void AddModsToModsCache(IReadOnlyCollection mods) { @@ -173,6 +203,11 @@ private void AddModsToModsCache(IReadOnlyCollection mods) .Setup(x => x.ModExists(mod)) .Returns(Task.FromResult(true)); } + + var modsInCache = _modsCacheMock.Object.Mods; + _modsCacheMock + .Setup(x => x.Mods) + .Returns(modsInCache.Concat(mods).ToList()); } private Mock CreateModsCacheMock() @@ -182,6 +217,10 @@ private Mock CreateModsCacheMock() mock .Setup(x => x.ModExists(It.IsAny())) .Returns(Task.FromResult(false)); + + mock + .Setup(x => x.Mods) + .Returns(new List()); return mock; } @@ -214,7 +253,7 @@ private Mock CreateSteamRemoteStorageMock() mock .Setup(x => x.GetPublishedFileDetails(It.IsAny>(), It.IsAny())) - .Returns(Task.FromResult(new Result())); + .Returns(Task.FromResult(Result.Success(Array.Empty()))); return mock; } diff --git a/ArmaForces.ArmaServerManager/Features/Mods/ModsManager.cs b/ArmaForces.ArmaServerManager/Features/Mods/ModsManager.cs index 4fcb884..0f99288 100644 --- a/ArmaForces.ArmaServerManager/Features/Mods/ModsManager.cs +++ b/ArmaForces.ArmaServerManager/Features/Mods/ModsManager.cs @@ -77,9 +77,12 @@ public async Task>> CheckModsUpdated(IReadOnlyCollection m { return Result.Success(new List()); } - - var workshopModIds = modsList + + var workshopMods = modsList .Where(x => x.Source == ModSource.SteamWorkshop) + .ToList(); + + var workshopModIds = workshopMods .Select(x => x.WorkshopId) .Where(x => x.HasValue) .Select(x => (ulong)x!.Value) @@ -93,8 +96,11 @@ public async Task>> CheckModsUpdated(IReadOnlyCollection m .Where(x => x.mod.LastUpdatedAt < x.details.LastUpdatedAt) .Select(x => x.mod) .ToList(); + + var modsNotInCache = workshopMods + .Where(x => _modsCache.Mods.NotContains(x)); - return Result.Success(modsToUpdate); + return Result.Success(modsNotInCache.Concat(modsToUpdate).ToList()); } ///