public async Task Handle_ShouldDeleteTrainingProviderLocationFromExistingBasket_WhenProviderLocationHasAlreadyBeenAddedForApprenticeship()
        {
            var basketId = Guid.NewGuid();
            var basket   = new ApprenticeshipFavouritesBasket {
                Id = basketId
            };

            basket.Add("123", 12345678, "TestProvider", 10000020);
            basket.Add("123", 23456789, "TestProvider", 10000030);

            _mockBasket.Setup(x => x.GetAsync(basketId)).ReturnsAsync(basket);

            ApprenticeshipFavouritesBasket savedBasket = null; // Setup callback so we can check contents of basket easier.

            _mockBasket.Setup(x => x.UpdateAsync(It.IsAny <ApprenticeshipFavouritesBasket>()))
            .Returns(Task.CompletedTask)
            .Callback <ApprenticeshipFavouritesBasket>((a) => savedBasket = a);

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = basketId,
                ApprenticeshipId = "123",
                Ukprn            = 12345678,
                LocationId       = 10000020
            };

            var response = await _sut.Handle(request, default(CancellationToken));

            _mockBasket.Verify(x => x.UpdateAsync(It.IsAny <ApprenticeshipFavouritesBasket>()), Times.Once);

            var favourite = savedBasket.SingleOrDefault(x => x.ApprenticeshipId == "123");

            favourite.Should().NotBeNull();
            favourite.Providers.Count.Should().Be(1);
        }
        public async Task Handle_ShouldRemoveApprenticeFromBasket_IfApprenticeshipAlreadyInBasket()
        {
            var basketId = Guid.NewGuid();
            var basket   = new ApprenticeshipFavouritesBasket {
                Id = basketId
            };

            basket.Add("123", 23456, "TestProvider");
            basket.Add("123", 12345, "TestProvider");

            _mockBasket.Setup(x => x.GetAsync(basketId)).ReturnsAsync(basket);

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = basketId,
                ApprenticeshipId = "123"
            };

            await _sut.Handle(request, default(CancellationToken));

            _mockBasket.Verify(x => x.UpdateAsync(It.IsAny <ApprenticeshipFavouritesBasket>()), Times.Once);

            basket.Should().NotBeNull();
            basket.Should().BeEmpty();
        }
        public async Task Handle_AddsApprenticeshipToExistingBasket_ForNewApprenticeship()
        {
            var basketId = Guid.NewGuid();
            var basket   = new ApprenticeshipFavouritesBasket {
                Id = basketId
            };

            basket.Add("111");

            _mockBasket.Setup(x => x.GetAsync(basketId)).ReturnsAsync(basket);

            ApprenticeshipFavouritesBasket savedBasket = null; // Setup callback so we can check contents of basket easier.

            _mockBasket.Setup(x => x.UpdateAsync(It.IsAny <ApprenticeshipFavouritesBasket>()))
            .Returns(Task.CompletedTask)
            .Callback <ApprenticeshipFavouritesBasket>((a) => savedBasket = a);

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = basketId,
                ApprenticeshipId = "123"
            };

            var response = await _sut.Handle(request, default(CancellationToken));

            response.ApprenticeshipName.Should().Be("Standard 1");
            response.BasketId.Should().Be(basketId);
            response.BasketOperation.Should().Be(BasketOperation.Added);
            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(b => b.Count() == 2)));

            savedBasket.SingleOrDefault(x => x.ApprenticeshipId == "123").Should().NotBeNull();
        }
        public async Task Handle_CreatesBasketId_WhenNoBasketSpecified()
        {
            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = null,
                ApprenticeshipId = "123"
            };

            var response = await _sut.Handle(request, default(CancellationToken));

            response.BasketId.Should().NotBeEmpty();
            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(a => a.Id != Guid.Empty)));
        }
        public async Task Handle_AddsApprenticeshipToBasket_ForNewBasket()
        {
            var basketId = Guid.NewGuid();

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = null,
                ApprenticeshipId = "123"
            };

            await _sut.Handle(request, default(CancellationToken));

            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(a => a.First().ApprenticeshipId == "123")));
        }
        public async Task Handle_CreatesNewBasketId_IfPassedBasketIdNoLongerExistsInCache()
        {
            var expiredBasketId = Guid.NewGuid();

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = expiredBasketId,
                ApprenticeshipId = "123"
            };

            var response = await _sut.Handle(request, default(CancellationToken));

            response.BasketId.Should().NotBeEmpty();
            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(a => a.Id != Guid.Empty && a.Id != expiredBasketId)));
        }
        public async Task Handle_AddsProviderLocationToBasket_ForNewBasket()
        {
            var basketId = Guid.NewGuid();

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = null,
                ApprenticeshipId = "123",
                LocationId       = 12345,
                Ukprn            = 12345678
            };

            await _sut.Handle(request, default(CancellationToken));

            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(a => a[0].ApprenticeshipId == "123" && a[0].Providers.Select(w => w.Ukprn).Contains(12345678) && a[0].Providers.SingleOrDefault(w => w.Ukprn == 12345678).Locations.Contains(12345))));
        }
        public async Task Handle_AddsTrainingProviderLocationToExistingBasket_ForExistingApprenticeshipAndProviderWithExistingLocations()
        {
            var basketId = Guid.NewGuid();
            var basket   = new ApprenticeshipFavouritesBasket {
                Id = basketId
            };

            basket.Add("123", 12345678, "TestProvider", 10000030);

            _mockBasket.Setup(x => x.GetAsync(basketId)).ReturnsAsync(basket);

            ApprenticeshipFavouritesBasket savedBasket = null; // Setup callback so we can check contents of basket easier.

            _mockBasket.Setup(x => x.UpdateAsync(It.IsAny <ApprenticeshipFavouritesBasket>()))
            .Returns(Task.CompletedTask)
            .Callback <ApprenticeshipFavouritesBasket>((a) => savedBasket = a);

            var request = new AddOrRemoveFavouriteInBasketCommand
            {
                BasketId         = basketId,
                ApprenticeshipId = "123",
                Ukprn            = 12345678,
                LocationId       = 10000020
            };

            var response = await _sut.Handle(request, default(CancellationToken));

            response.ApprenticeshipName.Should().Be("Standard 1");
            response.BasketId.Should().Be(basketId);
            response.BasketOperation.Should().Be(BasketOperation.Added);
            _mockBasket.Verify(x => x.UpdateAsync(It.Is <ApprenticeshipFavouritesBasket>(b => b.Count() == 1)));

            var favourite = savedBasket.SingleOrDefault(x => x.ApprenticeshipId == "123");

            favourite.Should().NotBeNull();
            favourite.Providers.Should().NotBeNull();
            favourite.Providers.Count.Should().Be(1);
            favourite.Providers.First().Ukprn.Should().Be(12345678);
            favourite.Providers.First().Locations.Count().Should().Be(2);
            favourite.Providers.First().Locations.Contains(10000020);
            favourite.Providers.First().Name.Should().Be("TestProvider");
        }