diff --git a/test/test_printers/test_printer_lp.py b/test/test_printers/test_printer_lp.py new file mode 100644 index 0000000..a84eb8c --- /dev/null +++ b/test/test_printers/test_printer_lp.py @@ -0,0 +1,168 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""tests for the LP printer + +:author: Benito López and the python-escpos developers +:organization: `python-escpos `_ +:copyright: Copyright (c) 2023 `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): + """ + GIVEN a lp printer object + WHEN open() is set to raise a DeviceNotFoundError on error + THEN check the exception is raised + """ + lpprinter.printer_name = "fakeprinter" + + with pytest.raises(devicenotfounderror): + lpprinter.open(raise_not_found=True) + + +def test_open_not_raise_exception(lpprinter, caplog): + """ + 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 + """ + 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" + + 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