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.xml.util.properties;
8   
9   import org.mule.DefaultMuleMessage;
10  import org.mule.api.config.MuleProperties;
11  import org.mule.api.registry.RegistrationException;
12  import org.mule.module.xml.expression.JXPathExpressionEvaluator;
13  import org.mule.module.xml.util.NamespaceManager;
14  import org.mule.tck.junit4.AbstractMuleContextTestCase;
15  import org.mule.tck.testmodels.fruit.Apple;
16  import org.mule.tck.testmodels.fruit.Banana;
17  import org.mule.tck.testmodels.fruit.FruitBowl;
18  
19  import java.net.MalformedURLException;
20  import java.util.HashMap;
21  import java.util.Map;
22  
23  import org.junit.Test;
24  
25  import static org.junit.Assert.assertEquals;
26  import static org.junit.Assert.assertNotNull;
27  import static org.junit.Assert.assertNull;
28  import static org.junit.Assert.assertTrue;
29  
30  @SuppressWarnings("deprecation") // we're testing a deprecated class
31  public class JXPathExpressionEvaluatorTestCase extends AbstractMuleContextTestCase
32  {
33      private static final String XML_USING_UNDEFINED_NAMESPACE = "<root " +
34                                                                  "xmlns:z=\"http://www.w3schools.com/furniture\">" +
35                                                                  "<z:table>" +
36                                                                  "<z:name>African Coffee Table</z:name>" +
37                                                                  "<z:width>80</z:width>" +
38                                                                  "<z:length>120</z:length>" +
39                                                                  "</z:table>" +
40                                                                  "</root>";
41  
42      @Test
43      public void testBean()
44      {
45          Apple apple = new Apple();
46          apple.wash();
47          FruitBowl payload = new FruitBowl(apple, new Banana());
48          DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
49  
50          JXPathExpressionEvaluator e = new JXPathExpressionEvaluator();
51          Object value = e.evaluate("apple/washed", msg);
52          assertNotNull(value);
53          assertTrue(value instanceof Boolean);
54          assertTrue(((Boolean) value).booleanValue());
55  
56          value = e.evaluate("bar", msg);
57          assertNull(value);
58      }
59  
60      @Test
61      public void testXmlContainingNoNameSpaces() throws MalformedURLException
62      {
63          String payload = "<?xml version=\"1.0\" ?>" +
64                           "<address>" +
65                           "<street>Orchard Road</street>" +
66                           "</address>";
67  
68          DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
69  
70          JXPathExpressionEvaluator e = new JXPathExpressionEvaluator();
71          Object value = e.evaluate("/address/street", msg);
72  
73          assertTrue(value instanceof String);
74          assertEquals("Orchard Road", (String) value);
75      }
76  
77      @Test
78      public void testXmlIfNameSpaceIsDefinedWithTheSamePrefix() throws MalformedURLException
79      {
80          String payload = "<root " +
81                           "xmlns:f=\"http://www.w3schools.com/furniture\">" +
82                           "<f:table>" +
83                           "<f:name>African Coffee Table</f:name>" +
84                           "<f:width>80</f:width>" +
85                           "<f:length>120</f:length>" +
86                           "</f:table>" +
87                           "</root>";
88  
89          DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
90  
91          JXPathExpressionEvaluator e = new JXPathExpressionEvaluator();
92          Object value = e.evaluate("//f:table/f:name", msg);
93  
94          assertTrue(value instanceof String);
95          assertEquals("African Coffee Table", (String) value);
96      }
97  
98      @Test
99      public void testXmlWithInvalidNameSpaceIfNameSpaceAliasIsUndefined() throws MalformedURLException
100     {
101         final String xpathExpression = "//f:table/f:name";
102 
103         DefaultMuleMessage msg = new DefaultMuleMessage(XML_USING_UNDEFINED_NAMESPACE, muleContext);
104 
105         JXPathExpressionEvaluator e = new JXPathExpressionEvaluator();
106         Object value = e.evaluate(xpathExpression, msg);
107         assertNull(value);
108     }
109 
110     @Test
111     public void testXmlWithInvalidNameSpaceIfNameSpaceAliasIsDefined() throws MalformedURLException, RegistrationException
112     {
113         NamespaceManager namespaceManager = new NamespaceManager();
114         Map<String, Object> namespaces = new HashMap<String, Object>();
115         namespaces.put("f", "http://www.w3schools.com/furniture");
116         namespaceManager.setNamespaces(namespaces);
117         muleContext.getRegistry().registerObject(MuleProperties.OBJECT_MULE_NAMESPACE_MANAGER, namespaceManager);
118 
119         DefaultMuleMessage msg = new DefaultMuleMessage(XML_USING_UNDEFINED_NAMESPACE, muleContext);
120 
121         JXPathExpressionEvaluator e = new JXPathExpressionEvaluator();
122         e.setMuleContext(muleContext);
123 
124         Object value = e.evaluate("//f:table/f:name", msg);
125         assertTrue(value instanceof String);
126         assertEquals("African Coffee Table", (String) value);
127     }
128 }