public void Can_save_update_order_concurently()
        {
            var order = TestOrderBuilder.BuildOrder().WithLineItemsCount(1).GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            var saveThread1 = new ThreadStart(() =>
            {
                var repository1 = GetRepository();
                var order1      = repository1.Orders.First();
                order1.Name     = "1";
                repository1.UnitOfWork.Commit();
            });
            var saveThread2 = new ThreadStart(() =>
            {
                var repository2 = GetRepository();
                var order2      = repository2.Orders.First();
                order2.Name     = "2";
                repository2.UnitOfWork.Commit();
            });

            var thread1 = new Thread(saveThread1);
            var thread2 = new Thread(saveThread2);

            thread1.Start();
            thread2.Start();

            thread1.Join();
            thread2.Join();
        }
        public void Can_repository_track_collection_changes()
        {
            var order = TestOrderBuilder.BuildOrder()
                        .WithLineItemsConstant()
                        .WithReturns()
                        .GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            order = repository.Orders.ExpandAll()
                    .Where(x => x.RmaRequests.Any())
                    .FirstOrDefault();

            Assert.NotNull(order);
            Assert.NotNull(order.RmaRequests[0]);

            order.RmaRequests[0].Status = "Completed";
            order.RmaRequests[0].Status = "Canceled";

            repository.UnitOfWork.Commit();

            //RefreshRepository(ref repository);
            order = repository.Orders.ExpandAll().Where(x => x.OrderGroupId == order.OrderGroupId).SingleOrDefault();

            Assert.NotNull(order);
            Assert.NotNull(order.RmaRequests[0]);
            Assert.Equal("Canceled", order.RmaRequests[0].Status);
        }
        public void Can_add_collection_item_without_parentid()
        {
            var order = TestOrderBuilder.BuildOrder().WithLineItemsCount(1).GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            order = repository.Orders.ExpandAll().FirstOrDefault();

            // adding new Shipment
            var newShipment = new Shipment();

            order.OrderForms[0].Shipments.Add(newShipment);

            repository.UnitOfWork.Commit();

            RefreshRepository(ref repository);
            order = repository.Orders.ExpandAll().FirstOrDefault();
            var savedShipment = order.OrderForms[0].Shipments.FirstOrDefault(x => x.ShipmentId == newShipment.ShipmentId);

            Assert.NotNull(savedShipment);
            Assert.Equal(order.OrderForms[0].OrderFormId, savedShipment.OrderFormId);
        }
        public void Can_add_collection_item_items()
        {
            var order = TestOrderBuilder.BuildOrder().WithLineItemsCount(1).GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            order = repository.Orders.ExpandAll().FirstOrDefault();

            // adding new ShipmentItem
            var item = new ShipmentItem();

            item.Quantity = 1;
            item.LineItem = order.OrderForms[0].LineItems[0];

            // adding new Shipment
            var newShipment = new Shipment();

            newShipment.ShipmentItems.Add(item);
            order.OrderForms[0].Shipments.Add(newShipment);

            repository.UnitOfWork.Commit();
        }
        [RepositoryTheory]         // fixed be setting LineItemId explicitly
        public void Can_add_shipmentitem()
        {
            var order = TestOrderBuilder.BuildOrder()
                        .WithAddresess()
                        .WithShipment()
                        .GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            RefreshRepository(ref repository);
            order = repository.Orders
                    .ExpandAll()
                    .Expand("RmaRequests/RmaReturnItems/RmaLineItems/LineItem")
                    .Expand("RmaRequests/Order")
                    .Expand("OrderForms/Shipments/OrderForm/OrderGroup")
                    .Expand("OrderForms/Shipments/ShipmentItems/LineItem")
                    .Expand("OrderForms/Shipments/ShipmentItems/Shipment/OrderForm/OrderGroup")
                    .FirstOrDefault();

            // adding new LineItem first
            var newLineItem = new LineItem
            {
                CatalogItemId   = "ItemId",
                CatalogItemCode = "ItemCode",
                Quantity        = 1,
                PlacedPrice     = 10,
                TaxTotal        = 1
            };

            order.OrderForms[0].LineItems.Add(newLineItem);

            // adding new ShipmentItem
            var item = new ShipmentItem();

            item.LineItem   = newLineItem;
            item.LineItemId = item.LineItem.LineItemId;             // this line shouldn't be necessary. But it is.
            //item.Shipment = order.OrderForms[0].Shipments[0]; // this line of code was causing exception in original	code
            order.OrderForms[0].Shipments[0].ShipmentItems.Add(item);
            repository.UnitOfWork.Commit();

            RefreshRepository(ref repository);
            order = repository.Orders
                    .ExpandAll()
                    .Expand("OrderForms/Shipments/ShipmentItems")
                    .Expand("OrderForms/LineItems")
                    .FirstOrDefault();

            Assert.True(order.OrderForms[0].LineItems.Any(x => x.LineItemId == newLineItem.LineItemId));
            Assert.True(order.OrderForms[0].Shipments[0].ShipmentItems.Any(x => x.LineItemId == newLineItem.LineItemId));
        }
        private ShoppingCart CreateCartConstant()
        {
            var          builder    = TestOrderBuilder.BuildCart();
            var          order      = builder.GetCart();
            const string customerId = "3a6e29a3-d0c9-4a9b-8207-faf957015c60";

            builder.WithAddresess()
            .WithShipmentCount(1, 123.23m)
            .WithShipmentDiscount(20.11m)
            .WithLineItemsConstant()
            .WithLineItemDiscounts(1, 5.65m)
            .WithOrderFormDiscounts(1, 50m)
            .WithCustomer(customerId);

            order.StoreId = "SampleStore";
            return(order);
        }
        private Order CreateOrder(int items = 2)
        {
            var          builder    = TestOrderBuilder.BuildOrder();
            var          order      = builder.GetOrder();
            const string customerId = "3a6e29a3-d0c9-4a9b-8207-faf957015c60";

            builder.WithAddresess()
            .WithShipment()
            .WithLineItemsCount(items)
            .WithStatus("InProgress")
            .WithCustomer(customerId)
            .WithOrderFormDiscounts(1)
            .WithLineItemDiscounts(2);

            order.StoreId = "SampleStore";
            return(order);
        }
        //[RepositoryTheory(Skip = "One or both of the ends of the relationship is in the added state.")]
        /// <summary>
        /// problem while creating the second ShipmentItem in a new Shipment.
        /// </summary>
        public void Can_create_shipment_with_2shipmentitems()
        {
            var order = TestOrderBuilder.BuildOrder()
                        .WithAddresess()
                        .WithShipment()
                        .WithLineItemsCount(2).GetOrder();

            var repository = GetRepository();

            repository.Add(order);
            repository.UnitOfWork.Commit();

            RefreshRepository(ref repository);
            order = repository.Orders.ExpandAll()
                    .Where(x => x.OrderGroupId == order.OrderGroupId)
                    .ExpandAll()
                    .Expand("RmaRequests/RmaReturnItems/RmaLineItems/LineItem")
                    .Expand("RmaRequests/Order")
                    .Expand("OrderForms/OrderGroup")
                    .Expand("OrderForms/Shipments/ShipmentItems/LineItem")
                    .SingleOrDefault();

            //adding new Shipment
            var targetShipment = new Shipment();

            //adding new ShipmentItem 1
            var movingShipmentItem = order.OrderForms[0].Shipments[0].ShipmentItems[0];

            movingShipmentItem.Quantity--;

            var targetShipmentItem = new ShipmentItem();

            targetShipmentItem.Quantity   = 1;
            targetShipmentItem.LineItemId = movingShipmentItem.LineItemId;
            targetShipmentItem.LineItem   = movingShipmentItem.LineItem;
            targetShipmentItem.ShipmentId = targetShipment.ShipmentId;
            targetShipment.ShipmentItems.Add(targetShipmentItem);

            targetShipment.ShipmentId  = targetShipment.GenerateNewKey();
            targetShipment.OrderFormId = order.OrderForms[0].OrderFormId;
            order.OrderForms[0].Shipments.Add(targetShipment);

            //adding new ShipmentItem 2
            movingShipmentItem = order.OrderForms[0].Shipments[0].ShipmentItems[1];
            movingShipmentItem.Quantity--;

            targetShipmentItem            = new ShipmentItem();
            targetShipmentItem.Quantity   = 1;
            targetShipmentItem.LineItemId = movingShipmentItem.LineItemId;
            targetShipmentItem.LineItem   = movingShipmentItem.LineItem;           // commenting out this single line makes the test to pass
            targetShipmentItem.ShipmentId = targetShipment.ShipmentId;
            targetShipment.ShipmentItems.Add(targetShipmentItem);

            repository.UnitOfWork.Commit();

            RefreshRepository(ref repository);
            order = repository.Orders.ExpandAll()
                    .Where(x => x.OrderGroupId == order.OrderGroupId)
                    .ExpandAll()
                    .Expand("RmaRequests/RmaReturnItems/RmaLineItems/LineItem")
                    .Expand("RmaRequests/Order")
                    .Expand("OrderForms/OrderGroup")
                    .Expand("OrderForms/Shipments/ShipmentItems/LineItem")
                    .SingleOrDefault();
            Assert.NotNull(order);
            Assert.Equal(2, order.OrderForms[0].Shipments.Count);
            Assert.Equal(2, order.OrderForms[0].Shipments[0].ShipmentItems.Count);
            Assert.Equal(2, order.OrderForms[0].Shipments[1].ShipmentItems.Count);
        }