public void Handle_ChecksReturnType()
        {
            //Arrange
            var iconfMock = new Mock <IConfiguration>().Object;
            var query     = new GetCharactersQuery();
            var handle    = new GetCharactersQuery.GetCharactersQueryHandler(iconfMock);
            //ACT
            var result = handle.Handle(query, CancellationToken.None);

            //Assert
            Assert.IsType <Task <CharactersListVM> >(result);
        }
Ejemplo n.º 2
0
        public async Task <PageResponse <Character> > List(GetCharactersQuery query)
        {
            var characters = await _characterRepository.GetAllCharacters()
                             .Select(x => new CharacterDTO(x.Id, x.Name, x.Planet))
                             .PickPage(query);

            var episodes      = _episodesService.GetAllEpisodes().ToList();
            var charactersIds = characters.Results.Select(x => x.Id);

            var episodeCharactersTask = _episodesService.GetAllEpisodesCharacters(charactersIds);
            var friendsTasks          = Task.FromResult(_characterRepository.GetAllCharactersFriends(charactersIds)
                                                        .Select(x => new CharacterFriendDTO(x.Id, x.FriendId))
                                                        .ToList());

            await Task.WhenAll(episodeCharactersTask, friendsTasks);

            return(characters.ComposeCharacters(episodes, friendsTasks.Result, episodeCharactersTask.Result));
        }
        public async Task <IReadOnlyList <GetCharacterDto> > Handle(GetCharactersQuery request, CancellationToken cancellationToken)
        {
            const string sql =
                "SELECT c.CharacterId, c.CreatedAt, c.Name, c.Strength, c.Defense, c.Intelligence, " +
                "e.Name as EpisodeName, e.EpisodeId, f.Name as FriendName, f.CharacterId as FriendId " +
                "FROM characters c " +
                "LEFT JOIN characterEpisodes ec ON ec.CharacterId = c.CharacterId " +
                "LEFT JOIN episodes e ON e.EpisodeId = ec.EpisodeId " +
                "LEFT JOIN CharacterFriends ef ON ef.CharacterId = c.CharacterId " +
                "LEFT JOIN Characters f ON f.CharacterId = ef.FriendId " +
                "ORDER BY c.CreatedAt " +
                "OFFSET @Offset ROWS " +
                "FETCH NEXT @PageSize ROWS ONLY";

            var connection = _sqlConnectionFactory.GetOpenConnection();

            var list = await connection.QueryAsync <GetCharacterDto, DynamicFriendEpisodeDto, GetCharacterDto>(
                sql, (character, dynamicValue) =>
            {
                //todo: Map Name, Defense, etc. from GetCharacterDto, not DynamicFriendEpisodeDto
                character.Name         = dynamicValue.Name;
                character.Intelligence = dynamicValue.Intelligence;
                character.Strength     = dynamicValue.Strength;
                character.Defense      = dynamicValue.Defense;

                if (dynamicValue.EpisodeId > 0)
                {
                    character.Episodes.Add(new GetEpisodeDto()
                    {
                        EpisodeId = dynamicValue.EpisodeId,
                        Name      = dynamicValue.EpisodeName
                    });
                }

                if (dynamicValue.FriendId > 0)
                {
                    character.Friends.Add(new GetFriendDto()
                    {
                        CharacterId = dynamicValue.FriendId,
                        FriendName  = dynamicValue.FriendName,
                    });
                }
                return(character);
            }, new
            {
                Offset = request.ProductSpecParams.PageIndex,
                request.ProductSpecParams.PageSize
            }, splitOn : "Name");

            var grouppedList = list.GroupBy(x => x.CharacterId);
            var lastResult   = new List <GetCharacterDto>();

            foreach (IGrouping <int, GetCharacterDto> item in grouppedList)
            {
                GetCharacterDto characterDto = new GetCharacterDto();

                for (int i = 0; i < item.Count(); i++)
                {
                    var tempCharacterDto = item.ElementAt(i);
                    if (i == 0)
                    {
                        characterDto = tempCharacterDto;
                        continue;
                    }

                    characterDto.Friends.AddRange(tempCharacterDto.Friends);
                    characterDto.Episodes.AddRange(tempCharacterDto.Episodes);
                }
                lastResult.Add(characterDto);
            }

            return(lastResult.AsList());
        }