Skip to content

Commit e9fb1cd

Browse files
Refactor and get tests work again
1 parent 0343805 commit e9fb1cd

File tree

4 files changed

+56
-55
lines changed

4 files changed

+56
-55
lines changed

js/server_functions.js

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function getStartup (req, res) {
3030
* Only the url-param of the input request url is required. It must be the last parameter.
3131
* @param {Request} req - the request
3232
* @param {Response} res - the result
33+
* @returns {Promise<void>} A promise that resolves when the response is sent
3334
*/
3435
async function cors (req, res) {
3536
try {
@@ -40,27 +41,26 @@ async function cors (req, res) {
4041
if (!match) {
4142
url = `invalid url: ${req.url}`;
4243
Log.error(url);
43-
res.send(url);
44-
return;
45-
}
46-
url = match[1];
47-
48-
const headersToSend = getHeadersToSend(req.url);
49-
const expectedReceivedHeaders = geExpectedReceivedHeaders(req.url);
50-
Log.log(`cors url: ${url}`);
51-
52-
const response = await fetch(url, { headers: headersToSend });
53-
if (response.ok) {
54-
for (const header of expectedReceivedHeaders) {
55-
const headerValue = response.headers.get(header);
56-
if (header) res.set(header, headerValue);
57-
}
58-
const data = await response.text();
59-
res.send(data);
44+
return res.status(400).send(url);
6045
} else {
61-
res.status(response.status).json({ message: response.statusText });
46+
url = match[1];
47+
48+
const headersToSend = getHeadersToSend(req.url);
49+
const expectedReceivedHeaders = geExpectedReceivedHeaders(req.url);
50+
Log.log(`cors url: ${url}`);
51+
52+
const response = await fetch(url, { headers: headersToSend });
53+
if (response.ok) {
54+
for (const header of expectedReceivedHeaders) {
55+
const headerValue = response.headers.get(header);
56+
if (header) res.set(header, headerValue);
57+
}
58+
const data = await response.text();
59+
res.send(data);
60+
} else {
61+
throw new Error(`Response status: ${response.status}`);
62+
}
6263
}
63-
6464
} catch (error) {
6565
// Only log errors in non-test environments to keep test output clean
6666
if (process.env.mmTestMode !== "true") {

modules/default/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ async function performWebRequest (url, type = "json", useCorsProxy = false, requ
3939
}
4040
} catch (error) {
4141
Log.error(`Error fetching data from ${url}: ${error}`);
42+
return undefined;
4243
}
4344
}
4445

modules/default/weather/providers/pirateweather.js

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,36 @@ WeatherProvider.register("pirateweather", {
2222
lon: 0
2323
},
2424

25-
fetchCurrentWeather () {
26-
this.fetchData(this.getUrl())
27-
.then((data) => {
28-
if (!data || !data.currently || typeof data.currently.temperature === "undefined") {
29-
// No usable data?
30-
return;
31-
}
25+
async fetchCurrentWeather () {
26+
try {
27+
const data = await this.fetchData(this.getUrl());
28+
if (!data || !data.currently || typeof data.currently.temperature === "undefined") {
29+
throw new Error("No usable data received from Pirate Weather API.");
30+
}
3231

33-
const currentWeather = this.generateWeatherDayFromCurrentWeather(data);
34-
this.setCurrentWeather(currentWeather);
35-
})
36-
.catch(function (request) {
37-
Log.error("[weatherprovider.pirateweather] Could not load data ... ", request);
38-
})
39-
.finally(() => this.updateAvailable());
32+
const currentWeather = this.generateWeatherDayFromCurrentWeather(data);
33+
this.setCurrentWeather(currentWeather);
34+
} catch (error) {
35+
Log.error("Could not load data ... ", error);
36+
} finally {
37+
this.updateAvailable();
38+
}
4039
},
4140

42-
fetchWeatherForecast () {
43-
this.fetchData(this.getUrl())
44-
.then((data) => {
45-
if (!data || !data.daily || !data.daily.data.length) {
46-
// No usable data?
47-
return;
48-
}
41+
async fetchWeatherForecast () {
42+
try {
43+
const data = await this.fetchData(this.getUrl());
44+
if (!data || !data.daily || !data.daily.data.length) {
45+
throw new Error("No usable data received from Pirate Weather API.");
46+
}
4947

50-
const forecast = this.generateWeatherObjectsFromForecast(data.daily.data);
51-
this.setWeatherForecast(forecast);
52-
})
53-
.catch(function (request) {
54-
Log.error("[weatherprovider.pirateweather] Could not load data ... ", request);
55-
})
56-
.finally(() => this.updateAvailable());
48+
const forecast = this.generateWeatherObjectsFromForecast(data.daily.data);
49+
this.setWeatherForecast(forecast);
50+
} catch (error) {
51+
Log.error("Could not load data ... ", error);
52+
} finally {
53+
this.updateAvailable();
54+
}
5755
},
5856

5957
// Create a URL from the config and base URL.

tests/unit/functions/server_functions_spec.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ describe("server_functions tests", () => {
1616
headers: {
1717
get: fetchResponseHeadersGet
1818
},
19-
text: fetchResponseHeadersText
19+
text: fetchResponseHeadersText,
20+
ok: true
2021
};
2122

2223
fetch = vi.fn();
@@ -26,7 +27,12 @@ describe("server_functions tests", () => {
2627

2728
corsResponse = {
2829
set: vi.fn(() => {}),
29-
send: vi.fn(() => {})
30+
send: vi.fn(() => {}),
31+
status: vi.fn(function (code) {
32+
this.statusCode = code;
33+
return this;
34+
}),
35+
json: vi.fn(() => {})
3036
};
3137

3238
request = {
@@ -91,15 +97,11 @@ describe("server_functions tests", () => {
9197
throw error;
9298
});
9399

94-
let sentData;
95-
corsResponse.send = vi.fn((input) => {
96-
sentData = input;
97-
});
98-
99100
await cors(request, corsResponse);
100101

101102
expect(fetchResponseHeadersText.mock.calls).toHaveLength(1);
102-
expect(sentData).toBe(error);
103+
expect(corsResponse.status).toHaveBeenCalledWith(500);
104+
expect(corsResponse.json).toHaveBeenCalledWith({ error: error.message });
103105
});
104106

105107
it("Fetches with user agent by default", async () => {

0 commit comments

Comments
 (0)