summaryrefslogtreecommitdiffstats
path: root/tests/test_common.py
blob: 97fc0667092d37e7ee0ceedb55b70df834c52a9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
import decimal
import unittest
import xml.etree.ElementTree as ET
from typing import Optional

import common


class Operation(common.Operation):
    """
    Dummy operation.

    Used to test the retry feature.
    """

    def __init__(self, timeouts: int) -> None:
        self.timeouts = timeouts

    async def run(self) -> Optional[common.Error]:
        if self.timeouts > 0:
            self.timeouts -= 1
            return common.OperationTimedOut("Operation timed out")

        return None


class TestOperation(unittest.IsolatedAsyncioTestCase):
    async def test_run_and_retry(self) -> None:
        """If an operation times out, we try again."""

        async def run_and_retry(timeouts: int, retries: int) -> Optional[common.Error]:
            operation = Operation(timeouts)
            return await operation.run_and_retry(retries=retries, delay=0, logger=None)

        self.assertIsNone(await run_and_retry(timeouts=0, retries=0))
        self.assertIsInstance(await run_and_retry(timeouts=1, retries=0), common.OperationTimedOut)
        self.assertIsNone(await run_and_retry(timeouts=1, retries=1))
        self.assertIsInstance(await run_and_retry(timeouts=2, retries=1), common.OperationTimedOut)
        self.assertIsNone(await run_and_retry(timeouts=2, retries=2))


class TestXmlParser(unittest.TestCase):
    def test_decimal_attribute(self) -> None:
        """We can parse decimal attributes"""
        element = common.XmlParser(ET.fromstring("""<Circle radius="1.5"/>"""))
        value = element.decimal_attribute("radius")
        self.assertEqual(value, decimal.Decimal("1.5"))

    def test_decimal_attrubute_with_comma(self) -> None:
        """We can parse decimal attributes with commas"""
        element = common.XmlParser(ET.fromstring("""<Line length="3,4"/>"""))
        value = element.decimal_attribute("length")
        self.assertEqual(value, decimal.Decimal("3.4"))