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.module.json;
8   
9   import org.mule.DefaultMuleMessage;
10  import org.mule.api.MuleMessage;
11  import org.mule.api.expression.ExpressionRuntimeException;
12  import org.mule.routing.filters.ExpressionFilter;
13  import org.mule.tck.junit4.AbstractMuleContextTestCase;
14  import org.mule.util.IOUtils;
15  
16  import java.util.ArrayList;
17  import java.util.List;
18  
19  import org.junit.Test;
20  
21  import static org.junit.Assert.assertEquals;
22  import static org.junit.Assert.assertFalse;
23  import static org.junit.Assert.assertNull;
24  import static org.junit.Assert.assertTrue;
25  import static org.junit.Assert.fail;
26  
27  public class JsonExpressionEvaluatorTestCase extends AbstractMuleContextTestCase
28  {
29  
30      protected JsonExpressionEvaluator eval;
31      protected String evalName;
32      protected MuleMessage message;
33  
34      @Override
35      protected void doSetUp() throws Exception
36      {
37          super.doSetUp();
38          eval = getEvaluator();
39          evalName = getEvaluatorName();
40          message = new DefaultMuleMessage(IOUtils.getResourceAsString("test-data.json", getClass()),
41              muleContext);
42      }
43  
44      protected JsonExpressionEvaluator getEvaluator()
45      {
46          return new JsonExpressionEvaluator();
47      }
48  
49      protected String getEvaluatorName()
50      {
51          return "json";
52      }
53  
54      @Test
55      public void testExpressions() throws Exception
56      {
57          assertEquals("test from Mule: 6ffca02b-9d52-475e-8b17-946acdb01492", eval.evaluate("[0]/text",
58              message));
59  
60          assertEquals("Mule Test", eval.evaluate("[0]/user/name", message));
61          assertEquals("Mule Test9", eval.evaluate("[9]/'user'/name", message));
62          assertNull(eval.evaluate("[9]/user/XXX", message));
63      }
64  
65      @Test
66      public void testReturnTypes()
67      {
68          // String
69          assertEquals(String.class, eval.evaluate("[0]/user/name", message).getClass());
70          // Number
71          assertEquals(String.class, eval.evaluate("[0]/id", message).getClass());
72          // Boolean
73          assertEquals(String.class, eval.evaluate("[0]/truncated", message).getClass());
74          // Object
75          assertEquals(String.class, eval.evaluate("[0]/user", message).getClass());
76          // Array
77          assertEquals(ArrayList.class, eval.evaluate("[0]/anArray", message).getClass());
78          assertEquals(String.class, ((List) eval.evaluate("[0]/anArray", message)).get(0).getClass());
79          assertEquals(String.class, ((List) eval.evaluate("[0]/anArray", message)).get(1).getClass());
80          assertEquals(ArrayList.class, ((List) eval.evaluate("[0]/anArray", message)).get(2).getClass());
81      }
82  
83      @Test
84      public void testExpressionsUsingManager() throws Exception
85      {
86          assertEquals("test from Mule: 6ffca02b-9d52-475e-8b17-946acdb01492",
87              muleContext.getExpressionManager().evaluate("#[json:[0]/text]", message));
88  
89          assertEquals("Mule Test", muleContext.getExpressionManager().evaluate(evalName + ":[0]/user/name",
90              message));
91          assertEquals("Mule Test9", muleContext.getExpressionManager().evaluate("#[json:[9]/'user'/name]",
92              message));
93          assertNull(muleContext.getExpressionManager().evaluate(evalName + ":[9]/user/XXX", message, false));
94  
95          try
96          {
97              muleContext.getExpressionManager().evaluate(evalName + ":[9]/user/XXX", message, true);
98              fail("A value was required");
99          }
100         catch (ExpressionRuntimeException e)
101         {
102             // Expected
103         }
104     }
105 
106     @Test
107     public void testExpressionFilter() throws Exception
108     {
109         ExpressionFilter filter = new ExpressionFilter("#[json:[0]/text]");
110         filter.setMuleContext(muleContext);
111         assertTrue(filter.accept(message));
112 
113         filter.setExpression("[0]/favorited");
114         assertFalse(filter.accept(message));
115 
116         filter.setExpression("[0]/truncated");
117         assertTrue(filter.accept(message));
118 
119         filter.setExpression("[0]/source");
120         assertTrue(filter.accept(message));
121 
122         filter.setExpression("[0]/xxx");
123         assertFalse(filter.accept(message));
124     }
125 
126     @Test
127     public void testExpressionFilterWithBooleanLogic() throws Exception
128     {
129         ExpressionFilter filter = new ExpressionFilter("#[json:[0]/text]");
130         filter.setMuleContext(muleContext);
131         assertTrue(filter.accept(message));
132 
133         filter.setExpression("[0]/favorited=false");
134         assertTrue(filter.accept(message));
135 
136         filter.setExpression("[0]/truncated != true");
137         assertFalse(filter.accept(message));
138 
139         filter.setExpression("[0]/source=null");
140         assertFalse(filter.accept(message));
141 
142         filter.setExpression("[0]/source!= null");
143         assertTrue(filter.accept(message));
144 
145     }
146 
147     @Test
148     public void testExpressionFilterWithBooleanLogicWhereElementDoesNotExist() throws Exception
149     {
150         // Checks against elements that do not exist
151 
152         ExpressionFilter filter = new ExpressionFilter("#[json:[0]/xyz = null]");
153         filter.setMuleContext(muleContext);
154         assertTrue(filter.accept(message));
155 
156         filter.setExpression("[0]/xyz!= null");
157         assertFalse(filter.accept(message));
158     }
159 }