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); }
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(); }
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(); }
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(); }
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); }
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())))); }
public Expression <Func <Anime, bool> > BuildExpression(SearchAnimeQuery query) { var predicate = PredicateBuilder.True <Anime>(); return(query != null?ExtendExpressionWithSearchCriteria(predicate, query) : predicate); }
public Task <PagedResult <AnimeSearchEntryDto> > GetSearchEntriesAsync(SearchAnimeQuery query) => _animeApi.GetSearchEntriesAsync(query.Title);
public Task <PagedResult <AnimeSearchEntryDto> > GetSearchEntries([FromQuery] SearchAnimeQuery query) => HandleAsync(async() => await _searchAnimeQueryHandler.HandleAsync(query));