예제 #1
0
        /// <summary>
        /// Set a Rating to bar and updates properties acording to new set
        /// </summary>
        /// <param name="barId">Bar Id to be rated</param>
        /// <param name="userId">User Id making the rating</param>
        /// <param name="rating">Value of rating</param>
        /// <returns>BarDTO</returns>
        public async Task <BarDTO> RateBarAsync(Guid barId, Guid userId, int rating)
        {
            try
            {
                var rate = await _context.BarRatings.FirstOrDefaultAsync(r => r.BarId == barId && r.UserId == userId);

                if (rate != null)
                {
                    rate.Rating = rating;

                    _context.Update(rate);
                }
                else
                {
                    var barRating = new UserBarRating
                    {
                        Rating = rating
                    };

                    barRating.Bar = await _context.Bars.FindAsync(barId);

                    barRating.User = await _context.Users.FindAsync(userId);

                    _context.BarRatings.Add(barRating);
                }

                await _context.SaveChangesAsync();

                var bar = await _context.Bars.FindAsync(barId);

                bar.Rating = await CalculateRating(barId);

                bar.TimesRated = await CountRates(barId);

                _context.Update(bar);

                await _context.SaveChangesAsync();

                return(_mapper.MapEntityToDTO(bar));
            }
            catch (Exception)
            {
                throw new ArgumentException("Fail to rate item");
            }
        }
        public async Task ChangeRating_IfAlreadyRatedButNotTimesRated()
        {
            //Arrange
            var options = Utils.GetOptions(nameof(ChangeRating_IfAlreadyRatedButNotTimesRated));

            var record = new Bar()
            {
                Name       = "BestBar",
                Rating     = 4,
                TimesRated = 1,
                ImageSrc   = null,
                IsDeleted  = false,
                Address    = "Галичица 17.",
                Country    = "България.",
                District   = "Лозенец.",
                Email      = "*****@*****.**",
                Phone      = "088888888.",
                Town       = "София.",
                LocationId = null,
            };

            var user = new User()
            {
                UserName     = "******",
                Email        = "*****@*****.**",
                PasswordHash = "pass",
            };

            using (var context = new BCcontext(options))
            {
                await context.Bars.AddAsync(record);

                await context.Users.AddAsync(user);

                await context.SaveChangesAsync();

                var barRating = new UserBarRating();
                barRating.Bar = await context.Bars.FirstOrDefaultAsync(b => b.Name == "BestBar");

                barRating.User = await context.Users.FirstOrDefaultAsync(u => u.UserName == "UserName");

                barRating.Rating = 4;

                await context.BarRatings.AddAsync(barRating);

                await context.SaveChangesAsync();
            }

            var mockMapper = new Mock <IBarMapper>();


            mockMapper.Setup((x) => x.MapEntityToDTO(It.IsAny <Bar>()))
            .Returns((Bar b) => new BarDTO()
            {
                Id         = b.Id,
                Name       = b.Name,
                Rating     = b.Rating,
                TimesRated = b.TimesRated,
                ImageSrc   = b.ImageSrc,
                IsDeleted  = b.IsDeleted,
                Address    = b.Address,
                Country    = b.Country,
                District   = b.District,
                Email      = b.Email,
                LocationId = b.LocationId,
                Phone      = b.Phone,
                Town       = b.Town
            });

            var http          = new Mock <IHttpClientFactory>();
            var coctailMapper = new Mock <ICocktailMapper>();

            //Act & Assert
            using (var context = new BCcontext(options))
            {
                var sut      = new BarsService(context, mockMapper.Object, http.Object, coctailMapper.Object);
                var dbResult = await context.Bars.FirstOrDefaultAsync(b => b.Name == "BestBar");

                var dbUser = await context.Users.FirstOrDefaultAsync(u => u.UserName == "UserName");

                var result = await sut.RateBarAsync(dbResult.Id, dbUser.Id, 2);

                dbResult = await context.Bars.FirstOrDefaultAsync(b => b.Name == "BestBar");

                Assert.AreEqual(dbResult.TimesRated, 1);
                Assert.AreEqual(dbResult.Rating, 2);
            }
        }