|
| 1 | +"""Visit Azores trails sync tests.""" |
| 2 | + |
| 3 | +from unittest.mock import patch |
| 4 | + |
| 5 | +from django.test import TestCase |
| 6 | + |
| 7 | +from trails.visitazores_sync import ( |
| 8 | + gpx_to_linestring, |
| 9 | + parse_trail_detail_page, |
| 10 | + sync_visitazores_trails_for_island, |
| 11 | +) |
| 12 | +from tenancy.services import get_or_create_default_island |
| 13 | + |
| 14 | +SAMPLE_DETAIL_HTML = """ |
| 15 | +<html><head> |
| 16 | +<meta property="og:title" content="Caldeiras da Ribeira Grande - Salto do Cabrito | Azores Trails" /> |
| 17 | +<script>jQuery.extend(Drupal.settings, {"geofieldMap":{"map":{"data":{"type":"LineString","coordinates":[[-25.50,37.78],[-25.49,37.79]],"properties":{"description":"Caldeiras"}}}}});</script> |
| 18 | +</head><body> |
| 19 | +<div class="field field-name-field-difficulty"><div class="field-item even">Difficulty - Medium</div></div> |
| 20 | +<div class="field field-name-field-extension"><div class="field-item even">Extension - 8.6 km</div></div> |
| 21 | +PRC29SMI |
| 22 | +<a href="https://trails.visitazores.com/sites/default/files/trails/sao-miguel/prc29smi.gpx">GPS</a> |
| 23 | +</body></html> |
| 24 | +""" |
| 25 | + |
| 26 | +SAMPLE_GPX = """<?xml version="1.0"?> |
| 27 | +<gpx xmlns="http://www.topografix.com/GPX/1/1"> |
| 28 | +<trk><trkseg> |
| 29 | +<trkpt lat="37.78" lon="-25.50"/> |
| 30 | +<trkpt lat="37.79" lon="-25.49"/> |
| 31 | +</trkseg></trk> |
| 32 | +</gpx>""" |
| 33 | + |
| 34 | + |
| 35 | +class VisitAzoresSyncTestCase(TestCase): |
| 36 | + def setUp(self): |
| 37 | + self.island = get_or_create_default_island() |
| 38 | + self.island.feature_flags = {**self.island.feature_flags, 'trails': True} |
| 39 | + self.island.save() |
| 40 | + |
| 41 | + def test_parse_trail_detail_page_extracts_fields(self): |
| 42 | + row = parse_trail_detail_page(SAMPLE_DETAIL_HTML, page_url='https://example.test/trail') |
| 43 | + assert row is not None |
| 44 | + self.assertEqual(row['source_ref'], 'PRC29SMI') |
| 45 | + self.assertEqual(row['name'], 'Caldeiras da Ribeira Grande - Salto do Cabrito') |
| 46 | + self.assertEqual(row['difficulty'], 'moderate') |
| 47 | + self.assertEqual(row['distance_km'], 8.6) |
| 48 | + self.assertEqual(row['geojson']['type'], 'LineString') |
| 49 | + |
| 50 | + def test_gpx_to_linestring(self): |
| 51 | + geometry = gpx_to_linestring(SAMPLE_GPX) |
| 52 | + assert geometry is not None |
| 53 | + self.assertEqual(geometry['coordinates'][0], [-25.50, 37.78]) |
| 54 | + |
| 55 | + @patch('trails.visitazores_sync.fetch_feed_trail_summaries', return_value={}) |
| 56 | + @patch('trails.visitazores_sync.fetch_island_trail_paths', return_value=['/en/trails-azores/sao-miguel/test']) |
| 57 | + @patch('trails.visitazores_sync._get_html', return_value=SAMPLE_DETAIL_HTML) |
| 58 | + def test_sync_visitazores_trails_for_island(self, *_mocks): |
| 59 | + counts = sync_visitazores_trails_for_island(self.island) |
| 60 | + self.assertEqual(counts['created'], 1) |
| 61 | + self.assertEqual(counts['skipped'], 0) |
0 commit comments