Refactor ShowAudience handling across the application to align with MPAA rating system. Update ShowAudience enum to reflect new ratings (G, PG, PG-13, R, NC-17) and adjust related data models, API types, and frontend components to support nullable audience values. Enhance metadata handling to incorporate content ratings from external sources, ensuring proper audience filtering in scheduling logic. Update documentation to clarify changes in audience categorization and its implications for content management.
ci / build-backend (push) Successful in 1m28s
ci / build-frontend (push) Successful in 51s
ci / tests (push) Successful in 2m7s
ci / sonar (push) Successful in 4m31s

This commit is contained in:
Leonid Pershin
2026-07-26 22:18:14 +03:00
parent c4c93cff02
commit fdb0f321e4
34 changed files with 1868 additions and 116 deletions
@@ -0,0 +1,71 @@
using TeleWave.Application.Metadata;
using TeleWave.Domain.Library;
using Xunit;
namespace TeleWave.Application.Tests.Metadata;
public class ContentRatingTests
{
[Theory]
[InlineData("G", ShowAudience.G)]
[InlineData("PG", ShowAudience.Pg)]
[InlineData("PG-13", ShowAudience.Pg13)]
[InlineData("R", ShowAudience.R)]
[InlineData("NC-17", ShowAudience.Nc17)]
public void Parse_Mpaa(string value, ShowAudience expected) =>
Assert.Equal(expected, ContentRating.Parse(value));
[Theory]
[InlineData("TV-Y", ShowAudience.G)]
[InlineData("TV-Y7", ShowAudience.G)]
[InlineData("TV-G", ShowAudience.G)]
[InlineData("TV-PG", ShowAudience.Pg)]
[InlineData("TV-14", ShowAudience.Pg13)]
[InlineData("TV-MA", ShowAudience.R)]
public void Parse_TvGuidelines_MapsToNearest(string value, ShowAudience expected) =>
Assert.Equal(expected, ContentRating.Parse(value));
[Theory]
[InlineData("0+", ShowAudience.G)]
[InlineData("6+", ShowAudience.G)]
[InlineData("12+", ShowAudience.Pg)]
[InlineData("16+", ShowAudience.Pg13)]
[InlineData("18+", ShowAudience.R)]
public void Parse_RussianMarking_MapsApproximately(string value, ShowAudience expected) =>
Assert.Equal(expected, ContentRating.Parse(value));
[Theory]
[InlineData("M", ShowAudience.Pg)]
[InlineData("GP", ShowAudience.Pg)]
[InlineData("X", ShowAudience.Nc17)]
public void Parse_HistoricalCodes(string value, ShowAudience expected) =>
Assert.Equal(expected, ContentRating.Parse(value));
[Theory]
[InlineData("pg-13", ShowAudience.Pg13)]
[InlineData(" R ", ShowAudience.R)]
public void Parse_IgnoresCaseAndPadding(string value, ShowAudience expected) =>
Assert.Equal(expected, ContentRating.Parse(value));
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
[InlineData("N/A")]
[InlineData("Not Rated")]
[InlineData("Unrated")]
[InlineData("Approved")]
[InlineData("Passed")]
// Голые числа — это немецкая FSK и французская шкала, которых мы не поддерживаем: «16» там
// означает не то же, что российское «16+», и принимать их за него нельзя.
[InlineData("16")]
[InlineData("12")]
[InlineData("какая-то ерунда")]
public void Parse_UnknownOrAbsent_IsNull(string? value)
{
// Незнакомое значение не должно превращаться в догадку: по нему шоу попало бы в детский эфир
// непроверенным. Отдельно проверяем «Approved»/«Passed» — исторические пометки IMDb,
// означающие «цензуру прошёл», а не «подходит детям».
Assert.Null(ContentRating.Parse(value));
}
}