combo-plugin-gnm/tests/test_get_mairie_opening_hou...

323 lines
12 KiB
Python

# -*- coding: utf-8 -*-
import pytest
import json
import os
from combo_plugin_gnm.templatetags.gnm import (
get_mairie_opening_hours, EN_FULL_WEEKDAYS_LIST, FR_WEEKDAYS)
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
GEOJSON = json.load(open(os.path.join(BASE_DIR, 'tests/data/mairie-geojson.json')))['features']
TZOFFSETS = {"Europe/Paris": 3600}
def test_mairie_hours_parsing():
"""everything is parsed correctly"""
opening_hours = [get_mairie_opening_hours(x) for x in GEOJSON]
assert len(opening_hours) == len(GEOJSON)
def test_mairie_hours_nodata():
""""no data return nothing"""
assert get_mairie_opening_hours(GEOJSON[0]['properties']) is None
def test_mairie_hours_special_data():
"""test results for various data examples"""
for x in GEOJSON:
if x['properties']['identifiant'] == 'S1376':
# La Mulatière : openinghoursspecification set but without opens/closes
assert get_mairie_opening_hours(x) == [
('lundi', {'am': u'08h30-12h00', 'pm': None}),
('mardi', {'am': u'08h30-12h30', 'pm': u'13h30-17h00'}),
('mercredi', {'am': u'08h30-12h30', 'pm': u'13h30-17h00'}),
('jeudi', {'am': u'08h30-12h30', 'pm': u'13h30-17h00'}),
('vendredi', {'am': u'08h30-12h30', 'pm': u'13h30-17h00'}),
('samedi', {'am': u'09h00-11h45', 'pm': None}),
]
if x['properties']['identifiant'] == 'S1437':
x['properties']['openinghoursspecification'] = [] # force using openinghours
# special openinghours format with days intervals, comma-separated list and one day definition with a saturday
assert get_mairie_opening_hours(x) == [
('lundi', {'am': u'08h45-12h30', 'pm': u'14h00-16h45'}),
('mardi', {'am': u'08h45-16h45', 'pm': ''}),
('mercredi', {'am': u'08h45-16h45', 'pm': ''}),
('jeudi', {'am': u'08h45-18h00', 'pm': ''}),
('vendredi', {'am': u'08h45-16h45', 'pm': ''}),
('samedi', {'am': u'09h00-12h00', 'pm': None}),
]
if x['properties']['identifiant'] == 'S5564':
x['properties']['openinghoursspecification'] = [] # force using openinghours
# classic openinghours days interval for am and pm
assert get_mairie_opening_hours(x) == [
('lundi', {'am': u'08h30-12h15', 'pm': u'13h15-17h00'}),
('mardi', {'am': u'08h30-12h15', 'pm': u'13h15-17h00'}),
('mercredi', {'am': u'08h30-12h15', 'pm': u'13h15-17h00'}),
('jeudi', {'am': u'08h30-12h15', 'pm': u'13h15-17h00'}),
('vendredi', {'am': u'08h30-12h15', 'pm': u'13h15-17h00'}),
]
@pytest.mark.freeze_time("2018-03-05 15:59:00")
def test_mairie_openinghoursspecification_period_valid():
"""Test valid periods of openinghoursspecification timetables"""
for x in GEOJSON:
if x['properties']['nom'] == 'Mairie de Jonage':
assert get_mairie_opening_hours(x) == [
('lundi', {'am': '08h30-12h30', 'pm': '14h00-17h00'}),
('mardi', {'am': '08h30-12h30', 'pm': '14h00-17h00'}),
('mercredi', {'am': '08h30-12h30', 'pm': '14h00-17h00'}),
('jeudi', {'am': '08h30-12h30', 'pm': '14h00-17h00'}),
('vendredi', {'am': '08h30-12h30', 'pm': '14h00-17h00'}),
('samedi', {'am': '09h00-12h00', 'pm': '14h00-17h00'}),
]
return
@pytest.mark.freeze_time("2020-03-05 15:59:00")
def test_mairie_openinghoursspecification_period_all_closed():
# display known format but no opening hours as all closed
for x in GEOJSON:
if x['properties']['nom'] == 'Mairie de Jonage':
assert get_mairie_opening_hours(x) == [
('lundi', {'am': None, 'pm': ''}),
('mardi', {'am': None, 'pm': ''}),
('mercredi', {'am': None, 'pm': ''}),
('jeudi', {'am': None, 'pm': ''}),
('vendredi', {'am': None, 'pm': ''}),
('samedi', {'am': None, 'pm': ''}),
('dimanche', {'am': None, 'pm': ''}),
]
return
def test_mairie_sathonay_timetable():
"""Sathonay-Village S1415"""
test_time_table = [
get_mairie_opening_hours(x) for x in GEOJSON if x['properties']['identifiant'] == 'S1415'
][0]
assert test_time_table == [
('lundi', {'am': u'08h30-12h00', 'pm': u'14h00-17h00'}),
('mardi', {'am': u'08h30-12h00', 'pm': u'13h30-17h00'}),
('mercredi', {'am': u'08h30-12h00', 'pm': u'14h00-17h00'}),
('jeudi', {'am': u'08h30-12h00', 'pm': u'14h00-17h00'}),
('vendredi', {'am': u'08h30-12h00', 'pm': u'14h00-17h00'}),
('samedi', {'am': u'08h30-12h00', 'pm': None}),
]
def test_mairie_saint_priest():
"S1406"
test_time_table = [
get_mairie_opening_hours(x) for x in GEOJSON if x['properties']['identifiant'] == 'S1406'
][0]
assert test_time_table == [
('lundi', {'am': u'08h15-12h15', 'pm': u'13h30-17h30'}),
('mardi', {'am': u'08h15-12h15', 'pm': u'13h30-17h30'}),
('mercredi', {'am': u'08h15-12h15', 'pm': u'13h30-17h30'}),
('jeudi', {'am': u'08h15-11h15', 'pm': u'13h30-17h30'}),
('vendredi', {'am': u'08h15-12h15', 'pm': u'13h30-17h30'}),
('samedi', {'am': u'09h00-11h30', 'pm': None}),
]
def test_mairie_format_openinghours():
""" some mairie may still only define the openinghours format """
geojson = """
{
"properties": {
"openinghours": [
"Mo 08:30-11:30",
"Tu 14:00-17:00",
"We 10:30-18:30",
"Th 22:30-00:30",
"Fr 07:30-07:00",
"Sa 21:00-24:00",
"Su 00:00-24:00"
]}}
"""
hours = get_mairie_opening_hours(json.loads(geojson))
assert hours == [
('lundi', {'am': '08h30-11h30', 'pm': None}),
('mardi', {'am': None, 'pm': '14h00-17h00'}),
('mercredi', {'am': '10h30-18h30', 'pm': ''}),
('jeudi', {'am': None, 'pm': '22h30-00h30'}),
('vendredi', {'am': '07h30-07h00', 'pm': ''}),
('samedi', {'am': None, 'pm': '21h00-24h00'}),
('dimanche', {'am': '00h00-24h00', 'pm': ''}),
]
@pytest.mark.freeze_time("2018-03-09 00:30:00")
def test_mairie_format_openinghoursspecification():
""" openinghoursspecification the default format """
geojson = """
{
"properties": {
"openinghoursspecification": [{
"opens": "08:30",
"closes": "11:30",
"dayOfWeek": "http:\/\/schema.org\/Monday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "14:00",
"closes": "17:00",
"dayOfWeek": "http:\/\/schema.org\/Tuesday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "10:30",
"closes": "18:30",
"dayOfWeek": "http:\/\/schema.org\/Wednesday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "22:30",
"closes": "00:30",
"dayOfWeek": "http:\/\/schema.org\/Thursday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "07:30",
"closes": "07:00",
"dayOfWeek": "http:\/\/schema.org\/Friday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "21:00",
"closes": "24:00",
"dayOfWeek": "http:\/\/schema.org\/Saturday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}, {
"opens": "00:00",
"closes": "24:00",
"dayOfWeek": "http:\/\/schema.org\/Sunday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}]}}
"""
hours = get_mairie_opening_hours(json.loads(geojson))
assert hours == [
('lundi', {'am': '08h30-11h30', 'pm': None}),
('mardi', {'am': None, 'pm': '14h00-17h00'}),
('mercredi', {'am': '10h30-18h30', 'pm': ''}),
('jeudi', {'am': None, 'pm': '22h30-00h30'}),
('vendredi', {'am': '07h30-07h00', 'pm': ''}),
('samedi', {'am': None, 'pm': '21h00-24h00'}),
('dimanche', {'am': '00h00-24h00', 'pm': ''}),
]
@pytest.mark.freeze_time("2018-03-09 00:30:00")
def test_mairie_having_both_formats():
""" openinghoursspecification take preference over openinghours"""
geojson = """
{
"properties": {
"openinghours": [
"Mo 08:30-11:30"
],
"openinghoursspecification": [{
"opens": "09:30",
"closes": "12:30",
"dayOfWeek": "http:\/\/schema.org\/Monday",
"validFrom": "2018-01-01T00:00:00+01:00",
"validThrough": "2018-06-30T23:59:59+02:00"
}]
}
}
"""
hours = get_mairie_opening_hours(json.loads(geojson))
assert hours[0] == ('lundi', {'am': '09h30-12h30', 'pm': None})
@pytest.mark.freeze_time("2021-01-21 15:37:00")
def test_mairie_saint_genis_lavak():
""" #50337 """
geojson = json.load(open(os.path.join(BASE_DIR, 'tests/data/mairie-saint-genis-lavak.json')))
test_time_table = get_mairie_opening_hours(geojson['features'][0])
assert test_time_table == [
('lundi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('mardi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('mercredi', {'am': '08h30-12h00', 'pm': None}),
('jeudi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('vendredi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('samedi', {'am': '09h00-12h00', 'pm': None})
]
@pytest.mark.freeze_time("2018-01-01 14:59:00")
def test_mairie_holiday_day():
# Ecully, using datetimes
test_time_table = [
get_mairie_opening_hours(x) for x in GEOJSON if x['properties']['identifiant'] == 'S1361'
][0]
assert test_time_table == [
('lundi', {'am': None, 'pm': None}),
('mardi', {'am': '08h30-12h00', 'pm': '13h30-17h00'}),
('mercredi', {'am': '08h30-12h00', 'pm': '13h30-17h00'}),
('jeudi', {'am': '08h30-12h00', 'pm': '13h30-17h00'}),
('vendredi', {'am': '08h30-12h00', 'pm': '13h30-17h00'}),
('samedi', {'am': '08h30-12h00', 'pm': None})
]
# Feyzin, using dates
test_time_table = [
get_mairie_opening_hours(x) for x in GEOJSON if x['properties']['identifiant'] == 'S1365'
][0]
assert test_time_table == [
('lundi', {'am': None, 'pm': None}),
('mardi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('mercredi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('jeudi', {'am': '08h30-12h00', 'pm': '13h30-17h30'}),
('vendredi', {'am': '08h30-12h00', 'pm': '13h30-17h30'})
]
@pytest.mark.freeze_time('2018-01-04 14:59:00')
@pytest.mark.parametrize(
'validFrom, validTrought, is_open', [
('2017-12-01', '2018-02-01', [False, False, False, False, False, False, False]),
('2018-01-04', '2018-01-04', [True, True, True, False, True, True, True]),
('2018-01-05', '2018-01-07', [True, True, True, True, False, False, False]),
('2018-01-05', '2018-01-09', [False, False, True, True, False, False, False]),
('2018-01-05', '2018-01-11', [False, False, False, True, False, False, False]),
])
def test_mairie_holiday_period(validFrom, validTrought, is_open):
# buid expected time table
open_day = {'am': '08h30-17h30', 'pm': ''}
closed_day = {'am': None, 'pm': None}
expected = []
if not any(is_open):
expected = [(weekday, {'am': None, 'pm': ''}) for weekday in FR_WEEKDAYS]
else:
for index, weekday in enumerate(FR_WEEKDAYS):
if is_open[index]:
expected.append((weekday, open_day))
elif weekday not in ['samedi', 'dimanche']:
expected.append((weekday, closed_day))
ohs = []
for weekday in EN_FULL_WEEKDAYS_LIST:
ohs.append({
'opens': '08:30',
'closes': '17:30',
'dayOfWeek': 'http://schema.org/%s' % weekday,
'validFrom': '2018-01-01T00:00:00+01:00',
'validThrough': '2018-06-30T23:59:59+01:00'
})
ohs.append({
'validFrom': '%sT00:00:00+01:00' % validFrom,
'validThrough': '%sT23:59:59+01:00' % validTrought,
})
data = {'properties': {'openinghoursspecification': ohs}}
time_table = get_mairie_opening_hours(data)
assert time_table == expected