File size: 5,579 Bytes
550665c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from datetime import time, datetime, date
from unittest import TestCase

from beautiful_date import Apr

from gcsa.reminders import Reminder, EmailReminder, PopupReminder
from gcsa.serializers.reminder_serializer import ReminderSerializer


class TestReminder(TestCase):
    def test_email_reminder(self):
        reminder = EmailReminder()
        self.assertEqual(reminder.method, 'email')
        self.assertEqual(reminder.minutes_before_start, 60)

        reminder = EmailReminder(34)
        self.assertEqual(reminder.method, 'email')
        self.assertEqual(reminder.minutes_before_start, 34)

        reminder = EmailReminder(days_before=1, at=time(0, 0))
        self.assertEqual(reminder.method, 'email')
        self.assertEqual(reminder.minutes_before_start, None)
        self.assertEqual(reminder.days_before, 1)
        self.assertEqual(reminder.at, time(0, 0))

    def test_popup_reminder(self):
        reminder = PopupReminder()
        self.assertEqual(reminder.method, 'popup')
        self.assertEqual(reminder.minutes_before_start, 30)

        reminder = PopupReminder(51)
        self.assertEqual(reminder.method, 'popup')
        self.assertEqual(reminder.minutes_before_start, 51)

        reminder = PopupReminder(days_before=1, at=time(0, 0))
        self.assertEqual(reminder.method, 'popup')
        self.assertEqual(reminder.minutes_before_start, None)
        self.assertEqual(reminder.days_before, 1)
        self.assertEqual(reminder.at, time(0, 0))

    def test_repr_str(self):
        reminder = EmailReminder(34)
        self.assertEqual(reminder.__repr__(), "<EmailReminder - minutes_before_start:34>")
        self.assertEqual(reminder.__str__(), "EmailReminder - minutes_before_start:34")

        reminder = PopupReminder(days_before=1, at=time(0, 0))
        self.assertEqual(reminder.__repr__(), "<PopupReminder - 1 days before at 00:00:00>")
        self.assertEqual(reminder.__str__(), "PopupReminder - 1 days before at 00:00:00")

    def test_absolute_reminders_conversion(self):
        absolute_reminder = EmailReminder(days_before=1, at=time(12, 0))
        reminder = absolute_reminder.convert_to_relative(datetime(2024, 4, 16, 10, 15))
        self.assertEqual(reminder.method, 'email')
        self.assertEqual(reminder.minutes_before_start, (12 + 10) * 60 + 15)

        absolute_reminder = PopupReminder(days_before=2, at=time(11, 30))
        reminder = absolute_reminder.convert_to_relative(date(2024, 4, 16))
        self.assertEqual(reminder.method, 'popup')
        self.assertEqual(reminder.minutes_before_start, 24 * 60 + 12 * 60 + 30)

        absolute_reminder = PopupReminder(days_before=5, at=time(10, 25))
        reminder = absolute_reminder.convert_to_relative(16 / Apr / 2024)
        self.assertEqual(reminder.method, 'popup')
        self.assertEqual(reminder.minutes_before_start, 4 * 24 * 60 + 13 * 60 + 35)

    def test_reminder_checks(self):
        # No time provided
        with self.assertRaises(ValueError):
            Reminder(method='email')

        # Both relative and absolute times provided
        with self.assertRaises(ValueError):
            Reminder(method='email', minutes_before_start=22, days_before=1)
        with self.assertRaises(ValueError):
            Reminder(method='email', minutes_before_start=22, at=time(0, 0))

        # Only one of days_before and at provided
        with self.assertRaises(ValueError):
            Reminder(method='email', days_before=1)
        with self.assertRaises(ValueError):
            Reminder(method='email', at=time(0, 0))
        with self.assertRaises(ValueError):
            PopupReminder(days_before=1)
        with self.assertRaises(ValueError):
            EmailReminder(at=time(0, 0))


class TestReminderSerializer(TestCase):
    def test_to_json(self):
        reminder_json = {
            'method': 'email',
            'minutes': 55
        }
        reminder = EmailReminder(55)

        self.assertDictEqual(ReminderSerializer.to_json(reminder), reminder_json)

        reminder_json = {
            'method': 'popup',
            'minutes': 13
        }
        reminder = PopupReminder(13)

        self.assertDictEqual(ReminderSerializer.to_json(reminder), reminder_json)

        serializer = ReminderSerializer(reminder)
        self.assertDictEqual(serializer.get_json(), reminder_json)

    def test_to_object(self):
        reminder_json = {
            'method': 'email',
            'minutes': 55
        }

        reminder = ReminderSerializer.to_object(reminder_json)

        self.assertIsInstance(reminder, EmailReminder)
        self.assertEqual(reminder.minutes_before_start, 55)

        reminder_json = {
            'method': 'popup',
            'minutes': 33
        }

        reminder = ReminderSerializer.to_object(reminder_json)

        self.assertIsInstance(reminder, PopupReminder)
        self.assertEqual(reminder.minutes_before_start, 33)

        reminder_json_str = """{

            "method": "popup",

            "minutes": 22

        }"""

        reminder = ReminderSerializer.to_object(reminder_json_str)

        self.assertIsInstance(reminder, PopupReminder)
        self.assertEqual(reminder.minutes_before_start, 22)

        with self.assertRaises(ValueError):
            reminder_json = {
                'method': 'telegram',
                'minutes': 33
            }

            ReminderSerializer.to_object(reminder_json)