Project

General

Profile

« Previous | Next » 

Revision 57ce414c

Added by koszko over 1 year ago

validate repository responses against JSON schemas

  • compute_scripts.awk (include_file): don't enforce specific path format on #INCLUDE'd files
  • .gitmodules, schemas: add Haketilo JSON schemas subrepo
  • html/install.js (InstallView): import schema validator and run it against downloaded mapping and resource definitions
  • html/repo_query.js (RepoEntry): import schema validator and run it against obtained query results
  • test/haketilo_test/unit/test_install.py (test_install_normal_usage, test_install_dialogs): use underscore instead of hyphen in item identifiers
  • test/haketilo_test/unit/test_install.py (test_install_dialogs): adapt error message test cases to new handling method of invalid JSON instanced
  • test/haketilo_test/unit/test_repo_query.py (test_repo_query_normal_usage): use underscore instead of hyphen in item identifiers
  • test/haketilo_test/unit/test_repo_query.py (test_repo_query_messages): use higher sample unsupported schema version to avoid having to modify the test case soon
  • test/haketilo_test/world_wide_library.py: use underscore instead of hyphen in item identifiers
  • common/jsonschema.js, common/jsonschema: adapt tdegrunt's jsonschema and include in Haketilo, load schema documents from schemas/

View differences:

test/haketilo_test/unit/test_install.py
70 70
    if complex_variant:
71 71
        # The resource/mapping others depend on.
72 72
        root_id = 'abcd-defg-ghij'
73
        root_resource_id = f'resource_{root_id}'
74
        root_mapping_id = f'mapping_{root_id}'
73
        root_resource_id = f'resource-{root_id}'
74
        root_mapping_id = f'mapping-{root_id}'
75 75
        # Those ids are used to check the alphabetical ordering.
76
        resource_ids = [f'resource_{letters}' for letters in (
76
        resource_ids = [f'resource-{letters}' for letters in (
77 77
            'a', 'abcd', root_id, 'b', 'c',
78 78
            'd', 'defg', 'e', 'f',
79 79
            'g', 'ghij', 'h', 'i', 'j'
80 80
        )]
81 81
        files_count = 9
82 82
    else:
83
        root_resource_id = f'resource_a'
84
        root_mapping_id = f'mapping_a'
83
        root_resource_id = f'resource-a'
84
        root_mapping_id = f'mapping-a'
85 85
        resource_ids = [root_resource_id]
86 86
        files_count = 0
87 87

  
......
102 102

  
103 103
    assert not execute_in_page('returnval(ets()[0].old_ver);').is_displayed()
104 104
    execute_in_page('returnval(ets()[0].details_but);').click()
105
    assert 'resource_a' in containers['resource_preview_container'].text
105
    assert 'resource-a' in containers['resource_preview_container'].text
106 106
    assert_container_displayed('resource_preview_container')
107 107

  
108 108
    execute_in_page('returnval(install_view.resource_back_but);').click()
......
246 246
            browser.tabs.sendMessage = () => new Promise(cb => {});
247 247
            install_view.show(...arguments);
248 248
            ''',
249
            'https://hydril.la/', 'mapping', 'mapping_a')
249
            'https://hydril.la/', 'mapping', 'mapping-a')
250 250

  
251 251
        assert dlg_buts() == []
252 252
        assert dialog_txt() == 'Fetching data from repository...'
......
256 256
            browser.tabs.sendMessage = () => Promise.resolve({error: "sth"});
257 257
            install_view.show(...arguments);
258 258
            ''',
259
            'https://hydril.la/', 'mapping', 'mapping_a')
259
            'https://hydril.la/', 'mapping', 'mapping-a')
260 260

  
261 261
        assert_dlg(['conf_buts'], 'Failure to communicate with repository :(')
262 262
    elif message == 'HTTP_code_item':
......
266 266
            browser.tabs.sendMessage = () => Promise.resolve(response);
267 267
            install_view.show(...arguments);
268 268
            ''',
269
            'https://hydril.la/', 'mapping', 'mapping_a')
269
            'https://hydril.la/', 'mapping', 'mapping-a')
270 270

  
271 271
        assert_dlg(['conf_buts'], 'Repository sent HTTP code 404 :(')
272 272
    elif message == 'invalid_JSON':
......
276 276
            browser.tabs.sendMessage = () => Promise.resolve(response);
277 277
            install_view.show(...arguments);
278 278
            ''',
279
            'https://hydril.la/', 'mapping', 'mapping_a')
279
            'https://hydril.la/', 'mapping', 'mapping-a')
280 280

  
281 281
        assert_dlg(['conf_buts'], "Repository's response is not valid JSON :(")
282 282
    elif message == 'newer_API_version':
