using System.Reflection; using ErsatzTV.Application.Libraries; using ErsatzTV.Controllers.Api; using ErsatzTV.Core.Api.Libraries; using ErsatzTV.Core.Interfaces.Repositories; using MediatR; using Microsoft.AspNetCore.Mvc.Routing; using NSubstitute; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Controllers; [TestFixture] public class LibrariesControllerTests { private LibrariesController _controller = null!; private IMediator _mediator = null!; [SetUp] public void SetUp() { _mediator = Substitute.For(); _controller = new LibrariesController(Substitute.For(), _mediator); } [Test] public void ScanStatus_Should_Expose_Idiomatic_Rest_Route() { MethodInfo action = typeof(LibrariesController).GetMethod(nameof(LibrariesController.GetScanStatus)) ?? throw new AssertionException("Missing action GetScanStatus"); HttpMethodAttribute attribute = action.GetCustomAttributes(inherit: true).Single(); attribute.HttpMethods.ShouldContain("GET"); attribute.Template.ShouldBe("/api/libraries/scan-status"); attribute.Name.ShouldBe("GetLibraryScanStatus"); } [Test] public async Task GetScanStatus_Should_Return_Results_From_Mediator() { var expected = new List { new(1, 42.5m), new(2, 99m) }; _mediator.Send(Arg.Any(), Arg.Any()) .Returns(expected); List result = await _controller.GetScanStatus(CancellationToken.None); result.ShouldBe(expected); } }