File: test_event.py

package info (click to toggle)
python-sse-starlette 3.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,248 kB
  • sloc: python: 3,481; makefile: 131; sh: 57
file content (131 lines) | stat: -rw-r--r-- 3,852 bytes parent folder | download
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
import pytest

from sse_starlette.event import ServerSentEvent, JSONServerSentEvent, ensure_bytes


@pytest.mark.parametrize(
    "input, expected",
    [
        ("foo", b"data: foo\r\n\r\n"),
        (dict(data="foo", event="bar"), b"event: bar\r\ndata: foo\r\n\r\n"),
        (
            dict(data="foo", event="bar", id="xyz"),
            b"id: xyz\r\nevent: bar\r\ndata: foo\r\n\r\n",
        ),
        (
            dict(data="foo", event="bar", id="xyz", retry=1),
            b"id: xyz\r\nevent: bar\r\ndata: foo\r\nretry: 1\r\n\r\n",
        ),
        (
            dict(data="foo", event="bar", id="xyz", retry=1, sep="\n"),
            b"id: xyz\nevent: bar\ndata: foo\nretry: 1\n\n",
        ),
        (
            dict(comment="a comment"),
            b": a comment\r\n\r\n",
        ),
        (
            dict(data="foo", comment="a comment"),
            b": a comment\r\ndata: foo\r\n\r\n",
        ),
    ],
)
def test_server_sent_event(input, expected):
    print(input, expected)
    if isinstance(input, str):
        assert ServerSentEvent(input).encode() == expected
    else:
        assert ServerSentEvent(**input).encode() == expected


@pytest.mark.parametrize(
    "input, expected",
    [
        (dict(data={"foo": "bar"}), b'data: {"foo":"bar"}\r\n\r\n'),
        (
            dict(data={"foo": "bar"}, event="baz"),
            b'event: baz\r\ndata: {"foo":"bar"}\r\n\r\n',
        ),
        (
            dict(data={"foo": "bar"}, event="baz", id="xyz"),
            b'id: xyz\r\nevent: baz\r\ndata: {"foo":"bar"}\r\n\r\n',
        ),
        (
            dict(data={"foo": "bar"}, event="baz", id="xyz", retry=1),
            b'id: xyz\r\nevent: baz\r\ndata: {"foo":"bar"}\r\nretry: 1\r\n\r\n',
        ),
        (
            dict(comment="a comment"),
            b": a comment\r\n\r\n",
        ),
        (
            dict(data={"foo": "bar"}, comment="a comment"),
            b': a comment\r\ndata: {"foo":"bar"}\r\n\r\n',
        ),
    ],
)
def test_json_server_sent_event(input, expected):
    assert JSONServerSentEvent(**input).encode() == expected


@pytest.mark.parametrize(
    "input, expected",
    [
        (b"data: foo\r\n\r\n", b"data: foo\r\n\r\n"),
        ("foo", b"data: foo\n\n"),
        (dict(data="foo", event="bar"), b"event: bar\ndata: foo\n\n"),
    ],
)
def test_ensure_bytes(input, expected):
    assert ensure_bytes(input, sep="\n") == expected


@pytest.mark.parametrize(
    "stream_sep,line_sep",
    [
        ("\n", "\n"),
        ("\n", "\r"),
        ("\n", "\r\n"),
        ("\r", "\n"),
        ("\r", "\r"),
        ("\r", "\r\n"),
        ("\r\n", "\n"),
        ("\r\n", "\r"),
        ("\r\n", "\r\n"),
    ],
    ids=(
        "stream-LF:line-LF",
        "stream-LF:line-CR",
        "stream-LF:line-CR+LF",
        "stream-CR:line-LF",
        "stream-CR:line-CR",
        "stream-CR:line-CR+LF",
        "stream-CR+LF:line-LF",
        "stream-CR+LF:line-CR",
        "stream-CR+LF:line-CR+LF",
    ),
)
def test_multiline_data(stream_sep, line_sep):
    lines = line_sep.join(["foo", "bar", "xyz"])
    result = ServerSentEvent(lines, event="event", sep=stream_sep).encode()
    assert (
        result
        == "event: event{0}data: foo{0}data: bar{0}data: xyz{0}{0}".format(
            stream_sep
        ).encode()
    )


@pytest.mark.parametrize("sep", ["\n", "\r", "\r\n"], ids=("LF", "CR", "CR+LF"))
def test_custom_sep(sep):
    result = ServerSentEvent("foo", event="event", sep=sep).encode()
    assert result == "event: event{0}data: foo{0}{0}".format(sep).encode()


def test_retry_is_int():
    response = ServerSentEvent(0, retry=1)
    assert response.retry == 1

    with pytest.raises(TypeError) as ctx:
        _ = ServerSentEvent(0, retry="ten").encode()  # type: ignore
    assert str(ctx.value) == "retry argument must be int"