public void IsNotPromotedWhen100DollarsHasNotBeenSpentInLastYear()
        {
            _mockDateProvider.Setup(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20));

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(15m, 30m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new TwoDaysPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 6, 21)
                },
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 6, 23)
                }
            };

            var customer = new Customer(new CustomerStatusRegular(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusRegular>(status);
        }
        public void IsPromotedToAdvancedWhenTwoMoviesAreBoughLastMonthAnd100DollarsIsSpentDuringLastYear()
        {
            _mockDateProvider.Setup(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20));

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(150m, 300m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new TwoDaysPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 6, 21)
                },
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 6, 23)
                }
            };

            var customer = new Customer(new CustomerStatusRegular(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusAdvanced>(status);
        }
        public void DemotesToRegularStatusAfterExpirationWhenTwoMoviesAreNotBoughLastMonth()
        {
            _mockDateProvider.SetupSequence(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 6, 21))
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Throws <Exception>();

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(150m, 300m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new TwoDaysPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2020, 6, 21)
                }
            };

            var customer = new Customer(new CustomerStatusAdvanced(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusRegular>(status);
        }
        public void IsNotPromotedWhenThereIsOnlyOnePurchaseInLastMonth()
        {
            _mockDateProvider.Setup(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20));

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(150m, 300m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 6, 21)
                },
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2019, 5, 21)
                }
            };

            var customer = new Customer(new CustomerStatusRegular(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusRegular>(status);
        }
Ejemplo n.º 5
0
        public void TwoDaysSetsTwoDaysPrice()
        {
            var movieOffer = new MovieOffer
            {
                MovieId = "123asd",
                Title   = "Movie title",
                Price   = new MoviePrice(_twoDaysPrice, _lifeLongPrice)
            };

            var purchasedMovie = PurchasedMovie.TwoDays(movieOffer);

            Assert.Equal(_twoDaysPrice, purchasedMovie.Price);
        }
Ejemplo n.º 6
0
        public void TwoDaysSetsExpirationTwoDaysInFuture()
        {
            var movieOffer = new MovieOffer
            {
                MovieId = "123asd",
                Title   = "Movie title",
                Price   = new MoviePrice(_twoDaysPrice, _lifeLongPrice)
            };

            _dateProviderMock.Setup(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 15));

            var purchasedMovie = PurchasedMovie.TwoDays(movieOffer);

            Assert.Equal(new DateTime(2019, 7, 17), purchasedMovie.Expiration);
        }
        public void BuyMovie(BuyMovieDto buyMovieRequest, IEnumerable <IHandleMoviePurchased> moviePurchasedHandlers)
        {
            var customer = _customerGetter.Get(buyMovieRequest.CustomerId).ToResult(Errors.CustomerNotFound);
            var movie    = _movieGetter.Get(buyMovieRequest.MovieId).ToResult(Errors.MovieNotFound);

            Result.Combine(customer, movie)
            .OnSuccess(() =>
            {
                var moviePriceCalculator = _moviePriceCalculatorFactory.GetPriceCalculatorFor(customer.Value);

                var offer     = MovieOffer.Create(movie.Value, moviePriceCalculator);
                var buyMethod = GetBuyMethod(buyMovieRequest.MovieLicenseType, customer.Value);

                buyMethod(offer);

                HandleMoviePurchased(moviePurchasedHandlers, Result.Ok <MovieOffer>(offer));
            })
            .OnFailure(message => HandleMoviePurchased(moviePurchasedHandlers, Result.Fail <MovieOffer>(message)));
        }
Ejemplo n.º 8
0
        public void BuyLifelongMovieAddsItToThePurchasedHistory()
        {
            var customer = new Customer
            {
                Id     = "abc",
                Status = new CustomerStatusRegular(),
            };

            var movieOffer = new MovieOffer
            {
                Price   = new MoviePrice(12m, 1m),
                Title   = "movie title",
                MovieId = "cfa"
            };

            customer.BuyLifelong(movieOffer);
            Assert.Equal(1, customer.PurchasedMovies.Count);
            Assert.IsType <LifelongPurchasedMovie>(customer.PurchasedMovies.First());
        }
        public void ShouldMapAllProperties()
        {
            var offer = new MovieOffer
            {
                MovieId = "abc",
                Price   = new MoviePrice(12m, 14m),
                Title   = "Movie Title"
            };

            var movieCatalogDto = MovieCatalogDtoMapper.MapToDto(new List <MovieOffer> {
                offer
            });


            Assert.Equal(1, movieCatalogDto.Movies.Count);
            Assert.Equal("abc", movieCatalogDto.Movies.First().Id);
            Assert.Equal("Movie Title", movieCatalogDto.Movies.First().Title);
            Assert.Equal(12m, movieCatalogDto.Movies.First().TwoDaysPrice);
            Assert.Equal(14m, movieCatalogDto.Movies.First().LifelongPrice);
        }
        public void RenewsAdvancedStatusAfterExpirationWhenTwoMoviesAreBoughLastMonthAnd100DollarsIsSpentDuringLastYear()
        {
            _mockDateProvider.SetupSequence(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 6, 21))
            .Returns(new DateTime(2020, 6, 23))
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Throws <Exception>();

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(150m, 300m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new TwoDaysPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2020, 6, 21)
                },
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2020, 6, 23)
                }
            };

            var customer = new Customer(new CustomerStatusAdvanced(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusAdvanced>(status);
            Assert.Equal(new DateTime(2021, 7, 21), status.ValidTo);
        }
        public void DemotesToRegularStatusAfterExpirationWhen100DollarsWereNotSpentDuringLastYear()
        {
            _mockDateProvider.SetupSequence(dateProvider => dateProvider.Now())
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 6, 21))
            .Returns(new DateTime(2020, 6, 23))
            .Returns(new DateTime(2019, 7, 20))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Returns(new DateTime(2020, 7, 21))
            .Throws <Exception>();

            var movieOffer = new MovieOffer
            {
                Price = new MoviePrice(15m, 30m)
            };

            var purchasedMovies = new List <PurchasedMovie>
            {
                new TwoDaysPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2020, 6, 21)
                },
                new LifelongPurchasedMovie(movieOffer)
                {
                    Purchased = new DateTime(2020, 6, 23)
                }
            };

            var customer = new Customer(new CustomerStatusAdvanced(), purchasedMovies);

            var status = customer.Status;

            Assert.IsType <CustomerStatusRegular>(status);
        }
 public LifelongPurchasedMovie(MovieOffer movieOffer) : base(movieOffer)
 {
     Price = movieOffer.Price.LifeLong;
 }