diff --git a/browser-extensions/common/js/lib/challenges.js b/browser-extensions/common/js/lib/challenges.js index 1ff01afc..65e16fdc 100644 --- a/browser-extensions/common/js/lib/challenges.js +++ b/browser-extensions/common/js/lib/challenges.js @@ -289,8 +289,11 @@ 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) - 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 @@ -1085,29 +1088,25 @@ 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) { - // Calculate average parkrun for user +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 ? + "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; - var average_parkrun_stat_info = { - "display_name": "Average parkrun event", - "help": "The nearest parkrun event to your average parkrun location.", - "value": "None" + if (average_parkrun_event_name) { + 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); } - var average_parkrun_event_name = calculate_average_parkrun_event_name(parkrun_results, geo_data) - - if (average_parkrun_event_name !== undefined) { - - 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, - "url": url_link - } - } - return average_parkrun_stat_info + return { display_name, help, value, url }; } function calculate_average_parkrun_event_name(parkrun_results, geo_data) { @@ -1267,7 +1266,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 diff --git a/browser-extensions/common/js/tests/test/test_challenges.js b/browser-extensions/common/js/tests/test/test_challenges.js index 927874c3..49efedaa 100644 --- a/browser-extensions/common/js/tests/test/test_challenges.js +++ b/browser-extensions/common/js/tests/test/test_challenges.js @@ -263,54 +263,66 @@ 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'); - - it("should return \"None\" if you haven't run any events", function() { - var parkrunResults = [] - var r = generate_stat_average_parkrun_event(parkrunResults, geoData) - 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 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, {}); + 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) - assert.equal(r.value, "Winchester") - 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) - assert.equal(r.value, "Winchester") - 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) - assert.equal(r.value, "Bushy Park") - 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() {