'OpenStreetMap Mapnik',
'Tile URL' => 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'Max zoom level' => 19
]
],
// #1.
[
[
'Tile provider' => 'OpenTopoMap',
'Tile URL' => 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
'Max zoom level' => 17
]
],
// #2.
[
[
'Tile provider' => 'Stamen Toner Lite',
'Tile URL' => 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}{r}.png',
'Max zoom level' => 20
]
],
// #3.
[
[
'Tile provider' => 'Stamen Terrain',
'Tile URL' => 'https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}{r}.png',
'Max zoom level' => 18
]
],
//#4.
[
[
'Tile provider' => 'USGS US Topo',
'Tile URL' => 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}',
'Max zoom level' => 20
]
],
// #5.
[
[
'Tile provider' => 'USGS US Imagery',
'Tile URL' => 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}',
'Max zoom level' => 20
]
],
// #6.
[
[
'Tile provider' => 'Other',
'Tile URL' => '',
'Attribution text' => '',
'Max zoom level' => ''
]
]
];
}
/**
* @dataProvider getLayoutData
*/
public function testFormAdministrationGeneralGeomaps_Layout($data) {
$this->page->login()->open('zabbix.php?action=geomaps.edit');
$form = $this->query('id:geomaps-form')->asForm()->one();
$form->fill(['Tile provider' => $data['Tile provider']]);
$form->checkValue($data);
/**
* Check form attributes only for last case.
*/
if ($data['Tile provider'] === 'Other') {
// Check dropdown options presence.
$this->assertEquals(['OpenStreetMap Mapnik', 'OpenTopoMap', 'Stamen Toner Lite', 'Stamen Terrain',
'USGS US Topo', 'USGS US Imagery', 'Other'], $form->getField('Tile provider')->asDropdown()
->getOptions()->asText()
);
// Open hintboxes and compare text.
$hintboxes = [
'Tile URL' => "The URL template is used to load and display the tile layer on geographical maps.".
"\n".
"\nExample: https://{s}.example.com/{z}/{x}/{y}{r}.png".
"\n".
"\nThe following placeholders are supported:".
"\n{s} represents one of the available subdomains;".
"\n{z} represents zoom level parameter in the URL;".
"\n{x} and {y} represent tile coordinates;".
"\n{r} can be used to add \"@2x\" to the URL to load retina tiles.",
'Attribution text' => 'Tile provider attribution data displayed in a small text box on the map.',
'Max zoom level' => 'Maximum zoom level of the map.'
];
foreach ($hintboxes as $field => $text) {
$form->getLabel($field)->query('xpath:./button[@data-hintbox]')->one()->click();
$hint = $this->query('xpath://div[@class="overlay-dialogue"]')->waitUntilPresent()->one();
$this->assertEquals($text, $hint->getText());
$hint->asOverlayDialog()->close();
}
// Check Service tab fields' maxlength.
$limits = [
'Tile URL' => 2048,
'Attribution text' => 1024,
'Max zoom level' => 10
];
foreach ($limits as $field => $max_length) {
$this->assertEquals($max_length, $form->getField($field)->getAttribute('maxlength'));
}
}
$fields = array_keys($data);
if ($data['Tile provider'] !== 'Other') {
// Take all fields except dropdown and check they are disabled.
unset($fields[0]);
foreach ($fields as $field) {
$this->assertFalse($form->getField($field)->isEnabled());
}
}
else {
foreach ($fields as $field) {
$this->assertTrue($form->getField($field)->isEnabled());
}
}
}
public function getFormData() {
return [
// #0.
[
[
'fields' => [
'Tile provider' => 'OpenStreetMap Mapnik'
],
'db' => 'OpenStreetMap.Mapnik'
]
],
// #1.
[
[
'fields' => [
'Tile provider' => 'OpenTopoMap'
],
'db' => 'OpenTopoMap'
]
],
// #2.
[
[
'fields' => [
'Tile provider' => 'Stamen Toner Lite'
],
'db' => 'Stamen.TonerLite'
]
],
// #3.
[
[
'fields' => [
'Tile provider' => 'Stamen Terrain'
],
'db' => 'Stamen.Terrain'
]
],
// #4.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other'
],
'error' => [
'Incorrect value for field "geomaps_tile_url": cannot be empty.',
'Incorrect value for field "geomaps_max_zoom": cannot be empty.'
]
]
],
// #5.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => '123',
'Max zoom level' => ''
],
'error' => 'Incorrect value for field "geomaps_max_zoom": cannot be empty.'
]
],
// #6.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => 0
],
'error' => 'Incorrect value for field "geomaps_max_zoom": value must be no less than "1".'
]
],
// #7.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => 31
],
'error' => 'Incorrect value for field "geomaps_max_zoom": value must be no greater than "30".'
]
],
// #8.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => 'aa'
],
'error' => 'Incorrect value "aa" for "geomaps_max_zoom" field.'
]
],
// #9.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => '!%:'
],
'error' => 'Incorrect value "!%:" for "geomaps_max_zoom" field.'
]
],
// #10.
[
[
'expected' => TEST_BAD,
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => -1
],
'error' => 'Incorrect value for field "geomaps_max_zoom": value must be no less than "1".'
]
],
// #11.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Max zoom level' => 29
]
]
],
// #12.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'bbb',
'Attribution text' => 'aaa',
'Max zoom level' => 20
]
]
],
// #13.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => '111',
'Attribution text' => '222',
'Max zoom level' => 1
]
]
],
// #14.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'йцу',
'Attribution text' => 'кен',
'Max zoom level' => 7
]
]
],
// #15.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => 'https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png',
'Attribution text' => 'Map memomaps.de '.
'CC-BY-SA, '.
'map data © '.
'OpenStreetMap contributors',
'Max zoom level' => 13
]
]
],
// #16.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => ' bbb ',
'Attribution text' => ' aaa ',
'Max zoom level' => 29
],
'trim' => true
]
],
// #17.
[
[
'fields' => [
'Tile provider' => 'Other',
'Tile URL' => ' bbb ',
'Attribution text' => '',
'Max zoom level' => 29
],
'trim' => true
]
]
];
}
/**
* @dataProvider getFormData
*/
public function testFormAdministrationGeneralGeomaps_Form($data) {
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
$old_hash = CDBHelper::getHash($this->sql);
}
$this->page->login()->open('zabbix.php?action=geomaps.edit');
$form = $this->query('id:geomaps-form')->waitUntilReady()->asForm()->one();
$form->fill($data['fields']);
$form->submit();
$this->page->waitUntilReady();
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
$this->assertMessage(TEST_BAD, 'Cannot update configuration', $data['error']);
// Check that DB hash is not changed.
$this->assertEquals($old_hash, CDBHelper::getHash($this->sql));
}
else {
$this->assertMessage(TEST_GOOD, 'Configuration updated');
// Check values in frontend form.
$this->page->login()->open('zabbix.php?action=geomaps.edit');
$form->invalidate();
// Remove leading and trailing spaces from data for assertion.
if (CTestArrayHelper::get($data, 'trim', false)) {
$data['fields']['Tile URL'] = trim($data['fields']['Tile URL']);
if (array_key_exists('Attribution text', $data['fields'])) {
$data['fields']['Attribution text'] = trim($data['fields']['Attribution text']);
}
}
$form->checkValue($data['fields']);
// Check db values.
if ($data['fields']['Tile provider'] === 'Other') {
$expected_db = [
'geomaps_tile_provider' => '',
'geomaps_tile_url' => $data['fields']['Tile URL'],
'geomaps_attribution' => CTestArrayHelper::get($data['fields'], 'Attribution text', ''),
'geomaps_max_zoom' => $data['fields']['Max zoom level']
];
}
else {
$expected_db = [
'geomaps_tile_provider' => $data['db'],
'geomaps_tile_url' => '',
'geomaps_attribution' => '',
'geomaps_max_zoom' => 0
];
}
$this->assertEquals($expected_db, CDBHelper::getRow('SELECT geomaps_tile_provider, geomaps_tile_url, '.
'geomaps_attribution, geomaps_max_zoom FROM config'
));
}
}
}