Use standard render test reporting mechanism in server tests

This commit is contained in:
Nyall Dawson 2024-02-03 10:05:15 +10:00
parent 2d71bb56d7
commit bf4bd47419
3 changed files with 29 additions and 34 deletions

View File

@ -30,7 +30,7 @@ import sys
import tempfile import tempfile
import unittest import unittest
from pathlib import Path from pathlib import Path
from typing import Optional, Tuple from typing import Optional, Tuple, Union
from warnings import warn from warnings import warn
from qgis.PyQt.QtCore import ( from qgis.PyQt.QtCore import (
@ -181,7 +181,7 @@ class QgisTestCase(unittest.TestCase):
control_name=None, control_name=None,
color_tolerance: int = 2, color_tolerance: int = 2,
allowed_mismatch: int = 20, allowed_mismatch: int = 20,
size_tolerance: Optional[int] = None, size_tolerance: Optional[Union[int, QSize]] = None,
expect_fail: bool = False, expect_fail: bool = False,
control_path_prefix: Optional[str] = None, control_path_prefix: Optional[str] = None,
use_checkerboard_background: bool = False use_checkerboard_background: bool = False
@ -213,6 +213,10 @@ class QgisTestCase(unittest.TestCase):
checker.setColorTolerance(color_tolerance) checker.setColorTolerance(color_tolerance)
checker.setExpectFail(expect_fail) checker.setExpectFail(expect_fail)
if size_tolerance is not None: if size_tolerance is not None:
if isinstance(size_tolerance, QSize):
if size_tolerance.isValid():
checker.setSizeTolerance(size_tolerance.width(), size_tolerance.height())
else:
checker.setSizeTolerance(size_tolerance, size_tolerance) checker.setSizeTolerance(size_tolerance, size_tolerance)
result = checker.runTest(name, allowed_mismatch) result = checker.runTest(name, allowed_mismatch)

View File

@ -47,7 +47,7 @@ from qgis.core import (
QgsMultiRenderChecker, QgsMultiRenderChecker,
) )
from qgis.PyQt.QtCore import QSize from qgis.PyQt.QtCore import QSize
from qgis.PyQt.QtGui import QColor from qgis.PyQt.QtGui import QColor, QImage
from qgis.server import ( from qgis.server import (
QgsBufferServerRequest, QgsBufferServerRequest,
QgsBufferServerResponse, QgsBufferServerResponse,
@ -209,11 +209,6 @@ class QgsServerTestBase(QgisTestCase):
@classmethod @classmethod
def store_reference(self, reference_path, response): def store_reference(self, reference_path, response):
"""Utility to store reference files""" """Utility to store reference files"""
# Normally this is false
if not self.regenerate_reference:
return
# Store the output for debug or to regenerate the reference documents: # Store the output for debug or to regenerate the reference documents:
f = open(reference_path, 'wb+') f = open(reference_path, 'wb+')
f.write(response) f.write(response)
@ -229,7 +224,7 @@ class QgsServerTestBase(QgisTestCase):
return data[1], headers return data[1], headers
def _img_diff(self, image, control_image, max_diff, max_size_diff=QSize(), outputFormat='PNG'): def _img_diff(self, image: str, control_image, max_diff, max_size_diff=QSize(), outputFormat='PNG') -> bool:
if outputFormat == 'PNG': if outputFormat == 'PNG':
extFile = 'png' extFile = 'png'
@ -246,17 +241,20 @@ class QgsServerTestBase(QgisTestCase):
f.write(image) f.write(image)
if outputFormat != 'PNG': if outputFormat != 'PNG':
return (True, "QgsRenderChecker can only be used for PNG") # TODO fix this, it's not actually testing anything..!
return True
control = QgsMultiRenderChecker() return self.image_check(
control.setControlPathPrefix("qgis_server") control_image,
control.setControlName(control_image) control_image,
control.setRenderedImage(temp_image) QImage(temp_image),
if max_size_diff.isValid(): control_image,
control.setSizeTolerance(max_size_diff.width(), max_size_diff.height()) allowed_mismatch=max_diff,
return control.runTest(control_image, max_diff), control.report() control_path_prefix="qgis_server",
size_tolerance=max_size_diff
)
def _img_diff_error(self, response, headers, image, max_diff=100, max_size_diff=QSize(), outputFormat='PNG'): def _img_diff_error(self, response, headers, test_name: str, max_diff=100, max_size_diff=QSize(), outputFormat='PNG'):
""" """
:param outputFormat: PNG, JPG or WEBP :param outputFormat: PNG, JPG or WEBP
""" """
@ -273,25 +271,18 @@ class QgsServerTestBase(QgisTestCase):
else: else:
raise RuntimeError('Yeah, new format implemented') raise RuntimeError('Yeah, new format implemented')
reference_path = unitTestDataPath('control_images') + '/qgis_server/' + image + '/' + image + '.' + extFile if self.regenerate_reference:
reference_path = unitTestDataPath(
'control_images') + '/qgis_server/' + test_name + '/' + test_name + '.' + extFile
self.store_reference(reference_path, response) self.store_reference(reference_path, response)
self.assertEqual( self.assertEqual(
headers.get("Content-Type"), contentType, headers.get("Content-Type"), contentType,
f"Content type is wrong: {headers.get('Content-Type')} instead of {contentType}\n{response}") f"Content type is wrong: {headers.get('Content-Type')} instead of {contentType}\n{response}")
test, report = self._img_diff(response, image, max_diff, max_size_diff, outputFormat) self.assertTrue(
self._img_diff(response, test_name, max_diff, max_size_diff, outputFormat)
with open(os.path.join(tempfile.gettempdir(), image + "_result." + extFile), "rb") as rendered_file: )
encoded_rendered_file = base64.b64encode(rendered_file.read())
message = f"Image is wrong: rendered file {tempfile.gettempdir()}/{test_name}_result.{extFile}"
# If the failure is in image sizes the diff file will not exists.
if os.path.exists(os.path.join(tempfile.gettempdir(), test_name + "_result_diff." + extFile)):
with open(os.path.join(tempfile.gettempdir(), test_name + "_result_diff." + extFile), "rb") as diff_file:
message = f"Image is wrong: diff file {tempfile.gettempdir()}/{test_name}_result_diff.{extFile}"
self.assertTrue(test, message)
def _execute_request(self, qs, requestMethod=QgsServerRequest.GetMethod, data=None, request_headers=None): def _execute_request(self, qs, requestMethod=QgsServerRequest.GetMethod, data=None, request_headers=None):
request = QgsBufferServerRequest(qs, requestMethod, request_headers or {}, data) request = QgsBufferServerRequest(qs, requestMethod, request_headers or {}, data)

View File

@ -141,7 +141,7 @@ class TestQgsServerWMSGetLegendGraphic(TestQgsServerWMSTestBase):
}.items())]) }.items())])
r, h = self._result(self._execute_request(qs)) r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetLegendGraphic_LayerTitleSpace") self._img_diff_error(r, h, "WMS_GetLegendGraphic_LayerTitleSpace", max_size_diff=QSize(1,5))
def test_wms_GetLegendGraphic_ShowFeatureCount(self): def test_wms_GetLegendGraphic_ShowFeatureCount(self):
qs = "?" + "&".join(["%s=%s" % i for i in list({ qs = "?" + "&".join(["%s=%s" % i for i in list({