< Summary

Class:DCLServices.WorldsAPIService.WorldsAPIService
Assembly:WorldsAPIService
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/WorldsAPIService/WorldsAPIService.cs
Covered lines:9
Uncovered lines:45
Coverable lines:54
Total lines:129
Line coverage:16.6% (9 of 54)
Covered branches:0
Total branches:0
Covered methods:3
Total methods:9
Method coverage:33.3% (3 of 9)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldsAPIService(...)0%110100%
Initialize()0%110100%
SearchWorlds()0%12300%
GetWorlds()0%42600%
GetFavorites()0%12300%
GetWorld()0%30500%
GetWorldsByNamesList()0%1321100%
CreateRequest()0%12300%
Dispose()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/WorldsAPIService/WorldsAPIService.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Tasks;
 4using DCLServices.Lambdas;
 5using System;
 6using System.Collections.Generic;
 7using System.Threading;
 8
 9namespace DCLServices.WorldsAPIService
 10{
 11
 12    public interface IWorldsAPIService : IService
 13    {
 14        UniTask<(IReadOnlyList<WorldsResponse.WorldInfo> worlds, int total)> SearchWorlds(string searchText, int pageNum
 15        UniTask<(IReadOnlyList<WorldsResponse.WorldInfo> worlds, int total)> GetWorlds(int pageNumber, int pageSize, str
 16        UniTask<IReadOnlyList<WorldsResponse.WorldInfo>> GetFavorites(int pageNumber, int pageSize, CancellationToken ct
 17        UniTask<WorldsResponse.WorldInfo> GetWorld(string name, CancellationToken ct, bool renewCache = false);
 18        UniTask<List<WorldsResponse.WorldInfo>> GetWorldsByNamesList(IEnumerable<string> namesList, CancellationToken ct
 19    }
 20
 21    public class WorldsAPIService : IWorldsAPIService, ILambdaServiceConsumer<WorldsResponse.WorldsAPIResponse>
 22    {
 23        private IWorldsAPIClient client;
 42524        private readonly CancellationTokenSource disposeCts = new ();
 42525        private readonly Dictionary<string, LambdaResponsePagePointer<WorldsResponse.WorldsAPIResponse>> activeWorldsPag
 42526        private readonly Dictionary<string, WorldsResponse.WorldInfo> worldsByName = new ();
 27
 42528        public WorldsAPIService(IWorldsAPIClient client)
 29        {
 42530            this.client = client;
 42531        }
 42532        public void Initialize() { }
 33
 34        public async UniTask<(IReadOnlyList<WorldsResponse.WorldInfo> worlds, int total)> SearchWorlds(string searchText
 35        {
 036            WorldsResponse.WorldsAPIResponse worldsAPIResponse = await client.SearchWorlds(searchText, pageNumber, pageS
 037            return (worldsAPIResponse.data, worldsAPIResponse.total);
 038        }
 39
 40        public async UniTask<(IReadOnlyList<WorldsResponse.WorldInfo> worlds, int total)> GetWorlds(int pageNumber, int 
 41            bool renewCache = false)
 42        {
 043            var createNewPointer = false;
 44
 045            if (!activeWorldsPagePointers.TryGetValue($"{pageSize}_{filter}_{sort}", out var pagePointer)) { createNewPo
 046            else if (renewCache)
 47            {
 048                pagePointer.Dispose();
 049                activeWorldsPagePointers.Remove($"{pageSize}_{filter}_{sort}");
 050                createNewPointer = true;
 51            }
 52
 053            if (createNewPointer)
 54            {
 055                activeWorldsPagePointers[$"{pageSize}_{filter}_{sort}"] = pagePointer = new LambdaResponsePagePointer<Wo
 56                    $"", // not needed, the consumer will compose the URL
 57                    pageSize, disposeCts.Token, this, TimeSpan.FromSeconds(30));
 58            }
 59
 060            (WorldsResponse.WorldsAPIResponse response, bool _) = await pagePointer.GetPageAsync(pageNumber, ct, new Dic
 61
 062            return (response.data, response.total);
 063        }
 64
 65        public async UniTask<IReadOnlyList<WorldsResponse.WorldInfo>> GetFavorites(int pageNumber, int pageSize, Cancell
 66        {
 067            var favorites = await client.GetFavorites(pageNumber, pageSize, disposeCts.Token);
 068            return favorites;
 069        }
 70
 71        public async UniTask<WorldsResponse.WorldInfo> GetWorld(string name, CancellationToken ct, bool renewCache = fal
 72        {
 073            if (renewCache)
 074                worldsByName.Remove(name);
 075            else if (worldsByName.TryGetValue(name, out var worldInfo))
 076                return worldInfo;
 77
 078            var world = await client.GetWorld(name, ct);
 079            worldsByName[world.world_name] = world;
 080            return world;
 081        }
 82
 83        public async UniTask<List<WorldsResponse.WorldInfo>> GetWorldsByNamesList(IEnumerable<string> namesList, Cancell
 84        {
 085            List<WorldsResponse.WorldInfo> alreadyCachedWorlds = new ();
 086            List<string> namesToRequest = new ();
 87
 088            foreach (string name in namesList)
 89            {
 090                if (renewCache)
 91                {
 092                    worldsByName.Remove(name);
 093                    namesToRequest.Add(name);
 94                }
 95                else
 96                {
 097                    if (worldsByName.TryGetValue(name, out var worldInfo))
 098                        alreadyCachedWorlds.Add(worldInfo);
 99                    else
 0100                        namesToRequest.Add(name);
 101                }
 102            }
 103
 0104            var worlds = new List<WorldsResponse.WorldInfo>();
 0105            if (namesToRequest.Count > 0)
 106            {
 0107                worlds = await client.GetWorldsByNamesList(namesToRequest, ct);
 0108                foreach (var world in worlds)
 0109                    worldsByName[world.world_name] = world;
 110            }
 111
 0112            worlds.AddRange(alreadyCachedWorlds);
 113
 0114            return worlds;
 0115        }
 116
 117        public async UniTask<(WorldsResponse.WorldsAPIResponse response, bool success)> CreateRequest(string endPoint, i
 118        {
 0119            var response = await client.GetWorlds(pageNumber, pageSize,additionalData["filter"],additionalData["sort"], 
 120            // Client will handle most of the error handling and throw if needed
 0121            return (response, true);
 0122        }
 123
 124        public void Dispose()
 125        {
 425126            disposeCts.SafeCancelAndDispose();
 425127        }
 128    }
 129}