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()); }
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); } }