Exemple #1
0
        public async Task <bool> UpdateAsync(EpisodeCreateUpdateDTO episode)
        {
            var entity = await _context.Episodes.Include(e => e.EpisodeCharacters).FirstOrDefaultAsync(e => e.Id == episode.Id);

            if (entity == null)
            {
                return(false);
            }

            entity.Title      = episode.Title;
            entity.FirstAired = episode.FirstAired;

            var toBeAdded = episode.CharacterIds.Except(entity.EpisodeCharacters.Select(c => c.CharacterId));

            foreach (var characterId in toBeAdded)
            {
                entity.EpisodeCharacters.Add(new EpisodeCharacter {
                    CharacterId = characterId
                });
            }
            foreach (var character in entity.EpisodeCharacters.ToList())
            {
                if (!episode.CharacterIds.Contains(character.CharacterId))
                {
                    entity.EpisodeCharacters.Remove(character);
                }
            }

            await _context.SaveChangesAsync();

            return(true);
        }
        public async Task CreateAsync_given_dto_returns_created_Episode()
        {
            using (var connection = await CreateConnectionAsync())
                using (var context = await CreateContextAsync(connection))
                {
                    var bender = new Character {
                        Name = "Bender", Species = "Robot"
                    };
                    var fry = new Character {
                        Name = "Fry", Species = "Human"
                    };
                    context.Characters.AddRange(bender, fry);
                    await context.SaveChangesAsync();

                    var repository = new EpisodeRepository(context);
                    var dto        = new EpisodeCreateUpdateDTO
                    {
                        Title        = "Murder on the Planet Express",
                        FirstAired   = new DateTime(2013, 8, 21),
                        CharacterIds = new[] { bender.Id, fry.Id }
                    };

                    var episode = await repository.CreateAsync(dto);

                    Assert.Equal(1, episode.Id);
                    Assert.Equal("Murder on the Planet Express", episode.Title);
                    Assert.Equal(new DateTime(2013, 8, 21), episode.FirstAired);
                    Assert.Equal(new Dictionary <int, string> {
                        { bender.Id, "Bender" }, { fry.Id, "Fry" }
                    }, episode.Characters);
                }
        }
Exemple #3
0
        public async Task <IActionResult> Put(int id, [FromBody] EpisodeCreateUpdateDTO episode)
        {
            var updated = await _repository.UpdateAsync(episode);

            if (updated)
            {
                return(NoContent());
            }

            return(NotFound());
        }
        public async Task UpdateAsync_given_existing_dto_updates_entity()
        {
            using (var connection = await CreateConnectionAsync())
                using (var context = await CreateContextAsync(connection))
                {
                    var bender = new Character {
                        Name = "Bender", Species = "Robot"
                    };
                    var fry = new Character {
                        Name = "Fry", Species = "Human"
                    };
                    var entity = new Episode
                    {
                        Title             = "Murder on the Planet Express",
                        FirstAired        = new DateTime(2013, 8, 21),
                        EpisodeCharacters = new HashSet <EpisodeCharacter>
                        {
                            new EpisodeCharacter {
                                Character = bender
                            },
                            new EpisodeCharacter {
                                Character = fry
                            }
                        }
                    };
                    context.Episodes.Add(entity);
                    await context.SaveChangesAsync();

                    var repository = new EpisodeRepository(context);
                    var dto        = new EpisodeCreateUpdateDTO
                    {
                        Id           = entity.Id,
                        Title        = "The Series Has Landed",
                        FirstAired   = new DateTime(1999, 4, 4),
                        CharacterIds = new HashSet <int> {
                            bender.Id
                        }
                    };

                    var updated = await repository.UpdateAsync(dto);

                    Assert.True(updated);

                    var updatedEntity = await context.Episodes.Include(c => c.EpisodeCharacters).FirstOrDefaultAsync(c => c.Id == entity.Id);

                    Assert.Equal("The Series Has Landed", updatedEntity.Title);
                    Assert.Equal(new DateTime(1999, 4, 4), updatedEntity.FirstAired);
                    Assert.Equal(bender.Id, updatedEntity.EpisodeCharacters.Single().CharacterId);
                }
        }
Exemple #5
0
        public async Task <EpisodeDetailedDTO> CreateAsync(EpisodeCreateUpdateDTO episode)
        {
            var entity = new Episode
            {
                Title             = episode.Title,
                FirstAired        = episode.FirstAired,
                EpisodeCharacters = episode.CharacterIds.Select(c => new EpisodeCharacter {
                    CharacterId = c
                }).ToList()
            };

            _context.Episodes.Add(entity);
            await _context.SaveChangesAsync();

            return(await FindAsync(entity.Id));
        }
        public async Task UpdateAsync_given_non_existing_dto_returns_false()
        {
            using (var connection = await CreateConnectionAsync())
                using (var context = await CreateContextAsync(connection))
                {
                    var repository = new EpisodeRepository(context);
                    var dto        = new EpisodeCreateUpdateDTO
                    {
                        Id    = 0,
                        Title = "Dummy"
                    };

                    var updated = await repository.UpdateAsync(dto);

                    Assert.False(updated);
                }
        }
        public async Task CreateAsync_given_dto_creates_new_Episode()
        {
            using (var connection = await CreateConnectionAsync())
                using (var context = await CreateContextAsync(connection))
                {
                    var bender = new Character {
                        Name = "Bender", Species = "Robot"
                    };
                    var fry = new Character {
                        Name = "Fry", Species = "Human"
                    };
                    context.Characters.AddRange(bender, fry);
                    await context.SaveChangesAsync();

                    var repository = new EpisodeRepository(context);
                    var dto        = new EpisodeCreateUpdateDTO
                    {
                        Title        = "Murder on the Planet Express",
                        FirstAired   = new DateTime(2013, 8, 21),
                        CharacterIds = new[] { bender.Id, fry.Id }
                    };

                    var episode = await repository.CreateAsync(dto);

                    Assert.Equal(1, episode.Id);

                    var entity = await context.Episodes.FindAsync(episode.Id);

                    Assert.Equal("Murder on the Planet Express", entity.Title);
                    Assert.Equal(new DateTime(2013, 8, 21), entity.FirstAired);

                    var characterIds = await context.EpisodeCharacters.Where(e => e.EpisodeId == episode.Id).Select(c => c.CharacterId).ToListAsync();

                    Assert.True(new HashSet <int> {
                        bender.Id, fry.Id
                    }.SetEquals(characterIds));
                }
        }
Exemple #8
0
        public async Task <ActionResult <EpisodeDetailedDTO> > Post([FromBody] EpisodeCreateUpdateDTO episode)
        {
            var dto = await _repository.CreateAsync(episode);

            return(CreatedAtAction(nameof(Get), new { id = dto.Id }, dto));
        }