Skip to content

Commit 14692e6

Browse files
committed
Added more tests and checks
1 parent 10ccf12 commit 14692e6

File tree

3 files changed

+116
-2
lines changed

3 files changed

+116
-2
lines changed

featuremanagement/_time_window_filter/_models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ def __init__(self, pattern_data: Dict[str, Any]):
8282
# Days of the week are represented as a list of integers from 0 to 6.
8383
self.days_of_week = []
8484
for day in days_of_week_str:
85+
if day not in self.days:
86+
raise ValueError(f"Invalid value for DaysOfWeek: {day}")
8587
self.days_of_week.append(self.days.index(day))
88+
if pattern_data.get("FirstDayOfWeek") and pattern_data.get("FirstDayOfWeek") not in self.days:
89+
raise ValueError(f"Invalid value for FirstDayOfWeek: {pattern_data.get('FirstDayOfWeek')}")
8690
self.first_day_of_week = self.days.index(pattern_data.get("FirstDayOfWeek", "Sunday"))
8791

8892

@@ -98,7 +102,10 @@ def __init__(self, range_data: Dict[str, Any]):
98102
self.type = RecurrenceRangeType.from_str(range_data.get("Type", "NoEnd"))
99103
if range_data.get("EndDate") and isinstance(range_data.get("EndDate"), str):
100104
end_date_str = range_data.get("EndDate", "")
101-
self.end_date = parsedate_to_datetime(end_date_str) if end_date_str else None
105+
try:
106+
self.end_date = parsedate_to_datetime(end_date_str) if end_date_str else None
107+
except ValueError:
108+
raise ValueError(f"Invalid value for EndDate: {end_date_str}")
102109
self.num_of_occurrences = range_data.get("NumberOfOccurrences", math.pow(2, 63) - 1)
103110
if self.num_of_occurrences < 0:
104111
raise ValueError("The number of occurrences must be greater than or equal to 0.")

