157 lines
5 KiB
Python
157 lines
5 KiB
Python
import io
|
|
|
|
import pytest
|
|
|
|
import qrcode
|
|
import qrcode.util
|
|
from qrcode.tests.consts import BLACK, RED, UNICODE_TEXT, WHITE
|
|
|
|
Image = pytest.importorskip("PIL.Image", reason="PIL is not installed")
|
|
|
|
if Image:
|
|
from qrcode.image.styledpil import StyledPilImage
|
|
from qrcode.image.styles import colormasks, moduledrawers
|
|
|
|
|
|
def test_render_pil():
|
|
qr = qrcode.QRCode()
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image()
|
|
img.save(io.BytesIO())
|
|
assert isinstance(img.get_image(), Image.Image)
|
|
|
|
|
|
@pytest.mark.parametrize("back_color", ["TransParent", "red", (255, 195, 235)])
|
|
def test_render_pil_background(back_color):
|
|
qr = qrcode.QRCode()
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(back_color="TransParent")
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_render_pil_with_rgb_color_tuples():
|
|
qr = qrcode.QRCode()
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(back_color=(255, 195, 235), fill_color=(55, 95, 35))
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_render_with_pattern():
|
|
qr = qrcode.QRCode(mask_pattern=3)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image()
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_render_styled_Image():
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_L)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(image_factory=StyledPilImage)
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_render_styled_with_embedded_image():
|
|
embedded_img = Image.new("RGB", (10, 10), color="red")
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_H)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(image_factory=StyledPilImage, embedded_image=embedded_img)
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_render_styled_with_embedded_image_path(tmp_path):
|
|
tmpfile = str(tmp_path / "test.png")
|
|
embedded_img = Image.new("RGB", (10, 10), color="red")
|
|
embedded_img.save(tmpfile)
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_H)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(image_factory=StyledPilImage, embedded_image_path=tmpfile)
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"drawer",
|
|
[
|
|
moduledrawers.CircleModuleDrawer,
|
|
moduledrawers.GappedSquareModuleDrawer,
|
|
moduledrawers.HorizontalBarsDrawer,
|
|
moduledrawers.RoundedModuleDrawer,
|
|
moduledrawers.SquareModuleDrawer,
|
|
moduledrawers.VerticalBarsDrawer,
|
|
],
|
|
)
|
|
def test_render_styled_with_drawer(drawer):
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_L)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(
|
|
image_factory=StyledPilImage,
|
|
module_drawer=drawer(),
|
|
)
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"mask",
|
|
[
|
|
colormasks.SolidFillColorMask(),
|
|
colormasks.SolidFillColorMask(back_color=WHITE, front_color=RED),
|
|
colormasks.SolidFillColorMask(back_color=(255, 0, 255, 255), front_color=RED),
|
|
colormasks.RadialGradiantColorMask(
|
|
back_color=WHITE, center_color=BLACK, edge_color=RED
|
|
),
|
|
colormasks.SquareGradiantColorMask(
|
|
back_color=WHITE, center_color=BLACK, edge_color=RED
|
|
),
|
|
colormasks.HorizontalGradiantColorMask(
|
|
back_color=WHITE, left_color=RED, right_color=BLACK
|
|
),
|
|
colormasks.VerticalGradiantColorMask(
|
|
back_color=WHITE, top_color=RED, bottom_color=BLACK
|
|
),
|
|
colormasks.ImageColorMask(
|
|
back_color=WHITE, color_mask_image=Image.new("RGB", (10, 10), color="red")
|
|
),
|
|
],
|
|
)
|
|
def test_render_styled_with_mask(mask):
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_L)
|
|
qr.add_data(UNICODE_TEXT)
|
|
img = qr.make_image(image_factory=StyledPilImage, color_mask=mask)
|
|
img.save(io.BytesIO())
|
|
|
|
|
|
def test_embedded_image_and_error_correction(tmp_path):
|
|
"If an embedded image is specified, error correction must be the highest so the QR code is readable"
|
|
tmpfile = str(tmp_path / "test.png")
|
|
embedded_img = Image.new("RGB", (10, 10), color="red")
|
|
embedded_img.save(tmpfile)
|
|
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_L)
|
|
qr.add_data(UNICODE_TEXT)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image_path=tmpfile)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image=embedded_img)
|
|
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_M)
|
|
qr.add_data(UNICODE_TEXT)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image_path=tmpfile)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image=embedded_img)
|
|
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_Q)
|
|
qr.add_data(UNICODE_TEXT)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image_path=tmpfile)
|
|
with pytest.raises(ValueError):
|
|
qr.make_image(embedded_image=embedded_img)
|
|
|
|
# The only accepted correction level when an embedded image is provided
|
|
qr = qrcode.QRCode(error_correction=qrcode.ERROR_CORRECT_H)
|
|
qr.add_data(UNICODE_TEXT)
|
|
qr.make_image(embedded_image_path=tmpfile)
|
|
qr.make_image(embedded_image=embedded_img)
|
|
|
|
|
|
def test_shortcut():
|
|
qrcode.make("image")
|