Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Desportes <williamdes@wdes.fr>2021-04-23 18:48:14 +0300
committerWilliam Desportes <williamdes@wdes.fr>2021-04-23 18:48:14 +0300
commitcbd35c9fa8ff00e2913aaf33b4e461ddc58b744b (patch)
tree1fd5625d052ee12d2b2b216ec4b8048ec38990ed /test/classes
parent45aeee579a918404bfef1a0bafae128089c76f7d (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.php99
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")
+ );
+ }
}