using System.Reflection; using ErsatzTV.Application.LibraryBrowse; using ErsatzTV.Controllers.Api; using ErsatzTV.Core.Api.LibraryBrowse; using ErsatzTV.Core.Domain; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Routing; using NSubstitute; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Controllers; [TestFixture] public class LibraryBrowseControllerTests { private LibraryBrowseController _controller = null!; private IMediator _mediator = null!; [SetUp] public void SetUp() { _mediator = Substitute.For(); _controller = new LibraryBrowseController(_mediator); } [Test] public void Controller_Should_Expose_Browse_Route_With_Stable_Operation_Name() { MethodInfo action = typeof(LibraryBrowseController).GetMethod(nameof(LibraryBrowseController.Browse)) ?? throw new AssertionException($"Missing action {nameof(LibraryBrowseController.Browse)}"); var attribute = action.GetCustomAttributes().Single(); attribute.Template.ShouldBe("/api/library/browse"); attribute.Name.ShouldBe("BrowseLibrary"); } [Test] public async Task Browse_Should_Clamp_Paging_And_Send_Query() { _mediator.Send(Arg.Any(), Arg.Any()) .Returns(new PagedLibraryBrowseItemsResponseModel(0, [])); await _controller.Browse( "star", 123, LibraryBrowseMediaType.Movie, -1, 500, 77, CancellationToken.None); await _mediator.Received(1).Send( Arg.Is(q => q.Query == "star" && q.LibraryId == 123 && q.MediaType == LibraryBrowseMediaType.Movie && q.PageNum == 0 && q.PageSize == 100 && q.ParentId == 77), Arg.Any()); } [Test] public async Task Browse_Should_Return_Paged_Response() { var item = new LibraryBrowseItemResponseModel( 10, LibraryBrowseMediaType.Movie, "Movie", 3, "Movies", "/artwork/posters/movie.jpg", TimeSpan.FromMinutes(90), 1, null, CollectionType.Movie, null, null, null, null, 10, null); _mediator.Send(Arg.Any(), Arg.Any()) .Returns(new PagedLibraryBrowseItemsResponseModel(1, [item])); PagedLibraryBrowseItemsResponseModel result = await _controller.Browse( cancellationToken: CancellationToken.None); result.TotalCount.ShouldBe(1); result.Page.ShouldBe([item]); } }