public void Can_create_marketing_dynamicpromotion_using_api()
		{
			var marketingController = GetMarketingController(GetPromotionExtensionManager());

			webModel.Promotion promotion = null;
			var promoResult = (marketingController.GetPromotionById("CartFiveDiscount") as OkNegotiatedContentResult<webModel.Promotion>);
			if (promoResult != null)
			{
				promotion = promoResult.Content;
			}
			if (promotion == null)
			{
				promotion = (marketingController.GetNewDynamicPromotion() as OkNegotiatedContentResult<webModel.Promotion>).Content;

				promotion.Description = "Buy at $100 and get a 5% discount";
				promotion.Name = "CartFiveDiscount";
				promotion.Id = "CartFiveDiscount";

				var expressionTree = promotion.DynamicExpression as DynamicExpression;
				
				//Curreny is USD
				var currencyExpression = expressionTree.FindAvailableExpression<ConditionCurrencyIs>();
				currencyExpression.Currency = "USD";
				expressionTree.Children.Add(currencyExpression);
				//Condition: Cart subtotal great or equal that 100$
				var subtotalExpression = expressionTree.FindAvailableExpression<ConditionCartSubtotalLeast>();
				subtotalExpression.SubTotal = 100;
				expressionTree.Children.Add(subtotalExpression);
				//Reward: Get 5% whole cart discount
				var rewardExpr = expressionTree.FindAvailableExpression<RewardItemGetOfRel>();
				rewardExpr.Amount = 0.5m;
				expressionTree.Children.Add(rewardExpr);

				promotion = (marketingController.CreatePromotion(promotion) as OkNegotiatedContentResult<webModel.Promotion>).Content;
			}

            var cacheManager = new Moq.Mock<ICacheManager<object>>();
            var marketingEval = new DefaultPromotionEvaluatorImpl(GetMarketingService(), cacheManager.Object);
			var context = GetPromotionEvaluationContext();
			var result = marketingEval.EvaluatePromotion(context);
		}
        public void Can_extend_marketing_promotion_expressiontree_and_create_new_dynamicpromotion()
		{
			var extensionManager = GetPromotionExtensionManager();

			//Register custom dynamic expression in main expression tree now it should be availabe for ui in expression builder
			var blockExpression = extensionManager.PromotionDynamicExpressionTree as DynamicExpression;
		    var blockCatalogCondition = blockExpression.FindChildrenExpression<BlockCatalogCondition>();
			blockCatalogCondition.AvailableChildren.Add(new ConditionItemWithTag());

			var marketingController = GetMarketingController(extensionManager);

			//Create custom promotion
			webModel.Promotion promotion = null;
			var promoResult = (marketingController.GetPromotionById("TaggedProductDiscount") as OkNegotiatedContentResult<webModel.Promotion>);
			if (promoResult != null)
			{
				promotion = promoResult.Content;
			}
			if (promotion == null)
			{
				promotion = (marketingController.GetNewDynamicPromotion() as OkNegotiatedContentResult<webModel.Promotion>).Content;

				promotion.Description = "Buy all product with tag '#FOOTBAL' with 7% discount";
				promotion.Name = "TaggedProductDiscount";
				promotion.Id = "TaggedProductDiscount";

				blockExpression = promotion.DynamicExpression as DynamicExpression;
				blockCatalogCondition = blockExpression.FindChildrenExpression<BlockCatalogCondition>();
				var blockReward = blockExpression.FindChildrenExpression<RewardBlock>();

				var conditionExpr = blockCatalogCondition.FindAvailableExpression<ConditionItemWithTag>();
				conditionExpr.Tags = new string[] { "#FOOTBAL" };
				blockCatalogCondition.Children.Add(conditionExpr);

				var rewardExpr = blockReward.FindAvailableExpression<RewardItemGetOfRel>();
				rewardExpr.Amount = 0.7m;
				blockReward.Children.Add(rewardExpr);
			
				promotion = (marketingController.CreatePromotion(promotion) as OkNegotiatedContentResult<webModel.Promotion>).Content;
			}

            var cacheManager = new Moq.Mock<ICacheManager<object>>();
            var marketingEval = new DefaultPromotionEvaluatorImpl(GetMarketingService(), cacheManager.Object);
			var context = GetPromotionEvaluationContext();
			context.PromoEntries.First().Attributes["tag"] = "#FOOTBAL";
			var result = marketingEval.EvaluatePromotion(context);
		}