public async Task TestCreateOrderTAndCsBad()
        {
            //SETUP
            var userId  = Guid.NewGuid();
            var options = SqliteInMemory.CreateOptions <OrderDbContext>();

            using var context = new OrderDbContext(options, new FakeUserIdService(userId));

            context.Database.EnsureCreated();
            var service = new PlaceOrderBizLogic(new PlaceOrderDbAccess(context));

            //ATTEMPT
            var lineItems = new List <OrderLineItem>
            {
                new OrderLineItem {
                    BookId = 1, NumBooks = 4
                },
            };
            var dto    = new PlaceOrderInDto(false, userId, lineItems.ToImmutableList());
            var status = await service.CreateOrderAndSaveAsync(dto);

            //VERIFY
            status.IsValid.ShouldBeFalse();
            status.GetAllErrors().ShouldEqual("You must accept the T&Cs to place an order.");
        }
        public async Task TestCreateOrderOneBookOk()
        {
            //SETUP
            var userId  = Guid.NewGuid();
            var options = SqliteInMemory.CreateOptions <OrderDbContext>();

            options.StopNextDispose();
            using var context = new OrderDbContext(options, new FakeUserIdService(userId));

            context.Database.EnsureCreated();
            var bookIds = context.SeedFourBookDdPartWithOptionalDbSchemaAdd(true);
            var service = new PlaceOrderBizLogic(new PlaceOrderDbAccess(context));
            //ATTEMPT
            var lineItems = new List <OrderLineItem>
            {
                new OrderLineItem {
                    BookId = 1, NumBooks = 4
                },
            };
            var dto    = new PlaceOrderInDto(true, userId, lineItems.ToImmutableList());
            var status = await service.CreateOrderAndSaveAsync(dto);

            //VERIFY
            status.IsValid.ShouldBeTrue(status.GetAllErrors());
            context.ChangeTracker.Clear();
            var order    = context.Orders.Include(x => x.LineItems).Single();
            var lineItem = order.LineItems.Single();

            lineItem.BookId.ShouldEqual(1);
            lineItem.NumBooks.ShouldEqual((short)4);
            lineItem.BookPrice.ShouldEqual(40);
        }
        public async Task TestCreateOrderEmptyBasketBad()
        {
            //SETUP
            var userId  = Guid.NewGuid();
            var options = SqliteInMemory.CreateOptions <OrderDbContext>();

            using var context = new OrderDbContext(options, new FakeUserIdService(userId));

            context.Database.EnsureCreated();
            var service = new PlaceOrderBizLogic(new PlaceOrderDbAccess(context));

            //ATTEMPT
            var dto    = new PlaceOrderInDto(true, userId, (new List <OrderLineItem>()).ToImmutableList());
            var status = await service.CreateOrderAndSaveAsync(dto);

            //VERIFY
            status.IsValid.ShouldBeFalse();
            status.GetAllErrors().ShouldEqual("No items in your basket.");
        }