barcodes_gs1_nomenclature/tests/test_barcodes_gs1_nomenclature.py

131 lines
5.6 KiB
Python
Raw Normal View History

from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
class TestBarcodeGS1Nomenclature(TransactionCase):
def test_gs1_date_to_date(self):
barcode_nomenclature = self.env['barcode.nomenclature']
# 20/10/2015 -> 151020
date_gs1 = "151020"
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
self.assertEqual(date.day, 20)
self.assertEqual(date.month, 10)
self.assertEqual(date.year, 2015)
# XX/03/2052 -> 520300 -> (if day no set take last day of the month -> 31)
date_gs1 = "520300"
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
self.assertEqual(date.day, 31)
self.assertEqual(date.month, 3)
self.assertEqual(date.year, 2052)
# XX/02/2020 -> 520200 -> (if day no set take last day of the month -> 29)
date_gs1 = "200200"
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
self.assertEqual(date.day, 29)
self.assertEqual(date.month, 2)
self.assertEqual(date.year, 2020)
def test_gs1_extanded_barcode_1(self):
barcode_nomenclature = self.env['barcode.nomenclature'].browse(self.ref('barcodes_gs1_nomenclature.default_gs1_nomenclature'))
# (01)94019097685457(10)33650100138(3102)002004(15)131018
code128 = "01940190976854571033650100138\x1D310200200415131018"
res = barcode_nomenclature.gs1_decompose_extanded(code128)
self.assertEqual(len(res), 4)
self.assertEqual(res[0]["ai"], "01")
self.assertEqual(res[1]["ai"], "10")
self.assertEqual(res[2]["ai"], "3102")
self.assertEqual(res[2]["value"], 20.04)
self.assertEqual(res[3]["ai"], "15")
self.assertEqual(res[3]["value"].year, 2013)
self.assertEqual(res[3]["value"].day, 18)
self.assertEqual(res[3]["value"].month, 10)
# (01)94019097685457(13)170119(30)17
code128 = "0194019097685457131701193017"
res = barcode_nomenclature.gs1_decompose_extanded(code128)
self.assertEqual(len(res), 3)
self.assertEqual(res[0]["ai"], "01")
self.assertEqual(res[1]["ai"], "13")
self.assertEqual(res[1]["value"].year, 2017)
self.assertEqual(res[1]["value"].day, 19)
self.assertEqual(res[1]["value"].month, 1)
self.assertEqual(res[2]["ai"], "30")
self.assertEqual(res[2]["value"], 17)
def test_gs1_extanded_barcode_2_decimal(self):
""" Parses multiples barcode with (or without) a decimal value and
checks for each of them the value is correctly parsed.
"""
# Configures a barcode GS1 nomenclature...
barcode_nomenclature = self.env['barcode.nomenclature'].create({
'name': "GS1 Nomenclature - Test",
'is_gs1_nomenclature': True,
})
default_barcode_rule_vals = {
'default_encoding': 'gs1-128',
'default_barcode_nomenclature_id': barcode_nomenclature.id,
'default_type': 'quantity',
'default_gs1_content_type': 'measure',
}
# Creates a rule who don't take any decimal.
barcode_rule = self.env['barcode.rule'].with_context(default_barcode_rule_vals).create({
'name': "GS1 Rule Test - No Decimal",
'pattern': r'(300)(\d{5,8})',
'gs1_decimal_usage': False,
})
# Creates a rule to take the four last digit as decimals.
barcode_rule_decimal = self.env['barcode.rule'].with_context(default_barcode_rule_vals).create({
'name': "GS1 Rule Test - Four Decimals",
'pattern': r'(304)(\d{5,8})',
'gs1_decimal_usage': True,
})
# Checks barcodes without decimals.
res = barcode_nomenclature.gs1_decompose_extanded('30000000')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '00000')
self.assertEqual(res[0]['value'], 0)
res = barcode_nomenclature.gs1_decompose_extanded('30018789')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '18789')
self.assertEqual(res[0]['value'], 18789)
res = barcode_nomenclature.gs1_decompose_extanded('3001515000')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '1515000')
self.assertEqual(res[0]['value'], 1515000)
# Checks barcodes with decimals.
res = barcode_nomenclature.gs1_decompose_extanded('30400000')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '00000')
self.assertEqual(res[0]['value'], 0.0)
res = barcode_nomenclature.gs1_decompose_extanded('30418789')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '18789')
self.assertEqual(res[0]['value'], 1.8789)
res = barcode_nomenclature.gs1_decompose_extanded('3041515000')
self.assertEqual(len(res), 1)
self.assertEqual(res[0]['string_value'], '1515000')
self.assertEqual(res[0]['value'], 151.5)
# Checks wrong configs will raise an exception.
barcode_rule_decimal.pattern = r'()(\d{0,4})'
# Barcode rule uses decimals but AI doesn't precise what is the decimal position.
with self.assertRaises(ValidationError):
res = barcode_nomenclature.gs1_decompose_extanded('1234')
# The pattern is too permissive and can catch something which can't be casted as measurement
barcode_rule.pattern = r'(300)(.*)'
with self.assertRaises(ValidationError):
res = barcode_nomenclature.gs1_decompose_extanded('300bilou4000')