public void CanCreateSalesOrder()
        {
            using (var context = new SPEmulationContext(Settings.Default.IsolationLevel, Settings.Default.Url))
            {
                var salesOrderList = context.GetOrCreateList(
                    SalesOrderListRepository.SalesOrderListName,
                    SPListTemplateType.GenericList,
                    "OrderDate", "Customer", "Status");

                var orderLinesList = context.GetOrCreateList(
                    SalesOrderListRepository.OrderLinesListName,
                    SPListTemplateType.GenericList,
                    "SalesOrder", "Price", "Quantity");

                var repository = new SalesOrderListRepository();

                var customer = new Customer
                {
                    CustomerId = 2,
                    Name = "Customer 2"
                };

                var order = new SalesOrder
                {
                    SalesOrderId = 0,
                    Customer = customer,
                    OrderDate = DateTime.Today,
                    Status = OrderStatus.New
                };


                order.Lines.Add(new OrderLine
                {
                    Product = "Product 1",
                    Quantity = 5,
                    Price = 5.5
                });

                order.Lines.Add(new OrderLine
                {
                    Product = "Product 2",
                    Quantity = 2,
                    Price = 106.5
                });

                int salesOrderCount = salesOrderList.ItemCount;
                int orderLineCount = orderLinesList.ItemCount;

                repository.Add(order);

                Assert.AreEqual<int>(salesOrderCount + 1, salesOrderList.Items.Count);
                Assert.AreEqual<int>(orderLineCount + 2, orderLinesList.Items.Count);
            }
        }
        public void CanGetSalesOrderByCustomer()
        {
            using (var context = new SPEmulationContext(Settings.Default.IsolationLevel, Settings.Default.Url))
            {
                var solutionRelativePath = @"..\..\..\SalesOrderPortalSolution\Lists\";
                var salesOrderList = context.GetOrCreateList(solutionRelativePath + "SalesOrders\\Elements.xml", solutionRelativePath + "SalesOrders\\schema.xml");
                var orderLinesList = context.GetOrCreateList(solutionRelativePath + "OrderLines\\Elements.xml", solutionRelativePath + "OrderLines\\schema.xml");

                var repository = new SalesOrderListRepository();

                // CAML not yet supported. Fake queries.
                if (context.IsolationLevel == IsolationLevel.Fake)
                {
                    new ShimSPList(salesOrderList)
                    {
                        GetItemsSPQuery = (q) =>
                            {
                                var shim = new ShimSPListItemCollection();
                                shim.Bind(salesOrderList.Items.Cast<SPListItem>().Where(i => (int)i["Customer"] == 1));

                                return shim.Instance;
                            }
                    };

                    new ShimSPList(orderLinesList)
                    {
                        GetItemsSPQuery = (q) =>
                        {
                            var shim = new ShimSPListItemCollection();
                            var match = Regex.Match(q.Query, "<FieldRef Name='SalesOrder' LookupId='TRUE' /><Value Type='Lookup' >.*?</Value>");
                            var lookupId = int.Parse(match.Value.Replace("<FieldRef Name='SalesOrder' LookupId='TRUE' /><Value Type='Lookup' >", "").Replace("</Value>", ""));
                            shim.Bind(orderLinesList.Items.Cast<SPListItem>().Where(i => (int)i["SalesOrder"] == 1));

                            return shim.Instance;
                        }
                    };
                }

                var customer1 = new Customer
                {
                    CustomerId = 1,
                    Name = "Customer 1"
                };

                var salesOrdersOfCustomer1 = repository.GetByCustomer(customer1);
                Assert.AreEqual<int>(2, salesOrdersOfCustomer1.Count());
                Assert.AreEqual<int>(2, salesOrdersOfCustomer1.First().Lines.Count);
            }
        }