File: test_formatter.py

package info (click to toggle)
streamlink 8.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,568 kB
  • sloc: python: 51,299; sh: 184; makefile: 152
file content (73 lines) | stat: -rw-r--r-- 3,050 bytes parent folder | download | duplicates (4)
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
from datetime import datetime, timezone
from unittest.mock import Mock, patch

import pytest
from freezegun import freeze_time

from streamlink.utils.formatter import Formatter


class TestFormatter:
    class Obj:
        def __str__(self):
            return "obj"

    @pytest.fixture()
    def prop(self):
        return Mock(return_value="prop")

    @pytest.fixture()
    def obj(self):
        return self.Obj()

    @pytest.fixture()
    def formatter(self, prop: Mock, obj: Obj):
        with freeze_time("2000-01-02T03:04:05.000006Z"):
            yield Formatter(
                {
                    "prop": prop,
                    "obj": lambda: obj,
                    "time": lambda: datetime.now(timezone.utc),
                    "empty": lambda: "",
                    "none": lambda: None,
                },
                {
                    "time": lambda dt, fmt: dt.strftime(fmt),
                },
            )

    def test_unknown(self, formatter: Formatter):
        assert formatter.format("{}") == "{}"
        assert formatter.format("some {unknown} variable") == "some {unknown} variable"
        assert formatter.format("some {unknown} variable", {"unknown": "known"}) == "some known variable"
        assert formatter.cache == {}

    def test_format(self, formatter: Formatter, prop: Mock, obj: Obj):
        assert formatter.format("text '{prop}' '{empty}' '{none}'") == "text 'prop' '' ''"
        assert formatter.cache == dict(prop="prop", empty="", none=None)
        assert prop.call_count == 1

        assert formatter.format("text '{prop}' '{obj}' '{empty}' '{none}'") == "text 'prop' 'obj' '' ''"
        assert formatter.cache == dict(prop="prop", obj=obj, empty="", none=None)
        assert prop.call_count == 1

        defaults = dict(prop="PROP", obj="OBJ", empty="EMPTY", none="NONE")
        assert formatter.format("'{prop}' '{obj}' '{empty}' '{none}'", defaults) == "'prop' 'obj' '' 'NONE'"
        assert formatter.cache == dict(prop="prop", obj=obj, empty="", none=None)
        assert prop.call_count == 1

    def test_format_spec(self, formatter: Formatter):
        assert formatter.format("{time}") == "2000-01-02 03:04:05.000006+00:00"
        assert formatter.cache == dict(time=datetime(2000, 1, 2, 3, 4, 5, 6, timezone.utc))
        assert formatter.format("{time:%Y}") == "2000"
        assert formatter.format("{time:%Y-%m-%d}") == "2000-01-02"
        assert formatter.format("{time:%H:%M:%S}") == "03:04:05"
        assert formatter.format("{time:%Z}") == "UTC"
        with patch("datetime.datetime.strftime", side_effect=ValueError):
            assert formatter.format("{time:foo:bar}") == "{time:foo:bar}"
        assert formatter.cache == dict(time=datetime(2000, 1, 2, 3, 4, 5, 6, timezone.utc))

        assert formatter.format("{prop:foo}") == "prop"
        assert formatter.format("{none:foo}") == ""
        assert formatter.format("{unknown:format}") == "{unknown:format}"
        assert formatter.format("{unknown:format}", {"unknown": "known"}) == "known"