< Summary - pva.SuperV

Information
Class: pva.SuperV.Api.Services.Instances.InstanceService
Assembly: pva.SuperV.Api
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Instances/InstanceService.cs
Tag: dotnet-ubuntu_18869653307
Line coverage
84%
Covered lines: 67
Uncovered lines: 12
Coverable lines: 79
Total lines: 114
Line coverage: 84.8%
Branch coverage
75%
Covered branches: 18
Total branches: 24
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%1175%
GetInstancesAsync()50%2283.33%
SearchInstancesAsync()100%11100%
FilterInstances(...)100%44100%
FilterInstanceClass(...)100%88100%
GetInstanceAsync()75%4488.88%
CreateInstanceAsync()50%2287.5%
DeleteInstanceAsync()0%620%

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Instances/InstanceService.cs

#LineLine coverage
 1using pva.SuperV.Api.Exceptions;
 2using pva.SuperV.Engine;
 3using pva.SuperV.Engine.Exceptions;
 4using pva.SuperV.Model;
 5using pva.SuperV.Model.Instances;
 6using pva.SuperV.Model.Services;
 7
 8namespace pva.SuperV.Api.Services.Instances
 9{
 10    public class InstanceService : BaseService, IInstanceService
 11    {
 1312        private readonly Dictionary<string, Comparison<InstanceModel>> sortOptions = new()
 1313            {
 014                { "name", new Comparison<InstanceModel>((a, b) => a.Name.CompareTo(b.Name)) }
 1315            };
 16
 17        public async Task<List<InstanceModel>> GetInstancesAsync(string projectId)
 918        {
 919            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 920            {
 921                return await Task.FromResult(runnableProject.Instances.Values.Select(InstanceMapper.ToDto).ToList());
 22            }
 023            return await Task.FromException<List<InstanceModel>>(new NonRunnableProjectException(projectId));
 924        }
 25
 26        public async Task<PagedSearchResult<InstanceModel>> SearchInstancesAsync(string projectId, InstancePagedSearchRe
 827        {
 828            List<InstanceModel> allInstances = await GetInstancesAsync(projectId);
 829            List<InstanceModel> projects = FilterInstances(projectId, allInstances, search);
 830            projects = SortResult(projects, search.SortOption, sortOptions);
 731            return CreateResult(search, allInstances, projects);
 32
 733        }
 34
 35        private static List<InstanceModel> FilterInstances(string projectId, List<InstanceModel> allInstances, InstanceP
 836        {
 837            List<InstanceModel> filteredInstances = allInstances;
 838            if (!String.IsNullOrEmpty(search.ClassName))
 139            {
 140                Dictionary<string, bool> classNameMatches = [];
 441                filteredInstances = [.. filteredInstances.Where(instance => FilterInstanceClass(projectId, search.ClassN
 142            }
 843            if (!String.IsNullOrEmpty(search.NameFilter))
 144            {
 245                filteredInstances = [.. filteredInstances.Where(instance => instance.Name.Contains(search.NameFilter))];
 146            }
 847            return filteredInstances;
 848        }
 49
 50        private static bool FilterInstanceClass(string projectId, string searchedClassName, InstanceModel instance, ref 
 351        {
 352            if (classNameMatches.TryGetValue(instance.ClassName, out bool isClassNameMatching))
 153            {
 154                return isClassNameMatching;
 55            }
 256            Class? clazz = GetClassEntity(projectId, instance.ClassName);
 257            List<string> classInheritance = [];
 458            while (clazz != null)
 359            {
 360                isClassNameMatching = clazz.Name.Equals(searchedClassName);
 361                classInheritance.Add(clazz.Name);
 362                if (isClassNameMatching)
 163                {
 164                    break;
 65                }
 266                clazz = clazz.BaseClass;
 267            }
 1268            foreach (string className in classInheritance)
 369            {
 370                classNameMatches[className] = isClassNameMatching;
 371            }
 272            return isClassNameMatching;
 373        }
 74
 75        public async Task<InstanceModel> GetInstanceAsync(string projectId, string instanceName)
 276        {
 277            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 278            {
 279                if (runnableProject.Instances.TryGetValue(instanceName, out Instance? instance))
 180                {
 181                    return await Task.FromResult(InstanceMapper.ToDto(instance));
 82                }
 183                return await Task.FromException<InstanceModel>(new UnknownEntityException("Instance", instanceName));
 84            }
 085            return await Task.FromException<InstanceModel>(new NonRunnableProjectException(projectId));
 186        }
 87
 88        public async Task<InstanceModel> CreateInstanceAsync(string projectId, InstanceModel createRequest, bool addToRu
 489        {
 490            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 491            {
 492                Instance? createdInstance = runnableProject.CreateInstance(createRequest.ClassName, createRequest.Name, 
 493                createRequest.Fields.ForEach(fieldModel =>
 294                {
 295                    IField? field = createdInstance!.GetField(fieldModel.Name) ?? throw new UnknownEntityException("Fiel
 296                    FieldValueMapper.SetFieldValue(field, fieldModel.FieldValue);
 697                });
 498                return await Task.FromResult(InstanceMapper.ToDto(createdInstance!));
 99            }
 0100            return await Task.FromException<InstanceModel>(new NonRunnableProjectException(projectId));
 4101        }
 102
 103        public async ValueTask DeleteInstanceAsync(string projectId, string instanceName)
 0104        {
 0105            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 0106            {
 0107                runnableProject.RemoveInstance(instanceName);
 0108                await ValueTask.CompletedTask;
 0109                return;
 110            }
 0111            await ValueTask.FromException(new NonRunnableProjectException(projectId));
 0112        }
 113    }
 114}