static void Main(string[] args)
        {
            try
            {
                OpsServiceUri       = Settings.Default.OpsServiceUri;
                ShopsServiceUri     = Settings.Default.ShopsServiceUri;
                MinionsServiceUri   = Settings.Default.MinionsServiceUri;
                AuthoringServiceUri = Settings.Default.AuthoringServiceUri;
                SitecoreIdServerUri = Settings.Default.SitecoreIdServerUri;

                UserName = Settings.Default.UserName;
                Password = Settings.Default.Password;

                SitecoreTokenRaw = SitecoreIdServerAuth.GetToken();
                SitecoreToken    = $"Bearer {SitecoreTokenRaw}";

                var stopwatch = new Stopwatch();
                stopwatch.Start();

                System.Console.ForegroundColor = ConsoleColor.Cyan;

                if (ShouldBootstrapOnLoad)
                {
                    Bootstrapping.RunScenarios();
                    Content.RunScenarios();
                }

                if (ShouldDevOpsScenarios)
                {
                    Environments.RunScenarios();

                    Plugins.RunScenarios();

                    Entities.RunScenarios();

                    Policies.RunScenarios();

                    Caching.RunScenarios();
                }

                if (ShouldRunCatalogScenarios)
                {
                    Catalogs.RunScenarios();
                    CatalogsUX.RunScenarios();

                    Categories.RunScenarios();
                    CategoriesUX.RunScenarios();

                    SellableItems.RunScenarios();
                    SellableItemsUX.RunScenarios();
                }

                if (ShouldRunPricingScenarios)
                {
                    Pricing.RunScenarios();
                    PricingUX.RunScenarios();
                }

                if (ShouldRunPromotionsScenarios)
                {
                    Promotions.RunScenarios();
                    PromotionsUX.RunScenarios();
                    PromotionsRuntime.RunScenarios();

                    Rules.RunScenarios();

                    Coupons.RunScenarios();
                    CouponsUX.RunScenarios();
                }

                if (ShouldRunInventoryScenarios)
                {
                    Inventory.RunScenarios();
                    InventoryUX.RunScenarios();
                }

                if (ShouldRunOrdersScenarios)
                {
                    Fulfillment.RunScenarios();

                    Payments.RunScenarios();

                    Carts.RunScenarios();

                    Returns.RunScenarios();

                    OrdersUX.RunScenarios();
                    Orders.RunScenarios();

                    Shipments.RunScenarios(); // ORDERS HAVE TO BE RELEASED FOR SHIPMENTS TO GET GENERATED
                }

                if (ShouldRunCustomersScenarios)
                {
                    CustomersUX.RunScenarios();
                }

                if (ShouldRunEntitlementsScenarios)
                {
                    Entitlements.RunScenarios();
                }

                if (ShouldRunSearchScenarios)
                {
                    Search.RunScenarios();
                }

                if (ShouldRunBusinessUsersScenarios)
                {
                    ComposerUX.RunScenarios();
                    Composer.RunScenarios();
                }

                if (ShouldRunVersionScenarios)
                {
                    Versions.RunScenarios();
                }

                stopwatch.Stop();

                System.Console.WriteLine($"Test Runs Complete - {stopwatch.ElapsedMilliseconds} ms -  (Hit any key to continue)");

                if (DemoStops)
                {
                    System.Console.ReadKey();
                }
            }
            catch (Exception ex)
            {
                ConsoleExtensions.WriteErrorLine("An unexpected exception occurred.");
                ConsoleExtensions.WriteErrorLine(ex.ToString());
                System.Console.ReadKey();
            }

            System.Console.WriteLine("done.");
        }
        private static void RequestDigitalRma()
        {
            using (new SampleMethodScope())
            {
                var order   = CreateDigitalCompletedOrder();
                var orderId = order.Id;
                var lineId  = order.Lines.FirstOrDefault()?.Id;

                var result =
                    Proxy.DoCommand(
                        _context.ShopsContainer()
                        .RequestRma(
                            orderId,
                            "ConsoleWrongItem",
                            new List <RmaLineComponent>
                {
                    new RmaLineComponent
                    {
                        LineId   = lineId,
                        Quantity = 1
                    }
                }));

                result.Should().NotBeNull();
                result.Messages.Should().NotContainErrors();
                var rmaId = result.Models.OfType <Sitecore.Commerce.Core.PersistedEntityModel>().FirstOrDefault(m => m.Name.Equals(typeof(ReturnMerchandiseAuthorization).FullName))?.EntityId;
                rmaId.Should().NotBeNullOrEmpty();
                var rmaFriendlyId = result.Models.OfType <Sitecore.Commerce.Core.PersistedEntityModel>().FirstOrDefault(m => m.Name.Equals(typeof(ReturnMerchandiseAuthorization).FullName))?.EntityFriendlyId;
                rmaFriendlyId.Should().NotBeNullOrEmpty();

                var rma = GetRma(_context.ShopsContainer(), rmaId);
                rma.Status.Should().Be("RefundPending");
                rma.Lines.Should().Contain(l => l.LineId.Equals(lineId));
                rma.Order.EntityTarget.Should().Be(orderId);
                rma.ItemsReturnedDate.Should().NotBe(DateTimeOffset.MinValue);

                order = Orders.GetOrder(_context.ShopsContainer(), orderId);
                order.Should().NotBeNull();
                order.Components.OfType <OrderRmasComponent>().FirstOrDefault().Should().NotBeNull();
                order.Components.OfType <OrderRmasComponent>().FirstOrDefault()?.Returns.Should().NotBeEmpty();
                order.Components.OfType <OrderRmasComponent>()
                .FirstOrDefault()
                ?.Returns.FirstOrDefault(r => r.Rma.EntityTarget.Equals(rma.Id))
                .Should()
                .NotBeNull();
                order.Components.OfType <OrderRmasComponent>()
                .FirstOrDefault()
                ?.Returns.FirstOrDefault(r => r.Rma.EntityTarget.Equals(rma.Id))
                ?.Lines.Should()
                .NotBeEmpty();
                order.Components.OfType <OrderRmasComponent>()
                .FirstOrDefault()
                ?.Returns.FirstOrDefault(r => r.Rma.EntityTarget.Equals(rma.Id))
                ?.Lines.Count.Should()
                .Be(rma.Lines.Count);
                order.Components.OfType <OrderRmasComponent>()
                .FirstOrDefault()
                ?.Returns.FirstOrDefault(r => r.Rma.EntityTarget.Equals(rma.Id))
                ?.Lines.Should()
                .Contain(rma.Lines.Select(l => l.LineId));
            }
        }
        private static void OnHoldScenarios()
        {
            using (new SampleMethodScope())
            {
                var jeff      = new AnonymousCustomerJeff();
                var container = jeff.Context.ShopsContainer();

                var orderId = Scenarios.SimplePhysical2Items.Run(jeff.Context);
                orderId.Should().NotBeNull();

                // hold order
                HoldOrder(orderId);

                // Get an Order Master view
                var orderMaster = Proxy.GetEntityView(container, orderId, "Master", string.Empty, string.Empty);

                // Adjustments
                var adjustments = orderMaster.ChildViews.FirstOrDefault(p => p.Name == "Adjustments") as EntityView;
                adjustments.Should().NotBeNull();
                adjustments.ChildViews.Count.Should().NotBe(0);
                var adjustment = adjustments.ChildViews[0] as EntityView;
                adjustment.DisplayName.Should().Be("Adjustment");
                adjustment.Properties.FirstOrDefault(p => p.Name == "Adjustment")?.Value.Should().NotBeEmpty();
                adjustment.Properties.FirstOrDefault(p => p.Name == "Type")?.Value.Should().NotBeEmpty();

                // Messages
                var messages = orderMaster.ChildViews.FirstOrDefault(p => p.Name == "Messages") as EntityView;
                messages.Should().NotBeNull();
                messages.ChildViews.Count.Should().NotBe(0);
                var message = messages.ChildViews[0] as EntityView;
                message.DisplayName.Should().Be("Message");
                message.Properties.FirstOrDefault(p => p.Name == "Code")?.Value.Should().NotBeEmpty();
                message.Properties.FirstOrDefault(p => p.Name == "Text")?.Value.Should().NotBeEmpty();

                // Edit line
                var lines = orderMaster.ChildViews.FirstOrDefault(p => p.Name == "Lines") as EntityView;
                lines?.Policies.OfType <ActionsPolicy>()
                .First()
                .Actions.First(p => p.Name == "AddLineItem")
                .IsEnabled.Should()
                .Be(true);
                var line   = lines?.ChildViews.First() as EntityView;
                var itemId = line?.Properties.FirstOrDefault(p => p.Name == "ItemId")?.Value;
                var editLineItemRequest = Proxy.GetEntityView(
                    container,
                    orderId,
                    "EditLineItem",
                    "EditLineItem",
                    itemId);
                editLineItemRequest.Properties.First(p => p.Name == "Quantity").Value = "2";
                var actionResult = Proxy.GetValue(container.DoAction(editLineItemRequest));
                actionResult.ResponseCode.Should().Be("Ok");
                var totals = actionResult.Models.OfType <Sitecore.Commerce.Plugin.Carts.Totals>().FirstOrDefault();
                totals.Should().NotBeNull();

                // add payment
                AddPayment_Federated(totals.GrandTotal.Amount, orderId);

                // Commit the OnHold Order
                CommitOnHoldOrder(orderId);

                var order = Orders.GetOrder(container, orderId);
                order.Status.Should().Be("Pending");

                orderId = Scenarios.SimplePhysical2Items.Run(jeff.Context);
                orderId.Should().NotBeNull();

                // hold order
                HoldOrder(orderId);

                order  = Proxy.GetValue(container.Orders.ByKey(orderId).Expand("Components"));
                totals = order.Totals;

                // Void payment
                VoidPayment_Federated(orderId);

                // add payment
                AddPayment_Federated(totals.GrandTotal.Amount, orderId);

                // Commit the OnHold Order
                CommitOnHoldOrder(orderId);

                order = Orders.GetOrder(container, orderId);
                order.Status.Should().Be("Pending");
            }
        }
        public static void ReturnedItemReceived(
            Engine.Container container,
            string rmaFriendlyId,
            string orderId,
            string lineId)
        {
            var result = Proxy.DoCommand(container.ReturnedItemReceived(rmaFriendlyId));

            result.Should().NotBeNull();
            result.Messages.Should().NotContainErrors();
            var rmaId = result.Models.OfType <Sitecore.Commerce.Core.PersistedEntityModel>().FirstOrDefault(m => m.Name.Equals(typeof(ReturnMerchandiseAuthorization).FullName))?.EntityId;

            rmaId.Should().NotBeNullOrEmpty();

            var rma = GetRma(container, rmaId);

            rma.Status.Should().Be("RefundPending");
            rma.ItemsReturnedDate.Should().BeCloseTo(DateTimeOffset.UtcNow, 5000);

            var order = Orders.GetOrder(container, orderId);

            order.Should().NotBeNull();
            order.Components.OfType <OrderRmasComponent>().FirstOrDefault().Should().NotBeNull();
            order.Components.OfType <OrderRmasComponent>().FirstOrDefault()?.Returns.Should().NotBeEmpty();
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId)).Should().NotBeNull();
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .Any()
            .Should()
            .BeTrue();
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .FirstOrDefault()
            ?.Returns.Should()
            .NotBeEmpty();
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .FirstOrDefault()
            ?.Returns.Count.Should()
            .Be(order.Components.OfType <OrderRmasComponent>().FirstOrDefault()?.Returns.Count);
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .FirstOrDefault()
            ?.Returns.OrderByDescending(r => r.ReturnedDate)
            .FirstOrDefault()
            .Should()
            .NotBeNull();
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .FirstOrDefault()
            ?.Returns.OrderByDescending(r => r.ReturnedDate)
            .FirstOrDefault()
            ?.Quantity.Should()
            .Be(rma.Lines.FirstOrDefault()?.Quantity);
            order.Lines.FirstOrDefault(l => l.Id.Equals(lineId))
            ?.CartLineComponents.OfType <ItemReturnedComponent>()
            .FirstOrDefault()
            ?.Returns.OrderByDescending(r => r.ReturnedDate)
            .FirstOrDefault()
            ?.ReturnedDate.Should()
            .BeCloseTo(DateTimeOffset.UtcNow, 5000);
        }