python-escpos/test/test_printers/test_printer_lp.py
Benito López a50a3b7167
Separate method open() and constructor, enhance consistency between connectors: Rework printer tests (#587)
* Add fixtures
* Add test_printer_file.py
* Remove old broken printer tests
* Include a close_on_reopen test
* Add test_printer_network.py
* Add test_printer_serial.py
* Add test_printer_usb.py
* Add test_printer_lp.py
* Add test_printer_cups.py
* Add test_printer_win32raw.py
* Test the 'printers' property
* Fix conftest import formatting
* Fix failing LP tests
* Cancel close only if literal False|None _device
* Fix win32raw failing tests (maybe)
* Include win32raw close_on_reopen test
* Include test _raw methods to win32raw
* Replace general exceptions in win32raw
* Replace wrong exception in cups
* Include more tests to cups
* Extend cups tests
2023-10-28 20:52:59 +02:00

174 lines
5.0 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""tests for the LP printer
:author: Benito López and the python-escpos developers
:organization: `python-escpos <https://github.com/python-escpos>`_
:copyright: Copyright (c) 2023 `python-escpos <https://github.com/python-escpos>`_
:license: MIT
"""
import logging
import sys
import pytest
# skip all the tests if the platform is Windows
pytestmark = pytest.mark.skipif(
sys.platform == "win32", reason="skipping non Windows platform specific tests"
)
def test_device_not_initialized(lpprinter):
"""
GIVEN a lp printer object
WHEN it is not initialized
THEN check the device property is False
"""
assert lpprinter._device is False
def test_open_raise_exception(lpprinter, devicenotfounderror, mocker):
"""
GIVEN a lp printer object
WHEN open() is set to raise a DeviceNotFoundError on error
THEN check the exception is raised
"""
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "fakeprinter"
with pytest.raises(devicenotfounderror):
lpprinter.open(raise_not_found=True)
def test_open_not_raise_exception(lpprinter, caplog, mocker):
"""
GIVEN a lp printer object
WHEN open() is set to not raise on error but simply cancel
THEN check the error is logged and open() canceled
"""
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "fakeprinter"
with caplog.at_level(logging.ERROR):
lpprinter.open(raise_not_found=False)
assert "not available" in caplog.text
assert lpprinter.device is None
def test_open(lpprinter, caplog, mocker):
"""
GIVEN a lp printer object and a mocked connection
WHEN a valid connection to a device is opened
THEN check the success is logged and the device property is set
"""
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
assert lpprinter.printer_name in lpprinter.printers
with caplog.at_level(logging.INFO):
lpprinter.open()
assert "enabled" in caplog.text
assert lpprinter.device
def test_close_on_reopen(lpprinter, mocker):
"""
GIVEN a lp printer object and a mocked connection
WHEN a valid connection to a device is reopened before close
THEN check the close method is called if _device
"""
spy = mocker.spy(lpprinter, "close")
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
lpprinter.open()
assert lpprinter._device
lpprinter.open()
spy.assert_called_once_with()
def test_flush(lpprinter, mocker):
"""
GIVEN a lp printer object and a mocked connection
WHEN auto_flush is disabled and flush() issued manually
THEN check the flush method is called only one time.
"""
spy = mocker.spy(lpprinter, "flush")
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
lpprinter.auto_flush = False
lpprinter.open()
lpprinter.textln("python-escpos")
lpprinter.flush()
assert spy.call_count == 1
def test_auto_flush_on_command(lpprinter, mocker):
"""
GIVEN a lp printer object and a mocked connection
WHEN auto_flush is enabled and flush() not issued manually
THEN check the flush method is called automatically
"""
spy = mocker.spy(lpprinter, "flush")
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
lpprinter.auto_flush = True
lpprinter.open()
lpprinter.textln("python-escpos")
lpprinter.textln("test")
assert spy.call_count > 1
def test_auto_flush_on_close(lpprinter, mocker, caplog, capsys):
"""
GIVEN a lp printer object and a mocked connection
WHEN auto_flush is disabled and flush() not issued manually
THEN check the flush method is called automatically on close
"""
spy = mocker.spy(lpprinter, "flush")
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
lpprinter.auto_flush = False
lpprinter.open()
lpprinter.textln("python-escpos")
lpprinter.close()
assert spy.call_count == 1
def test_close(lpprinter, caplog, mocker):
"""
GIVEN a lp printer object and a mocked connection
WHEN a connection is opened and closed
THEN check the closing is logged and the device property is False
"""
mocker.patch("subprocess.Popen")
mocker.patch("escpos.printer.LP.printers", new={"test_printer": "Test"})
lpprinter.printer_name = "test_printer"
lpprinter.open()
with caplog.at_level(logging.INFO):
lpprinter.close()
assert "Closing" in caplog.text
assert lpprinter._device is False