< Summary - MechanicsSoftware — Coverage Report

Information
Class: MechanicsSoftware.Application.UseCases.ServiceOrders.Handlers.CompleteServiceOrderHandler
Assembly: MechanicsSoftware.Application
File(s): /home/runner/work/mechanics-software/mechanics-software/src/MechanicsSoftware.Application/UseCases/ServiceOrders/Handlers/CompleteServiceOrderHandler.cs
Line coverage
100%
Covered lines: 16
Uncovered lines: 0
Coverable lines: 16
Total lines: 35
Line coverage: 100%
Branch coverage
75%
Covered branches: 3
Total branches: 4
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%11100%
ExecuteAsync()75%44100%

File(s)

/home/runner/work/mechanics-software/mechanics-software/src/MechanicsSoftware.Application/UseCases/ServiceOrders/Handlers/CompleteServiceOrderHandler.cs

#LineLine coverage
 1using MechanicsSoftware.Application.Abstractions;
 2using MechanicsSoftware.Application.Exceptions;
 3using MechanicsSoftware.Domain.Entities;
 4using MechanicsSoftware.Domain.Enums;
 5using Microsoft.Extensions.Logging;
 6
 7namespace MechanicsSoftware.Application.UseCases.ServiceOrders.Handlers;
 8
 89public sealed class CompleteServiceOrderHandler(IAppDbContext db, IEmailNotifier emailNotifier, ILogger<CompleteServiceO
 10{
 11    public async Task<ServiceOrderResponse> ExecuteAsync(
 12        Guid serviceOrderId, CancellationToken cancellationToken = default)
 813    {
 814        var order = await db.ServiceOrders.FindFullAsync(serviceOrderId, cancellationToken);
 15
 616        order.Complete();
 17
 418        var availablePartItems = order.PartItems
 419            .Where(p => p.Availability == PartAvailability.Available);
 20
 1621        foreach (var partItem in availablePartItems)
 222        {
 223            var part = await db.Parts.FindAsync([partItem.PartId], cancellationToken)
 224                ?? throw new NotFoundException(nameof(Part), partItem.PartId);
 25
 226            part.ConfirmUsage(partItem.Quantity, serviceOrderId);
 227        }
 28
 429        await db.SaveChangesAsync(cancellationToken);
 30
 431        await emailNotifier.TrySendStatusEmailAsync(db, logger, order, cancellationToken);
 32
 433        return ServiceOrderResponse.From(order);
 434    }
 35}