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.xml;
8   
9   import org.mule.module.xml.transformer.JXPathExtractor;
10  import org.mule.tck.junit4.AbstractMuleContextTestCase;
11  
12  import java.util.List;
13  
14  import org.dom4j.Node;
15  import org.junit.Test;
16  
17  import static org.junit.Assert.assertEquals;
18  import static org.junit.Assert.assertNotNull;
19  import static org.junit.Assert.assertTrue;
20  
21  public class JXPathExtractorTestCase extends AbstractMuleContextTestCase
22  {
23  
24      protected static final String TEST_XML_MULTI_RESULTS = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
25                                                             + "<root>" + "<node>value1</node>"
26                                                             + "<node>value2</node>" + "<node>value3</node>"
27                                                             + "</root>";
28  
29      protected static final String TEST_XML_MULTI_NESTED_RESULTS = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
30                                                                    + "<root>"
31                                                                    + "<node>"
32                                                                    + "<subnode1>val1</subnode1>"
33                                                                    + "<subnode2>val2</subnode2>"
34                                                                    + "</node>"
35                                                                    + "<node>"
36                                                                    + "<subnode1>val3</subnode1>"
37                                                                    + "<subnode2>val4</subnode2>"
38                                                                    + "</node>"
39                                                                    + "</root>";
40  
41      protected static final String TEST_XML_SINGLE_RESULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
42                                                             + "<root>" + "<node>value1</node>" + "</root>";
43  
44      @Test
45      public void testSingeResult() throws Exception
46      {
47          final JXPathExtractor extractor = createObject(JXPathExtractor.class);
48          final String expression = "/root/node";
49          extractor.setExpression(expression);
50          // just make code coverage tools happy
51          assertEquals("Wrong expression returned.", expression, extractor.getExpression());
52          final Object objResult = extractor.transform(TEST_XML_SINGLE_RESULT);
53          assertNotNull(objResult);
54          String result = (String)objResult;
55          assertEquals("Wrong value extracted.", "value1", result);
56      }
57  
58      @Test
59      public void testMultipleResults() throws Exception
60      {
61          JXPathExtractor extractor = createObject(JXPathExtractor.class);
62          extractor.setExpression("/root/node");
63          extractor.setSingleResult(false);
64          final Object objResult = extractor.transform(TEST_XML_MULTI_RESULTS);
65          assertNotNull(objResult);
66          List results = (List)objResult;
67          assertEquals("Wrong number of results returned.", 3, results.size());
68          assertEquals("Wrong value returned.", "value1", results.get(0));
69          assertEquals("Wrong value returned.", "value2", results.get(1));
70          assertEquals("Wrong value returned.", "value3", results.get(2));
71      }
72  
73      @Test
74      public void testMultipleResultsAsNode() throws Exception
75      {
76          JXPathExtractor extractor = createObject(JXPathExtractor.class);
77          extractor.setExpression("/root/node");
78          extractor.setSingleResult(false);
79          extractor.setOutputType(JXPathExtractor.OUTPUT_TYPE_NODE);
80          
81          final Object objResult = extractor.transform(TEST_XML_MULTI_RESULTS);
82          assertNotNull(objResult);
83          List results = (List)objResult;
84          assertEquals("Wrong number of results returned.", 3, results.size());
85          assertTrue(results.get(0) instanceof Node);
86      }
87      /**
88       * This xpath expression will internally have DefaultText returned, test there
89       * are no ClassCastExceptions.
90       */
91      @Test
92      public void testMultipleResultsNested() throws Exception
93      {
94          JXPathExtractor extractor = createObject(JXPathExtractor.class);
95          extractor.setExpression("/root/node[*]/*/text()");
96          extractor.setSingleResult(false);
97          final Object objResult = extractor.transform(TEST_XML_MULTI_NESTED_RESULTS);
98          assertNotNull(objResult);
99          List results = (List)objResult;
100         assertEquals("Wrong number of results returned.", 4, results.size());
101         assertEquals("Wrong value returned.", "val1", results.get(0));
102         assertEquals("Wrong value returned.", "val2", results.get(1));
103         assertEquals("Wrong value returned.", "val3", results.get(2));
104         assertEquals("Wrong value returned.", "val4", results.get(3));
105     }
106 
107 }