public void SeriesMappings_HasMappingsForAllFields()
        {
            var aniDbParser = Substitute.For <IAniDbParser>();

            var expectedMappedFields = new[]
            {
                nameof(Series.PremiereDate),
                nameof(Series.EndDate),
                nameof(Series.Name),
                nameof(Series.Overview),
                nameof(Series.CommunityRating),
                nameof(Series.Studios),
                nameof(Series.Genres),
                nameof(Series.Tags),
                nameof(MetadataResult <Series> .People)
            };

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeriesMappings(1, true, true, TitleType.Localized, "en")
            .Select(m => m.TargetPropertyName)
            .Should()
            .BeEquivalentTo(expectedMappedFields);
        }
        public void SeriesMappings_DontMapEmptyFields()
        {
            var source = new AniDbSeriesData
            {
                StartDate   = null,
                EndDate     = null,
                Description = null,
                Ratings     = new PermanentRatingData[] { }
            };

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

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

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeriesMappings(1, true, true, TitleType.Localized, "en")
            .Where(m => !m.CanApply(source, target))
            .Select(m => m.TargetPropertyName)
            .Should()
            .BeEquivalentTo(nameof(target.Item.PremiereDate), nameof(target.Item.EndDate),
                            nameof(target.Item.Overview),
                            nameof(target.Item.CommunityRating));
        }
        public void SeriesMappings_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"
            });
            aniDbParser.GetPeople(source)
            .Returns(new List <PersonInfo>
            {
                new PersonInfo
                {
                    Name = "Person",
                    Role = "Role"
                }
            });

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

            var aniDbSourceMappingConfiguration =
                new AniDbSourceMappingConfiguration(aniDbParser, _titleSelector);

            aniDbSourceMappingConfiguration.GetSeriesMappings(1, true, true, TitleType.Localized, "en")
            .Select(m => m.CanApply(source, target))
            .All(v => v)
            .Should()
            .BeTrue();

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

            target.Item.Name.Should().Be("SelectedTitle");
            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);

            target.People.Should()
            .BeEquivalentTo(new List <PersonInfo>
            {
                new PersonInfo
                {
                    Name = "Person",
                    Role = "Role"
                }
            });
        }