# Copyright 2016 LasLabs Inc. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import mock import logging from odoo import exceptions from odoo.tests.common import TransactionCase _logger = logging.getLogger(__name__) try: import zpl2 except ImportError: _logger.debug('Cannot `import zpl2`.') model = 'odoo.addons.base_report_to_printer.models.printing_server' class TestPrintingLabelZpl2(TransactionCase): def setUp(self): super(TestPrintingLabelZpl2, self).setUp() self.Model = self.env['printing.label.zpl2'] self.ComponentModel = self.env['printing.label.zpl2.component'] self.server = self.env['printing.server'].create({}) self.printer = self.env['printing.printer'].create({ 'name': 'Printer', 'server_id': self.server.id, 'system_name': 'Sys Name', 'default': True, 'status': 'unknown', 'status_message': 'Msg', 'model': 'res.users', 'location': 'Location', 'uri': 'URI', }) self.label_vals = { 'name': 'ZPL II Label', 'model_id': self.env.ref( 'base_report_to_printer.model_printing_printer').id, } self.component_vals = { 'name': 'ZPL II Label Component', } def new_label(self, vals=None): values = self.label_vals.copy() if vals: values.update(vals) return self.Model.create(values) def new_component(self, vals=None): values = self.component_vals.copy() if vals: values.update(vals) return self.ComponentModel.create(values) def test_print_on_bad_model(self): """ Check that printing on the bad model raises an exception """ label = self.new_label() with self.assertRaises(exceptions.UserError): label.print_label(self.printer, label) @mock.patch('%s.cups' % model) def test_print_empty_label(self, cups): """ Check that printing an empty label works """ label = self.new_label() label.print_label(self.printer, self.printer) cups.Connection().printFile.assert_called_once() def test_empty_label_contents(self): """ Check contents of an empty label """ label = self.new_label() contents = label._generate_zpl2_data(self.printer).decode('utf-8') self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ') def test_sublabel_label_contents(self): """ Check contents of a sublabel label component """ sublabel = self.new_label({ 'name': 'Sublabel', }) data = 'Some text' self.new_component({ 'label_id': sublabel.id, 'data': '"' + data + '"', }) label = self.new_label() self.new_component({ 'label_id': label.id, 'name': 'Sublabel contents', 'component_type': 'sublabel', 'sublabel_id': sublabel.id, }) contents = label._generate_zpl2_data(self.printer).decode('utf-8') self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Sublabel component position # Position 30x30 because the default values are : # - 10x10 for the sublabel component in the main label # - 10x10 for the sublabel in the sublabel component # - 10x10 for the component in the sublabel '^FO30,30' # Sublabel component format '^A0N,10,10' # Sublabel component contents '^FD{contents}' # Sublabel component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_repeatable_component_label_fixed_contents(self): """ Check contents of a repeatable label component Check that a fixed value is repeated each time """ label = self.new_label({ 'model_id': self.env.ref( 'printer_zpl2.model_printing_label_zpl2').id, }) data = 'Some text' self.new_component({ 'label_id': label.id, 'data': '"' + data + '"', 'repeat': True, 'repeat_count': 3, 'repeat_offset_y': 15, }) contents = label._generate_zpl2_data(label).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # First component position '^FO10,10' # First component format '^A0N,10,10' # First component contents '^FD{contents}' # First component end '^FS\n' # Second component position '^FO10,25' # Second component format '^A0N,10,10' # Second component contents '^FD{contents}' # Second component end '^FS\n' # Third component position '^FO10,40' # Third component format '^A0N,10,10' # Third component contents '^FD{contents}' # Third component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_repeatable_component_label_iterable_contents(self): """ Check contents of a repeatable label component Check that an iterable contents (list, tuple, etc.) is browsed If the repeat_count is higher than the value length, all values are displayed """ label = self.new_label({ 'model_id': self.env.ref( 'printer_zpl2.model_printing_label_zpl2').id, }) data = ['First text', 'Second text', 'Third text'] self.new_component({ 'label_id': label.id, 'data': str(data), 'repeat': True, 'repeat_offset': 1, 'repeat_count': 3, 'repeat_offset_y': 15, }) contents = label._generate_zpl2_data(label).decode('utf-8') self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # First component position '^FO10,10' # First component format '^A0N,10,10' # First component contents '^FD{contents[1]}' # First component end '^FS\n' # Second component position '^FO10,25' # Second component format '^A0N,10,10' # Second component contents '^FD{contents[2]}' # Second component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_repeatable_component_label_iterable_offset(self): """ Check contents of a repeatable label component with an offset Check that an iterable contents (list, tuple, etc.) is browsed If the repeat_count is higher than the value length, all values are displayed """ label = self.new_label({ 'model_id': self.env.ref( 'printer_zpl2.model_printing_label_zpl2').id, }) data = ['Text {value}'.format(value=ind) for ind in range(20)] self.new_component({ 'label_id': label.id, 'data': str(data), 'repeat': True, 'repeat_offset': 10, 'repeat_count': 3, 'repeat_offset_y': 15, }) contents = label._generate_zpl2_data(label).decode('utf-8') self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # First component position '^FO10,10' # First component format '^A0N,10,10' # First component contents '^FD{contents[10]}' # First component end '^FS\n' # Second component position '^FO10,25' # Second component format '^A0N,10,10' # Second component contents '^FD{contents[11]}' # Second component end '^FS\n' # Third component position '^FO10,40' # Third component format '^A0N,10,10' # Third component contents '^FD{contents[12]}' # Third component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_repeatable_sublabel_contents(self): """ Check contents of a repeatable sublabel label component """ sublabel = self.new_label({ 'name': 'Sublabel', 'model_id': self.env.ref( 'printer_zpl2.model_printing_label_zpl2_component').id, }) self.new_component({ 'label_id': sublabel.id, 'name': 'Components name', 'data': 'object.name', }) self.new_component({ 'label_id': sublabel.id, 'name': 'Components data', 'data': 'object.data', 'origin_x': 50, }) label = self.new_label({ 'model_id': self.env.ref( 'printer_zpl2.model_printing_label_zpl2').id, }) self.new_component({ 'label_id': label.id, 'name': 'Label name', 'data': 'object.name', }) self.new_component({ 'label_id': label.id, 'name': 'Label components', 'component_type': 'sublabel', 'origin_x': 15, 'origin_y': 30, 'data': 'object.component_ids', 'sublabel_id': sublabel.id, 'repeat': True, 'repeat_count': 3, 'repeat_offset_y': 15, }) contents = label._generate_zpl2_data(label).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Label name component position '^FO10,10' # Label name component format '^A0N,10,10' # Label name component contents '^FD{label.name}' # Label name component end '^FS\n' # First component name component position '^FO35,50' # First component name component format '^A0N,10,10' # First component name component contents '^FD{label.component_ids[0].name}' # First component name component end '^FS\n' # First component data component position '^FO75,50' # First component data component format '^A0N,10,10' # First component data component contents '^FD{label.component_ids[0].data}' # First component data component end '^FS\n' # Second component name component position '^FO35,65' # Second component name component format '^A0N,10,10' # Second component name component contents '^FD{label.component_ids[1].name}' # Second component name component end '^FS\n' # Second component data component position '^FO75,65' # Second component data component format '^A0N,10,10' # Second component data component contents '^FD{label.component_ids[1].data}' # Second component data component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(label=label)) def test_text_label_contents(self): """ Check contents of a text label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'data': '"%s"' % data, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^A0N,10,10' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_reversed_text_label_contents(self): """ Check contents of a text label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'data': '"' + data + '"', 'reverse_print': True, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^A0N,10,10' # Reverse print argument '^FR' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_block_text_label_contents(self): """ Check contents of a text label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'data': '"' + data + '"', 'in_block': True, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^A0N,10,10' # Block definition '^FB0,1,0,L,0' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_rectangle_label_contents(self): """ Check contents of a rectangle label """ label = self.new_label() self.new_component({ 'label_id': label.id, 'component_type': 'rectangle', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^GB1,1,1,B,0' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ') def test_diagonal_line_label_contents(self): """ Check contents of a diagonal line label """ label = self.new_label() self.new_component({ 'label_id': label.id, 'component_type': 'diagonal', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^GD3,3,1,B,L' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ') def test_circle_label_contents(self): """ Check contents of a circle label """ label = self.new_label() self.new_component({ 'label_id': label.id, 'component_type': 'circle', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Component position '^FO10,10' # Component format '^GC3,2,B' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ') def test_code11_barcode_label_contents(self): """ Check contents of a code 11 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_11', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B1N,N,0,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_2of5_barcode_label_contents(self): """ Check contents of a interleaved 2 of 5 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'interleaved_2_of_5', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B2N,0,N,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_code39_barcode_label_contents(self): """ Check contents of a code 39 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_39', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B3N,N,0,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_code49_barcode_label_contents(self): """ Check contents of a code 49 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_49', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B4N,0,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_code49_barcode_label_contents_line(self): """ Check contents of a code 49 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_49', 'data': '"' + data + '"', 'interpretation_line': True, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B4N,0,B' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_code49_barcode_label_contents_with_above(self): """ Check contents of a code 49 barconde label with interpretation line above """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_49', 'data': '"' + data + '"', 'interpretation_line': True, 'interpretation_line_above': True, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B4N,0,A' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_pdf417_barcode_label_contents(self): """ Check contents of a pdf417 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'pdf417', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B7N,0,0,0,0,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_ean8_barcode_label_contents(self): """ Check contents of a ean-8 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'ean-8', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B8N,0,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_upce_barcode_label_contents(self): """ Check contents of a upc-e barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'upc-e', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^B9N,0,N,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_code128_barcode_label_contents(self): """ Check contents of a code 128 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'code_128', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^BCN,0,N,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_ean13_barcode_label_contents(self): """ Check contents of a ean-13 barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'ean-13', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^BEN,0,N,N' # Component contents '^FD{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_qrcode_barcode_label_contents(self): """ Check contents of a qr code barcode label """ label = self.new_label() data = 'Some text' self.new_component({ 'label_id': label.id, 'component_type': 'qr_code', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, # Label start '^XA\n' # Print width '^PW480\n' # UTF-8 encoding '^CI28\n' # Label position '^LH10,10\n' # Barcode default format '^BY2,3.0' # Component position '^FO10,10' # Component format '^BQN,2,1,Q,7' # Component contents '^FDQA,{contents}' # Component end '^FS\n' # Recall last saved parameters '^JUR\n' # Label end '^XZ'.format(contents=data)) def test_graphic_label_contents_blank(self): """ Check contents of a image label """ label = self.new_label() data = 'R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' self.new_component({ 'label_id': label.id, 'component_type': 'graphic', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, "^XA\n" "^PW480\n" "^CI28\n" "^LH10,10\n" "^FO10,10^GFA,1.0,1.0,1.0,b'00'^FS\n" "^JUR\n" "^XZ") def test_graphic_label_contents_blank_rotated(self): """ Check contents of image rotated label """ label = self.new_label() data = 'R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' self.new_component({ 'label_id': label.id, 'component_type': 'graphic', 'data': '"' + data + '"', 'height': 10, 'width': 10, 'reverse_print': 1, 'orientation': zpl2.ORIENTATION_ROTATED, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, "^XA\n" "^PW480\n" "^CI28\n" "^LH10,10\n" "^FO10,10^GFA,20.0,20.0,2.0," "b'FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0'^FS\n" "^JUR\n" "^XZ") def test_graphic_label_contents_blank_inverted(self): """ Check contents of a image inverted label """ label = self.new_label() data = 'R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' self.new_component({ 'label_id': label.id, 'component_type': 'graphic', 'data': '"' + data + '"', 'orientation': zpl2.ORIENTATION_INVERTED, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, "^XA\n" "^PW480\n" "^CI28\n" "^LH10,10\n" "^FO10,10^GFA,1.0,1.0,1.0,b'00'^FS\n" "^JUR\n" "^XZ") def test_graphic_label_contents_blank_bottom(self): """ Check contents of a image bottom label """ label = self.new_label() data = 'R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' self.new_component({ 'label_id': label.id, 'component_type': 'graphic', 'data': '"' + data + '"', 'orientation': zpl2.ORIENTATION_BOTTOM_UP, }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, "^XA\n" "^PW480\n" "^CI28\n" "^LH10,10\n" "^FO10,10^GFA,1.0,1.0,1.0,b'00'^FS\n" "^JUR\n" "^XZ") def test_zpl2_raw_contents_blank(self): """ Check contents of a image label """ label = self.new_label() data = '^FO50,50^GB100,100,100^FS' self.new_component({ 'label_id': label.id, 'component_type': 'zpl2_raw', 'data': '"' + data + '"', }) contents = label._generate_zpl2_data(self.printer).decode("utf-8") self.assertEqual( contents, '^XA\n' '^PW480\n' '^CI28\n' '^LH10,10\n' '^FO50,50^GB100,100,100^FS\n' '^JUR\n' '^XZ')