Skip to content

Commit 57b35f9

Browse files
authored
Improve handling of boolean and null values in xpath methods (#88)
* increase xpath support * use single quote
1 parent 2535889 commit 57b35f9

File tree

2 files changed

+49
-11
lines changed

2 files changed

+49
-11
lines changed

src/Codeception/Util/JsonArray.php

+23-1
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,33 @@ private function arrayToXml(DOMDocument $doc, DOMNode $node, array $array): void
121121
if (is_array($value)) {
122122
$this->arrayToXml($doc, $subNode, $value);
123123
} else {
124-
$subNode->nodeValue = htmlspecialchars((string)$value);
124+
$this->setValue($subNode, $value);
125125
}
126126
}
127127
}
128128

129+
private function setValue($subNode, $value) {
130+
switch(gettype($value)) {
131+
case 'boolean':
132+
$subNode->nodeValue = $value?'true':'false';
133+
$subNode->setAttribute('type', 'boolean');
134+
break;
135+
case 'integer':
136+
case 'double':
137+
$subNode->nodeValue = (string) $value;
138+
$subNode->setAttribute('type', 'number');
139+
break;
140+
case 'NULL':
141+
$subNode->nodeValue = '';
142+
$subNode->setAttribute('type', 'null');
143+
break;
144+
default:
145+
$subNode->nodeValue = htmlspecialchars((string) $value);
146+
$subNode->setAttribute('type', 'string');
147+
break;
148+
}
149+
}
150+
129151
private function getValidTagNameForInvalidKey($key)
130152
{
131153
static $map = [];

tests/unit/Codeception/Util/JsonArrayTest.php

+26-10
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ protected function _before()
2121
public function testXmlConversion()
2222
{
2323
$this->assertStringContainsString(
24-
'<ticket><title>Bug should be fixed</title><user><name>Davert</name></user><labels></labels></ticket>',
24+
'<ticket><title type="string">Bug should be fixed</title><user><name type="string">Davert</name></user><labels type="null"></labels></ticket>',
2525
$this->jsonArray->toXml()->saveXML()
2626
);
2727
}
@@ -32,17 +32,33 @@ public function testXmlArrayConversion2()
3232
'[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},'
3333
. '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]'
3434
);
35-
$this->assertStringContainsString('<tags>wed-dev</tags>', $jsonArray->toXml()->saveXML());
35+
$this->assertStringContainsString('<tags type="string">wed-dev</tags>', $jsonArray->toXml()->saveXML());
3636
$this->assertSame(2, $jsonArray->filterByXPath('//user')->length);
3737
}
3838

3939
public function testXPathEvaluation()
4040
{
41-
$this->assertSame(true, $this->jsonArray->evaluateXPath('count(//ticket/title)>0'));
42-
$this->assertEquals(1.0 , $this->jsonArray->evaluateXPath('count(//ticket/user/name)'));
43-
$this->assertSame(true, $this->jsonArray->evaluateXPath("count(//user/name[text() = 'Davert']) > 0"));
41+
$this->assertTrue($this->jsonArray->evaluateXPath('count(//ticket/title)>0'));
42+
$this->assertEquals(1, $this->jsonArray->evaluateXPath('count(//ticket/user/name)'));
43+
$this->assertTrue($this->jsonArray->evaluateXPath("count(//user/name[text() = 'Davert']) > 0"));
4444
}
4545

46+
public function testXPathTypes()
47+
{
48+
$jsonArray = new JsonArray(
49+
'{"boolean":true, "number": -1.2780E+2, "null": null, "string": "i\'am a sentence"}'
50+
);
51+
$this->assertEquals(0, $jsonArray->evaluateXPath("count(//*[text() = 'false'])"));
52+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//boolean[text() = 'true'])"));
53+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//boolean[@type = 'boolean'])"));
54+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[text() = -127.80])"));
55+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[text() = -1.2780E+2])"));
56+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[@type = 'number'])"));
57+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//null[@type = 'null'])"));
58+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//null[text() = ''])"));
59+
$this->assertEquals(1, $jsonArray->evaluateXPath("count(//string[@type = 'string'])"));
60+
}
61+
4662
public function testXPathLocation()
4763
{
4864
$this->assertGreaterThan(0, $this->jsonArray->filterByXPath('//ticket/title')->length);
@@ -83,32 +99,32 @@ public function testConvertsBareJson()
8399
public function testInvalidXmlTag()
84100
{
85101
$jsonArray = new JsonArray('{"a":{"foo/bar":1,"":2},"b":{"foo/bar":1,"":2},"baz":2}');
86-
$expectedXml = '<a><invalidTag1>1</invalidTag1><invalidTag2>2</invalidTag2></a>'
87-
. '<b><invalidTag1>1</invalidTag1><invalidTag2>2</invalidTag2></b><baz>2</baz>';
102+
$expectedXml = '<a><invalidTag1 type="number">1</invalidTag1><invalidTag2 type="number">2</invalidTag2></a>'
103+
. '<b><invalidTag1 type="number">1</invalidTag1><invalidTag2 type="number">2</invalidTag2></b><baz type="number">2</baz>';
88104
$this->assertStringContainsString($expectedXml, $jsonArray->toXml()->saveXML());
89105
}
90106

91107
public function testConvertsArrayHavingSingleElement()
92108
{
93109
$jsonArray = new JsonArray('{"success": 1}');
94110
$expectedXml = '<?xml version="1.0" encoding="UTF-8"?>'
95-
. "\n<root><success>1</success></root>\n";
111+
. "\n<root><success type=\"number\">1</success></root>\n";
96112
$this->assertSame($expectedXml, $jsonArray->toXml()->saveXML());
97113
}
98114

99115
public function testConvertsArrayHavingTwoElements()
100116
{
101117
$jsonArray = new JsonArray('{"success": 1, "info": "test"}');
102118
$expectedXml = '<?xml version="1.0" encoding="UTF-8"?>'
103-
. "\n<root><success>1</success><info>test</info></root>\n";
119+
. "\n<root><success type=\"number\">1</success><info type=\"string\">test</info></root>\n";
104120
$this->assertSame($expectedXml, $jsonArray->toXml()->saveXML());
105121
}
106122

107123
public function testConvertsArrayHavingSingleSubArray()
108124
{
109125
$jsonArray = new JsonArray('{"array": {"success": 1}}');
110126
$expectedXml = '<?xml version="1.0" encoding="UTF-8"?>'
111-
. "\n<array><success>1</success></array>\n";
127+
. "\n<array><success type=\"number\">1</success></array>\n";
112128
$this->assertSame($expectedXml, $jsonArray->toXml()->saveXML());
113129
}
114130
}

0 commit comments

Comments
 (0)