Files
pybadges/tests/test_pybadges.py
2020-06-29 16:29:34 -07:00

126 lines
4.6 KiB
Python

# Copyright 2018 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.
"""Tests for pybadges."""
import base64
import doctest
import json
import os.path
import unittest
import pathlib
import sys
import tempfile
import xmldiff.main
import pybadges
TEST_DIR = os.path.dirname(__file__)
PNG_IMAGE_B64 = (
'iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAAD0lEQVQI12P4zw'
'AD/xkYAA/+Af8iHnLUAAAAAElFTkSuQmCC')
PNG_IMAGE = base64.b64decode(PNG_IMAGE_B64)
class TestPybadgesBadge(unittest.TestCase):
"""Tests for pybadges.badge."""
def test_docs(self):
doctest.testmod(pybadges, optionflags=doctest.ELLIPSIS)
def test_whole_link_and_left_link(self):
with self.assertRaises(ValueError):
pybadges.badge(left_text='foo',
right_text='bar',
left_link='http://example.com/',
whole_link='http://example.com/')
def test_changes(self):
with open(os.path.join(TEST_DIR, 'test-badges.json'), 'r') as f:
examples = json.load(f)
for example in examples:
file_name = example.pop('file_name')
with self.subTest(example=file_name):
filepath = os.path.join(TEST_DIR, 'golden-images', file_name)
with open(filepath, mode="r", encoding="utf-8") as f:
golden_image = f.read()
pybadge_image = pybadges.badge(**example)
diff = xmldiff.main.diff_texts(golden_image, pybadge_image)
self.assertFalse(diff)
class TestEmbedImage(unittest.TestCase):
"""Tests for pybadges._embed_image."""
def test_data_url(self):
url = 'data:image/png;base64,' + PNG_IMAGE_B64
self.assertEqual(url, pybadges._embed_image(url))
def test_http_url(self):
url = 'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/python.svg'
self.assertRegex(pybadges._embed_image(url),
r'^data:image/svg(\+xml)?;base64,')
def test_not_image_url(self):
with self.assertRaisesRegex(ValueError,
'expected an image, got "text"'):
pybadges._embed_image('http://www.google.com/')
@unittest.skipIf(sys.platform.startswith("win"), "requires Unix filesystem")
def test_svg_file_path(self):
image_path = os.path.abspath(
os.path.join(TEST_DIR, 'golden-images', 'build-failure.svg'))
self.assertRegex(pybadges._embed_image(image_path),
r'^data:image/svg(\+xml)?;base64,')
@unittest.skipIf(sys.platform.startswith("win"), "requires Unix filesystem")
def test_png_file_path(self):
with tempfile.NamedTemporaryFile() as png:
png.write(PNG_IMAGE)
png.flush()
self.assertEqual(pybadges._embed_image(png.name),
'data:image/png;base64,' + PNG_IMAGE_B64)
@unittest.skipIf(sys.platform.startswith("win"), "requires Unix filesystem")
def test_unknown_type_file_path(self):
with tempfile.NamedTemporaryFile() as non_image:
non_image.write(b'Hello')
non_image.flush()
with self.assertRaisesRegex(ValueError,
'not able to determine file type'):
pybadges._embed_image(non_image.name)
@unittest.skipIf(sys.platform.startswith("win"), "requires Unix filesystem")
def test_text_file_path(self):
with tempfile.NamedTemporaryFile(suffix='.txt') as non_image:
non_image.write(b'Hello')
non_image.flush()
with self.assertRaisesRegex(ValueError,
'expected an image, got "text"'):
pybadges._embed_image(non_image.name)
def test_file_url(self):
image_path = os.path.abspath(
os.path.join(TEST_DIR, 'golden-images', 'build-failure.svg'))
with self.assertRaisesRegex(ValueError, 'unsupported scheme "file"'):
pybadges._embed_image(pathlib.Path(image_path).as_uri())
if __name__ == '__main__':
unittest.main()