using ErsatzTV.Application.Channels; using ErsatzTV.Core.Domain; using NUnit.Framework; using Shouldly; namespace ErsatzTV.Tests.Application.Channels; [TestFixture] public class AutoTuneAxisMapTests { [Test] public void GenerateQuery_Builds_Expected_Lucene() { AutoTuneAxisMap.GenerateQuery(AutoTuneAxis.TvShow, "The Office") .ShouldBe("type:episode AND show_title:\"The Office\""); AutoTuneAxisMap.GenerateQuery(AutoTuneAxis.TvGenre, "Comedy") .ShouldBe("type:episode AND genre:\"Comedy\""); AutoTuneAxisMap.GenerateQuery(AutoTuneAxis.MovieGenre, "Action") .ShouldBe("type:movie AND genre:\"Action\""); } [Test] public void GenerateQuery_Escapes_Quotes_And_Backslashes() { AutoTuneAxisMap.GenerateQuery(AutoTuneAxis.TvShow, "Bob\"s \\Show") .ShouldBe("type:episode AND show_title:\"Bob\\\"s \\\\Show\""); } [Test] public void GenerateName_Suffixes_Movie_Genres_Only() { AutoTuneAxisMap.GenerateName(AutoTuneAxis.TvShow, "The Office").ShouldBe("The Office"); AutoTuneAxisMap.GenerateName(AutoTuneAxis.TvGenre, "Comedy").ShouldBe("Comedy"); AutoTuneAxisMap.GenerateName(AutoTuneAxis.MovieGenre, "Action").ShouldBe("Action Movies"); } [Test] public void PlaybackOrderFor_Uses_PseudoTV_Defaults() { AutoTuneAxisMap.PlaybackOrderFor(AutoTuneAxis.TvShow).ShouldBe(PlaybackOrder.SeasonEpisode); AutoTuneAxisMap.PlaybackOrderFor(AutoTuneAxis.TvGenre).ShouldBe(PlaybackOrder.Shuffle); AutoTuneAxisMap.PlaybackOrderFor(AutoTuneAxis.MovieGenre).ShouldBe(PlaybackOrder.Shuffle); } // --- #425: per-source weighted distribution query authorship --- [Test] public void GenerateSourceQuery_Uses_ShowTitle_For_Tv_And_Id_For_Movies() { // TV episodes carry no parent-show id in the index; show_title is the only per-show discriminator. AutoTuneAxisMap.GenerateSourceQuery(AutoTuneAxis.TvGenre, "The Office") .ShouldBe("type:episode AND show_title:\"The Office\""); AutoTuneAxisMap.GenerateSourceQuery(AutoTuneAxis.TvShow, "The Office") .ShouldBe("type:episode AND show_title:\"The Office\""); // A movie is the played item, so its own stable media-item id selects it exactly. AutoTuneAxisMap.GenerateSourceQuery(AutoTuneAxis.MovieGenre, "1234") .ShouldBe("type:movie AND id:1234"); } [Test] public void GenerateSourceQuery_Escapes_Tv_Discriminator() { AutoTuneAxisMap.GenerateSourceQuery(AutoTuneAxis.TvGenre, "Bob\"s \\Show") .ShouldBe("type:episode AND show_title:\"Bob\\\"s \\\\Show\""); } [Test] public void GenerateRemainderQuery_Returns_Base_When_Nothing_Subtracted() { AutoTuneAxisMap.GenerateRemainderQuery(AutoTuneAxis.TvGenre, "Comedy", []) .ShouldBe("type:episode AND genre:\"Comedy\""); } [Test] public void GenerateRemainderQuery_Subtracts_Tv_Sources_By_ShowTitle() { AutoTuneAxisMap.GenerateRemainderQuery(AutoTuneAxis.TvGenre, "Comedy", ["The Office", "Parks"]) .ShouldBe( "(type:episode AND genre:\"Comedy\") AND NOT (show_title:\"The Office\" OR show_title:\"Parks\")"); } [Test] public void GenerateRemainderQuery_Subtracts_Movie_Sources_By_Id() { AutoTuneAxisMap.GenerateRemainderQuery(AutoTuneAxis.MovieGenre, "Action", ["12", "34"]) .ShouldBe("(type:movie AND genre:\"Action\") AND NOT (id:12 OR id:34)"); } }