From 172d787b4d5c0710b01f7f18f90c7be99be8d9c6 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 7c374230..188cb117 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -296,7 +296,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 4021d3a3342361d92dff90250f79c54137cf4a17 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 188cb117..43d056c5 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -296,10 +296,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 181b25a84da489639a70621e5e3fe9adcdd7ced2 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 43d056c5..49d06fa6 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1095,7 +1095,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 = { @@ -1106,14 +1106,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 } } @@ -1277,7 +1278,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 ec9eca920bf3429fe8557af3f29171bc9718ed2d 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 4280a480..bf1f4a75 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -269,10 +269,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) }) @@ -281,8 +282,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") }) @@ -292,8 +293,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") }) @@ -305,8 +306,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 70975e29354ec68d61c589713966a3c0431e72bb 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 49d06fa6..15347f18 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1096,29 +1096,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 bf1f4a75..b85d80d7 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -265,55 +265,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 d5fc1eea368c8d94a932faad314c5adefeb866bd 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 15347f18..e5a1eb44 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -1098,7 +1098,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 b85d80d7..e0535660 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -277,6 +277,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, {});