|
21 | 21 | import email
|
22 | 22 | from io import StringIO
|
23 | 23 | from qgis.server import QgsServer
|
24 |
| -from qgis.core import QgsMessageLog, QgsApplication |
| 24 | +from qgis.core import QgsMessageLog, QgsRenderChecker, QgsApplication |
25 | 25 | from qgis.testing import unittest
|
| 26 | +from qgis.PyQt.QtCore import QSize |
26 | 27 | from utilities import unitTestDataPath
|
27 | 28 | import osgeo.gdal
|
| 29 | +import tempfile |
| 30 | +import base64 |
28 | 31 |
|
29 | 32 | # Strip path and content length because path may vary
|
30 | 33 | RE_STRIP_UNCHECKABLE = b'MAP=[^"]+|Content-Length: \d+'
|
@@ -431,6 +434,81 @@ def test_getLegendGraphics(self):
|
431 | 434 | self.assertEqual(-1, h.find(b'Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
|
432 | 435 | self.assertNotEqual(-1, h.find(b'Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))
|
433 | 436 |
|
| 437 | + def test_getLegendGraphics_layertitle(self): |
| 438 | + """Test that does not return an exception but an image""" |
| 439 | + parms = { |
| 440 | + 'MAP': self.testdata_path + "test_project.qgs", |
| 441 | + 'SERVICE': 'WMS', |
| 442 | + 'VERSION': '1.3.0', |
| 443 | + 'REQUEST': 'GetLegendGraphic', |
| 444 | + 'FORMAT': 'image/png', |
| 445 | + #'WIDTH': '20', # optional |
| 446 | + #'HEIGHT': '20', # optional |
| 447 | + 'LAYER': u'testlayer%20èé', |
| 448 | + 'LAYERTITLE': 'TRUE', |
| 449 | + } |
| 450 | + qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.items()]) |
| 451 | + r, h = self._result(self.server.handleRequest(qs)) |
| 452 | + self._img_diff_error(r, h, "WMS_GetLegendGraphic_test", 250, QSize(10, 10)) |
| 453 | + |
| 454 | + parms = { |
| 455 | + 'MAP': self.testdata_path + "test_project.qgs", |
| 456 | + 'SERVICE': 'WMS', |
| 457 | + 'VERSION': '1.3.0', |
| 458 | + 'REQUEST': 'GetLegendGraphic', |
| 459 | + 'FORMAT': 'image/png', |
| 460 | + #'WIDTH': '20', # optional |
| 461 | + #'HEIGHT': '20', # optional |
| 462 | + 'LAYER': u'testlayer%20èé', |
| 463 | + 'LAYERTITLE': 'FALSE', |
| 464 | + } |
| 465 | + qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.items()]) |
| 466 | + r, h = self._result(self.server.handleRequest(qs)) |
| 467 | + self._img_diff_error(r, h, "WMS_GetLegendGraphic_test_layertitle_false", 250, QSize(10, 10)) |
| 468 | + |
| 469 | + def _result(self, data): |
| 470 | + headers = {} |
| 471 | + for line in data[0].decode('UTF-8').split("\n"): |
| 472 | + if line != "": |
| 473 | + header = line.split(":") |
| 474 | + self.assertEqual(len(header), 2, line) |
| 475 | + headers[str(header[0])] = str(header[1]).strip() |
| 476 | + |
| 477 | + return data[1], headers |
| 478 | + |
| 479 | + def _img_diff(self, image, control_image, max_diff, max_size_diff=QSize()): |
| 480 | + temp_image = os.path.join(tempfile.gettempdir(), "%s_result.png" % control_image) |
| 481 | + |
| 482 | + with open(temp_image, "wb") as f: |
| 483 | + f.write(image) |
| 484 | + |
| 485 | + control = QgsRenderChecker() |
| 486 | + control.setControlPathPrefix("qgis_server") |
| 487 | + control.setControlName(control_image) |
| 488 | + control.setRenderedImage(temp_image) |
| 489 | + if max_size_diff.isValid(): |
| 490 | + control.setSizeTolerance(max_size_diff.width(), max_size_diff.height()) |
| 491 | + return control.compareImages(control_image), control.report() |
| 492 | + |
| 493 | + def _img_diff_error(self, response, headers, image, max_diff=10, max_size_diff=QSize()): |
| 494 | + self.assertEqual( |
| 495 | + headers.get("Content-Type"), "image/png", |
| 496 | + "Content type is wrong: %s" % headers.get("Content-Type")) |
| 497 | + test, report = self._img_diff(response, image, max_diff, max_size_diff) |
| 498 | + |
| 499 | + with open(os.path.join(tempfile.gettempdir(), image + "_result.png"), "rb") as rendered_file: |
| 500 | + encoded_rendered_file = base64.b64encode(rendered_file.read()) |
| 501 | + message = "Image is wrong\n%s\nImage:\necho '%s' | base64 -d >%s/%s_result.png" % ( |
| 502 | + report, encoded_rendered_file.strip(), tempfile.gettempdir(), image |
| 503 | + ) |
| 504 | + |
| 505 | + with open(os.path.join(tempfile.gettempdir(), image + "_result_diff.png"), "rb") as diff_file: |
| 506 | + encoded_diff_file = base64.b64encode(diff_file.read()) |
| 507 | + message += "\nDiff:\necho '%s' | base64 -d > %s/%s_result_diff.png" % ( |
| 508 | + encoded_diff_file.strip(), tempfile.gettempdir(), image |
| 509 | + ) |
| 510 | + |
| 511 | + self.assertTrue(test, message) |
434 | 512 |
|
435 | 513 | if __name__ == '__main__':
|
436 | 514 | unittest.main()
|
0 commit comments