From 5940da74774f8f363fb3341d76798ed33c5f8971 Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 14:52:35 +1100 Subject: [PATCH 1/6] Alternative origins for Record Breaker --- browser-extensions/common/js/lib/challenges.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index 1ff01afc..81737108 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -289,7 +289,9 @@ function challenge_record_breaker(data, params) { geoData = data.geo_data user_data = data.user_data - var reference_parkrun_name = calculate_average_parkrun_event_name(parkrunResults, geoData) + const reference_parkrun_name = user_data?.home_parkrun_info?.name ?? + calculate_average_parkrun_event_name(parkrunResults, geoData) ?? + 'Bushy Park'; var reference_parkrun = geoData.data.events[reference_parkrun_name] var o = create_data_object(params, "runner") From 4d42ca873540c7ed7820875813273e770719e0ac Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 15:04:43 +1100 Subject: [PATCH 2/6] Only use the home parkrun on "our" page --- browser-extensions/common/js/lib/challenges.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index 81737108..ffeebec6 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -289,10 +289,11 @@ function challenge_record_breaker(data, params) { geoData = data.geo_data user_data = data.user_data - const reference_parkrun_name = user_data?.home_parkrun_info?.name ?? - calculate_average_parkrun_event_name(parkrunResults, geoData) ?? - 'Bushy Park'; - var reference_parkrun = geoData.data.events[reference_parkrun_name] + const reference_parkrun_name = (is_our_page(data) && data.info.has_home_parkrun) ? + user_data?.home_parkrun_info?.name : + calculate_average_parkrun_event_name(parkrunResults, geoData) ?? 'Bushy Park'; + + const reference_parkrun = geoData.data.events[reference_parkrun_name] var o = create_data_object(params, "runner") o.has_map = true From 53be7d1ab3fe24f23382c8ddd800115a8ac5b79c Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 15:40:21 +1100 Subject: [PATCH 3/6] Show distance to average event --- browser-extensions/common/js/lib/challenges.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index ffeebec6..5ca4bc2d 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1088,7 +1088,7 @@ function get_parkrun_page_url(geo_data, parkrun_name) { } // Which is the closest parkrun to your average parkrun location? -function generate_stat_average_parkrun_event(parkrun_results, geo_data) { +function generate_stat_average_parkrun_event(parkrun_results, geo_data, home_parkrun_info) { // Calculate average parkrun for user var average_parkrun_stat_info = { @@ -1099,14 +1099,15 @@ function generate_stat_average_parkrun_event(parkrun_results, geo_data) { var average_parkrun_event_name = calculate_average_parkrun_event_name(parkrun_results, geo_data) - if (average_parkrun_event_name !== undefined) { + if (average_parkrun_event_name) { + const distance = Math.round(calculate_great_circle_distance(geo_data.data.events[average_parkrun_event_name], home_parkrun_info)); var url_link = get_parkrun_page_url(geo_data, average_parkrun_event_name) average_parkrun_stat_info = { "display_name": "Average parkrun event", "help": "The nearest parkrun event to your average parkrun location.", - "value": average_parkrun_event_name, + "value": `${average_parkrun_event_name} - ${distance}km away`, "url": url_link } } @@ -1270,7 +1271,7 @@ function generate_stats(data) { stats['total_distance_travelled'] = generate_stat_total_distance_travelled(data.parkrun_results, data.geo_data) stats['total_countries_visited'] = generate_stat_total_countries_visited(data.parkrun_results, data.geo_data) stats['average_parkrun_location'] = generate_stat_average_parkrun_location(data.parkrun_results, data.geo_data) - stats['average_parkrun_event'] = generate_stat_average_parkrun_event(data.parkrun_results, data.geo_data) + stats['average_parkrun_event'] = generate_stat_average_parkrun_event(data.parkrun_results, data.geo_data, data.user_data.home_parkrun_info) } // Stats that need the user data available, and we are on their page (i.e. has From 8d2c6d16a8565445f51baa82eba8b2e30defaa0e Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 15:47:42 +1100 Subject: [PATCH 4/6] Fix tests --- .../common/js/tests/test/test_challenges.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/browser-extensions/common/js/tests/test/test_challenges.js b/browser-extensions/common/js/tests/test/test_challenges.js index 927874c3..7cf0d838 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -267,10 +267,11 @@ describe("challenges.js", function() { // Use the special '__get__' accessor to get your private function. var generate_stat_average_parkrun_event = challenges.__get__('generate_stat_average_parkrun_event'); + const homeParkrun = getParkrunEventInfo("Winchester") it("should return \"None\" if you haven't run any events", function() { var parkrunResults = [] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData) + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) assert.equal(r.value, "None") assert.equal(r.url, undefined) }) @@ -279,8 +280,8 @@ describe("challenges.js", function() { var parkrunResults = [ createParkrunResult({name: "Winchester"}) ] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData) - assert.equal(r.value, "Winchester") + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) + assert.equal(r.value, "Winchester - 0km away") assert.equal(r.url, "https://www.parkrun.org.uk/winchester") }) @@ -290,8 +291,8 @@ describe("challenges.js", function() { createParkrunResult({name: "Winchester"}), createParkrunResult({name: "Winchester"}) ] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData) - assert.equal(r.value, "Winchester") + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) + assert.equal(r.value, "Winchester - 0km away") assert.equal(r.url, "https://www.parkrun.org.uk/winchester") }) @@ -303,8 +304,8 @@ describe("challenges.js", function() { ] // Filter the events to just Bushy Park and Winchester so that we definitely know which it will pick var filteredGeoData = filterGeoData(geoData, {"events": ["Bushy Park", "Winchester"]}) - var r = generate_stat_average_parkrun_event(parkrunResults, filteredGeoData) - assert.equal(r.value, "Bushy Park") + var r = generate_stat_average_parkrun_event(parkrunResults, filteredGeoData, homeParkrun) + assert.equal(r.value, "Bushy Park - 78km away") assert.equal(r.url, "https://www.parkrun.org.uk/bushy") }) From 2c50b2be1b9912395770d6bc7677ec9bde9b66cd Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 17:14:51 +1100 Subject: [PATCH 5/6] No home parkrun, no worries! --- .../common/js/lib/challenges.js | 35 +++---- .../common/js/tests/test/test_challenges.js | 95 ++++++++++--------- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index 5ca4bc2d..ef46f766 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1089,29 +1089,24 @@ function get_parkrun_page_url(geo_data, parkrun_name) { // Which is the closest parkrun to your average parkrun location? function generate_stat_average_parkrun_event(parkrun_results, geo_data, home_parkrun_info) { - // Calculate average parkrun for user - - var average_parkrun_stat_info = { - "display_name": "Average parkrun event", - "help": "The nearest parkrun event to your average parkrun location.", - "value": "None" - } - - var average_parkrun_event_name = calculate_average_parkrun_event_name(parkrun_results, geo_data) + const average_parkrun_event_name = calculate_average_parkrun_event_name(parkrun_results, geo_data); + const display_name = "Average parkrun event"; + const help = home_parkrun_info.lat && home_parkrun_info.lon ? + "The nearest parkrun event to your home parkrun location" : + "The nearest parkrun event to your average parkrun location (or Bushy if you're yet to start)"; + let value = 'None'; + let url; if (average_parkrun_event_name) { - const distance = Math.round(calculate_great_circle_distance(geo_data.data.events[average_parkrun_event_name], home_parkrun_info)); - - var url_link = get_parkrun_page_url(geo_data, average_parkrun_event_name) - - average_parkrun_stat_info = { - "display_name": "Average parkrun event", - "help": "The nearest parkrun event to your average parkrun location.", - "value": `${average_parkrun_event_name} - ${distance}km away`, - "url": url_link - } + const distance = home_parkrun_info ? + Math.round(calculate_great_circle_distance(geo_data.data.events[average_parkrun_event_name], home_parkrun_info)) : + 0; + const distanceAway = distance ? `${distance}km away` : null; + value = [average_parkrun_event_name, distanceAway].filter(Boolean).join(' - '); + url = get_parkrun_page_url(geo_data, average_parkrun_event_name); } - return average_parkrun_stat_info + + return { display_name, help, value, url }; } function calculate_average_parkrun_event_name(parkrun_results, geo_data) { diff --git a/browser-extensions/common/js/tests/test/test_challenges.js b/browser-extensions/common/js/tests/test/test_challenges.js index 7cf0d838..b83964ba 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -263,55 +263,58 @@ describe("challenges.js", function() { }) - describe("generate_stat_average_parkrun_event", function() { - - // Use the special '__get__' accessor to get your private function. + describe("generate_stat_average_parkrun_event", function () { var generate_stat_average_parkrun_event = challenges.__get__('generate_stat_average_parkrun_event'); - const homeParkrun = getParkrunEventInfo("Winchester") - - it("should return \"None\" if you haven't run any events", function() { - var parkrunResults = [] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) - assert.equal(r.value, "None") - assert.equal(r.url, undefined) - }) - - it("should return \"Winchester\" if you have only run at Winchester once", function() { + const homeParkrun = getParkrunEventInfo("Winchester"); + + it("should return 'None' if no events have been run", function () { + var parkrunResults = []; + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun); + assert.equal(r.value, "None"); + assert.equal(r.url, undefined); + assert.equal(r.help, "The nearest parkrun event to your home parkrun location") + }); + + it("should handle no home parkrun", function () { + var parkrunResults = [createParkrunResult({ name: "Winchester" })]; + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, {}); + assert.equal(r.value, "Winchester"); + assert.equal(r.url, "https://www.parkrun.org.uk/winchester"); + assert.equal(r.help, "The nearest parkrun event to your average parkrun location (or Bushy if you're yet to start)") + }); + + it("should return 'Winchester' if only run there once", function () { + var parkrunResults = [createParkrunResult({ name: "Winchester" })]; + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun); + assert.equal(r.value, "Winchester"); + assert.equal(r.url, "https://www.parkrun.org.uk/winchester"); + assert.equal(r.help, "The nearest parkrun event to your home parkrun location")}); + + it("should return 'Winchester' if run there multiple times", function () { var parkrunResults = [ - createParkrunResult({name: "Winchester"}) - ] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) - assert.equal(r.value, "Winchester - 0km away") - assert.equal(r.url, "https://www.parkrun.org.uk/winchester") - }) - - it("should return \"Winchester\" if you have only run there Winchester, but been there multiple times", function() { - var parkrunResults = [ - createParkrunResult({name: "Winchester"}), - createParkrunResult({name: "Winchester"}), - createParkrunResult({name: "Winchester"}) - ] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun) - assert.equal(r.value, "Winchester - 0km away") - assert.equal(r.url, "https://www.parkrun.org.uk/winchester") - }) - - it("should return \"Bushy Park\" if you have run there most often", function() { + createParkrunResult({ name: "Winchester" }), + createParkrunResult({ name: "Winchester" }), + createParkrunResult({ name: "Winchester" }) + ]; + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, homeParkrun); + assert.equal(r.value, "Winchester"); + assert.equal(r.url, "https://www.parkrun.org.uk/winchester"); + assert.equal(r.help, "The nearest parkrun event to your home parkrun location") + }); + + it("should return 'Bushy Park' if run there most often", function () { var parkrunResults = [ - createParkrunResult({name: "Bushy Park"}), - createParkrunResult({name: "Bushy Park"}), - createParkrunResult({name: "Winchester"}) - ] - // Filter the events to just Bushy Park and Winchester so that we definitely know which it will pick - var filteredGeoData = filterGeoData(geoData, {"events": ["Bushy Park", "Winchester"]}) - var r = generate_stat_average_parkrun_event(parkrunResults, filteredGeoData, homeParkrun) - assert.equal(r.value, "Bushy Park - 78km away") - assert.equal(r.url, "https://www.parkrun.org.uk/bushy") - }) - - }) - - }) + createParkrunResult({ name: "Bushy Park" }), + createParkrunResult({ name: "Bushy Park" }), + createParkrunResult({ name: "Winchester" }) + ]; + var filteredGeoData = filterGeoData(geoData, { "events": ["Bushy Park", "Winchester"] }); + var r = generate_stat_average_parkrun_event(parkrunResults, filteredGeoData, homeParkrun); + assert.equal(r.value, "Bushy Park - 78km away"); + assert.equal(r.url, "https://www.parkrun.org.uk/bushy"); + assert.equal(r.help, "The nearest parkrun event to your home parkrun location")}); + }); + }); describe("challenges", function() { From 366583e72264b1a086d979c8b398e0a3442a0fdf Mon Sep 17 00:00:00 2001 From: Pete Johns Date: Sat, 26 Oct 2024 21:00:12 +1100 Subject: [PATCH 6/6] Not sure how I missed this --- browser-extensions/common/js/lib/challenges.js | 2 +- .../common/js/tests/test/test_challenges.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index ef46f766..65e16fdc 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1091,7 +1091,7 @@ function get_parkrun_page_url(geo_data, parkrun_name) { function generate_stat_average_parkrun_event(parkrun_results, geo_data, home_parkrun_info) { const average_parkrun_event_name = calculate_average_parkrun_event_name(parkrun_results, geo_data); const display_name = "Average parkrun event"; - const help = home_parkrun_info.lat && home_parkrun_info.lon ? + const help = home_parkrun_info?.lat && home_parkrun_info?.lon ? "The nearest parkrun event to your home parkrun location" : "The nearest parkrun event to your average parkrun location (or Bushy if you're yet to start)"; let value = 'None'; diff --git a/browser-extensions/common/js/tests/test/test_challenges.js b/browser-extensions/common/js/tests/test/test_challenges.js index b83964ba..49efedaa 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -275,6 +275,14 @@ describe("challenges.js", function() { assert.equal(r.help, "The nearest parkrun event to your home parkrun location") }); + it("should handle no home parkrun data at all", function () { + var parkrunResults = [createParkrunResult({ name: "Winchester" })]; + var r = generate_stat_average_parkrun_event(parkrunResults, geoData, undefined); + assert.equal(r.value, "Winchester"); + assert.equal(r.url, "https://www.parkrun.org.uk/winchester"); + assert.equal(r.help, "The nearest parkrun event to your average parkrun location (or Bushy if you're yet to start)") + }); + it("should handle no home parkrun", function () { var parkrunResults = [createParkrunResult({ name: "Winchester" })]; var r = generate_stat_average_parkrun_event(parkrunResults, geoData, {});