builder = $this->makeBuilder(array('method' => 'MultiSites_getAll')); DataTable\Manager::getInstance()->deleteAll(); } public function testRenderSuccessShouldIncludeMessage() { $response = $this->builder->renderSuccess('ok'); $this->assertEquals('', $response); } public function testRenderExceptionShouldIncludeTheMessageAndNotExceptionMessage() { $response = $this->builder->renderException("The error message", new \Exception('The other message')); $this->assertEquals('The error message', $response); } public function testRenderExceptionShouldConvertNewLinesToBr() { $response = $this->builder->renderException("The\nerror\nmessage", new \Exception('The other message')); $this->assertEquals('The
error
message', $response); } public function testRenderObjectShouldReturAnError() { $response = $this->builder->renderObject(new \stdClass()); $this->assertEquals('The API cannot handle this data structure.', $response); } public function testRenderResourceShouldReturAnError() { $response = $this->builder->renderResource(new \stdClass()); $this->assertEquals('The API cannot handle this data structure.', $response); } public function testRenderScalarShouldReturnABooleanAsIntegerWrappedInTable() { $response = $this->builder->renderScalar(true); $this->assertEquals('
value
1
', $response); } public function testRenderScalarShouldReturnAnIntegerWrappedInTable() { $response = $this->builder->renderScalar(5); $this->assertEquals('
value
5
', $response); } public function testRenderScalarShouldReturnAStringWrappedInValue() { $response = $this->builder->renderScalar('The Output'); $this->assertEquals('
value
The Output
', $response); } public function testRenderScalarShouldNotRemoveLineBreaks() { $response = $this->builder->renderScalar('The\nOutput'); $this->assertEquals('
value
The\nOutput
', $response); } public function testRenderDataTableShouldRenderABasicDataTable() { $dataTable = new DataTable(); $dataTable->addRowFromSimpleArray(array('nb_visits' => 5, 'nb_random' => 10)); $response = $this->builder->renderDataTable($dataTable); $this->assertEquals('
nb_visits nb_random
5 10
', $response); } public function testRenderDataTableShouldRenderSubtables() { $subtable = new DataTable(); $subtable->addRowFromSimpleArray(array('nb_visits' => 2, 'nb_random' => 6)); $dataTable = new DataTable(); $dataTable->addRowFromSimpleArray(array('nb_visits' => 5, 'nb_random' => 10)); $dataTable->getFirstRow()->setSubtable($subtable); $response = $this->builder->renderDataTable($dataTable); $this->assertEquals('
nb_visits nb_random _idSubtable
5 10 1
', $response); } public function testRenderDataTableShouldRenderDataTableMaps() { $map = new DataTable\Map(); $dataTable = new DataTable(); $dataTable->addRowFromSimpleArray(array('nb_visits' => 5, 'nb_random' => 10)); $dataTable2 = new DataTable(); $dataTable2->addRowFromSimpleArray(array('nb_visits' => 3, 'nb_random' => 6)); $map->addTable($dataTable, 'table1'); $map->addTable($dataTable2, 'table2'); $response = $this->builder->renderDataTable($map); $this->assertEquals('
_defaultKeyName nb_visits nb_random
table1 5 10
table2 3 6
', $response); } public function testRenderDataTableShouldRenderSimpleDataTable() { $dataTable = new DataTable\Simple(); $dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6)); $response = $this->builder->renderDataTable($dataTable); $this->assertEquals('
nb_visits nb_random
3 6
', $response); } public function testRenderDataTableShouldRenderDataTableWithComplexMetadata() { $dataTable = new DataTable\Simple(); $row = new DataTable\Row(); $row->setColumn('nb_visits', 3); $row->setColumn('nb_random', 6); $row->setMetadata('processedRows', [ new AverageTimeOnSite(), new \stdClass(), Date::factory('2016-01-01 00:00:00'), ]); $dataTable->addRow($row); $response = $this->builder->renderDataTable($dataTable); $stdClass = version_compare(PHP_VERSION, 7.3, '>=') ? "(object) array(\n )," : "stdClass::__set_state(array(\n )),"; $isPHP82orNewer = version_compare(PHP_VERSION, 8.2, '>='); $this->assertEquals('
nb_visits nb_random _metadata
3 6 \'processedRows\' => array ( 0 => ' . ($isPHP82orNewer ? '\\' : '') . 'Piwik\Plugins\CoreHome\Columns\Metrics\AverageTimeOnSite::__set_state(array( )), 1 => ' . $stdClass . ' 2 => ' . ($isPHP82orNewer ? '\\' : '') . 'Piwik\Date::__set_state(array( \'timestamp\' => 1451606400, \'timezone\' => \'UTC\', )), )
', $response); } public function testRenderArrayShouldConvertSimpleArrayToJson() { $input = array(1, 2, 5, 'string', 10); $response = $this->builder->renderArray($input); $this->assertEquals('
value
1
2
5
string
10
', $response); } public function testRenderArrayShouldRenderAnEmptyArray() { $response = $this->builder->renderArray(array()); $this->assertEquals('
', $response); } public function testRenderArrayShouldConvertAssociativeArrayToJson() { $input = array('nb_visits' => 6, 'nb_random' => 8); $response = $this->builder->renderArray($input); $this->assertEquals('
nb_visits nb_random
6 8
', $response); } public function testRenderArrayShouldConvertsIndexedAssociativeArrayToJson() { $input = array( array('nb_visits' => 6, 'nb_random' => 8), array('nb_visits' => 3, 'nb_random' => 4), ); $response = $this->builder->renderArray($input); $this->assertEquals('
nb_visits nb_random
6 8
3 4
', $response); } public function testRenderArrayShouldConvertMultiDimensionalStandardArrayToJson() { $input = array("firstElement", array( "firstElement", "secondElement", ), "thirdElement"); $actual = $this->builder->renderArray($input); $this->assertEquals('
value 1 2
firstElement - -
firstElement secondElement -
- - thirdElement
', $actual); } public function testRenderArrayShouldConvertMultiDimensionalAssociativeArrayToJson() { $this->expectException(\Exception::class); $this->expectExceptionMessage("Data structure returned is not convertible in the requested format: Only integer keys supported for array columns on base level. Unsupported string 'secondElement' found for row 'array ( 'firstElement' => 'isFirst', 'secondElement' => 'isSecond', )'."); $input = array( "firstElement" => "isFirst", "secondElement" => array( "firstElement" => "isFirst", "secondElement" => "isSecond", ), "thirdElement" => "isThird"); $this->builder->renderArray($input); } public function testRenderArrayShouldConvertMultiDimensionalIndexArrayToJson() { $this->expectException(\Exception::class); $this->expectExceptionMessage("Data structure returned is not convertible in the requested format: Multidimensional column values not supported. Found unexpected array value for column '1' in row '0': 'array ( 0 => 'firstElement', 1 => 'secondElement', )'."); $input = array(array("firstElement", array( "firstElement", "secondElement", ), "thirdElement")); $this->builder->renderArray($input); } public function testRenderArrayShouldConvertMultiDimensionalMixedArrayToJson() { $this->expectException(\Exception::class); $this->expectExceptionMessage("Data structure returned is not convertible in the requested format: Only integer keys supported for array columns on base level. Unsupported string 'thirdElement' found for row 'array ( 'firstElement' => 'isFirst', 'secondElement' => 'isSecond', )'."); $input = array( "firstElement" => "isFirst", array( "firstElement", "secondElement", ), "thirdElement" => array( "firstElement" => "isFirst", "secondElement" => "isSecond", ), ); $this->builder->renderArray($input); } private function makeBuilder($request) { return new Html($request); } }