public async Task AddAsync_GivenEmptyCharacter_ShouldAdd()
        {
            // Given
            var dbContext  = InMemoryDbProvider.GetDbContext();
            var repository = new CharacterRepository(dbContext);

            // When
            await repository.AddAsync(new CharacterBuilder().Build());

            // Then
            var allAnime = await dbContext.AnimeCharacters.ToListAsync();

            allAnime.Should().ContainSingle();
        }
        public async Task AddAsync_GivenDuplicatedKeyCharacter_ShouldThrowException()
        {
            // Given
            var id         = Guid.NewGuid();
            var dbContext  = InMemoryDbProvider.GetDbContext();
            var repository = new CharacterRepository(dbContext);

            await repository.AddAsync(new CharacterBuilder().WithId(id).Build());

            // When
            Func <Task> func = repository.Awaiting(x => x.AddAsync(new CharacterBuilder().WithId(id).Build()));

            // Then
            func.Should().Throw <Exception>();
        }
        public void AddAsync_Should_Add_Character_To_Database_And_Return_Created_Character_With_Id()
        {
            Character createdCharacter = null;

            using (var context = DbContextHelper.GetInMemory())
            {
                var characterRepository = new CharacterRepository(context);

                createdCharacter = characterRepository.AddAsync(new Character {
                    Name = "Luke"
                }).Result;

                Assert.NotNull(createdCharacter);
                Assert.True(context.Characters.Contains(createdCharacter));
            }
        }
        public async Task AddAsync_GivenCharacter_ShouldAdd()
        {
            // Given
            var dbContext  = InMemoryDbProvider.GetDbContext();
            var repository = new CharacterRepository(dbContext);

            const string expectedName      = "ExpectedName";
            const string expectedImageUrl  = "ExpectedImageUrl";
            const string expectedKanjiName = "期待される日本語タイトル";
            const string expectedNicknames = "expectedNicknames";
            const string expectedAbout     = "ExpectedAbout";
            const long   expectedMalId     = 1;

            var character = new CharacterBuilder()
                            .WithName(expectedName)
                            .WithImageUrl(expectedImageUrl)
                            .WithMalId(expectedMalId)
                            .WithKanjiName(expectedKanjiName)
                            .WithNicknames(expectedNicknames)
                            .WithAbout(expectedAbout)
                            .Build();

            // When
            await repository.AddAsync(character);

            // Then
            var allCharacters = await dbContext.AnimeCharacters.ToListAsync();

            var newCharacter = await dbContext.AnimeCharacters.FirstOrDefaultAsync();

            using (new AssertionScope())
            {
                allCharacters.Should().ContainSingle();

                newCharacter.Should().NotBeNull();
                newCharacter.Name.Should().Be(expectedName);
                newCharacter.ImageUrl.Should().Be(expectedImageUrl);
                newCharacter.MalId.Should().Be(expectedMalId);
                newCharacter.KanjiName.Should().Be(expectedKanjiName);
                newCharacter.Nicknames.Should().Be(expectedNicknames);
                newCharacter.About.Should().Be(expectedAbout);
            }
        }