""" Tests on opening hours helpers """ import datetime import pytest from mylib import opening_hours # # Test on parse_exceptional_closures() # def test_parse_exceptional_closures_one_day_without_time_period(): assert opening_hours.parse_exceptional_closures(["22/09/2017"]) == [{'days': [datetime.date(2017, 9, 22)], 'hours_periods': []}] def test_parse_exceptional_closures_one_day_with_time_period(): assert opening_hours.parse_exceptional_closures(["26/11/2017 9h30-12h30"]) == [ { 'days': [datetime.date(2017, 11, 26)], 'hours_periods': [{'start': datetime.time(9, 30), 'stop': datetime.time(12, 30)}] } ] def test_parse_exceptional_closures_one_day_with_multiple_time_periods(): assert opening_hours.parse_exceptional_closures(["26/11/2017 9h30-12h30 14h-18h"]) == [ { 'days': [datetime.date(2017, 11, 26)], 'hours_periods': [ {'start': datetime.time(9, 30), 'stop': datetime.time(12, 30)}, {'start': datetime.time(14, 0), 'stop': datetime.time(18, 0)}, ] } ] def test_parse_exceptional_closures_full_days_period(): assert opening_hours.parse_exceptional_closures(["20/09/2017-22/09/2017"]) == [ { 'days': [datetime.date(2017, 9, 20), datetime.date(2017, 9, 21), datetime.date(2017, 9, 22)], 'hours_periods': [] } ] def test_parse_exceptional_closures_invalid_days_period(): with pytest.raises(ValueError): opening_hours.parse_exceptional_closures(["22/09/2017-21/09/2017"]) def test_parse_exceptional_closures_days_period_with_time_period(): assert opening_hours.parse_exceptional_closures(["20/09/2017-22/09/2017 9h-12h"]) == [ { 'days': [datetime.date(2017, 9, 20), datetime.date(2017, 9, 21), datetime.date(2017, 9, 22)], 'hours_periods': [{'start': datetime.time(9, 0), 'stop': datetime.time(12, 0)}] } ] def test_parse_exceptional_closures_time_period_without_days(): with pytest.raises(ValueError): opening_hours.parse_exceptional_closures(["9h-12h"]) def test_parse_exceptional_closures_invalid_time_period(): with pytest.raises(ValueError): opening_hours.parse_exceptional_closures(["20/09/2017 9h-8h"]) def test_parse_exceptional_closures_multiple_periods(): assert opening_hours.parse_exceptional_closures(["20/09/2017 25/11/2017-26/11/2017 9h30-12h30 14h-18h"]) == [ { 'days': [ datetime.date(2017, 9, 20), datetime.date(2017, 11, 25), datetime.date(2017, 11, 26), ], 'hours_periods': [ {'start': datetime.time(9, 30), 'stop': datetime.time(12, 30)}, {'start': datetime.time(14, 0), 'stop': datetime.time(18, 0)}, ] } ] # # Tests on parse_normal_opening_hours() # def test_parse_normal_opening_hours_one_day(): assert opening_hours.parse_normal_opening_hours(["jeudi"]) == [{'days': ["jeudi"], 'hours_periods': []}] def test_parse_normal_opening_hours_multiple_days(): assert opening_hours.parse_normal_opening_hours(["lundi jeudi"]) == [{'days': ["lundi", "jeudi"], 'hours_periods': []}] def test_parse_normal_opening_hours_invalid_day(): with pytest.raises(ValueError): opening_hours.parse_exceptional_closures(["invalid"]) def test_parse_normal_opening_hours_one_days_period(): assert opening_hours.parse_normal_opening_hours(["lundi-jeudi"]) == [ {'days': ["lundi", "mardi", "mercredi", "jeudi"], 'hours_periods': []} ] def test_parse_normal_opening_hours_one_day_with_one_time_period(): assert opening_hours.parse_normal_opening_hours(["jeudi 9h-12h"]) == [ {'days': ["jeudi"], 'hours_periods': [{'start': datetime.time(9, 0), 'stop': datetime.time(12, 0)}]}] def test_parse_normal_opening_hours_invalid_days_period(): with pytest.raises(ValueError): opening_hours.parse_normal_opening_hours(["jeudi-mardi"]) with pytest.raises(ValueError): opening_hours.parse_normal_opening_hours(["lundi-mardi-mercredi"]) def test_parse_normal_opening_hours_one_time_period(): assert opening_hours.parse_normal_opening_hours(["9h-18h30"]) == [ {'days': [], 'hours_periods': [{'start': datetime.time(9, 0), 'stop': datetime.time(18, 30)}]} ] def test_parse_normal_opening_hours_invalid_time_period(): with pytest.raises(ValueError): opening_hours.parse_normal_opening_hours(["12h-10h"]) def test_parse_normal_opening_hours_multiple_periods(): assert opening_hours.parse_normal_opening_hours(["lundi-vendredi 9h30-12h30 14h-18h", "samedi 9h30-18h", "dimanche 9h30-12h"]) == [ { 'days': ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi'], 'hours_periods': [ {'start': datetime.time(9, 30), 'stop': datetime.time(12, 30)}, {'start': datetime.time(14, 0), 'stop': datetime.time(18, 0)}, ] }, { 'days': ['samedi'], 'hours_periods': [ {'start': datetime.time(9, 30), 'stop': datetime.time(18, 0)}, ] }, { 'days': ['dimanche'], 'hours_periods': [ {'start': datetime.time(9, 30), 'stop': datetime.time(12, 0)}, ] }, ] # # Tests on is_closed # exceptional_closures = ["22/09/2017", "20/09/2017-22/09/2017", "20/09/2017-22/09/2017 18/09/2017", "25/11/2017", "26/11/2017 9h30-12h30"] normal_opening_hours = ["lundi-mardi jeudi 9h30-12h30 14h-16h30", "mercredi vendredi 9h30-12h30 14h-17h"] nonworking_public_holidays = [ '1janvier', 'paques', 'lundi_paques', '1mai', '8mai', 'jeudi_ascension', 'lundi_pentecote', '14juillet', '15aout', '1novembre', '11novembre', 'noel', ] def test_is_closed_when_normaly_closed_by_hour(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 5, 1, 20, 15) ) == { 'closed': True, 'exceptional_closure': False, 'exceptional_closure_all_day': False } def test_is_closed_on_exceptional_closure_full_day(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 9, 22, 14, 15) ) == { 'closed': True, 'exceptional_closure': True, 'exceptional_closure_all_day': True } def test_is_closed_on_exceptional_closure_day(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 11, 26, 10, 30) ) == { 'closed': True, 'exceptional_closure': True, 'exceptional_closure_all_day': False } def test_is_closed_on_nonworking_public_holidays(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 1, 1, 10, 30) ) == { 'closed': True, 'exceptional_closure': False, 'exceptional_closure_all_day': False } def test_is_closed_when_normaly_closed_by_day(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 5, 6, 14, 15) ) == { 'closed': True, 'exceptional_closure': False, 'exceptional_closure_all_day': False } def test_is_closed_when_normaly_opened(): assert opening_hours.is_closed( normal_opening_hours_values=normal_opening_hours, exceptional_closures_values=exceptional_closures, nonworking_public_holidays_values=nonworking_public_holidays, when=datetime.datetime(2017, 5, 2, 15, 15) ) == { 'closed': False, 'exceptional_closure': False, 'exceptional_closure_all_day': False } def test_easter_date(): assert opening_hours.easter_date(2010) == datetime.date(2010, 4, 4) assert opening_hours.easter_date(2011) == datetime.date(2011, 4, 24) assert opening_hours.easter_date(2012) == datetime.date(2012, 4, 8) assert opening_hours.easter_date(2013) == datetime.date(2013, 3, 31) assert opening_hours.easter_date(2014) == datetime.date(2014, 4, 20) assert opening_hours.easter_date(2015) == datetime.date(2015, 4, 5) assert opening_hours.easter_date(2016) == datetime.date(2016, 3, 27) assert opening_hours.easter_date(2017) == datetime.date(2017, 4, 16) assert opening_hours.easter_date(2018) == datetime.date(2018, 4, 1) assert opening_hours.easter_date(2019) == datetime.date(2019, 4, 21) assert opening_hours.easter_date(2020) == datetime.date(2020, 4, 12) assert opening_hours.easter_date(2021) == datetime.date(2021, 4, 4) def test_nonworking_french_public_days_of_the_year(): assert opening_hours.nonworking_french_public_days_of_the_year(2021) == { '1janvier': datetime.date(2021, 1, 1), 'paques': datetime.date(2021, 4, 4), 'lundi_paques': datetime.date(2021, 4, 5), '1mai': datetime.date(2021, 5, 1), '8mai': datetime.date(2021, 5, 8), 'jeudi_ascension': datetime.date(2021, 5, 13), 'pentecote': datetime.date(2021, 5, 23), 'lundi_pentecote': datetime.date(2021, 5, 24), '14juillet': datetime.date(2021, 7, 14), '15aout': datetime.date(2021, 8, 15), '1novembre': datetime.date(2021, 11, 1), '11novembre': datetime.date(2021, 11, 11), 'noel': datetime.date(2021, 12, 25), 'saint_etienne': datetime.date(2021, 12, 26) }