* version 3.2.13 - 2023-06-26
* Reverse map: show search position (red circle) also when no search results
- * text-suite: replace httpbin with beeceptor for mocking HTTP error codes
+ * test-suite: remove httpbin HTTP calls, server is unreliable
* NPM package updates (Bootstrap 5.3, Leaflet 1.9.4)
* version 3.2.12 - 2023-04-04
export async function fetch_from_api(endpoint_name, params, callback) {
var api_url = generate_nominatim_api_url(endpoint_name, params);
- // For the test suite:
- // If mock_http_status URL parameter is set we call an external webservice. First
- // https://httpbin.org/#/Status_codes but we saw timeouts. Now beeceptor.com
- // If that turns out unreliable or expensive (only 50/day free) we might have to
- // start running a local webserver for the test suite
- var tmp_params = new URLSearchParams(window.location.search);
- if (tmp_params && tmp_params.get('mock_http_status')) {
- api_url = 'https://nominatim-ui.free.beeceptor.com/status/' + parseInt(tmp_params.get('mock_http_status'), 10);
- }
+ const mock_api_error = (new URLSearchParams(window.location.search)).get('mock_api_error');
api_request_progress('start');
if (endpoint_name !== 'status') last_api_request_url_store.set(null);
try {
await fetch(api_url, { headers: Nominatim_Config.Nominatim_API_Endpoint_Headers || {} })
.then(async (response) => {
- if (!((response.status >= 200 && response.status < 300) || response.status === 404)) {
+ if ((!((response.status >= 200 && response.status < 300) || response.status === 404))
+ || mock_api_error === 'fetch'
+ ) {
error_store.set(`Error fetching data from ${api_url} (${response.statusText})`);
return undefined;
}
// errors.
var data;
try {
- data = await response.json();
+ if (mock_api_error === 'parse') {
+ data = JSON.parse('{');
+ } else {
+ data = await response.json();
+ }
} catch (err) {
// e.g. 'JSON.parse: unexpected non-whitespace character after JSON data at line 1'
error_store.set(`Error parsing JSON data from ${api_url} (${err})`);
defaultViewport: { width: 1024, height: 768 },
timeout: 10000,
// latency: 1000,
+ headless: 'new',
args: [
'--user-agent=Nominatim UI test suite Mozilla/5.0 Gecko/20100101 HeadlessChrome/90.0'
]
describe('HTTP 503 - service unavailable', function () {
before(async function () {
page = await browser.newPage();
- await page.goto('http://localhost:9999/search.html?q=london&mock_http_status=503');
+ await page.goto('http://localhost:9999/search.html?q=london&mock_api_error=fetch');
});
after(async function () {
await page.waitForSelector('#error');
let message = await page.$eval('#error', el => el.textContent);
- assert.ok(message.includes('/status/503'));
assert.ok(message.includes('Error fetching data from'));
});
});
describe('HTTP 200 - JSON parsing fails', function () {
before(async function () {
page = await browser.newPage();
- await page.goto('http://localhost:9999/search.html?q=london&mock_http_status=200');
+ await page.goto('http://localhost:9999/search.html?q=london&mock_api_error=parse');
});
after(async function () {
await page.waitForSelector('#error');
let message = await page.$eval('#error', el => el.textContent);
- assert.ok(message.includes('/status/200'));
assert.ok(message.includes('Error parsing JSON data from'));
});
});