diff options
author | William Desportes <williamdes@wdes.fr> | 2021-04-23 18:48:14 +0300 |
---|---|---|
committer | William Desportes <williamdes@wdes.fr> | 2021-04-23 18:48:14 +0300 |
commit | cbd35c9fa8ff00e2913aaf33b4e461ddc58b744b (patch) | |
tree | 1fd5625d052ee12d2b2b216ec4b8048ec38990ed /test/classes | |
parent | 45aeee579a918404bfef1a0bafae128089c76f7d (diff) |
Ref #16847 - Fix JSON export code duplicated and not following rules in raw query export mode
Signed-off-by: William Desportes <williamdes@wdes.fr>
Diffstat (limited to 'test/classes')
-rw-r--r-- | test/classes/Plugins/Export/ExportJsonTest.php | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/test/classes/Plugins/Export/ExportJsonTest.php b/test/classes/Plugins/Export/ExportJsonTest.php index 2d6edd1199..4c12f7451b 100644 --- a/test/classes/Plugins/Export/ExportJsonTest.php +++ b/test/classes/Plugins/Export/ExportJsonTest.php @@ -340,4 +340,103 @@ class ExportJsonTest extends AbstractTestCase $this->object->exportData('db', 'tbl', "\n", 'example.com', 'SELECT') ); } + + public function testExportRawComplexData(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $flags = []; + $normalString = new stdClass(); + $normalString->blob = false; + $normalString->numeric = false; + $normalString->type = 'string'; + $normalString->name = 'f1'; + $normalString->charsetnr = 33; + $normalString->length = 20; + $flags[] = $normalString; + $binaryField = new stdClass(); + $binaryField->blob = false; + $binaryField->numeric = false; + $binaryField->type = 'string'; + $binaryField->name = 'f1'; + $binaryField->charsetnr = 63; + $binaryField->length = 20; + $flags[] = $binaryField; + $textField = new stdClass(); + $textField->blob = false; + $textField->numeric = false; + $textField->type = 'blob'; + $textField->name = 'f1'; + $textField->charsetnr = 23; + $textField->length = 20; + $flags[] = $textField; + $blobField = new stdClass(); + $blobField->blob = false; + $blobField->numeric = false; + $blobField->type = 'blob'; + $blobField->name = 'f1'; + $blobField->charsetnr = 63; + $blobField->length = 20; + $flags[] = $blobField; + + $dbi->expects($this->once()) + ->method('getFieldsMeta') + ->with(null) + ->will($this->returnValue($flags)); + + $dbi->expects($this->once()) + ->method('numFields') + ->with(null) + ->will($this->returnValue(4)); + + $dbi->expects($this->exactly(4)) + ->method('fieldName') + ->withConsecutive( + [null, 0], + [null, 1], + [null, 2], + [null, 3] + ) + ->willReturnOnConsecutiveCalls( + 'f1', + 'f2', + 'f3', + 'f4' + ); + + $dbi->expects($this->exactly(4)) + ->method('fetchRow') + ->withConsecutive( + [null], + [null], + [null], + [null] + ) + ->willReturnOnConsecutiveCalls( + // normalString binaryField textField blobField + ['"\'"><iframe onload=alert(1)>шеллы', '0x12346857fefe', "My awesome\nText", '0xaf1234f68c57fefe'], + [null, null, null, null], + ['', '0x1', 'шеллы', '0x2'], + null// No more data + ); + + $GLOBALS['dbi'] = $dbi; + + $this->expectOutputString( + '{"type":"raw","data":' + . "\n[\n" + . '{"f1":"\"\'\"><iframe onload=alert(1)>\u0448\u0435\u043b\u043b\u044b",' + . '"f2":"0x3078313233343638353766656665",' + . '"f3":"My awesome\nText","f4":"0x307861663132333466363863353766656665"},' . "\n" + . '{"f1":null,"f2":null,"f3":null,"f4":null},' . "\n" + . '{"f1":"","f2":"0x307831","f3":"\u0448\u0435\u043b\u043b\u044b","f4":"0x307832"}' . "\n" + . "]\n}\n" + ); + + $this->assertTrue( + $this->object->exportRawQuery('example.com', 'SELECT', "\n") + ); + } } |