Skip to content
Merged
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
8 changes: 4 additions & 4 deletions defaultmodules/weather/providers/ukmetofficedatahub.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class UkMetOfficeDataHubProvider extends WeatherProvider {
snow: hour.totalSnowAmount || 0,
precipitationAmount: (hour.totalPrecipAmount || 0) + (hour.totalSnowAmount || 0),
precipitationProbability: hour.probOfPrecipitation || null,
feelsLikeTemp: hour.feelsLikeTemperature || null,
feelsLikeTemp: hour.feelsLikeTemperature ?? null,
sunrise: null,
sunset: null
};
Expand All @@ -167,7 +167,7 @@ class UkMetOfficeDataHubProvider extends WeatherProvider {
snow: firstHour.totalSnowAmount || 0,
precipitationAmount: (firstHour.totalPrecipAmount || 0) + (firstHour.totalSnowAmount || 0),
precipitationProbability: firstHour.probOfPrecipitation || null,
feelsLikeTemp: firstHour.feelsLikeTemperature || null,
feelsLikeTemp: firstHour.feelsLikeTemperature ?? null,
sunrise: null,
sunset: null
};
Expand Down Expand Up @@ -204,7 +204,7 @@ class UkMetOfficeDataHubProvider extends WeatherProvider {
snow: day.dayProbabilityOfSnow || 0,
precipitationAmount: 0,
precipitationProbability: day.dayProbabilityOfPrecipitation || null,
feelsLikeTemp: day.dayMaxFeelsLikeTemp || null
feelsLikeTemp: day.dayMaxFeelsLikeTemp ?? null
});
}
}
Expand Down Expand Up @@ -235,7 +235,7 @@ class UkMetOfficeDataHubProvider extends WeatherProvider {
snow: hour.totalSnowAmount || 0,
precipitationAmount: (hour.totalPrecipAmount || 0) + (hour.totalSnowAmount || 0),
precipitationProbability: hour.probOfPrecipitation || null,
feelsLikeTemp: hour.feelsLikeTemp || null
feelsLikeTemp: hour.feelsLikeTemp ?? null
});
}

Expand Down
2 changes: 1 addition & 1 deletion defaultmodules/weather/weatherobject.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class WeatherObject {
}

feelsLike () {
if (this.feelsLikeTemp) {
if (this.feelsLikeTemp || this.feelsLikeTemp === 0) {
return this.feelsLikeTemp;
}
return WeatherUtils.calculateFeelsLike(this.temperature, this.windSpeed, this.humidity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,25 @@ describe("UKMetOfficeDataHubProvider", () => {
UKMetOfficeDataHubProvider = module.default || module;
});

it.each([
["current observation", "current", -1, "feelsLikeTemperature"],
["current fallback", "current", -120, "feelsLikeTemperature"],
["daily forecast", "forecast", 1440, "dayMaxFeelsLikeTemp"],
["hourly forecast", "hourly", 60, "feelsLikeTemp"]
])("should preserve zero feels-like temperature in the %s", (label, type, offsetMinutes, field) => {
const provider = new UKMetOfficeDataHubProvider({ apiKey: "test-key", type });
const onData = vi.fn();
provider.setCallbacks(onData, vi.fn());
const time = new Date(Date.now() + offsetMinutes * 60_000).toISOString();
const data = { features: [{ properties: { timeSeries: [{ time, [field]: 0 }] } }] };
vi.spyOn(provider, "_createJSONFetcher").mockImplementation((options, onResponse) => onResponse(data));

provider.initialize();

const [weather] = onData.mock.calls[0];
expect((Array.isArray(weather) ? weather[0] : weather).feelsLikeTemp).toBe(0);
});

describe("Constructor & Configuration", () => {
it("should set config values from params", () => {
const provider = new UKMetOfficeDataHubProvider({
Expand Down
22 changes: 22 additions & 0 deletions tests/unit/modules/default/weather/weather_object_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ const WeatherObject = require(`../../../../../${defaults.defaultModulesDir}/weat
global.moment = require("moment-timezone");
global.SunCalc = require("suncalc");

global.WeatherUtils = require(`../../../../../${defaults.defaultModulesDir}/weather/weatherutils`);

describe("WeatherObject", () => {
let originalTimeZone;
let weatherobject;
Expand Down Expand Up @@ -44,6 +46,26 @@ describe("WeatherObject", () => {
expect(weatherobject.feelsLike()).toBe("feelsLikeTempValue");
});

it("should preserve a provider's zero feels-like temperature", () => {
const current = Object.assign(new WeatherObject(), {
temperature: 12,
windSpeed: 0,
humidity: 50,
feelsLikeTemp: 0
});
expect(current.feelsLike()).toBe(0);
});

it.each([null, undefined, NaN])("should calculate a fallback for %s", (feelsLikeTemp) => {
const current = Object.assign(new WeatherObject(), {
temperature: 12,
windSpeed: 0,
humidity: 50,
feelsLikeTemp
});
expect(current.feelsLike()).toBeCloseTo(11.741);
});

afterAll(() => {
moment.tz.setDefault(originalTimeZone);
});
Expand Down
Loading