public async Task All_ReturnsCorectly()
        {
            MapperInitializer.InitializeMapper();
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var result = await promoCodeService.All <PromoCodeViewModel>();

            Assert.Equal(2, result.Count());
        }
        public async Task GetIdByNameAsync_FunctionsProperly()
        {
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var actualResult = await promoCodeService.GetIdByNameAsync("First");

            var expectedResult = "FirstId";

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task DeductPercentageFromPrice_ShouldDecuctThePriceProperly()
        {
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var actualResult = await promoCodeService.DeductPercentageFromPrice(100, "FirstId");

            var expectedResult = 90;

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task ExistsAsync_FunctionsProperly()
        {
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var shouldBeTrue = await promoCodeService.ExistsAsync("First");

            var shouldBeFalse = await promoCodeService.ExistsAsync("invalid");

            Assert.True(shouldBeTrue);
            Assert.False(shouldBeFalse);
        }
        public async Task DeleteAsync_FunctionsProperly()
        {
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var shouldBeTrue = await promoCodeService.DeleteAsync("FirstId");

            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                await promoCodeService.DeleteAsync("invalid");
            });
        }
        public async Task Add_FunctionsProperly()
        {
            MapperInitializer.InitializeMapper();
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var validPromoCodeCreateInputModel = new PromoCodeCreateInputModel()
            {
                Name = "Unique",
                DiscountInPercentage = 2,
            };

            var inValidPromoCodeNameCreateInputModel = new PromoCodeCreateInputModel()
            {
                Name = "First",
                DiscountInPercentage = 2,
            };

            var inValidPromoCodeCreateInputModel = new PromoCodeCreateInputModel()
            {
                Name = null,
                DiscountInPercentage = -1,
            };

            var shouldBeTrue = await promoCodeService.AddAsync(validPromoCodeCreateInputModel);

            var shouldBeFalse = await promoCodeService.AddAsync(inValidPromoCodeNameCreateInputModel);

            Assert.True(shouldBeTrue);
            Assert.False(shouldBeFalse);

            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                await promoCodeService.AddAsync(inValidPromoCodeCreateInputModel);
            });
        }
        public async Task EditAsync_FunctionsProperly()
        {
            MapperInitializer.InitializeMapper();
            var context             = ApplicationDbContextInMemoryFactory.InitializeContext();
            var promoCodeRepository = new EfDeletableEntityRepository <PromoCode>(context);
            var promoCodeService    = new PromoCodeService(promoCodeRepository);

            var promoCodesTestSeeder = new PromoCodesTestSeeder();

            await promoCodesTestSeeder.SeedPromoCodesAsync(context);

            var validPromoCodeCreateInputModel = new PromoCodeCreateInputModel()
            {
                Id   = "FirstId",
                Name = "FirstChanged",
            };

            var invalidNamePromoCodeCreateInputModel = new PromoCodeCreateInputModel()
            {
                Id   = "SecondId",
                Name = "FirstChanged",
            };

            var exceptionPromoCodeCreateInputModel = new PromoCodeCreateInputModel()
            {
                Id   = "invalid",
                Name = "invalid",
            };

            var shouldBeTrue = await promoCodeService.EditAsync(validPromoCodeCreateInputModel);

            var shouldBeFalse = await promoCodeService.EditAsync(invalidNamePromoCodeCreateInputModel);

            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                await promoCodeService.EditAsync(exceptionPromoCodeCreateInputModel);
            });
        }