View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.transformers.simple;
8   
9   import org.mule.DefaultMuleEvent;
10  import org.mule.DefaultMuleMessage;
11  import org.mule.api.MuleEvent;
12  import org.mule.api.MuleMessage;
13  import org.mule.api.expression.RequiredValueException;
14  import org.mule.construct.SimpleFlowConstruct;
15  import org.mule.expression.transformers.BeanBuilderTransformer;
16  import org.mule.expression.transformers.ExpressionArgument;
17  import org.mule.expression.transformers.ExpressionTransformer;
18  import org.mule.tck.junit4.FunctionalTestCase;
19  import org.mule.tck.testmodels.fruit.Apple;
20  import org.mule.tck.testmodels.fruit.Banana;
21  import org.mule.tck.testmodels.fruit.FruitBasket;
22  import org.mule.tck.testmodels.fruit.FruitBowl;
23  
24  import java.util.HashMap;
25  import java.util.List;
26  import java.util.Map;
27  
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertFalse;
32  import static org.junit.Assert.assertNotNull;
33  import static org.junit.Assert.assertNull;
34  import static org.junit.Assert.assertTrue;
35  import static org.junit.Assert.fail;
36  
37  public class ExpressionTransformerTestCase extends FunctionalTestCase
38  {
39  
40      @Override
41      protected String getConfigResources()
42      {
43          return "org/mule/test/transformers/expression-transformers-test.xml";
44      }
45  
46      @Test
47      public void testTransformerConfig() throws Exception
48      {
49          ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer");
50          assertNotNull(transformer);
51          assertNotNull(transformer.getArguments());
52          assertEquals(2, transformer.getArguments().size());
53          ExpressionArgument arg1 = transformer.getArguments().get(0);
54          assertEquals("payload", arg1.getEvaluator());
55          assertEquals("org.mule.tck.testmodels.fruit.FruitBasket", arg1.getExpression());
56          assertFalse(arg1.isOptional());
57  
58          ExpressionArgument arg2 = transformer.getArguments().get(1);
59          assertEquals("headers", arg2.getEvaluator());
60          assertEquals("foo,bar?", arg2.getExpression());
61          assertTrue(arg2.isOptional());
62      }
63  
64      @Test
65      public void testBeanBuilderTransformerConfig() throws Exception
66      {
67          BeanBuilderTransformer transformer = (BeanBuilderTransformer) muleContext.getRegistry().lookupTransformer("testTransformer3");
68          assertNotNull(transformer);
69          assertNotNull(transformer.getArguments());
70          assertEquals(3, transformer.getArguments().size());
71          ExpressionArgument arg1 = transformer.getArguments().get(0);
72          assertEquals("brand", arg1.getName());
73          assertEquals("mule", arg1.getEvaluator());
74          assertEquals("message.payload", arg1.getExpression());
75          assertFalse(arg1.isOptional());
76  
77          ExpressionArgument arg2 = transformer.getArguments().get(1);
78          assertEquals("segments", arg2.getName());
79          assertEquals("mule", arg2.getEvaluator());
80          assertEquals("message.header(SEGMENTS)", arg2.getExpression());
81          assertTrue(arg2.isOptional());
82      }
83  
84      @Test
85      public void testExecutionWithCorrectMessage() throws Exception
86      {
87          ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer");
88          Map<String, Object> props = new HashMap<String, Object>();
89          props.put("foo", "moo");
90          props.put("bar", "mar");
91  
92          MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props, muleContext);
93  
94          Object result = transformer.transform(message);
95          assertNotNull(result);
96          assertTrue(result.getClass().isArray());
97          Object o1 = ((Object[]) result)[0];
98          assertTrue(o1 instanceof FruitBasket);
99  
100         Object o2 = ((Object[]) result)[1];
101         assertTrue(o2 instanceof Map<?, ?>);
102         Map<?, ?> map = (Map<?, ?>) o2;
103         assertEquals(2, map.size());
104         assertEquals("moo", map.get("foo"));
105         assertEquals("mar", map.get("bar"));
106     }
107 
108     @Test
109     public void testExecutionWithPartialMissingOptionalParams() throws Exception
110     {
111         ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer");
112         Map<String, Object> props = new HashMap<String, Object>();
113         props.put("foo", "moo");
114 
115         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props, muleContext);
116 
117         Object result = transformer.transform(message);
118         assertNotNull(result);
119         assertTrue(result.getClass().isArray());
120         Object o1 = ((Object[]) result)[0];
121         assertTrue(o1 instanceof FruitBasket);
122 
123         Object o2 = ((Object[]) result)[1];
124         assertTrue(o2 instanceof Map<?, ?>);
125         Map<?, ?> map = (Map<?, ?>) o2;
126         assertEquals(1, map.size());
127         assertEquals("moo", map.get("foo"));
128     }
129 
130     @Test
131     public void testExecutionWithAllMissingOptionalParams() throws Exception
132     {
133         ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer");
134 
135         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), muleContext);
136 
137         Object result = transformer.transform(message);
138         assertNotNull(result);
139         assertTrue(result.getClass().isArray());
140         Object o1 = ((Object[]) result)[0];
141         assertTrue(o1 instanceof FruitBasket);
142 
143         assertNull(((Object[]) result)[1]);
144     }
145 
146     @Test
147     public void testTransformerConfigWithSingleArgument() throws Exception
148     {
149         ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer2");
150         Map<String, Object> props = new HashMap<String, Object>();
151         props.put("foo", "moo");
152         props.put("bar", "mar");
153 
154         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props, muleContext);
155 
156         Object result = transformer.transform(message);
157         assertNotNull(result);
158         assertFalse(result.getClass().isArray());
159         assertTrue(result instanceof List<?>);
160         List<?> list = (List<?>) result;
161         assertTrue(list.contains("moo"));
162         assertTrue(list.contains("mar"));
163     }
164 
165     @Test
166     public void testTransformerConfigWithSingleArgumentShortcutConfig() throws Exception
167     {
168         ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer4");
169         Map<String, Object> props = new HashMap<String, Object>();
170         props.put("foo", "moo");
171         props.put("bar", "mar");
172 
173         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props, muleContext);
174 
175         Object result = transformer.transform(message);
176         assertNotNull(result);
177         assertFalse(result.getClass().isArray());
178         assertTrue(result instanceof List<?>);
179         List<?> list = (List<?>) result;
180         assertTrue(list.contains("moo"));
181         assertTrue(list.contains("mar"));
182     }
183 
184     @Test
185     public void testTransformerConfigWithSingleArgumentShortcutConfigInFlow() throws Exception
186     {
187         SimpleFlowConstruct flow = (SimpleFlowConstruct) muleContext.getRegistry().lookupFlowConstruct("et");
188         Map<String, Object> props = new HashMap<String, Object>();
189         props.put("foo", "moo");
190         props.put("bar", "mar");
191 
192         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props,
193             muleContext);
194 
195         MuleEvent resultEvent = flow.process(new DefaultMuleEvent(message, getTestInboundEndpoint(""),
196             getTestSession(getTestService(), muleContext)));
197         assertNotNull(resultEvent);
198         assertNotNull(resultEvent.getMessage().getPayload());
199         Object payload = resultEvent.getMessage().getPayload();
200         assertFalse(payload.getClass().isArray());
201         assertTrue(payload instanceof List<?>);
202         List<?> list = (List<?>) payload;
203         assertTrue(list.contains("moo"));
204         assertTrue(list.contains("mar"));
205     }
206 
207     @Test(expected = RequiredValueException.class)
208     public void testExecutionWithInCorrectMessage() throws Exception
209     {
210         ExpressionTransformer transformer = (ExpressionTransformer) muleContext.getRegistry().lookupTransformer("testTransformer2");
211         Map<String, Object> props = new HashMap<String, Object>();
212         props.put("foo", "moo");
213 
214         MuleMessage message = new DefaultMuleMessage(new FruitBowl(new Apple(), new Banana()), props, muleContext);
215 
216         transformer.transform(message);
217         fail("Not all headers present, the transform should have failed");
218     }
219 }