283 283
        execute_in_page(
284 284
            '''
285
            const response = {
286
                ok: true,
287
                status: 200,
288
                json: {$schema: "https://hydrilla.koszko.org/schemas/api_mapping_description-2.1.schema.json"}
289
            };
290
            browser.tabs.sendMessage = () => Promise.resolve(response);
285
            const old_sendMessage = browser.tabs.sendMessage;
286
            browser.tabs.sendMessage = async function(...args) {
287
                const response = await old_sendMessage(...args);
288
                response.json.$schema = "https://hydrilla.koszko.org/schemas/api_mapping_description-255.1.schema.json";
289
                return response;
290
            }
291 291
            install_view.show(...arguments);
292 292
            ''',
293
            'https://hydril.la/', 'mapping', 'somemapping', [2, 1])
293
            'https://hydril.la/', 'mapping', 'mapping-a', [2022, 5, 10])
294 294

  
295 295
        assert_dlg(['conf_buts'],
296
                   'Mapping somemapping-2.1 was served using unsupported Hydrilla API version. You might need to update Haketilo.')
296
                   'Mapping mapping-a-2022.5.10 was served using unsupported Hydrilla API version. You might need to update Haketilo.')
297 297
    elif message == 'invalid_response_format':
298 298
        execute_in_page(
299 299
            '''
300
            const response = {
301
                ok: true,
302
                status: 200,
303
                /* $schema is not a string as it should be. */
304
                json: {$schema: null}
305
            };
306
            browser.tabs.sendMessage = () => Promise.resolve(response);
300
            const old_sendMessage = browser.tabs.sendMessage;
301
            browser.tabs.sendMessage = async function(...args) {
302
                const response = await old_sendMessage(...args);
303
                /* identifier is not a string as it should be. */
304
                response.json.identifier = 1234567;
305
                return response;
306
            }
307 307
            install_view.show(...arguments);
308 308
            ''',
309
            'https://hydril.la/', 'resource', 'someresource')
309
            'https://hydril.la/', 'resource', 'resource-a')
310 310

  
311 311
        assert_dlg(['conf_buts'],
312
                   'Resource someresource was served using a nonconforming response format.')
312
                   'Resource resource-a was served using a nonconforming response format.')
313 313
    elif message == 'indexeddb_error_item':
314 314
        execute_in_page(
315 315
            '''
316 316
            haketilodb.idb_get = () => {throw "some error";};
317 317
            install_view.show(...arguments);
318 318
            ''',
319
            'https://hydril.la/', 'mapping', 'mapping_a')
319
            'https://hydril.la/', 'mapping', 'mapping-a')
320 320

  
321 321
        assert_dlg(['conf_buts'],
322 322
                   "Error accessing Haketilo's internal database :(")
......
326 326
            haketilodb.save_items = () => new Promise(() => {});
327 327
            returnval(install_view.show(...arguments));
328 328
            ''',
329
            'https://hydril.la/', 'mapping', 'mapping_b')
329
            'https://hydril.la/', 'mapping', 'mapping-b')
330 330

  
331 331
        execute_in_page('returnval(install_view.install_but);').click()
332 332

  
......
343 343
            }
344 344
            returnval(install_view.show(...arguments));
345 345
            ''',
346
            'https://hydril.la/', 'mapping', 'mapping_b')
346
            'https://hydril.la/', 'mapping', 'mapping-b')
347 347

  
348 348
        execute_in_page('returnval(install_view.install_but);').click()
349 349

  
......
355 355
            fetch = () => {throw "some error";};
356 356
            returnval(install_view.show(...arguments));
357 357
            ''',
358
            'https://hydril.la/', 'mapping', 'mapping_b')
358
            'https://hydril.la/', 'mapping', 'mapping-b')
359 359

  
360 360
        execute_in_page('returnval(install_view.install_but);').click()
361 361

  
......
367 367
            fetch = () => Promise.resolve({ok: false, status: 400});
368 368
            returnval(install_view.show(...arguments));
369 369
            ''',
370
            'https://hydril.la/', 'mapping', 'mapping_b')
370
            'https://hydril.la/', 'mapping', 'mapping-b')
371 371

  
372 372
        execute_in_page('returnval(install_view.install_but);').click()
373 373

  
......
379 379
            fetch = () => Promise.resolve({ok: true, status: 200, text: err});
380 380
            returnval(install_view.show(...arguments));
381 381
            ''',
382
            'https://hydril.la/', 'mapping', 'mapping_b')
382
            'https://hydril.la/', 'mapping', 'mapping-b')
383 383

  
384 384
        execute_in_page('returnval(install_view.install_but);').click()
385 385

  
......
396 396
            }
397 397
            returnval(install_view.show(...arguments));
398 398
            ''',
399
            'https://hydril.la/', 'mapping', 'mapping_b')
399
            'https://hydril.la/', 'mapping', 'mapping-b')
400 400

  
401 401
        execute_in_page('returnval(install_view.install_but);').click()
402 402

  
......
413 413
            haketilodb.save_items = () => {throw "some error";};
414 414
            returnval(install_view.show(...arguments));
415 415
            ''',
416
            'https://hydril.la/', 'mapping', 'mapping_b')
416
            'https://hydril.la/', 'mapping', 'mapping-b')
417 417

  
418 418
        execute_in_page('returnval(install_view.install_but);').click()
419 419

  

Also available in: Unified diff