File: test_freebusy.py

package info (click to toggle)
python-ical 9.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,448 kB
  • sloc: python: 13,877; sh: 9; makefile: 5
file content (129 lines) | stat: -rw-r--r-- 4,079 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
"""Tests for Free/Busy component."""

from __future__ import annotations

import datetime
import zoneinfo
from typing import Generator
from unittest.mock import patch

import pytest

from ical.exceptions import CalendarParseError
from ical.freebusy import FreeBusy
from ical.types import FreeBusyType, Period


@pytest.fixture(autouse=True)
def local_timezone() -> Generator[None, None, None]:
    """Fixture to set a local timezone to use during tests."""
    with patch(
        "ical.util.local_timezone", return_value=zoneinfo.ZoneInfo("America/Regina")
    ):
        yield


def test_empty() -> None:
    """Test that no fields are required."""
    freebusy = FreeBusy()
    assert not freebusy.sequence
    assert not freebusy.start
    assert not freebusy.start_datetime
    assert not freebusy.end
    assert not freebusy.end_datetime
    assert not freebusy.computed_duration


def test_freebusy() -> None:
    """Test a valid Journal object."""
    freebusy = FreeBusy(sequence=1)
    assert freebusy.sequence == 1


def test_start_datetime() -> None:
    """Test FreeBusy with a start datetime and no end."""

    freebusy = FreeBusy(
        start=datetime.datetime(2022, 8, 7, 5, 0, 0, tzinfo=datetime.timezone.utc)
    )
    assert freebusy.start
    assert freebusy.start.isoformat() == "2022-08-07T05:00:00+00:00"
    assert freebusy.start_datetime
    assert freebusy.start_datetime.isoformat() == "2022-08-07T05:00:00+00:00"
    assert not freebusy.end
    assert not freebusy.end_datetime


def test_start_date() -> None:
    """Test FreeBusy with a start date and no end."""

    freebusy = FreeBusy(start=datetime.date(2022, 8, 7))
    assert freebusy.start.isoformat() == "2022-08-07"
    # Use local timezone
    assert freebusy.start_datetime
    assert freebusy.start_datetime.isoformat() == "2022-08-07T06:00:00+00:00"

    assert not freebusy.end
    assert not freebusy.end_datetime


def test_start_end_date() -> None:
    """Test freebusy start date conversions."""

    freebusy = FreeBusy(start=datetime.date(2022, 8, 7), end=datetime.date(2022, 8, 10))
    assert freebusy.start
    assert freebusy.start.isoformat() == "2022-08-07"
    assert freebusy.end
    assert freebusy.end.isoformat() == "2022-08-10"
    assert freebusy.computed_duration == datetime.timedelta(days=3)

    # Use local timezone
    assert freebusy.start_datetime
    assert freebusy.start_datetime.isoformat() == "2022-08-07T06:00:00+00:00"
    assert freebusy.end_datetime
    assert freebusy.end_datetime.isoformat() == "2022-08-10T06:00:00+00:00"


def test_free_busy() -> None:
    """Test freebusy start date conversions."""
    freebusy = FreeBusy(
        start=datetime.date(2022, 8, 7),
        end=datetime.date(2022, 8, 10),
        freebusy=[
            Period(
                start=datetime.datetime(
                    2022, 8, 7, 5, 0, 0, tzinfo=datetime.timezone.utc
                ),
                duration=datetime.timedelta(hours=2),
                free_busy_type=FreeBusyType.BUSY,
            ),
            Period(
                start=datetime.datetime(
                    2022, 8, 7, 10, 0, 0, tzinfo=datetime.timezone.utc
                ),
                duration=datetime.timedelta(minutes=30),
                free_busy_type=FreeBusyType.BUSY,
            ),
        ],
    )
    assert freebusy.start
    assert freebusy.start.isoformat() == "2022-08-07"
    assert freebusy.end
    assert freebusy.end.isoformat() == "2022-08-10"
    assert len(freebusy.freebusy) == 2


def test_free_busy_requires_utc() -> None:
    """Test freebusy start date conversions."""
    with pytest.raises(CalendarParseError, match=r"Freebusy time must be in UTC format.*"):
        FreeBusy(
            start=datetime.date(2022, 8, 7),
            end=datetime.date(2022, 8, 10),
            freebusy=[
                Period(
                    start=datetime.datetime(2022, 8, 7, 5, 0, 0),
                    duration=datetime.timedelta(hours=2),
                    free_busy_type=FreeBusyType.BUSY,
                ),
            ],
        )