public async Task <IActionResult> PurchaseBook(string bookId)
        {
            if (bookId == null)
            {
                this.ShowErrorMessage(NotificationMessages.PurchaseErrorMessage);
                return(this.RedirectToAction("Index", "Home"));
            }

            var isPurchased = await this.purchasesService.UserHasPurchasedBookAsync(bookId, this.User.Identity.Name);

            if (isPurchased)
            {
                return(this.RedirectToAction("Details", "Books", new { id = bookId }));
            }

            var purchase = new PurchaseCreateServiceModel
            {
                BookId       = bookId,
                PurchaseDate = DateTime.UtcNow,
                UserName     = this.User.Identity.Name
            };

            var isSuccess = await this.purchasesService.CreateAsync(purchase);

            if (!isSuccess)
            {
                this.ShowErrorMessage(NotificationMessages.PurchaseErrorMessage);
                return(this.RedirectToAction("Index", "Home"));
            }

            this.ShowSuccessMessage(NotificationMessages.PurchaseSuccessMessage);

            return(this.RedirectToAction("My"));
        }
Exemple #2
0
        public async Task CreateAsync_WithNonexistentUser_ReturnsFalse()
        {
            // Arrange
            var context = this.NewInMemoryDatabase();

            var testBook = new Book();

            await context.Books.AddAsync(testBook);

            await context.SaveChangesAsync();

            var serviceModel = new PurchaseCreateServiceModel
            {
                UserName     = "******",
                BookId       = testBook.Id,
                PurchaseDate = DateTime.UtcNow
            };
            var purchasesService = new PurchasesService(context);

            // Act
            var result = await purchasesService.CreateAsync(serviceModel);

            // Assert
            Assert.False(result);
            Assert.False(await context.Purchases.AnyAsync());
        }
Exemple #3
0
        public async Task CreateAsync_WithNonexistentBook_ReturnsFalse()
        {
            // Arrange
            var context = this.NewInMemoryDatabase();

            var testUser = new KnigaUser {
                UserName = "******"
            };

            await context.Users.AddAsync(testUser);

            await context.SaveChangesAsync();

            var serviceModel = new PurchaseCreateServiceModel
            {
                UserName     = testUser.UserName,
                BookId       = Guid.NewGuid().ToString(),
                PurchaseDate = DateTime.UtcNow
            };

            var purchasesService = new PurchasesService(context);

            // Act
            var result = await purchasesService.CreateAsync(serviceModel);

            // Assert
            Assert.False(result);
            Assert.False(await context.Purchases.AnyAsync());
        }
Exemple #4
0
        public async Task <bool> CreateAsync(PurchaseCreateServiceModel model)
        {
            if (!this.IsEntityStateValid(model))
            {
                return(false);
            }

            var user = await this.Context.Users.SingleOrDefaultAsync(u => u.UserName == model.UserName);

            // Verify that the user exists, the book exists, and that the book has not already been purchased by the user
            if (user == null ||
                !await this.Context.Books.AnyAsync(b => b.Id == model.BookId) ||
                await this.Context.Purchases.AnyAsync(bt => bt.BookId == model.BookId && bt.UserId == user.Id))
            {
                return(false);
            }

            var purchase = Mapper.Map <Purchase>(model);

            purchase.UserId = user.Id;

            await this.Context.Purchases.AddAsync(purchase);

            await this.Context.SaveChangesAsync();

            return(true);
        }
Exemple #5
0
        public async Task CreateAsync_WithExistingPurchase_ReturnsFalse()
        {
            // Arrange
            var context = this.NewInMemoryDatabase();

            var testUser = new KnigaUser {
                UserName = "******"
            };
            var testBook = new Book();

            await context.Books.AddAsync(testBook);

            await context.Users.AddAsync(testUser);

            var purchase = new Purchase
            {
                UserId       = testUser.Id,
                BookId       = testBook.Id,
                PurchaseDate = DateTime.UtcNow
            };
            await context.Purchases.AddAsync(purchase);

            await context.SaveChangesAsync();

            var serviceModel = new PurchaseCreateServiceModel
            {
                UserName     = testUser.UserName,
                BookId       = testBook.Id,
                PurchaseDate = DateTime.UtcNow
            };
            var purchasesService = new PurchasesService(context);

            // Act
            var result = await purchasesService.CreateAsync(serviceModel);

            // Assert
            Assert.False(result);
            Assert.True(await context.Purchases.AnyAsync(p => p.User.UserName == testUser.UserName));
            Assert.Equal(1, await context.Purchases.CountAsync());
        }
Exemple #6
0
        public async Task CreateAsync_WithCorrectModel_WorksCorrectly()
        {
            // Arrange
            var context = this.NewInMemoryDatabase();

            var testUser = new KnigaUser {
                UserName = "******"
            };
            var testBook = new Book();

            await context.Books.AddAsync(testBook);

            await context.Users.AddAsync(testUser);

            await context.SaveChangesAsync();

            var serviceModel = new PurchaseCreateServiceModel
            {
                UserName     = testUser.UserName,
                BookId       = testBook.Id,
                PurchaseDate = DateTime.UtcNow
            };
            var purchasesService = new PurchasesService(context);

            // Act
            var result = await purchasesService.CreateAsync(serviceModel);

            // Assert
            Assert.True(result);

            var purchase = await context.Purchases.SingleOrDefaultAsync();

            Assert.NotNull(purchase);
            Assert.Equal(testUser.Id, purchase.UserId);
            Assert.Equal(testBook.Id, purchase.BookId);
            Assert.Equal(serviceModel.PurchaseDate, purchase.PurchaseDate);
        }