package com.braintreegateway.util;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;
import static org.junit.Assert.*;
public class SimpleNodeWrapperTest {
@Test
public void getsHashFromSimpleXML() {
SimpleNodeWrapper node = SimpleNodeWrapper.parse("<parent><child>value</child></parent>");
String actual = StringUtils.toString(node);
assertEquals("<parent content=[<child content=[value]>]>", actual);
assertEquals("parent", node.getElementName());
}
@Test
public void parsingFullXmlDoc() {
SimpleNodeWrapper node = SimpleNodeWrapper.parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<add-on>\n" +
" <amount>100.00</amount>\n" +
" <foo nil='true'></foo>\n" +
"</add-on>");
assertEquals("<add-on content=[<amount content=[100.00]>, <foo attributes={nil: true} content=[null]>]>", StringUtils.toString(node));
}
@Test
public void parsingXmlWithListAtRoot() {
SimpleNodeWrapper node = SimpleNodeWrapper.parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<add-ons type=\"array\">\n" +
" <add-on>\n" +
" <amount>10.00</amount>\n" +
" </add-on>\n" +
"</add-ons>");
assertEquals("<add-ons attributes={type: array} content=[<add-on content=[<amount content=[10.00]>]>]>", StringUtils.toString(node));
}
@Test
public void parsingXmlWithNilValuesWithoutNilAttr() {
SimpleNodeWrapper node = SimpleNodeWrapper.parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<customer>\n" +
" <id>884969</id>\n" +
" <merchant-id>integration_merchant_id</merchant-id>\n" +
" <first-name nil=\"true\"></first-name>\n" +
" <custom-fields>\n" +
" </custom-fields>\n" +
"</customer>");
assertEquals("<customer content=[<id content=[884969]>, <merchant-id content=[integration_merchant_id]>, <first-name attributes={nil: true} content=[null]>, <custom-fields content=[]>]>", StringUtils.toString(node));
}
@Test
public void moreNestedXml() {
String xml = "<toplevel><foo type='array'><bar><greeting>hi</greeting><salutation>bye</salutation></bar><bar><greeting>hello</greeting></bar></foo></toplevel>";
SimpleNodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals("toplevel", node.getElementName());
assertEquals("<toplevel content=[<foo attributes={type: array} content=[" +
"<bar content=[<greeting content=[hi]>, <salutation content=[bye]>]>, " +
"<bar content=[<greeting content=[hello]>]>]>]>", StringUtils.toString(node));
}
@Test
public void findDot() {
NodeWrapper node = SimpleNodeWrapper.parse("<toplevel>bar</toplevel>");
assertEquals("bar", node.findString("."));
}
@Test
public void findString() {
String xml = "<toplevel><foo>bar</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals("bar", node.findString("foo"));
}
@Test
public void findStringForNull() {
String xml = "<toplevel><foo nil='true'></foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(null, node.findString("foo"));
}
@Test
public void findStringWithNoMatchingElements() {
String xml = "<toplevel><foo>bar</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(null, node.findString("blah"));
}
@Test
public void findDate() {
String xml = "<toplevel><created-at type=\"date\">2010-02-16</created-at></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
Calendar expected = Calendar.getInstance();
expected.set(2010, 1, 16);
expected.setTimeZone(TimeZone.getTimeZone("UTC"));
Calendar actual = node.findDate("created-at");
assertEquals(2010, actual.get(Calendar.YEAR));
assertEquals(Calendar.FEBRUARY, actual.get(Calendar.MONTH));
assertEquals(16, actual.get(Calendar.DAY_OF_MONTH));
assertEquals(TimeZone.getTimeZone("UTC"), actual.getTimeZone());
}
@Test
public void findDateWithNoMatchingElement() {
String xml = "<toplevel><foo>bar</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(null, node.findDate("created-at"));
}
@Test
public void findDateTime() {
String xml = "<toplevel><created-at type=\"datetime\">2010-02-16T16:32:07Z</created-at></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
Calendar expected = Calendar.getInstance();
expected.setTimeZone(TimeZone.getTimeZone("UTC"));
expected.set(2010, 1, 16, 16, 32, 7);
expected.set(Calendar.MILLISECOND, 0);
Calendar actual = node.findDateTime("created-at");
assertEquals(2010, actual.get(Calendar.YEAR));
assertEquals(Calendar.FEBRUARY, actual.get(Calendar.MONTH));
assertEquals(16, actual.get(Calendar.DAY_OF_MONTH));
assertEquals(16, actual.get(Calendar.HOUR_OF_DAY));
assertEquals(32, actual.get(Calendar.MINUTE));
assertEquals(07, actual.get(Calendar.SECOND));
assertEquals(TimeZone.getTimeZone("UTC"), actual.getTimeZone());
}
@Test
public void findDateTimeWithNoMatchingElement() {
String xml = "<toplevel><foo>bar</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(null, node.findDateTime("created-at"));
}
@Test
public void findBigDecimal() {
String xml = "<toplevel><amount>12.59</amount></toplevel>";
NodeWrapper response = SimpleNodeWrapper.parse(xml);
assertEquals(new BigDecimal("12.59"), response.findBigDecimal("amount"));
}
@Test
public void findBigDecimalWithNoMatchingElement() {
String xml = "<toplevel><amount>12.59</amount></toplevel>";
NodeWrapper response = SimpleNodeWrapper.parse(xml);
assertEquals(null, response.findBigDecimal("price"));
}
@Test
public void findInteger() {
String xml = "<toplevel><foo>4</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(new Integer(4), node.findInteger("foo"));
}
@Test
public void findIntegerWithNoMatchingElements() {
String xml = "<toplevel><foo>4</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals(null, node.findInteger("blah"));
}
@Test
public void handleXmlCharactersCorrectly() {
String xml = "<credit-card>\n" +
" <bin>510510</bin>\n" +
" <cardholder-name>Special Chars <>&"'</cardholder-name>\n" +
"</credit-card>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals("Special Chars <>&\"'", node.findString("cardholder-name"));
}
@Test
public void findAll() {
String xml = "<toplevel><foo type='array'><bar><greeting>hi</greeting></bar><bar><greeting>hello</greeting></bar></foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
List<NodeWrapper> nodes = node.findAll("foo/bar");
assertEquals(2, nodes.size());
assertEquals("hi", nodes.get(0).findString("greeting"));
assertEquals("hello", nodes.get(1).findString("greeting"));
}
@Test
public void findAllWithStar() {
String xml = "<toplevel><foo type='array'><bar><greeting>hi</greeting></bar><bar><greeting>hello</greeting></bar></foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml);
List<NodeWrapper> nodes = node.findAll("foo/*");
assertEquals(2, nodes.size());
assertEquals("hi", nodes.get(0).findString("greeting"));
assertEquals("hello", nodes.get(1).findString("greeting"));
}
@Test
public void findAllWithNoMatchingElement() {
String xml = "<toplevel></toplevel>";
assertTrue(SimpleNodeWrapper.parse(xml).findAll("foo/bar").isEmpty());
}
@Test
public void findFirst() {
String xml = "<toplevel><foo type='array'><bar><greeting>hi</greeting></bar><bar><greeting>hello</greeting></bar></foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml).findFirst("foo/bar");
assertEquals("hi", node.findString("greeting"));
}
@Test
public void findFirstWithNoMatchingElement() {
String xml = "<toplevel></toplevel>";
assertNull(SimpleNodeWrapper.parse(xml).findFirst("foo/bar"));
}
@Test
public void parameters() {
String xml = "<api-error-response>" +
" <params>\n" +
" <payment-method-token>99s6</payment-method-token>\n" +
" <id>invalid id</id>\n" +
" <plan-id>integration_trialless_plan</plan-id>\n" +
" </params>\n" +
"</api-error-response>";
SimpleNodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals("{id: invalid id, payment_method_token: 99s6, plan_id: integration_trialless_plan}",
StringUtils.toString(node.findFirst("params").getFormParameters()));
assertEquals("{params[id]: invalid id, params[payment_method_token]: 99s6, params[plan_id]: integration_trialless_plan}",
StringUtils.toString(node.getFormParameters()));
}
@Test
public void nestesParameters() {
String xml = "<api-error-response>" +
" <ps>\n" +
" <child>\n" +
" <grandchild>sonny</grandchild>\n" +
" </child>\n" +
" <id>invalid id</id>\n" +
" </ps>\n" +
"</api-error-response>";
SimpleNodeWrapper node = SimpleNodeWrapper.parse(xml);
assertEquals("{child[grandchild]: sonny, id: invalid id}",
StringUtils.toString(node.findFirst("ps").getFormParameters()));
}
@Test
public void isBlankWithBlankNode() {
String xml = "<toplevel><foo nil=\"true\"/></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml).findFirst("foo");
assertTrue(node.isBlank());
}
@Test
public void isBlankWithPresentNode() {
String xml = "<toplevel><foo>test</foo></toplevel>";
NodeWrapper node = SimpleNodeWrapper.parse(xml).findFirst("foo");
assertFalse(node.isBlank());
}
}