Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 22 additions & 23 deletions browser-extensions/common/js/lib/challenges.js
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,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
Expand Down Expand Up @@ -1092,29 +1095,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) {
Expand Down Expand Up @@ -1274,7 +1273,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
Expand Down
102 changes: 57 additions & 45 deletions browser-extensions/common/js/tests/test/test_challenges.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,54 +265,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() {

Expand Down