91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
import app as app_module
|
|
|
|
|
|
def _client():
|
|
app_module.app.config['TESTING'] = True
|
|
return app_module.app.test_client()
|
|
|
|
|
|
def _stub_data(monkeypatch):
|
|
monkeypatch.setattr(app_module, 'get_cached', lambda key: None)
|
|
monkeypatch.setattr(app_module, 'set_cached', lambda key, data: None)
|
|
monkeypatch.setattr(
|
|
app_module.rtt_scraper,
|
|
'fetch',
|
|
lambda travel_date, user_agent: [
|
|
{'depart_bristol': '07:00', 'arrive_paddington': '08:45', 'headcode': '1A23'},
|
|
],
|
|
)
|
|
monkeypatch.setattr(
|
|
app_module.eurostar_scraper,
|
|
'fetch',
|
|
lambda destination, travel_date, user_agent: [
|
|
{
|
|
'depart_st_pancras': '10:01',
|
|
'arrive_destination': '13:34',
|
|
'destination': destination,
|
|
'train_number': 'ES 9014',
|
|
},
|
|
],
|
|
)
|
|
monkeypatch.setattr(
|
|
app_module.eurostar_scraper,
|
|
'timetable_url',
|
|
lambda destination: f'https://example.test/{destination.lower().replace(" ", "-")}',
|
|
)
|
|
|
|
|
|
def test_index_shows_fixed_departure_and_destination_radios():
|
|
client = _client()
|
|
|
|
resp = client.get('/')
|
|
html = resp.get_data(as_text=True)
|
|
|
|
assert resp.status_code == 200
|
|
assert 'Departure point' in html
|
|
assert 'Bristol Temple Meads' in html
|
|
assert html.count('type="radio"') == len(app_module.DESTINATIONS)
|
|
assert 'destination-rotterdam' in html
|
|
|
|
|
|
def test_search_redirects_to_results_with_selected_params():
|
|
client = _client()
|
|
|
|
resp = client.get('/search?destination=rotterdam&travel_date=2026-04-10&min_connection=60&max_connection=120')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.headers['Location'].endswith(
|
|
'/results/rotterdam/2026-04-10?min_connection=60&max_connection=120'
|
|
)
|
|
|
|
|
|
def test_results_shows_same_day_destination_switcher(monkeypatch):
|
|
_stub_data(monkeypatch)
|
|
client = _client()
|
|
|
|
resp = client.get('/results/paris/2026-04-10?min_connection=60&max_connection=120')
|
|
html = resp.get_data(as_text=True)
|
|
|
|
assert resp.status_code == 200
|
|
assert 'Switch destination for Friday 10 April 2026' in html
|
|
assert '<span class="chip-current">Paris Gare du Nord</span>' in html
|
|
assert '/results/brussels/2026-04-10?min_connection=60&max_connection=120' in html
|
|
assert '/results/rotterdam/2026-04-10?min_connection=60&max_connection=120' in html
|
|
assert 'ES 9014' in html
|
|
|
|
|
|
def test_results_title_and_social_meta_include_destination(monkeypatch):
|
|
_stub_data(monkeypatch)
|
|
client = _client()
|
|
|
|
resp = client.get('/results/lille/2026-04-10?min_connection=60&max_connection=120')
|
|
html = resp.get_data(as_text=True)
|
|
|
|
assert resp.status_code == 200
|
|
assert '<title>Bristol to Lille Europe via Eurostar</title>' in html
|
|
assert '<meta property="og:title" content="Bristol to Lille Europe via Eurostar">' in html
|
|
assert (
|
|
'<meta property="og:description" content="Train options from Bristol Temple Meads '
|
|
'to Lille Europe on Friday 10 April 2026 via Paddington, St Pancras, and Eurostar.">'
|
|
) in html
|
|
assert '<meta property="og:url" content="http://localhost/results/lille/2026-04-10?min_connection=60&max_connection=120">' in html
|