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); } }
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); } }
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)); } }
public async Task <ActionResult <EpisodeDetailedDTO> > Post([FromBody] EpisodeCreateUpdateDTO episode) { var dto = await _repository.CreateAsync(episode); return(CreatedAtAction(nameof(Get), new { id = dto.Id }, dto)); }