File: test_fallback.py

package info (click to toggle)
python-nbxmpp 6.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,340 kB
  • sloc: python: 19,639; makefile: 4
file content (156 lines) | stat: -rw-r--r-- 5,586 bytes parent folder | download | duplicates (2)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
from __future__ import annotations

from test.lib.util import StanzaHandlerTest
from unittest.mock import MagicMock

import nbxmpp
from nbxmpp.exceptions import FallbackLanguageError
from nbxmpp.language import LanguageRange
from nbxmpp.modules.fallback import FallbackRange
from nbxmpp.modules.fallback import FallbacksForT
from nbxmpp.modules.fallback import parse_fallback_indication
from nbxmpp.modules.fallback import strip_fallback
from nbxmpp.structs import BodyData


class TestFallback(StanzaHandlerTest):

    def test_parse_fallback_indication(self):
        xml = """
            <message to='anna@example.com' id='message-id2' type='groupchat'>
              <body>> Anna wrote:\n> Hi, how are you?\nGreat</body>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:0'>
                <body start='0' end='33' />
                <body xml:lang='en' start='0' end='32' />
                <body xml:lang='de' start='0' end='31' />
              </fallback>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:1'>
                <body />
              </fallback>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:2' />
            </message>
        """

        log = MagicMock()
        message = nbxmpp.Message(node=xml)

        fallbacks_for = parse_fallback_indication(log, message)

        expected = {
            "urn:xmpp:test:0": {
                None: FallbackRange(0, 33),
                "en": FallbackRange(0, 32),
                "de": FallbackRange(0, 31),
            },
            "urn:xmpp:test:1": {
                None: None,
            },
            "urn:xmpp:test:2": None,
        }

        self.assertEqual(fallbacks_for, expected)

    def test_strip_fallback(self):
        fallbacks_for: FallbacksForT = {
            "urn:xmpp:test:1": {
                None: FallbackRange(33, 38),
            },
            "urn:xmpp:test:0": {
                None: FallbackRange(0, 14),
                "en": FallbackRange(0, 33),
            },
            "urn:xmpp:test:2": {
                None: FallbackRange(54, 55),
                "en": None,
            },
        }

        text = "> Anna wrote:\n> Hi, how are you?\nGreat"

        # Strip one fallback with unavailable language
        with self.assertRaises(FallbackLanguageError):
            stripped_text = strip_fallback(
                fallbacks_for, {"urn:xmpp:test:0"}, "xx", text
            )

        # Strip one fallback with language
        stripped_text = strip_fallback(fallbacks_for, {"urn:xmpp:test:0"}, "en", text)
        self.assertEqual(stripped_text, "Great")

        # Strip one fallback with no language
        stripped_text = strip_fallback(fallbacks_for, {"urn:xmpp:test:0"}, None, text)
        self.assertEqual(stripped_text, "> Hi, how are you?\nGreat")

        # Strip multiple fallbacks in correct order
        stripped_text = strip_fallback(
            fallbacks_for, {"urn:xmpp:test:0", "urn:xmpp:test:1"}, None, text
        )
        self.assertEqual(stripped_text, "> Hi, how are you?\n")

        # Range out of bounds, don’t strip anything
        stripped_text = strip_fallback(fallbacks_for, {"urn:xmpp:test:2"}, None, text)
        self.assertEqual(stripped_text, text)

        # One Range is None, so whole body is fallback
        stripped_text = strip_fallback(
            fallbacks_for, {"urn:xmpp:test:0", "urn:xmpp:test:2"}, "en", text
        )
        self.assertEqual(stripped_text, "")

    def test_body_with_fallback(self):
        text = "> Anna wrote:\n> Hi, how are you?\nGreat"
        text_de = "> Anna schrieb\n>Hallo, wie geht es dir?\nGut"

        xml = """
            <message to='anna@example.com' id='message-id2' type='groupchat'>
              <body>%s</body>
              <body xml:lang='en'>%s</body>
              <body xml:lang='de'>%s</body>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:0'>
                <body start='0' end='33' />
                <body xml:lang='en' start='0' end='33' />
                <body xml:lang='de' start='0' end='40' />
              </fallback>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:1'>
                <body />
              </fallback>
              <fallback xmlns='urn:xmpp:fallback:0' for='urn:xmpp:test:2' />
            </message>
        """ % (
            text,
            text,
            text_de,
        )

        log = MagicMock()
        message = nbxmpp.Message(node=xml)

        fallbacks_for = parse_fallback_indication(log, message)

        body_data = BodyData(message, fallbacks_for, {"urn:xmpp:test:0"})
        body = body_data.get([LanguageRange(tag="en")])
        self.assertEqual(body, "Great")

        body = body_data.get(None)
        self.assertEqual(body, "Great")

        body = body_data.get([LanguageRange(tag="de")])
        self.assertEqual(body, "Gut")

        body_data = BodyData(message, fallbacks_for, {"urn:xmpp:test:1"})
        # specific language body requested
        # but there is no fallback for this language
        body = body_data.get([LanguageRange(tag="en")])
        self.assertEqual(body, text)

        body = body_data.get(None)
        self.assertEqual(body, "")

        body_data = BodyData(message, fallbacks_for, {"urn:xmpp:test:2"})
        # specific language body requested
        # fallback is for all bodies
        body = body_data.get([LanguageRange(tag="en")])
        self.assertEqual(body, "")

        body = body_data.get(None)
        self.assertEqual(body, "")