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.xml.filters;
8   
9   import org.mule.DefaultMuleMessage;
10  import org.mule.api.MuleContext;
11  import org.mule.tck.junit4.AbstractMuleTestCase;
12  
13  import java.io.InputStream;
14  import java.util.HashMap;
15  
16  import javax.xml.parsers.DocumentBuilderFactory;
17  import javax.xml.xpath.XPathFactory;
18  
19  import org.junit.Test;
20  import org.mockito.Mockito;
21  import org.w3c.dom.Document;
22  import org.w3c.dom.Node;
23  
24  import static org.junit.Assert.assertEquals;
25  import static org.junit.Assert.assertFalse;
26  import static org.junit.Assert.assertNotNull;
27  import static org.junit.Assert.assertSame;
28  import static org.junit.Assert.assertTrue;
29  
30  /**
31   * @author Ryan Heaton
32   */
33  public class XPathFilterTestCase extends AbstractMuleTestCase
34  {
35  
36      /**
37       * tests accepting the mule message.
38       */
39      @Test
40      public void testAcceptMessage() throws Exception
41      {
42          final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
43          MuleContext muleContext = Mockito.mock(MuleContext.class);
44          DefaultMuleMessage message = new DefaultMuleMessage(null, muleContext);
45          XPathFilter filter = new XPathFilter()
46          {
47              @Override
48              public Node toDOMNode(Object src) throws Exception
49              {
50                  return document;
51              }
52  
53              @Override
54              protected boolean accept(Node node)
55              {
56                  return node == document;
57              }
58          };
59  
60          assertFalse("shouldn't accept a message if no payload is set.", filter.accept(message));
61          message.setPayload(new Object());
62          filter.setPattern("/some/pattern = null");
63          assertTrue(filter.accept(message));
64          assertEquals("null", filter.getExpectedValue());
65          assertEquals("/some/pattern", filter.getPattern().trim());
66          assertSame(document, message.getPayload());
67          message.setPayload(new Object());
68          filter.setExpectedValue(null);
69          assertTrue(filter.accept(message));
70          assertEquals("true", filter.getExpectedValue());
71          assertEquals("/some/pattern", filter.getPattern().trim());
72          assertSame(document, message.getPayload());
73      }
74  
75      /**
76       * tests accepting a node.
77       */
78      @Test
79      public void testAcceptNode() throws Exception
80      {
81          InputStream testXml = getClass().getResourceAsStream("/test.xml");
82          assertNotNull(testXml);
83          XPathFilter filter = new XPathFilter();
84  
85          filter.setXpath(XPathFactory.newInstance().newXPath());
86  
87          filter.setPattern("/some/unknown/path");
88          filter.setExpectedValue("bogus");
89          filter.initialise();
90          DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
91          builderFactory.setNamespaceAware(true);
92          Document document = builderFactory.newDocumentBuilder().parse(testXml);
93          assertFalse("shouldn't have accepted a null evaluation when expected value isn't null.",
94              filter.accept(document));
95          filter.setExpectedValue("null");
96          assertTrue(filter.accept(document));
97          filter.setPattern("test/some/in");
98          assertFalse(filter.accept(document));
99          filter.setExpectedValue("another");
100         assertTrue(filter.accept(document));
101     }
102 
103     /**
104      * tests accepting a node.
105      */
106     @Test
107     public void testAcceptSoapNode() throws Exception
108     {
109         InputStream soapEnvelope = getClass().getResourceAsStream("/request.xml");
110         assertNotNull(soapEnvelope);
111         XPathFilter filter = new XPathFilter();
112 
113         filter.setXpath(XPathFactory.newInstance().newXPath());
114 
115         filter.setPattern("/soap:Envelope/soap:Body/mule:echo/mule:echo");
116         filter.setExpectedValue("Hello!");
117         HashMap<String, String> prefix2Namespace = new HashMap<String, String>();
118         prefix2Namespace.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
119         prefix2Namespace.put("mule", "http://simple.component.mule.org/");
120         filter.setNamespaces(prefix2Namespace);
121         filter.initialise();
122         DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
123         builderFactory.setNamespaceAware(true);
124         Document envDoc = builderFactory.newDocumentBuilder().parse(soapEnvelope);
125         assertTrue(filter.accept(envDoc));
126     }
127 
128 }