public void SeasonMappings_MapsAllFields()
        {
            var source = new AniDbSeriesData
            {
                StartDate   = new DateTime(2017, 1, 2, 3, 4, 5),
                EndDate     = new DateTime(2017, 5, 4, 3, 2, 1),
                Description = "Description",
                Ratings     = new[]
                {
                    new PermanentRatingData
                    {
                        Value = 45
                    }
                }
            };

            var aniDbParser = Substitute.For <IAniDbParser>();

            aniDbParser.FormatDescription("Description").Returns("FormattedDescription");
            aniDbParser.GetGenres(source, 1, true).Returns(new List <string> {
                "Genre"
            });
            aniDbParser.GetTags(source, 1, true).Returns(new List <string> {
                "Tags"
            });
            aniDbParser.GetStudios(source).Returns(new List <string> {
                "Studio"
            });

            var target = new MetadataResult <Season>
            {
                Item = new Season()
            };

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeasonMappings(1, true, TitleType.Localized, "en")
            .Select(m => m.CanApply(source, target))
            .Count(v => v)
            .Should()
            .Be(7);

            aniDbSourceMappingConfiguration.GetSeasonMappings(1, true, TitleType.Localized, "en")
            .Iter(m => m.Apply(source, target));

            target.Item.PremiereDate.Should().Be(new DateTime(2017, 1, 2, 3, 4, 5));
            target.Item.EndDate.Should().Be(new DateTime(2017, 5, 4, 3, 2, 1));
            target.Item.Overview.Should().Be("FormattedDescription");
            target.Item.Genres.Should().BeEquivalentTo("Genre");
            target.Item.Studios.Should().BeEquivalentTo("Studio");
            target.Item.Tags.Should().BeEquivalentTo("Tags");
            target.Item.CommunityRating.Should().Be(45);
        }
        public void SeasonMappings_DontMapEmptyFields()
        {
            var source = new AniDbSeriesData
            {
                StartDate   = null,
                EndDate     = null,
                Description = "",
                Ratings     = new PermanentRatingData[] { }
            };

            var aniDbParser = Substitute.For <IAniDbParser>();

            var target = new MetadataResult <Season>
            {
                Item = new Season()
            };

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeasonMappings(1, true, TitleType.Localized, "en")
            .Where(m => !m.CanApply(source, target))
            .Select(m => m.TargetPropertyName)
            .Should()
            .BeEquivalentTo(
                nameof(target.Item.Name),
                nameof(target.Item.PremiereDate),
                nameof(target.Item.EndDate),
                nameof(target.Item.Overview),
                nameof(target.Item.CommunityRating));
        }
        public void SeasonMappings_HasMappingsForAllFields()
        {
            var aniDbParser = Substitute.For <IAniDbParser>();

            var expectedMappedFields = new[]
            {
                nameof(Season.Name),
                nameof(Season.PremiereDate),
                nameof(Season.EndDate),
                nameof(Season.Overview),
                nameof(Season.CommunityRating),
                nameof(Season.Studios),
                nameof(Season.Genres),
                nameof(Season.Tags)
            };

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeasonMappings(1, true, TitleType.Localized, "en")
            .Select(m => m.TargetPropertyName)
            .Should()
            .BeEquivalentTo(expectedMappedFields);
        }