diff --git a/backend/report.html b/backend/report.html index 87e9e5d..a74ab9d 100644 --- a/backend/report.html +++ b/backend/report.html @@ -328,7 +328,7 @@ div.media { </head> <body> <h1 id="title">Backend Testing Report</h1> - <p>Report generated on 28-Jan-2025 at 12:52:37 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> + <p>Report generated on 28-Jan-2025 at 14:07:50 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v4.1.1</p> <div id="environment-header"> <h2>Environment</h2> @@ -382,7 +382,7 @@ div.media { <h2>Summary</h2> <div class="additional-summary prefix"> </div> - <p class="run-count">1 test took 00:00:31.</p> + <p class="run-count">1 test took 159 ms.</p> <p class="filter">(Un)check the boxes to filter the results.</p> <div class="summary__reload"> <div class="summary__reload__button hidden" onclick="location.reload()"> @@ -392,10 +392,10 @@ div.media { <div class="summary__spacer"></div> <div class="controls"> <div class="filters"> - <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="failed" /> - <span class="failed">1 Failed,</span> - <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="passed" disabled/> - <span class="passed">0 Passed,</span> + <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="failed" disabled/> + <span class="failed">0 Failed,</span> + <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="passed" /> + <span class="passed">1 Passed,</span> <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="skipped" disabled/> <span class="skipped">0 Skipped,</span> <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xfailed" disabled/> @@ -432,7 +432,7 @@ div.media { </table> </body> <footer> - <div id="data-container" data-jsonblob="{"environment": {"Python": "3.12.3", "Platform": "Linux-6.8.0-51-generic-x86_64-with-glibc2.39", "Packages": {"pytest": "8.3.4", "pluggy": "1.5.0"}, "Plugins": {"html": "4.1.1", "anyio": "4.8.0", "metadata": "3.1.1"}}, "tests": {"src/tests/test_main.py::test_turckheim": [{"extras": [], "result": "Failed", "testId": "src/tests/test_main.py::test_turckheim", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_turckheim</td>", "<td>start (0 | 0) - 6 - H\u00f4tel des Deux-Clefs (217 | 5) - 1 - H\u00f4tel de ville (238 | 5) - 6 - finish (0 | 0) - 0</td>", "<td>23 min</td>", "<td>20 min</td>", "<td class=\"col-duration\">00:00:31</td>", "<td class=\"col-links\"></td>"], "log": "client = &lt;starlette.testclient.TestClient object at 0x7678d3c99400&gt;\nrequest = &lt;FixtureRequest for &lt;Function test_turckheim&gt;&gt;\n\n def test_turckheim(client, request): # pylint: disable=redefined-outer-name\n &quot;&quot;&quot;\n Test n\u00b01 : Custom test in Turckheim to ensure small villages are also supported.\n \n Args:\n client:\n request:\n &quot;&quot;&quot;\n start_time = time.time() # Start timer\n duration_minutes = 20\n \n response = client.post(\n &quot;/trip/new&quot;,\n json={\n &quot;preferences&quot;: {&quot;sightseeing&quot;: {&quot;type&quot;: &quot;sightseeing&quot;, &quot;score&quot;: 5},\n &quot;nature&quot;: {&quot;type&quot;: &quot;nature&quot;, &quot;score&quot;: 5},\n &quot;shopping&quot;: {&quot;type&quot;: &quot;shopping&quot;, &quot;score&quot;: 0},\n &quot;max_time_minute&quot;: duration_minutes,\n &quot;detour_tolerance_minute&quot;: 0},\n &quot;start&quot;: [48.084588, 7.280405]\n }\n )\n result = response.json()\n landmarks = load_trip_landmarks(client, result[&#x27;first_landmark_uuid&#x27;])\n \n \n # Get computation time\n comp_time = time.time() - start_time\n \n # Add details to report\n log_trip_details(request, landmarks, result[&#x27;total_time&#x27;], duration_minutes)\n \n # for elem in landmarks :\n # print(elem)\n \n # checks :\n assert response.status_code == 200 # check for successful planning\n assert isinstance(landmarks, list) # check that the return type is a list\n assert len(landmarks) &gt; 2 # check that there is something to visit\n&gt; assert comp_time &lt; 30, f&quot;Computation time exceeded 30 seconds: {comp_time:.2f} seconds&quot;\nE AssertionError: Computation time exceeded 30 seconds: 30.69 seconds\nE assert 30.685150384902954 &lt; 30\n\nsrc/tests/test_main.py:54: AssertionError\n\n------------------------------ Captured log call -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: EpollSelector\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:76 Starting to fetch landmarks...\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:88 Fetching sightseeing landmarks...\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[tourism~&quot;^(museum|attraction|gallery|artwork|aquarium)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[tourism~&quot;^(museum|attraction|gallery|artwork|aquarium)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[historic](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[historic](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[amenity~&quot;^(planetarium|place_of_worship|fountain|townhall)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[amenity~&quot;^(planetarium|place_of_worship|fountain|townhall)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[water=reflecting_pool](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[water=reflecting_pool](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[bridge~&quot;^(aqueduct|viaduct|boardwalk|cantilever|abandoned)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[bridge~&quot;^(aqueduct|viaduct|boardwalk|cantilever|abandoned)$&quot;](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[building=cathedral](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[building=cathedral](if: count_tags()&gt;5)(48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:204 Fetched 9 landmarks of type sightseeing in (48.079458619727674, 7.272726663391359, 48.08971738027232, 7.288083336608641)\nINFO src.utils.landmarks_manager:landmarks_manager.py:91 Found 9 sightseeing landmarks\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[&quot;historic&quot;~&quot;^(monument|building|yes)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center;\nINFO src.utils.cluster_manager:cluster_manager.py:145 Found 0 sightseeing clusters.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:100 Fetching nature landmarks...\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[leisure=park](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[leisure=park](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[geological](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[geological](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[natural~&quot;^(geyser|hot_spring|arch|volcano|stone)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[natural~&quot;^(geyser|hot_spring|arch|volcano|stone)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[tourism~&quot;^(alpine_hut|viewpoint|zoo|resort|picnic_site)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[tourism~&quot;^(alpine_hut|viewpoint|zoo|resort|picnic_site)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);node[tourism~&quot;^(alpine_hut|viewpoint|zoo|resort|picnic_site)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[water~&quot;^(pond|lake|river|basin|stream|lagoon|rapids)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[water~&quot;^(pond|lake|river|basin|stream|lagoon|rapids)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nINFO src.overpass.overpass:overpass.py:84 Cache miss. Fetching data through Overpass.\nDEBUG src.overpass.overpass:overpass.py:85 Query = [out:json];(way[waterway~&quot;^(waterfall|river|canal|dam|dock|boatyard)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641);relation[waterway~&quot;^(waterfall|river|canal|dam|dock|boatyard)$&quot;](48.079458619727674,7.272726663391359,48.08971738027232,7.288083336608641););out ids center tags;\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:204 Fetched 10 landmarks of type nature in (48.079458619727674, 7.272726663391359, 48.08971738027232, 7.288083336608641)\nINFO src.utils.landmarks_manager:landmarks_manager.py:103 Found 10 nature landmarks\nINFO src.main:main.py:103 Fetched 12 landmarks in \t: 12.036 seconds\nDEBUG src.optimization.optimizer:optimizer.py:597 First results are out. Looking out for circles and correcting.\nINFO src.optimization.optimizer:optimizer.py:637 Re-optimized 0 times, objective value : 455\nDEBUG src.optimization.refiner:refiner.py:345 Using 5 minor landmarks around the predicted path\nDEBUG src.optimization.optimizer:optimizer.py:597 First results are out. Looking out for circles and correcting.\nINFO src.optimization.optimizer:optimizer.py:637 Re-optimized 0 times, objective value : 455\nDEBUG src.main:main.py:129 First stage optimization\t: 0.064 seconds\nDEBUG src.main:main.py:130 Second stage optimization\t: 0.029 seconds\nINFO src.main:main.py:131 Total computation time\t: 0.092 seconds\nINFO src.main:main.py:136 Generated a trip of 23 minutes with 4 landmarks in 12.128 seconds.\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 17697322ddb543cd28c7d672da5b0a42\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 2d4f31d2bcc071a8ae54824e88b0b71f\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for b038bd8d4d6e49b077d4475aef2dbec7\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for fc8f85cdaba838cf56c61bf67d3d073f\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 57782ff2b60d1b4b56fae34a135862f8\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for b2fd047a07f9563c8c0925aad9d61052\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 36c2ed8cfba53833c4be58184562e315\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for bfec290793bde2bf9796d5dda23d0122\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 7ee38297ba20e3bc47b984dce2785e22\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for b7989cbe1aff4f6d0054a6c5550d3fcc\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 7f98015c7bc3a9100e10bc1c1ddfa572\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for 43424dbebba69d06a66a34728c3bb93e\nDEBUG src.overpass.overpass:overpass.py:112 Cache set for b7d4ee874adac132bc9e80d7172fab8e\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}]}, "renderCollapsed": ["passed"], "initialSort": "result", "title": "Backend Testing Report"}"></div> + <div id="data-container" data-jsonblob="{"environment": {"Python": "3.12.3", "Platform": "Linux-6.8.0-51-generic-x86_64-with-glibc2.39", "Packages": {"pytest": "8.3.4", "pluggy": "1.5.0"}, "Plugins": {"html": "4.1.1", "anyio": "4.8.0", "metadata": "3.1.1"}}, "tests": {"src/tests/test_main.py::test_turckheim": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_turckheim", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_turckheim</td>", "<td>start (0 | 0) - 6 - H\u00f4tel des Deux-Clefs (217 | 5) - 1 - H\u00f4tel de ville (238 | 5) - 6 - finish (0 | 0) - 0</td>", "<td>23 min</td>", "<td>20 min</td>", "<td class=\"col-duration\">159 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: EpollSelector\nINFO src.main:main.py:67 No end coordinates provided. Using start=end.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:76 Starting to fetch landmarks...\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:88 Fetching sightseeing landmarks...\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:204 Fetched 20 landmarks of type sightseeing in (48.079458619727674, 7.272726663391359, 48.08971738027232, 7.288083336608641)\nINFO src.utils.landmarks_manager:landmarks_manager.py:91 Found 20 sightseeing landmarks\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.utils.cluster_manager:cluster_manager.py:145 Found 0 sightseeing clusters.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:100 Fetching nature landmarks...\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nINFO src.overpass.overpass:overpass.py:55 Cache hit.\nDEBUG src.utils.landmarks_manager:landmarks_manager.py:204 Fetched 24 landmarks of type nature in (48.079458619727674, 7.272726663391359, 48.08971738027232, 7.288083336608641)\nINFO src.utils.landmarks_manager:landmarks_manager.py:103 Found 24 nature landmarks\nINFO src.main:main.py:104 Fetched 25 landmarks in \t: 0.009 seconds\nDEBUG src.optimization.optimizer:optimizer.py:597 First results are out. Looking out for circles and correcting.\nINFO src.optimization.optimizer:optimizer.py:637 Re-optimized 0 times, objective value : 455\nDEBUG src.optimization.refiner:refiner.py:345 Using 5 minor landmarks around the predicted path\nDEBUG src.optimization.optimizer:optimizer.py:597 First results are out. Looking out for circles and correcting.\nINFO src.optimization.optimizer:optimizer.py:637 Re-optimized 0 times, objective value : 455\nDEBUG src.main:main.py:130 First stage optimization\t: 0.101 seconds\nDEBUG src.main:main.py:131 Second stage optimization\t: 0.033 seconds\nINFO src.main:main.py:132 Total computation time\t: 0.134 seconds\nINFO src.main:main.py:137 Generated a trip of 23 minutes with 4 landmarks in 0.143 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}]}, "renderCollapsed": ["passed"], "initialSort": "result", "title": "Backend Testing Report"}"></div> <script> (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ const { getCollapsedCategory, setCollapsedIds } = require('./storage.js') diff --git a/backend/src/main.py b/backend/src/main.py index bb063fa..104ff08 100644 --- a/backend/src/main.py +++ b/backend/src/main.py @@ -136,7 +136,7 @@ def new_trip(preferences: Preferences, trip = Trip.from_linked_landmarks(linked_tour, cache_client) logger.info(f'Generated a trip of {trip.total_time} minutes with {len(refined_tour)} landmarks in {round(t_generate_landmarks + t_first_stage + t_second_stage,3)} seconds.') - background_tasks.add(fill_cache()) + background_tasks.add_task(fill_cache) return trip