public async Task HandleAsync_GivenNoMatchingAnime_ShouldReturnEmptyResults()
        {
            // Given
            var query = new SearchAnimeQuery {
                Title = "Gundam"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(1).WithTitle("Naruto").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(2).WithTitle("Bleach").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(3).WithTitle("One Piece").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().BeEmpty();
        }
        public async Task HandleAsync_GivenMultipleMatchingTitleAnime_ShouldReturnMultipleResult()
        {
            // Given
            var query = new SearchAnimeQuery {
                Title = "Gundam"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(1).WithTitle("Gundam ZZ").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(2).WithTitle("Zeta Gundam").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(3).WithTitle("Turn A Gundam").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().HaveSameCount(animes);
        }
        public async Task HandleAsync_GivenSingleMatchingTitleAnime_ShouldReturnMappedEntity()
        {
            // Given
            const int    expectedMalId    = 2;
            const string expectedTitle    = "Zeta Gundam";
            const string expectedImageUrl = "https://some.url";

            var query = new SearchAnimeQuery {
                Title = "Gundam"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(1).WithTitle("Naruto").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(expectedMalId).WithTitle(expectedTitle).WithImageUrl(expectedImageUrl).Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(3).WithTitle("One Piece").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            using (new AssertionScope())
            {
                result.Results.First().MalId.Should().Be(expectedMalId);
                result.Results.First().Title.Should().Be(expectedTitle);
                result.Results.First().ImageUrl.Should().Be(expectedImageUrl);
            }
        }
        public async Task HandleAsync_GivenMatchingJapaneseAnime_ShouldReturnMultipleResult()
        {
            // Given
            var query = new SearchAnimeQuery {
                Title = "ひぐらしのな"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(1).WithTitle("Naruto").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(2).WithTitle("Higurashi no Naku Koro ni")
                .WithJapaneseTitle("When They Cry").WithJapaneseTitle("ひぐらしのなく頃に").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(3).WithTitle("One Piece").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().ContainSingle().Which.MalId.Should().Be(2);
        }
        public async Task HandleAsync_GivenMatchingSynonymsAnime_ShouldReturnMultipleResult()
        {
            // Given
            var query = new SearchAnimeQuery {
                Title = "Ghost"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(1).WithTitle("Naruto").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(2).WithTitle("Bakemonogatari").WithTitleSynonyms("Ghostory").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithMalId(3).WithTitle("One Piece").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().ContainSingle().Which.MalId.Should().Be(2);
        }
        public async Task HandleAsync_GivenOver10MatchingTitleAnime_ShouldReturnTenMostPopular()
        {
            // Given
            var query = new SearchAnimeQuery {
                Title = "Gundam"
            };
            var dbContext = InMemoryDbProvider.GetDbContext();

            var animes = new List <Anime>
            {
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(1).WithMalId(1).WithTitle("Gundam ZZ").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(2).WithMalId(2).WithTitle("Zeta Gundam").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(3).WithMalId(3).WithTitle("Turn A Gundam").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(4).WithMalId(4).WithTitle("Gundam Seed").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(5).WithMalId(5).WithTitle("Gundam Seed Destiny").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(6).WithMalId(6).WithTitle("Gundam 00").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(7).WithMalId(7).WithTitle("Gundam G no Reconguista").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(8).WithMalId(8).WithTitle("Gundam Wind").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(9).WithMalId(9).WithTitle("Mobile Fighter G Gundam").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(10).WithMalId(10).WithTitle("Victory Gundam").Build(),
                new AnimeBuilder().WithId(Guid.NewGuid()).WithPopularity(11).WithMalId(11).WithTitle("Gundam 0079").Build(),
            };
            await dbContext.AddRangeAsync(animes);

            await dbContext.SaveChangesAsync();

            var handler = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().NotContain(x => x.MalId == 1);
        }
Exemplo n.º 7
0
        public async Task HandleAsync_GivenRepositoryReturnCollection_ShouldReturnResponse()
        {
            // Given
            var query          = new SearchAnimeQuery();
            var mockRepository = new Mock <IAnimeRepository>();

            mockRepository.Setup(x => x.GetOrderedPageByPopularityAsync(It.IsAny <Expression <Func <Anime, bool> > >(), 0, 10))
            .ReturnsAsync(new PagedResult <Anime>
            {
                Results = new List <Anime>
                {
                    new AnimeBuilder().WithMalId(default).Build()
        public async Task HandleAsync_GivenEmptyDatabase_ShouldReturnEmptyResults()
        {
            // Given
            var query     = new SearchAnimeQuery();
            var dbContext = InMemoryDbProvider.GetDbContext();
            var handler   = CreateHandler(dbContext);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            result.Results.Should().BeEmpty();
        }
Exemplo n.º 9
0
        public async Task GetSearchEntries_NotExistingAnime_ShouldReturnEmptyCollection()
        {
            // Given
            var api = new AnimeApi(requester);

            var query = new SearchAnimeQuery
            {
                Title = "qwertyuiopasdghjkl"
            };

            // When
            var apiResult = await api.GetSearchEntriesAsync(query);

            // Then
            apiResult.Results.Should().BeEmpty();
        }
Exemplo n.º 10
0
        public async Task HandleAsync_GivenRepositoryReturnEmptyCollection_ShouldReturnEmptyResults()
        {
            // Given
            var query          = new SearchAnimeQuery();
            var mockRepository = new Mock <IAnimeRepository>();

            mockRepository.Setup(x => x.GetOrderedPageByPopularityAsync(It.IsAny <Expression <Func <Anime, bool> > >(), 0, 10))
            .ReturnsAsync(new PagedResult <Anime> {
                Results = new List <Anime>()
            });
            var mockAnimeSearchCriteriaService = new Mock <IAnimeSearchCriteriaService>();

            mockAnimeSearchCriteriaService.Setup(x => x.BuildExpression(query)).Returns(f => true);
            var handler = new SearchAnimeQueryHandler(mockRepository.Object, mockAnimeSearchCriteriaService.Object);

            // When
            var result = await handler.HandleAsync(query);

            // Then
            mockRepository.Verify(x => x.GetOrderedPageByPopularityAsync(It.IsAny <Expression <Func <Anime, bool> > >(), 0, 10), Times.Once);
            result.Results.Should().BeEmpty();
        }
Exemplo n.º 11
0
        public async Task GetSearchEntries_ExistingAnime_ShouldReturnSearchEntries()
        {
            // Given
            const int cowboyBebopId = 1;
            var       api           = new AnimeApi(requester);

            var query = new SearchAnimeQuery
            {
                Title = "Cowboy Bebop"
            };

            // When
            var apiResult = await api.GetSearchEntriesAsync(query);

            // Then
            using var scope = new AssertionScope();
            var firstResult = apiResult.Results.First();

            apiResult.Results.Count.Should().Be(4);
            firstResult.Title.Should().Be("Cowboy Bebop");
            firstResult.ImageUrl.Should().NotBeNullOrWhiteSpace();
            firstResult.MalId.Should().Be(cowboyBebopId);
        }
Exemplo n.º 12
0
 private Expression <Func <Anime, bool> > ExtendExpressionWithSearchCriteria(Expression <Func <Anime, bool> > predicate, SearchAnimeQuery query)
 {
     return(predicate
            .And(!string.IsNullOrWhiteSpace(query.Title), () => anime =>
                 anime.Title.ToLower().Contains(query.Title.ToLower()) ||
                 (!string.IsNullOrWhiteSpace(anime.KanjiTitle) && anime.KanjiTitle.ToLower().Contains(query.Title.ToLower())) ||
                 (!string.IsNullOrWhiteSpace(anime.EnglishTitle) && anime.EnglishTitle.ToLower().Contains(query.Title.ToLower())) ||
                 (!string.IsNullOrWhiteSpace(anime.TitleSynonyms) && anime.TitleSynonyms.ToLower().Contains(query.Title.ToLower()))));
 }
Exemplo n.º 13
0
        public Expression <Func <Anime, bool> > BuildExpression(SearchAnimeQuery query)
        {
            var predicate = PredicateBuilder.True <Anime>();

            return(query != null?ExtendExpressionWithSearchCriteria(predicate, query) : predicate);
        }
Exemplo n.º 14
0
 public Task <PagedResult <AnimeSearchEntryDto> > GetSearchEntriesAsync(SearchAnimeQuery query) => _animeApi.GetSearchEntriesAsync(query.Title);
Exemplo n.º 15
0
 public Task <PagedResult <AnimeSearchEntryDto> > GetSearchEntries([FromQuery] SearchAnimeQuery query)
 => HandleAsync(async() => await _searchAnimeQueryHandler.HandleAsync(query));