aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_install.py
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-02-16 22:01:38 +0100
committerWojtek Kosior <koszko@koszko.org>2022-02-16 22:01:38 +0100
commitfd9f2fc4783cc606734e61116185c032a63d54a0 (patch)
treeddc162b1df608c3ae51d74f19fbffc92e5cfc3e3 /test/unit/test_install.py
parent7965f1b455144220c137bcb25c4967283a6b7ff3 (diff)
downloadbrowser-extension-fd9f2fc4783cc606734e61116185c032a63d54a0.tar.gz
browser-extension-fd9f2fc4783cc606734e61116185c032a63d54a0.zip
fix out-of-source builds
Diffstat (limited to 'test/unit/test_install.py')
-rw-r--r--test/unit/test_install.py423
1 files changed, 0 insertions, 423 deletions
diff --git a/test/unit/test_install.py b/test/unit/test_install.py
deleted file mode 100644
index f4bc483..0000000
--- a/test/unit/test_install.py
+++ /dev/null
@@ -1,423 +0,0 @@
-# SPDX-License-Identifier: CC0-1.0
-
-"""
-Haketilo unit tests - item installation dialog
-"""
-
-# This file is part of Haketilo
-#
-# Copyright (C) 2022 Wojtek Kosior <koszko@koszko.org>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the CC0 1.0 Universal License as published by
-# the Creative Commons Corporation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# CC0 1.0 Universal License for more details.
-
-import pytest
-import json
-from selenium.webdriver.support.ui import WebDriverWait
-
-from ..extension_crafting import ExtraHTML
-from ..script_loader import load_script
-from .utils import *
-
-def setup_view(driver, execute_in_page):
- mock_cacher(execute_in_page)
-
- execute_in_page(load_script('html/install.js'))
- container_ids, containers_objects = execute_in_page(
- '''
- const cb_calls = [];
- const install_view = new InstallView(0,
- () => cb_calls.push("show"),
- () => cb_calls.push("hide"));
- document.body.append(install_view.main_div);
- const ets = () => install_view.item_entries;
- const shw = slice => [cb_calls.slice(slice || 0), install_view.shown];
- returnval([container_ids, container_ids.map(cid => install_view[cid])]);
- ''')
-
- containers = dict(zip(container_ids, containers_objects))
-
- def assert_container_displayed(container_id):
- for cid, cobj in zip(container_ids, containers_objects):
- assert (cid == container_id) == cobj.is_displayed()
-
- return containers, assert_container_displayed
-
-install_ext_data = {
- 'background_script': broker_js,
- 'extra_html': ExtraHTML('html/install.html', {}),
- 'navigate_to': 'html/install.html'
-}
-
-@pytest.mark.ext_data(install_ext_data)
-@pytest.mark.usefixtures('webextension')
-@pytest.mark.parametrize('complex_variant', [False, True])
-def test_install_normal_usage(driver, execute_in_page, complex_variant):
- """
- Test of the normal package installation procedure with one mapping and,
- depending on parameter, one or many resources.
- """
- containers, assert_container_displayed = setup_view(driver, execute_in_page)
-
- assert execute_in_page('returnval(shw());') == [[], False]
-
- if complex_variant:
- # The resource/mapping others depend on.
- root_id = 'abcd-defg-ghij'
- root_resource_id = f'resource_{root_id}'
- root_mapping_id = f'mapping_{root_id}'
- # Those ids are used to check the alphabetical ordering.
- resource_ids = [f'resource_{letters}' for letters in (
- 'a', 'abcd', root_id, 'b', 'c',
- 'd', 'defg', 'e', 'f',
- 'g', 'ghij', 'h', 'i', 'j'
- )]
- files_count = 9
- else:
- root_resource_id = f'resource_a'
- root_mapping_id = f'mapping_a'
- resource_ids = [root_resource_id]
- files_count = 0
-
- # Preview the installation of a resource, show resource's details, close
- # the details and cancel installation.
- execute_in_page('returnval(install_view.show(...arguments));',
- 'https://hydril.la/', 'resource', root_resource_id)
-
- assert execute_in_page('returnval(shw());') == [['show'], True]
- assert f'{root_resource_id}-2021.11.11-1'\
- in containers['install_preview'].text
- assert_container_displayed('install_preview')
-
- entries = execute_in_page('returnval(ets().map(e => e.main_li.innerText));')
- assert len(entries) == len(resource_ids)
- # Verify alphabetical ordering.
- assert all([id in text for id, text in zip(resource_ids, entries)])
-
- assert not execute_in_page('returnval(ets()[0].old_ver);').is_displayed()
- execute_in_page('returnval(ets()[0].details_but);').click()
- assert 'resource_a' in containers['resource_preview_container'].text
- assert_container_displayed('resource_preview_container')
-
- execute_in_page('returnval(install_view.resource_back_but);').click()
- assert_container_displayed('install_preview')
-
- assert execute_in_page('returnval(shw());') == [['show'], True]
- execute_in_page('returnval(install_view.cancel_but);').click()
- assert execute_in_page('returnval(shw());') == [['show', 'hide'], False]
-
- # Preview the installation of a mapping and a resource, show mapping's
- # details, close the details and commit the installation.
- execute_in_page('returnval(install_view.show(...arguments));',
- 'https://hydril.la/', 'mapping',
- root_mapping_id, [2022, 5, 10])
-
- assert execute_in_page('returnval(shw(2));') == [['show'], True]
- assert_container_displayed('install_preview')
-
- entries = execute_in_page('returnval(ets().map(e => e.main_li.innerText));')
- assert len(entries) == len(resource_ids) + 1
- assert f'{root_mapping_id}-2022.5.10' in entries[0]
- # Verify alphabetical ordering.
- assert all([id in text for id, text in zip(resource_ids, entries[1:])])
-
- assert not execute_in_page('returnval(ets()[0].old_ver);').is_displayed()
- execute_in_page('returnval(ets()[0].details_but);').click()
- assert root_mapping_id in containers['mapping_preview_container'].text
- assert_container_displayed('mapping_preview_container')
-
- execute_in_page('returnval(install_view.mapping_back_but);').click()
- assert_container_displayed('install_preview')
-
- execute_in_page('returnval(install_view.install_but);').click()
- installed = lambda d: 'ly installed!' in containers['dialog_container'].text
- WebDriverWait(driver, 10).until(installed)
-
- assert execute_in_page('returnval(shw(2));') == [['show'], True]
- execute_in_page('returnval(install_view.dialog_ctx.ok_but);').click()
- assert execute_in_page('returnval(shw(2));') == [['show', 'hide'], False]
-
- # Verify the install
- db_contents = get_db_contents(execute_in_page)
- for item_type, ids in \
- [('mapping', {root_mapping_id}), ('resource', set(resource_ids))]:
- assert set([it['identifier'] for it in db_contents[item_type]]) == ids
-
- assert all([len(db_contents[store]) == files_count
- for store in ('file', 'file_uses')])
-
- # Update the installed mapping to a newer version.
- execute_in_page('returnval(install_view.show(...arguments));',
- 'https://hydril.la/', 'mapping', root_mapping_id)
- assert execute_in_page('returnval(shw(4));') == [['show'], True]
- # resources are already in the newest versions, hence they should not appear
- # in the install preview list.
- assert execute_in_page('returnval(ets().length);') == 1
- # Mapping's version update information should be displayed.
- assert execute_in_page('returnval(ets()[0].old_ver);').is_displayed()
- execute_in_page('returnval(install_view.install_but);').click()
-
- WebDriverWait(driver, 10).until(installed)
-
- assert execute_in_page('returnval(shw(4));') == [['show'], True]
- execute_in_page('returnval(install_view.dialog_ctx.ok_but);').click()
- assert execute_in_page('returnval(shw(4));') == [['show', 'hide'], False]
-
- # Verify the newer version install.
- old_db_contents, db_contents = db_contents, get_db_contents(execute_in_page)
- old_db_contents['mapping'][0]['version'][-1] += 1
- assert db_contents['mapping'] == old_db_contents['mapping']
-
- # All items are up to date - verify dialog is instead shown in this case.
- execute_in_page('install_view.show(...arguments);',
- 'https://hydril.la/', 'mapping', root_mapping_id)
-
- fetched = lambda d: 'Fetching ' not in containers['dialog_container'].text
- WebDriverWait(driver, 10).until(fetched)
-
- assert 'Nothing to do - packages already installed.' \
- in containers['dialog_container'].text
- assert_container_displayed('dialog_container')
-
- assert execute_in_page('returnval(shw(6));') == [['show'], True]
- execute_in_page('returnval(install_view.dialog_ctx.ok_but);').click()
- assert execute_in_page('returnval(shw(6));') == [['show', 'hide'], False]
-
-@pytest.mark.ext_data(install_ext_data)
-@pytest.mark.usefixtures('webextension')
-@pytest.mark.parametrize('message', [
- 'fetching_data',
- 'failure_to_communicate_sendmessage',
- 'HTTP_code_item',
- 'invalid_JSON',
- 'newer_API_version',
- 'invalid_response_format',
- 'indexeddb_error_item',
- 'installing',
- 'indexeddb_error_file_uses',
- 'failure_to_communicate_fetch',
- 'HTTP_code_file',
- 'not_valid_text',
- 'sha256_mismatch',
- 'indexeddb_error_write'
-])
-def test_install_dialogs(driver, execute_in_page, message):
- """
- Test of various error and loading messages used in install view.
- """
- containers, assert_container_displayed = setup_view(driver, execute_in_page)
-
- def dlg_buts():
- return execute_in_page(
- '''{
- const dlg = install_view.dialog_ctx;
- const ids = ['ask_buts', 'conf_buts'];
- returnval(ids.filter(id => !dlg[id].classList.contains("hide")));
- }''')
-
- def dialog_txt():
- return execute_in_page(
- 'returnval(install_view.dialog_ctx.msg.textContent);'
- )
-
- def assert_dlg(awaited_buttons, expected_msg, hides_install_view=True,
- button_to_click='ok_but'):
- WebDriverWait(driver, 10).until(lambda d: dlg_buts() == awaited_buttons)
-
- assert expected_msg == dialog_txt()
-
- execute_in_page(
- f'returnval(install_view.dialog_ctx.{button_to_click});'
- ).click()
-
- if hides_install_view:
- assert execute_in_page('returnval(shw());') == \
- [['show', 'hide'], False]
-
- if message == 'fetching_data':
- execute_in_page(
- '''
- browser.tabs.sendMessage = () => new Promise(cb => {});
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_a')
-
- assert dlg_buts() == []
- assert dialog_txt() == 'Fetching data from repository...'
- elif message == 'failure_to_communicate_sendmessage':
- execute_in_page(
- '''
- browser.tabs.sendMessage = () => Promise.resolve({error: "sth"});
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_a')
-
- assert_dlg(['conf_buts'], 'Failure to communicate with repository :(')
- elif message == 'HTTP_code_item':
- execute_in_page(
- '''
- const response = {ok: false, status: 404};
- browser.tabs.sendMessage = () => Promise.resolve(response);
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_a')
-
- assert_dlg(['conf_buts'], 'Repository sent HTTP code 404 :(')
- elif message == 'invalid_JSON':
- execute_in_page(
- '''
- const response = {ok: true, status: 200, error_json: "sth"};
- browser.tabs.sendMessage = () => Promise.resolve(response);
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_a')
-
- assert_dlg(['conf_buts'], "Repository's response is not valid JSON :(")
- elif message == 'newer_API_version':
- execute_in_page(
- '''
- const response = {
- ok: true,
- status: 200,
- json: {$schema: "https://hydrilla.koszko.org/schemas/api_mapping_description-2.1.schema.json"}
- };
- browser.tabs.sendMessage = () => Promise.resolve(response);
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'somemapping', [2, 1])
-
- assert_dlg(['conf_buts'],
- 'Mapping somemapping-2.1 was served using unsupported Hydrilla API version. You might need to update Haketilo.')
- elif message == 'invalid_response_format':
- execute_in_page(
- '''
- const response = {
- ok: true,
- status: 200,
- /* $schema is not a string as it should be. */
- json: {$schema: null}
- };
- browser.tabs.sendMessage = () => Promise.resolve(response);
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'resource', 'someresource')
-
- assert_dlg(['conf_buts'],
- 'Resource someresource was served using a nonconforming response format.')
- elif message == 'indexeddb_error_item':
- execute_in_page(
- '''
- haketilodb.idb_get = () => {throw "some error";};
- install_view.show(...arguments);
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_a')
-
- assert_dlg(['conf_buts'],
- "Error accessing Haketilo's internal database :(")
- elif message == 'installing':
- execute_in_page(
- '''
- haketilodb.save_items = () => new Promise(() => {});
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert dlg_buts() == []
- assert dialog_txt() == 'Installing...'
- elif message == 'indexeddb_error_file_uses':
- execute_in_page(
- '''
- const old_idb_get = haketilodb.idb_get;
- haketilodb.idb_get = function(transaction, store_name, identifier) {
- if (store_name === "file_uses")
- throw "some error";
- return old_idb_get(...arguments);
- }
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert_dlg(['conf_buts'],
- "Error accessing Haketilo's internal database :(")
- elif message == 'failure_to_communicate_fetch':
- execute_in_page(
- '''
- fetch = () => {throw "some error";};
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert_dlg(['conf_buts'],
- 'Failure to communicate with repository :(')
- elif message == 'HTTP_code_file':
- execute_in_page(
- '''
- fetch = () => Promise.resolve({ok: false, status: 400});
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert_dlg(['conf_buts'], 'Repository sent HTTP code 400 :(')
- elif message == 'not_valid_text':
- execute_in_page(
- '''
- const err = () => {throw "some error";};
- fetch = () => Promise.resolve({ok: true, status: 200, text: err});
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert_dlg(['conf_buts'], "Repository's response is not valid text :(")
- elif message == 'sha256_mismatch':
- execute_in_page(
- '''
- let old_fetch = fetch, url_used;
- fetch = async function(url) {
- url_used = url;
- const response = await old_fetch(...arguments);
- const text = () => response.text().then(t => t + ":d");
- return {ok: response.ok, status: response.status, text};
- }
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- get_url_used = lambda d: execute_in_page('returnval(url_used);')
- url_used = WebDriverWait(driver, 10).until(get_url_used)
- print ((url_used,))
-
- assert dlg_buts() == ['conf_buts']
- assert dialog_txt() == \
- f'{url_used} served a file with different SHA256 cryptographic sum :('
- elif message == 'indexeddb_error_write':
- execute_in_page(
- '''
- haketilodb.save_items = () => {throw "some error";};
- returnval(install_view.show(...arguments));
- ''',
- 'https://hydril.la/', 'mapping', 'mapping_b')
-
- execute_in_page('returnval(install_view.install_but);').click()
-
- assert_dlg(['conf_buts'],
- "Error writing to Haketilo's internal database :(")
- else:
- raise Exception('made a typo in test function params?')