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_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_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");
        }