예제 #1
0
        public async Task <UserDTO> Rate(int userID, int?beerID, int theRating)
        {
            var theUser = await this._context.Users
                          .Where(u => u.IsDeleted == false)
                          .FirstOrDefaultAsync(u => u.Id == userID);

            var theBeer = await this._context.Beers
                          .Where(b => b.IsDeleted == false)
                          .FirstOrDefaultAsync(b => b.ID == beerID);

            var theNewRating = new BeerUserRating()
            {
                BeerID = theBeer.ID,
                Beer   = theBeer,
                UserID = theUser.Id,
                User   = theUser,
                Rating = theRating,
            };

            await this._context.BeerUserRatings.AddAsync(theNewRating);

            try
            {
                await this._context.SaveChangesAsync();
            }
            catch (Exception)
            {
                return(null);
            }
            //Recalculate beer's rating
            var recalculatedRating = await this._context.BeerUserRatings
                                     .Where(r => r.BeerID == beerID)
                                     .Select(r => r.Rating).AverageAsync();

            theBeer.Rating = recalculatedRating;
            try
            {
                this._context.Beers.Update(theBeer);
                await this._context.SaveChangesAsync();
            }
            catch (Exception)
            {
                return(null);
            }
            return(theUser.MapUserToDTO());
        }
예제 #2
0
        public void RateShould_RecalculateRating_WhenValid()
        {
            //Arrange
            var options = InMemory.GetOptions("RateShould_RecalculateRating_WhenValid");

            using (var context = new BOContext(options))
            {
                var user = new User()
                {
                    Id       = 1,
                    IDOld    = 1,
                    Name     = "SuperMan",
                    Password = "******",
                };

                var user2 = new User()
                {
                    Id       = 2,
                    IDOld    = 2,
                    Name     = "Batman",
                    Password = "******",
                };


                var beer = new Beer()
                {
                    ID      = 1,
                    ABV     = 4.5f,
                    Name    = "Carlsberg",
                    Country = new Country()
                    {
                        Name = "Germany"
                    },
                    Style = new BeerStyle()
                    {
                        Name = "Ale"
                    }
                };
                var firstNewRating = new BeerUserRating()
                {
                    BeerID = beer.ID,
                    Beer   = beer,
                    UserID = user.IDOld,
                    User   = user,
                    Rating = 2,
                };
                context.Users.Add(user);
                context.Users.Add(user2);
                context.Beers.Add(beer);
                context.BeerUserRatings.Add(firstNewRating);
                context.SaveChanges();
            }

            using (var context = new BOContext(options))
            {
                //Act
                var sut               = new UsersService(context);
                var result            = sut.Rate(2, 1, 5).Result;
                var beerWithNewRating = context.Beers.Find(1);
                //Assert
                Assert.AreEqual(3.5, beerWithNewRating.Rating);
            }
        }