tests/time_window_filter/test_recurrence_validator.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,24 @@ def test_is_duration_compliant_with_days_of_week_false():
191191
def test_sort_days_of_week():
192192
days_of_week = [0, 3, 5] # Monday, Thursday, Saturday
193193
sorted_days = _sort_days_of_week(days_of_week, 6)
194-
assert sorted_days == [0, 3, 5]
194+
assert sorted_days == [0, 3, 5]
195+
196+
days_of_week = [5, 0, 3] # Saturday, Monday, Thursday
197+
sorted_days = _sort_days_of_week(days_of_week, 6)
198+
assert sorted_days == [0, 3, 5]
199+
200+
days_of_week = [0, 1, 2, 3, 4, 5, 6] # All days of the week
201+
sorted_days = _sort_days_of_week(days_of_week, 6)
202+
assert sorted_days == [6, 0, 1, 2, 3, 4, 5]
203+
204+
days_of_week = [6, 5, 4, 3, 2, 1, 0] # All days of the week in reverse order
205+
sorted_days = _sort_days_of_week(days_of_week, 6)
206+
assert sorted_days == [6, 0, 1, 2, 3, 4, 5]
207+
208+
days_of_week = [0, 2, 4, 6] # Monday, Wednesday, Friday, Sunday
209+
sorted_days = _sort_days_of_week(days_of_week, 2)
210+
assert sorted_days == [2, 4, 6, 0]
211+
212+
days_of_week = [1] # Tuesday
213+
sorted_days = _sort_days_of_week(days_of_week, 0)
214+
assert sorted_days == [1]
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# ------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# -------------------------------------------------------------------------
6+
from featuremanagement._time_window_filter._models import RecurrencePatternType, RecurrenceRangeType, RecurrencePattern, RecurrenceRange, Recurrence
7+
from datetime import datetime
8+
import math
9+
10+
def test_recurrence_pattern_type():
11+
assert RecurrencePatternType.from_str("Daily") == RecurrencePatternType.DAILY
12+
assert RecurrencePatternType.from_str("Weekly") == RecurrencePatternType.WEEKLY
13+
try:
14+
RecurrencePatternType.from_str("Invalid")
15+
except ValueError as e:
16+
assert str(e) == "Invalid value: Invalid"
17+
18+
def test_recurrence_range_type():
19+
assert RecurrenceRangeType.from_str("NoEnd") == RecurrenceRangeType.NO_END
20+
assert RecurrenceRangeType.from_str("EndDate") == RecurrenceRangeType.END_DATE
21+
assert RecurrenceRangeType.from_str("Numbered") == RecurrenceRangeType.NUMBERED
22+
try:
23+
RecurrenceRangeType.from_str("Invalid")
24+
except ValueError as e:
25+
assert str(e) == "Invalid value: Invalid"
26+
27+
def test_recurrence_pattern():
28+
pattern = RecurrencePattern({"Type":"Daily", "Interval":1, "DaysOfWeek":["Monday", "Tuesday"]})
29+
assert pattern.type == RecurrencePatternType.DAILY
30+
assert pattern.interval == 1
31+
assert pattern.days_of_week == [0, 1]
32+
assert pattern.first_day_of_week == 6
33+
34+
pattern = RecurrencePattern({"Type":"Daily", "Interval":1, "DaysOfWeek":["Monday", "Tuesday"], "FirstDayOfWeek":"Monday"})
35+
assert pattern.type == RecurrencePatternType.DAILY
36+
assert pattern.interval == 1
37+
assert pattern.days_of_week == [0, 1]
38+
assert pattern.first_day_of_week == 0
39+
40+
try:
41+
pattern = RecurrencePattern({"Type":"Daily", "Interval":1, "DaysOfWeek":["Monday", "Tuesday"], "FirstDayOfWeek":"Thor's day"})
42+
except ValueError as e:
43+
assert str(e) == "Invalid value for FirstDayOfWeek: Thor's day"
44+
45+
pattern = RecurrencePattern({"Type":"Weekly", "Interval":2, "DaysOfWeek":["Wednesday"]})
46+
assert pattern.type == RecurrencePatternType.WEEKLY
47+
assert pattern.interval == 2
48+
assert pattern.days_of_week == [2]
49+
assert pattern.first_day_of_week == 6
50+
51+
try:
52+
pattern = RecurrencePattern({"Type":"Daily", "Interval":0, "DaysOfWeek":["Monday", "Tuesday"]})
53+
except ValueError as e:
54+
assert str(e) == "The interval must be greater than 0."
55+
56+
try:
57+
pattern = RecurrencePattern({"Type":"Daily", "Interval":1, "DaysOfWeek":["Monday", "Thor's day"]})
58+
except ValueError as e:
59+
assert str(e) == "Invalid value for DaysOfWeek: Thor's day"
60+
61+
def test_recurrence_range():
62+
max_occurrences = math.pow(2, 63) - 1
63+
64+
range = RecurrenceRange({"Type":"NoEnd"})
65+
assert range.type == RecurrenceRangeType.NO_END
66+
assert range.end_date is None
67+
assert range.num_of_occurrences == max_occurrences
68+
69+
range = RecurrenceRange({"Type":"EndDate", "EndDate":"Mon, 31 Mar 2025 00:00:00"})
70+
assert range.type == RecurrenceRangeType.END_DATE
71+
assert range.end_date == datetime(2025, 3, 31, 0, 0, 0)
72+
assert range.num_of_occurrences == max_occurrences
73+
74+
range = RecurrenceRange({"Type":"Numbered", "NumberOfOccurrences":10})
75+
assert range.type == RecurrenceRangeType.NUMBERED
76+
assert range.end_date is None
77+
assert range.num_of_occurrences == 10
78+
79+
try:
80+
range = RecurrenceRange({"Type":"NoEnd", "NumberOfOccurrences":-1})
81+
except ValueError as e:
82+
assert str(e) == "The number of occurrences must be greater than or equal to 0."
83+
84+
try:
85+
range = RecurrenceRange({"Type":"EndDate", "EndDate":"InvalidDate"})
86+
except ValueError as e:
87+
assert str(e) == "Invalid value for EndDate: InvalidDate"

0 commit comments

Comments
 (0)