File: test_serialization.py

package info (click to toggle)
django-recurrence 1.12.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,148 kB
  • sloc: python: 2,530; javascript: 2,502; makefile: 159; sh: 6
file content (125 lines) | stat: -rw-r--r-- 3,456 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
from datetime import datetime
from recurrence import Recurrence, Rule
from recurrence.exceptions import DeserializationError
import pytest
import recurrence


def test_rule_serialization():
    rule = Rule(
        recurrence.WEEKLY
    )

    serialized = recurrence.serialize(rule)
    assert 'RRULE:FREQ=WEEKLY' == serialized
    assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule])


def test_no_equal_sign():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:A')


def test_no_value():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:A=')


def test_unknown_key():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:A=X')


def test_bad_freq():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:FREQ=X')


def test_bad_interval():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:INTERVAL=X')


def test_bad_wkst():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:WKST=X')


def test_bad_count():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:COUNT=X')


def test_bad_byday():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:BYDAY=X')


def test_bad_BYMONTH():
    with pytest.raises(DeserializationError):
        recurrence.deserialize('RRULE:BYMONTH=X')


def test_complex_rule_serialization():
    rule = Rule(
        recurrence.WEEKLY,
        interval=17,
        wkst=1,
        count=7,
        byday=[
            recurrence.to_weekday('-1MO'),
            recurrence.to_weekday('TU')
        ],
        bymonth=[1, 3]
    )

    serialized = recurrence.serialize(rule)
    assert ('RRULE:FREQ=WEEKLY;INTERVAL=17;WKST=TU;'
            'COUNT=7;BYDAY=-1MO,TU;BYMONTH=1,3') == serialized
    assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule])


def test_complex_rule_serialization_with_weekday_instance():
    rule = Rule(
        recurrence.WEEKLY,
        interval=17,
        wkst=recurrence.to_weekday(1),
        count=7,
        byday=[
            recurrence.to_weekday('-1MO'),
            recurrence.to_weekday('TU')
        ],
        bymonth=[1, 3]
    )

    serialized = recurrence.serialize(rule)
    assert ('RRULE:FREQ=WEEKLY;INTERVAL=17;WKST=TU;'
            'COUNT=7;BYDAY=-1MO,TU;BYMONTH=1,3') == serialized
    assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule])


def test_bug_in_count_and_until_rule_serialization():
    # This tests a bug in the way we serialize rules with instance
    # counts and an until date. We should really raise a
    # ValidationError in validate if you specify both, but we
    # currently don't. Once we start doing this, this test can be
    # modified to check an exception is raised.
    rule = Rule(
        recurrence.WEEKLY,
        count=7,
        until=datetime(2014, 10, 31, 0, 0, 0)
    )

    serialized = recurrence.serialize(rule)

    # Note that we've got no UNTIL value here
    assert 'RRULE:FREQ=WEEKLY;COUNT=7' == serialized


def test_comma_separated_exdates():
    exdates = [datetime(2022, 3, 14, 21, 0, 0), datetime(2022, 3, 13, 21, 0, 0)]
    recurrence_ = Recurrence(exdates=exdates)
    text = 'EXDATE:20220314T210000Z,20220313T210000Z'

    deserialized = recurrence.deserialize(text)
    assert recurrence_ == deserialized