Source code for openpyxl.descriptors.tests.test_sequence

from __future__ import absolute_import
# Copyright (c) 2010-2017 openpyxl
import pytest

from openpyxl.xml.functions import fromstring, tostring, Element
from openpyxl.tests.helper import compare_xml
from ..serialisable import Serialisable
from ..base import Integer

@pytest.fixture
[docs]def Sequence(): from ..sequence import Sequence return Sequence
@pytest.fixture
[docs]def Dummy(Sequence): class Dummy(Serialisable): value = Sequence(expected_type=int) def __init__(self, value=()): self.value = value return Dummy
[docs]class TestSequence: @pytest.mark.parametrize("value", [list(), tuple()])
[docs] def test_valid_ctor(self, Dummy, value): dummy = Dummy() dummy.value = value assert dummy.value == list(value)
@pytest.mark.parametrize("value", ["", b"", dict(), 1, None])
[docs] def test_invalid_container(self, Dummy, value): dummy = Dummy() with pytest.raises(TypeError): dummy.value = value
[docs]class TestPrimitive:
[docs] def test_to_tree(self, Dummy): dummy = Dummy([1, '2', 3]) root = Element("root") for node in Dummy.value.to_tree("el", dummy.value, ): root.append(node) xml = tostring(root) expected = """ <root> <el>1</el> <el>2</el> <el>3</el> </root> """ diff = compare_xml(xml, expected) assert diff is None, diff
[docs] def test_from_xml(self, Dummy): src = """ <root> <value>1</value> <value>2</value> <value>3</value> </root> """ node = fromstring(src) dummy = Dummy.from_tree(node) assert dummy.value == [1, 2, 3]
[docs]class SomeType(Serialisable): value = Integer() def __init__(self, value): self.value = value
[docs]class TestComplex:
[docs] def test_to_tree(self, Sequence): class Dummy: vals = Sequence(expected_type=SomeType, name="vals") dummy = Dummy() dummy.vals = [SomeType(1), SomeType(2), SomeType(3)] root = Element("root") for node in Dummy.vals.to_tree("el", dummy.vals): root.append(node) xml = tostring(root) expected = """ <root> <el value="1"></el> <el value="2"></el> <el value="3"></el> </root> """ diff = compare_xml(xml, expected) assert diff is None, diff
[docs] def test_from_xml(self, Sequence): src = """ <root> <vals value="1"></vals> <vals value="2"></vals> <vals value="3"></vals> </root> """ node = fromstring(src) class Dummy(Serialisable): vals = Sequence(expected_type=SomeType) def __init__(self, vals): self.vals = vals dummy = Dummy.from_tree(node) assert dummy.vals == [SomeType(1), SomeType(2), SomeType(3)]
@pytest.fixture
[docs]def ValueSequence(): from .. sequence import ValueSequence return ValueSequence
[docs]class TestValueSequence:
[docs] def test_to_tree(self, ValueSequence): class Dummy(Serialisable): tagname = "el" size = ValueSequence(expected_type=int) dummy = Dummy() dummy.size = [1, 2, 3] xml = tostring(dummy.to_tree()) expected = """ <el> <size val="1"></size> <size val="2"></size> <size val="3"></size> </el> """ diff = compare_xml(xml, expected) assert diff is None, diff
[docs] def test_from_tree(self, ValueSequence): class Dummy(Serialisable): tagname = "el" __nested__ = ("size",) size = ValueSequence(expected_type=int) def __init__(self, size): self.size = size src = """ <el> <size val="1"></size> <size val="2"></size> <size val="3"></size> </el> """ node = fromstring(src) desc = Dummy.size vals = desc.from_tree(node) dummy = Dummy.from_tree(node) assert dummy.size == [1, 2, 3]
@pytest.fixture
[docs]def NestedSequence(): from ..sequence import NestedSequence return NestedSequence
from openpyxl.styles import Font @pytest.fixture
[docs]def ComplexObject(NestedSequence): class Complex(Serialisable): tagname = "style" fonts = NestedSequence(expected_type=Font, count=True) def __init__(self, fonts=()): self.fonts = fonts return Complex
[docs]class TestNestedSequence:
[docs] def test_ctor(self, ComplexObject): style = ComplexObject() ft1 = Font(family=2, sz=11, name="Arial") ft2 = Font(bold=True) style.fonts = [ft1, ft2] expected = """ <style> <fonts count="2"> <font> <name val="Arial" /> <family val="2"></family> <sz val="11"></sz> </font> <font> <b val="1"></b> </font> </fonts> </style> """ tree = style.__class__.fonts.to_tree('fonts', style.fonts) tree = style.to_tree() xml = tostring(tree) diff = compare_xml(xml, expected) assert diff is None, diff
[docs] def test_from_tree(self, ComplexObject): xml = """ <style> <fonts count="2"> <font> <name val="Calibri"></name> <family val="2"></family> <color rgb="00000000"></color> <sz val="11"></sz> </font> <font> <name val="Calibri"></name> <family val="2"></family> <b val="1"></b> <color rgb="00000000"></color> <sz val="11"></sz> </font> </fonts> </style> """ node = fromstring(xml) style = ComplexObject.from_tree(node) assert len(style.fonts) == 2 assert style.fonts[1].bold is True