< Summary - MechanicsSoftware — Coverage Report

Information
Class: MechanicsSoftware.Application.UseCases.ServiceOrders.Handlers.AddPartItemHandler
Assembly: MechanicsSoftware.Application
File(s): /home/runner/work/mechanics-software/mechanics-software/src/MechanicsSoftware.Application/UseCases/ServiceOrders/Handlers/AddPartItemHandler.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 54
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
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()100%66100%

File(s)

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

#LineLine coverage
 1using MechanicsSoftware.Application.Abstractions;
 2using MechanicsSoftware.Application.Exceptions;
 3using MechanicsSoftware.Application.UseCases.ServiceOrders.Commands;
 4using MechanicsSoftware.Domain.Entities;
 5using MechanicsSoftware.Domain.Enums;
 6
 7namespace MechanicsSoftware.Application.UseCases.ServiceOrders.Handlers;
 8
 89public sealed class AddPartItemHandler(IAppDbContext db)
 10{
 11    public async Task<AddPartItemResponse> ExecuteAsync(
 12        Guid serviceOrderId, AddPartItemCommand command, CancellationToken cancellationToken = default)
 813    {
 814        var order = await db.ServiceOrders.FindFullAsync(serviceOrderId, cancellationToken);
 15
 616        var part = await db.Parts.FindAsync([command.PartId], cancellationToken)
 617            ?? throw new NotFoundException(nameof(Part), command.PartId);
 18
 19        PartAvailability availability;
 420        string? warning = null;
 21
 422        if (part.AvailableQuantity >= command.Quantity)
 223        {
 224            part.Reserve(command.Quantity, serviceOrderId);
 225            availability = PartAvailability.Available;
 226        }
 27        else
 228        {
 229            availability = PartAvailability.Unavailable;
 230            warning = $"Insufficient stock for part '{part.Name}'. " +
 231                      $"Available: {part.AvailableQuantity}, requested: {command.Quantity}. " +
 232                      $"Part added as UNAVAILABLE and excluded from budget.";
 233        }
 34
 435        var item = order.AddPartItem(
 436            part.Id,
 437            part.Name,
 438            part.UnitPrice,
 439            command.Quantity,
 440            availability);
 41
 442        await db.SaveChangesAsync(cancellationToken);
 43
 444        return new AddPartItemResponse(
 445            item.Id,
 446            item.PartId,
 447            item.PartName,
 448            item.UnitPrice.Cents,
 449            item.Quantity,
 450            availability == PartAvailability.Available ? "AVAILABLE" : "UNAVAILABLE",
 451            item.Total.Cents,
 452            warning);
 453    }
 54}