#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of facho. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
"""Tests for `facho` package."""
import pytest
# from click.testing import CliRunner
from facho import facho
# from facho import cli
def test_facho_xml():
xml = facho.FachoXML('root')
invoice = xml.find_or_create_element('/root/Invoice')
assert xml.tostring() == ''
invoice.text = 'Test'
assert xml.tostring() == 'Test'
xml.find_or_create_element('/root/Invoice/Line')
assert xml.tostring() == 'Test'
def test_facho_xml_with_attr():
xml = facho.FachoXML('root')
xml.find_or_create_element('/root/Invoice[id=123]')
assert xml.tostring() == ''
def test_facho_xml_idempotent():
xml = facho.FachoXML('root')
xml.find_or_create_element('/root/Invoice')
assert xml.tostring() == ''
xml.find_or_create_element('/root/Invoice')
assert xml.tostring() == ''
xml.find_or_create_element('/root/Invoice')
assert xml.tostring() == ''
xml.find_or_create_element('/root/Invoice/Line')
assert xml.tostring() == ''
xml.find_or_create_element('/root/Invoice/Line')
assert xml.tostring() == ''
def test_facho_xml_aliases():
xml = facho.FachoXML('root')
xml.register_alias_xpath('Invoice', '/root/Invoice')
invoice = xml.find_or_create_element('Invoice')
assert xml.tostring() == ''
invoice.text = 'Test'
assert xml.tostring() == 'Test'
def test_facho_xmlns():
xml = facho.FachoXML('root', nsmap={
'ext': 'https://ext',
'sts': 'https://sts',
})
invoiceAuthorization = xml.find_or_create_element(
'/root/ext:UBLExtensions/ext:UBLExtension/'
'ext:ExtensionContent/sts:DianExtensions/'
'sts:InvoiceControl/sts:InvoiceAuthorization')
assert xml.tostring().strip() == (
''
''
''
''
''
''
''
''
''
'')
invoiceAuthorization.text = '123456789'
assert xml.tostring().strip() == (
''
''
''
''
''
''
'123456789'
''
''
'')
def test_facho_xmlns_idempotent():
xml = facho.FachoXML('root', nsmap={
'ext': 'https://ext',
'sts': 'https://sts',
})
xml.find_or_create_element('/root/ext:Extension/sts:Sotoros')
assert xml.tostring() == (
''
'')
xml.find_or_create_element('/root/ext:Extension/sts:Sotoros')
assert xml.tostring() == (
''
'')
def test_facho_xml_set_element_with_format():
xml = facho.FachoXML('root')
xml.set_element('/root/Invoice', 1, format_='%02d')
assert xml.tostring() == '01'
def test_facho_xml_fragment():
xml = facho.FachoXML('root')
invoice = xml.fragment('/root/Invoice')
invoice.set_element('/Invoice/Id', 1)
assert xml.tostring() == '1'
def test_facho_xml_fragments():
xml = facho.FachoXML('Invoice')
line = xml.fragment('/Invoice/Line')
line.set_element('/Line/Id', 1)
line = xml.fragment('/Invoice/Line', append=True)
line.set_element('/Line/Id', 2)
line = xml.fragment('/Invoice/Line', append=True)
line.set_element('/Line/Id', 3)
assert xml.tostring() == (
'12'
'3')
def test_facho_xml_nested_fragments():
xml = facho.FachoXML('Invoice')
party = xml.fragment('/Invoice/Party')
party.set_element('/Party/Name', 'test')
address = party.fragment('/Party/Address')
address.set_element('/Address/Line', 'line 1')
party.set_element('/Party/LastName', 'test')
assert xml.tostring() == (
'test'
'line 1'
'test')
def test_facho_xml_get_element_text_of_fragment():
xml = facho.FachoXML('root')
invoice = xml.fragment('/root/Invoice')
invoice.set_element('/Invoice/Id', 1)
assert invoice.get_element_text('/Invoice/Id') == '1'
def test_facho_xml_get_element_text():
xml = facho.FachoXML('Invoice')
xml.set_element('/Invoice/ID', 'ABC123')
assert xml.get_element_text('/Invoice/ID') == 'ABC123'
line = xml.fragment('/Invoice/Line')
line.set_element('/Line/Quantity', 5)
assert line.get_element_text('/Line/Quantity', format_=int) == 5
def test_facho_xml_get_element_text_next_child():
xml = facho.FachoXML('Invoice')
xml.set_element('/Invoice/ID', 'ABC123')
assert xml.get_element_text('/Invoice/ID') == 'ABC123'
line = xml.fragment('/Invoice/Line')
line.set_element('/Line/Quantity', 5)
line = xml.fragment('/Invoice/Line', append=True)
line.set_element('/Line/Quantity', 6)
assert line.get_element_text('/Line[2]/Quantity', format_=int) == 6
def test_facho_xml_set_element_relative():
xml = facho.FachoXML('Invoice')
xml.set_element('./ID', 'ABC123')
assert xml.get_element_text('/Invoice/ID') == 'ABC123'
def test_facho_xml_set_element_relative_with_namespace():
xml = facho.FachoXML(
'{%s}Invoice' %
('http://www.dian.gov.co/contratos/facturaelectronica/v1'),
nsmap={
'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1'})
xml.set_element('./ID', 'ABC123')
assert xml.get_element_text('/fe:Invoice/ID') == 'ABC123'
def test_facho_xml_fragment_relative():
xml = facho.FachoXML('root')
invoice = xml.fragment('./Invoice')
invoice.set_element('./Id', 1)
assert xml.tostring() == '1'
def test_facho_xml_get_element_fragment_relative():
xml = facho.FachoXML('root')
invoice = xml.fragment('./Invoice')
invoice.set_element('./Id', 1)
assert invoice.get_element_text('./Id') == '1'
def test_facho_xml_replacement_for():
xml = facho.FachoXML('root')
xml.placeholder_for('./child/type')
xml.replacement_for('./child/type',
'./child/code', 'test')
assert xml.tostring() == 'test'
def test_facho_xml_set_element_content_invalid_validation():
xml = facho.FachoXML('root')
with pytest.raises(facho.FachoValueInvalid):
xml.set_element_validator('./Id', lambda text, attrs: text == 'mero')
xml.set_element('./Id', 'bad')
def test_facho_xml_set_element_content_valid_validation():
xml = facho.FachoXML('root')
xml.set_element_validator('./Id', lambda text, attrs: text == 'mero')
xml.set_element('./Id', 'mero')
def test_facho_xml_set_element_attribute_invalid_validation():
xml = facho.FachoXML('root')
with pytest.raises(facho.FachoValueInvalid):
xml.set_element_validator(
'./Id', lambda text, attrs: attrs['code'] == 'ABC')
xml.set_element('./Id', 'mero', code='CBA')
def test_facho_xml_set_element_attribute_valid_validation():
xml = facho.FachoXML('root')
xml.set_element_validator(
'./Id',
lambda text,
attrs: attrs['code'] == 'ABC')
xml.set_element('./Id', 'mero', code='ABC')
def test_facho_xml_get_element_attribute():
xml = facho.FachoXML('root')
xml.set_element('./Id', 'mero', code='ABC')
assert xml.get_element_attribute('/root/Id', 'code') == 'ABC'
def test_facho_xml_keep_orden_slibing():
xml = facho.FachoXML('root')
xml.find_or_create_element('./A')
xml.find_or_create_element('./B')
xml.find_or_create_element('./C')
xml.find_or_create_element('./B', append=True)
xml.find_or_create_element('./A', append=True)
assert xml.tostring() == ''
def test_facho_xml_placeholder_optional():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.placeholder_for('./B', optional=True)
xml.placeholder_for('./C')
assert xml.tostring() == ''
def test_facho_xml_placeholder_append_to_optional():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.placeholder_for('./B', optional=True)
xml.placeholder_for('./C')
xml.find_or_create_element('./B')
assert xml.tostring() == ''
def test_facho_xml_placeholder_set_element_to_optional():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.placeholder_for('./B', optional=True)
xml.placeholder_for('./C')
xml.set_element('./B', '2')
assert xml.tostring() == '2'
def test_facho_xml_placeholder_set_element_to_optional_with_append():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.placeholder_for('./B', optional=True)
xml.placeholder_for('./C')
xml.set_element('./B', '2')
xml.set_element('./B', '3', append_=True)
assert xml.tostring() == '23'
def test_facho_xml_set_attributes():
xml = facho.FachoXML('root')
xml.find_or_create_element('./A')
xml.set_attributes('./A',
value1='1',
value2='2'
)
assert xml.get_element_attribute('/root/A', 'value1') == '1'
assert xml.get_element_attribute('/root/A', 'value2') == '2'
def test_facho_xml_set_attributes_not_set_optional():
xml = facho.FachoXML('root')
xml.find_or_create_element('./A')
xml.set_attributes('./A',
value1=None,
value2='2'
)
with pytest.raises(KeyError):
xml.get_element_attribute('/root/A', 'value1')
assert xml.get_element_attribute('/root/A', 'value2') == '2'
def test_facho_xml_placeholder_with_fragment():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.placeholder_for('./AA')
xml.placeholder_for('./AAA')
AA = xml.fragment('./AA/Child')
AA.find_or_create_element('./B')
AA.find_or_create_element('./B', append=True)
AA = xml.fragment('./AA/Child', append=True)
assert xml.tostring() == (
'')
def test_facho_xml_create_on_first_append():
xml = facho.FachoXML('root')
xml.find_or_create_element('./A', append=True)
assert xml.tostring() == ''
def test_facho_xml_create_on_first_append_multiple_appends():
xml = facho.FachoXML('root')
xml.find_or_create_element('./B', append=True)
xml.find_or_create_element('./A', append=True)
xml.find_or_create_element('./A', append=True)
xml.find_or_create_element('./A', append=True)
xml.find_or_create_element('./C', append=True)
assert xml.tostring() == ''
def test_facho_xml_fragment_create_on_first_append():
xml = facho.FachoXML('root')
A = xml.fragment('./A', append=True)
A.find_or_create_element('./B')
A = xml.fragment('./A', append=True)
A.find_or_create_element('./C')
assert xml.tostring() == ''
def test_facho_xml_placeholder_optional_and_fragment():
xml = facho.FachoXML('root')
xml.placeholder_for('./A/AA')
A = xml.fragment('./A', append_not_exists=True)
A.find_or_create_element('./AA/B')
A = xml.fragment('./A', append_not_exists=True)
A.find_or_create_element('./AA/C')
assert xml.tostring() == ''
def test_facho_xml_placeholder_optional_and_set_attributes():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
xml.set_attributes('/root/A', prueba='OK')
assert xml.get_element_attribute('/root/A', 'prueba') == 'OK'
assert xml.tostring() == ''
def test_facho_xml_placeholder_optional_and_fragment_with_set_element():
xml = facho.FachoXML('root')
xml.placeholder_for('./A/AA')
A = xml.fragment('./A', append_not_exists=True)
A.set_element('./AA', None, append_=True, prueba='OK')
assert xml.tostring() == ''
assert xml.get_element_attribute('/root/A/AA', 'prueba') == 'OK'
def test_facho_xml_exist_element():
xml = facho.FachoXML('root')
xml.placeholder_for('./A')
assert xml.exist_element('/root/A') is False
assert xml.tostring() == ''
xml.find_or_create_element('./A')
assert xml.exist_element('/root/A')
assert xml.tostring() == ''
def test_facho_xml_query_element_text_or_attribute():
xml = facho.FachoXML('root')
xml.set_element('./A', 'contenido', clave='valor')
assert xml.get_element_text_or_attribute('/root/A') == 'contenido'
assert xml.get_element_text_or_attribute('/root/A/@clave') == 'valor'
def test_facho_xml_query_element_text_or_attribute_from_fragment():
xml = facho.FachoXML('root')
invoice = xml.fragment('/root/Invoice')
invoice.set_element('./A', 'contenido')
assert invoice.get_element_text_or_attribute('/Invoice/A') == 'contenido'
def test_facho_xml_build_xml_absolute():
xml = facho.FachoXML('root')
xpath = xml.xpath_from_root('/A')
assert xpath == '/root/A'
def test_facho_xml_build_xml_absolute_namespace():
xml = facho.FachoXML(
'{%s}root' %
('http://www.dian.gov.co/contratos/facturaelectronica/v1'),
nsmap={
'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1'})
xpath = xml.xpath_from_root('/A')
assert xpath == '/fe:root/A'
def test_facho_xml_build_xml_absolute_namespace_from_fragment():
xml = facho.FachoXML(
'{%s}root' %
('http://www.dian.gov.co/contratos/facturaelectronica/v1'),
nsmap={
'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1'})
invoice = xml.fragment('/root/Invoice')
xpath = invoice.xpath_from_root('/A')
assert xpath == '/fe:root/Invoice/A'