|
19 | 19 | from mimetools import Message
|
20 | 20 | from StringIO import StringIO
|
21 | 21 | from qgis.server import QgsServer
|
22 |
| -from qgis.core import QgsMessageLog |
| 22 | +from qgis.core import QgsMessageLog, QgsRenderChecker |
23 | 23 | from qgis.testing import unittest
|
| 24 | +from qgis.PyQt.QtCore import QSize |
24 | 25 | from utilities import unitTestDataPath
|
25 | 26 | import osgeo.gdal
|
| 27 | +import tempfile |
| 28 | +import base64 |
26 | 29 |
|
27 | 30 | # Strip path and content length because path may vary
|
28 | 31 | RE_STRIP_PATH = r'MAP=[^&]+|Content-Length: \d+'
|
@@ -383,6 +386,81 @@ def test_getLegendGraphics(self):
|
383 | 386 | self.assertEqual(-1, h.find('Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
|
384 | 387 | self.assertNotEquals(-1, h.find('Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))
|
385 | 388 |
|
| 389 | + def test_getLegendGraphics_layertitle(self): |
| 390 | + """Test that does not return an exception but an image""" |
| 391 | + parms = { |
| 392 | + 'MAP': self.testdata_path + "test%2Bproject.qgs", |
| 393 | + 'SERVICE': 'WMS', |
| 394 | + 'VERSION': '1.3.0', |
| 395 | + 'REQUEST': 'GetLegendGraphic', |
| 396 | + 'FORMAT': 'image/png', |
| 397 | + #'WIDTH': '20', # optional |
| 398 | + #'HEIGHT': '20', # optional |
| 399 | + 'LAYER': u'testlayer+èé', |
| 400 | + 'LAYERTITLE': 'TRUE', |
| 401 | + } |
| 402 | + qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.iteritems()]) |
| 403 | + r, h = self._result(self.server.handleRequest(qs)) |
| 404 | + self._img_diff_error(r, h, "WMS_GetLegendGraphic_test", 250, QSize(10, 10)) |
| 405 | + |
| 406 | + parms = { |
| 407 | + 'MAP': self.testdata_path + "test%2Bproject.qgs", |
| 408 | + 'SERVICE': 'WMS', |
| 409 | + 'VERSION': '1.3.0', |
| 410 | + 'REQUEST': 'GetLegendGraphic', |
| 411 | + 'FORMAT': 'image/png', |
| 412 | + #'WIDTH': '20', # optional |
| 413 | + #'HEIGHT': '20', # optional |
| 414 | + 'LAYER': u'testlayer+èé', |
| 415 | + 'LAYERTITLE': 'FALSE', |
| 416 | + } |
| 417 | + qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.iteritems()]) |
| 418 | + r, h = self._result(self.server.handleRequest(qs)) |
| 419 | + self._img_diff_error(r, h, "WMS_GetLegendGraphic_test_layertitle_false", 250, QSize(10, 10)) |
| 420 | + |
| 421 | + def _result(self, data): |
| 422 | + headers = {} |
| 423 | + for line in data[0].decode('UTF-8').split("\n"): |
| 424 | + if line != "": |
| 425 | + header = line.split(":") |
| 426 | + self.assertEqual(len(header), 2, line) |
| 427 | + headers[str(header[0])] = str(header[1]).strip() |
| 428 | + |
| 429 | + return data[1], headers |
| 430 | + |
| 431 | + def _img_diff(self, image, control_image, max_diff, max_size_diff=QSize()): |
| 432 | + temp_image = os.path.join(tempfile.gettempdir(), "%s_result.png" % control_image) |
| 433 | + |
| 434 | + with open(temp_image, "wb") as f: |
| 435 | + f.write(image) |
| 436 | + |
| 437 | + control = QgsRenderChecker() |
| 438 | + control.setControlPathPrefix("qgis_server") |
| 439 | + control.setControlName(control_image) |
| 440 | + control.setRenderedImage(temp_image) |
| 441 | + if max_size_diff.isValid(): |
| 442 | + control.setSizeTolerance(max_size_diff.width(), max_size_diff.height()) |
| 443 | + return control.compareImages(control_image), control.report() |
| 444 | + |
| 445 | + def _img_diff_error(self, response, headers, image, max_diff=10, max_size_diff=QSize()): |
| 446 | + self.assertEqual( |
| 447 | + headers.get("Content-Type"), "image/png", |
| 448 | + "Content type is wrong: %s" % headers.get("Content-Type")) |
| 449 | + test, report = self._img_diff(response, image, max_diff, max_size_diff) |
| 450 | + |
| 451 | + with open(os.path.join(tempfile.gettempdir(), image + "_result.png"), "rb") as rendered_file: |
| 452 | + encoded_rendered_file = base64.b64encode(rendered_file.read()) |
| 453 | + message = "Image is wrong\n%s\nImage:\necho '%s' | base64 -d >%s/%s_result.png" % ( |
| 454 | + report, encoded_rendered_file.strip(), tempfile.gettempdir(), image |
| 455 | + ) |
| 456 | + |
| 457 | + with open(os.path.join(tempfile.gettempdir(), image + "_result_diff.png"), "rb") as diff_file: |
| 458 | + encoded_diff_file = base64.b64encode(diff_file.read()) |
| 459 | + message += "\nDiff:\necho '%s' | base64 -d > %s/%s_result_diff.png" % ( |
| 460 | + encoded_diff_file.strip(), tempfile.gettempdir(), image |
| 461 | + ) |
| 462 | + |
| 463 | + self.assertTrue(test, message) |
386 | 464 |
|
387 | 465 | if __name__ == '__main__':
|
388 | 466 | unittest.main()
|
0 commit comments