1
2
3
4
5
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")
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 }