From 5973dbf35dc32d394166a6d4db7693ecb65a8452 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 15 Mar 2022 15:25:47 -0700 Subject: [PATCH] Fix a flaky test by using a local web server --- build_golden_images.py | 22 ++++++---- tests/__init__.py | 0 tests/golden-images/accuracy.svg | 2 +- tests/golden-images/build-failure.svg | 2 +- tests/golden-images/build-passing.svg | 2 +- tests/golden-images/build-running.svg | 2 +- tests/golden-images/complete.svg | 2 +- tests/golden-images/embedded-logo.svg | 2 +- tests/golden-images/github.svg | 2 +- tests/golden-images/license.svg | 2 +- tests/golden-images/no-embedded-logo.svg | 2 +- tests/golden-images/pip.svg | 2 +- tests/golden-images/python.svg | 2 +- tests/golden-images/saying-arabic.svg | 2 +- tests/golden-images/saying-chinese.svg | 2 +- tests/golden-images/saying-russian.svg | 2 +- tests/golden-images/status.svg | 2 +- tests/golden-images/tests.svg | 2 +- tests/image_server.py | 51 ++++++++++++++++++++++++ tests/test_pybadges.py | 15 +++++-- 20 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/image_server.py diff --git a/build_golden_images.py b/build_golden_images.py index d403e67..7ed730d 100644 --- a/build_golden_images.py +++ b/build_golden_images.py @@ -21,17 +21,25 @@ import os.path import pkg_resources import pybadges +from tests import image_server +from tests import test_pybadges def generate_images(source_json_path, target_directory): - os.makedirs(target_directory, exist_ok=True) - with open(source_json_path) as f: - examples = json.load(f) + srv = image_server.ImageServer(test_pybadges.PNG_IMAGE) + srv.start_server() + try: + os.makedirs(target_directory, exist_ok=True) + with open(source_json_path) as f: + examples = json.load(f) - for example in examples: - filename = os.path.join(target_directory, example.pop('file_name')) - with open(filename, 'w') as f: - f.write(pybadges.badge(**example)) + for example in examples: + srv.fix_embedded_url_reference(example) + filename = os.path.join(target_directory, example.pop('file_name')) + with open(filename, 'w', encoding='utf-8') as f: + f.write(pybadges.badge(**example)) + finally: + srv.stop_server() def main(): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/golden-images/accuracy.svg b/tests/golden-images/accuracy.svg index bb38ef2..ae5c657 100644 --- a/tests/golden-images/accuracy.svg +++ b/tests/golden-images/accuracy.svg @@ -1 +1 @@ -accuracyaccuracy70%70% \ No newline at end of file +accuracyaccuracy70%70% \ No newline at end of file diff --git a/tests/golden-images/build-failure.svg b/tests/golden-images/build-failure.svg index c11d95e..a4c3ddd 100644 --- a/tests/golden-images/build-failure.svg +++ b/tests/golden-images/build-failure.svg @@ -1 +1 @@ -Error in foo.py, line 3buildbuildfailurefailure \ No newline at end of file +Error in foo.py, line 3buildbuildfailurefailure \ No newline at end of file diff --git a/tests/golden-images/build-passing.svg b/tests/golden-images/build-passing.svg index 35d7ca5..7a907d0 100644 --- a/tests/golden-images/build-passing.svg +++ b/tests/golden-images/build-passing.svg @@ -1 +1 @@ -buildbuildpassingpassing \ No newline at end of file +buildbuildpassingpassing \ No newline at end of file diff --git a/tests/golden-images/build-running.svg b/tests/golden-images/build-running.svg index 822ca8d..d1aaae5 100644 --- a/tests/golden-images/build-running.svg +++ b/tests/golden-images/build-running.svg @@ -1 +1 @@ -buildbuildrunningrunning \ No newline at end of file +buildbuildrunningrunning \ No newline at end of file diff --git a/tests/golden-images/complete.svg b/tests/golden-images/complete.svg index 00f6655..3f2ee19 100644 --- a/tests/golden-images/complete.svg +++ b/tests/golden-images/complete.svg @@ -1 +1 @@ -Badge TitleLeft TitleRight Titlecompletecompleteexampleexample \ No newline at end of file +Badge TitleLeft TitleRight Titlecompletecompleteexampleexample \ No newline at end of file diff --git a/tests/golden-images/embedded-logo.svg b/tests/golden-images/embedded-logo.svg index 159f80e..8292fc7 100644 --- a/tests/golden-images/embedded-logo.svg +++ b/tests/golden-images/embedded-logo.svg @@ -1 +1 @@ ---embed-logo--embed-logoyesyes \ No newline at end of file +--embed-logo--embed-logoyesyes \ No newline at end of file diff --git a/tests/golden-images/github.svg b/tests/golden-images/github.svg index 5093965..7770b2d 100644 --- a/tests/golden-images/github.svg +++ b/tests/golden-images/github.svg @@ -1 +1 @@ -githubgithubpybadgespybadges \ No newline at end of file +githubgithubpybadgespybadges \ No newline at end of file diff --git a/tests/golden-images/license.svg b/tests/golden-images/license.svg index 43a94a9..13811dc 100644 --- a/tests/golden-images/license.svg +++ b/tests/golden-images/license.svg @@ -1 +1 @@ -licenselicenseAPACHE 2.0APACHE 2.0 \ No newline at end of file +licenselicenseAPACHE 2.0APACHE 2.0 \ No newline at end of file diff --git a/tests/golden-images/no-embedded-logo.svg b/tests/golden-images/no-embedded-logo.svg index 06c17af..4976507 100644 --- a/tests/golden-images/no-embedded-logo.svg +++ b/tests/golden-images/no-embedded-logo.svg @@ -1 +1 @@ ---embed-logo--embed-logonono \ No newline at end of file +--embed-logo--embed-logonono \ No newline at end of file diff --git a/tests/golden-images/pip.svg b/tests/golden-images/pip.svg index bdf0850..1a7be88 100644 --- a/tests/golden-images/pip.svg +++ b/tests/golden-images/pip.svg @@ -1 +1 @@ -pip installpip installpybadgespybadges \ No newline at end of file +pip installpip installpybadgespybadges \ No newline at end of file diff --git a/tests/golden-images/python.svg b/tests/golden-images/python.svg index c9cdacb..cde40b4 100644 --- a/tests/golden-images/python.svg +++ b/tests/golden-images/python.svg @@ -1 +1 @@ -pythonpython3.2, 3.3, 3.4, 3.5, 3.63.2, 3.3, 3.4, 3.5, 3.6 \ No newline at end of file +pythonpython3.2, 3.3, 3.4, 3.5, 3.63.2, 3.3, 3.4, 3.5, 3.6 \ No newline at end of file diff --git a/tests/golden-images/saying-arabic.svg b/tests/golden-images/saying-arabic.svg index 9c45022..1e454e8 100644 --- a/tests/golden-images/saying-arabic.svg +++ b/tests/golden-images/saying-arabic.svg @@ -1 +1 @@ -sayingsayingأباد الله خضراءهم ابذل لصديقك دمك ومالكأباد الله خضراءهم ابذل لصديقك دمك ومالك \ No newline at end of file +sayingsayingأباد الله خضراءهم ابذل لصديقك دمك ومالكأباد الله خضراءهم ابذل لصديقك دمك ومالك \ No newline at end of file diff --git a/tests/golden-images/saying-chinese.svg b/tests/golden-images/saying-chinese.svg index f6f9470..b207bed 100644 --- a/tests/golden-images/saying-chinese.svg +++ b/tests/golden-images/saying-chinese.svg @@ -1 +1 @@ -sayingsaying不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至於行之而止矣不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至於行之而止矣 \ No newline at end of file +sayingsaying不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至於行之而止矣不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之;學至於行之而止矣 \ No newline at end of file diff --git a/tests/golden-images/saying-russian.svg b/tests/golden-images/saying-russian.svg index 24b25f3..c1f40c1 100644 --- a/tests/golden-images/saying-russian.svg +++ b/tests/golden-images/saying-russian.svg @@ -1 +1 @@ -sayingsayingБез труда́ не вы́тащишь и ры́бку из пруда́.Без труда́ не вы́тащишь и ры́бку из пруда́. \ No newline at end of file +sayingsayingБез труда́ не вы́тащишь и ры́бку из пруда́.Без труда́ не вы́тащишь и ры́бку из пруда́. \ No newline at end of file diff --git a/tests/golden-images/status.svg b/tests/golden-images/status.svg index 127388c..e1126c6 100644 --- a/tests/golden-images/status.svg +++ b/tests/golden-images/status.svg @@ -1 +1 @@ -statusstatus \ No newline at end of file +statusstatus \ No newline at end of file diff --git a/tests/golden-images/tests.svg b/tests/golden-images/tests.svg index 6f47238..330ee09 100644 --- a/tests/golden-images/tests.svg +++ b/tests/golden-images/tests.svg @@ -1 +1 @@ -teststests231 passed, 1 failed, 1 skipped231 passed, 1 failed, 1 skipped \ No newline at end of file +teststests231 passed, 1 failed, 1 skipped231 passed, 1 failed, 1 skipped \ No newline at end of file diff --git a/tests/image_server.py b/tests/image_server.py new file mode 100644 index 0000000..25fc01c --- /dev/null +++ b/tests/image_server.py @@ -0,0 +1,51 @@ +# Copyright 2022 The pybadge Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An HTTP image server that can be used to set logo embedding. + +The server will respond to any request with the image data provided in the +constructor. +""" + +from http import server +import threading + + +class ImageServer: + + def __init__(self, image_data): + self._image_data = image_data + + def start_server(self): + srv = self + + class Handler(server.BaseHTTPRequestHandler): + + def do_GET(self): + self.send_response(200) + self.send_header('Content-Type', 'image/png') + self.end_headers() + self.wfile.write(srv._image_data) + + self._httpd = server.HTTPServer(('localhost', 0), Handler) + self.logo_url = "http://localhost:{0}".format(self._httpd.server_port) + + thread = threading.Thread(target=self._httpd.serve_forever) + thread.start() + + def fix_embedded_url_reference(self, example): + if example.get("logo") == "": + example["logo"] = self.logo_url + + def stop_server(self): + self._httpd.shutdown() diff --git a/tests/test_pybadges.py b/tests/test_pybadges.py index 370a49a..5cf6af4 100644 --- a/tests/test_pybadges.py +++ b/tests/test_pybadges.py @@ -17,13 +17,14 @@ import base64 import doctest import json import os.path -import unittest import pathlib import sys import tempfile +import unittest import xmldiff.main import pybadges +from tests import image_server TEST_DIR = os.path.dirname(__file__) @@ -36,6 +37,15 @@ PNG_IMAGE = base64.b64decode(PNG_IMAGE_B64) class TestPybadgesBadge(unittest.TestCase): """Tests for pybadges.badge.""" + def setUp(self): + super().setUp() + self._image_server = image_server.ImageServer(PNG_IMAGE) + self._image_server.start_server() + + def tearDown(self): + super().tearDown() + self._image_server.stop_server() + def test_docs(self): doctest.testmod(pybadges, optionflags=doctest.ELLIPSIS) @@ -51,6 +61,7 @@ class TestPybadgesBadge(unittest.TestCase): examples = json.load(f) for example in examples: + self._image_server.fix_embedded_url_reference(example) file_name = example.pop('file_name') with self.subTest(example=file_name): goldenpath = os.path.join(TEST_DIR, 'golden-images', file_name) @@ -81,8 +92,6 @@ class TestPybadgesBadge(unittest.TestCase): "images for %s differ:\n%s\nview with:\npython -m webbrowser %s" % (file_name, diff, html.name)) - self.assertFalse(diff,) - class TestEmbedImage(unittest.TestCase): """Tests for pybadges._embed_image."""