using System.Reflection; using ErsatzTV.Application.MediaItems; using ErsatzTV.Controllers.Api; using ErsatzTV.Core.Api.MediaItems; using MediatR; using Microsoft.AspNetCore.Mvc.Routing; using NSubstitute; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Controllers; [TestFixture] public class LanguagesControllerTests { private LanguagesController _controller = null!; private IMediator _mediator = null!; [SetUp] public void SetUp() { _mediator = Substitute.For(); _controller = new LanguagesController(_mediator); } [Test] public void Controller_Should_Expose_Idiomatic_Rest_Route() { MethodInfo action = typeof(LanguagesController).GetMethod(nameof(LanguagesController.GetLanguages))!; HttpMethodAttribute attribute = action.GetCustomAttributes(inherit: true).Single(); attribute.HttpMethods.ShouldContain("GET"); attribute.Template.ShouldBe("/api/v1/languages"); } [Test] public async Task GetLanguages_Should_Map_Vm_To_ResponseModel() { List vms = [ new LanguageCodeViewModel("eng", "English"), new LanguageCodeViewModel("fra", "French") ]; _mediator.Send(Arg.Any(), Arg.Any()) .Returns(vms); List result = await _controller.GetLanguages(CancellationToken.None); result.ShouldBe( [ new LanguageCodeResponseModel("eng", "English"), new LanguageCodeResponseModel("fra", "French") ]); } }