Revision aec5c9ae
Added by koszko about 1 year ago
common/indexeddb.js | ||
---|---|---|
53 | 53 |
); |
54 | 54 |
|
55 | 55 |
/* Update when changes are made to database schema. Must have 3 elements */ |
56 |
const db_version = [1, 0, 0];
|
|
56 |
const db_version = [1, 0, 1];
|
|
57 | 57 |
|
58 | 58 |
const nr_reductor = ([i, s], num) => [i - 1, s + num * 1024 ** i]; |
59 | 59 |
const version_nr = ver => ver.slice(0, 3).reduce(nr_reductor, [2, 0])[1]; |
60 | 60 |
|
61 |
let db_version_nr = version_nr(db_version); |
|
62 |
|
|
61 | 63 |
const stores = [ |
62 | 64 |
["file", {keyPath: "sha256"}], |
63 | 65 |
["file_uses", {keyPath: "sha256"}], |
... | ... | |
100 | 102 |
} |
101 | 103 |
|
102 | 104 |
async function perform_upgrade(event) { |
105 |
if (event.oldVersion > db_version_nr) |
|
106 |
throw "bad db version: " + event.oldVersion; |
|
107 |
|
|
103 | 108 |
const opened_db = event.target.result; |
109 |
const transaction = event.target.transaction; |
|
104 | 110 |
|
105 |
/* When we move to a new database schema, we will add upgrade logic here. */ |
|
106 |
if (event.oldVersion > 0) |
|
107 |
throw "bad db version: " + event.oldVersion; |
|
111 |
if (event.oldVersion == 0) { |
|
112 |
for (const [store_name, key_mode] of stores) |
|
113 |
opened_db.createObjectStore(store_name, key_mode); |
|
114 |
} |
|
108 | 115 |
|
109 |
let store;
|
|
110 |
for (const [store_name, key_mode] of stores)
|
|
111 |
store = opened_db.createObjectStore(store_name, key_mode);
|
|
116 |
if (event.oldVersion > 0 && event.oldVersion < db_version_nr) {
|
|
117 |
const v1_url = "https://hydrilla.koszko.org/api_v1/";
|
|
118 |
const v1_entry = await idb_get(transaction, "repo", v1_url);
|
|
112 | 119 |
|
113 |
const ctx = make_context(store.transaction, initial_data.file); |
|
114 |
await _save_items(initial_data.resource, initial_data.mapping, |
|
115 |
initial_data.repo || [], ctx); |
|
120 |
if (v1_entry) { |
|
121 |
const v2_url = "https://hydrilla.koszko.org/api_v2/"; |
|
122 |
|
|
123 |
await idb_del(transaction, "repo", v1_url); |
|
124 |
await idb_put(transaction, "repo", {url: v2_url}); |
|
125 |
} |
|
126 |
} |
|
127 |
|
|
128 |
if (event.oldVersion == 0) { |
|
129 |
const ctx = make_context(transaction, initial_data.file); |
|
130 |
await _save_items(initial_data.resource, initial_data.mapping, |
|
131 |
initial_data.repo || [], ctx); |
|
132 |
} else { |
|
133 |
await new Promise( |
|
134 |
(...cbs) => [transaction.onsuccess, transaction.onerror] = cbs |
|
135 |
); |
|
136 |
} |
|
116 | 137 |
|
117 | 138 |
return opened_db; |
118 | 139 |
} |
... | ... | |
125 | 146 |
let resolve, reject; |
126 | 147 |
const waiter = new Promise((...cbs) => [resolve, reject] = cbs); |
127 | 148 |
|
128 |
const request = indexedDB.open("haketilo", version_nr(db_version));
|
|
149 |
const request = indexedDB.open("haketilo", db_version_nr);
|
|
129 | 150 |
request.onsuccess = ev => resolve(ev.target.result); |
130 | 151 |
request.onerror = ev => reject("db error: " + ev.target.errorCode); |
131 | 152 |
request.onupgradeneeded = ev => perform_upgrade(ev).then(resolve, reject); |
default_settings.json | ||
---|---|---|
74 | 74 |
"f1d9dc9f2f4edaaebd9167eb8b79a6da6434313df47921aa4ea8ae278f7739e3": "/**\n * Haketilo demo script.\n *\n * Copyright (C) 2021 Wojtek Kosior\n * Available under the terms of Creative Commons Zero\n * <https://creativecommons.org/publicdomain/zero/1.0/legalcode>\n */\n\n{\n const banner = document.createElement(\"h2\");\n \n banner.textContent = \"Hoooray! Haketilo works :D\";\n \n banner.setAttribute(\"style\", `\\\n margin: 1em; \\\n border-radius: 1em 0px; \\\n background-color: #474; \\\n padding: 10px 20px; \\\n color: #eee; \\\n box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19); \\\n display: inline-block;\\\n `);\n \n document.body.prepend(banner);\n}\n" |
75 | 75 |
} |
76 | 76 |
}, |
77 |
"repo": ["https://hydrilla.koszko.org/api_v1/"]
|
|
77 |
"repo": ["https://hydrilla.koszko.org/api_v2/"]
|
|
78 | 78 |
} |
test/haketilo_test/test_integration.py | ||
---|---|---|
48 | 48 |
|
49 | 49 |
driver.find_element_by_id('repos_head').click() |
50 | 50 |
lst = driver.find_element_by_css_selector('.active_tab .text_entries') |
51 |
assert 'https://hydrilla.koszko.org/api_v1' in lst.text
|
|
51 |
assert 'https://hydrilla.koszko.org/api_v2' in lst.text
|
|
52 | 52 |
|
53 | 53 |
# TODO: do some more tests, including popup interaction and repository |
54 | 54 |
# querying |
test/haketilo_test/unit/test_indexeddb.py | ||
---|---|---|
50 | 50 |
'identifier': 'helloapple' |
51 | 51 |
} |
52 | 52 |
|
53 |
@pytest.mark.get_page('https://gotmyowndoma.in') |
|
54 |
def test_haketilodb_update_1_0_1(driver, execute_in_page): |
|
55 |
""" |
|
56 |
indexeddb.js modifies data when updating to database version 1.0.1. Verify |
|
57 |
the update procedure works properly. |
|
58 |
""" |
|
59 |
execute_in_page(load_script('common/indexeddb.js')) |
|
60 |
execute_in_page('db_version_nr = version_nr([1, 0, 0]);') |
|
61 |
mock_broadcast(execute_in_page) |
|
62 |
|
|
63 |
# Start with no database. |
|
64 |
clear_indexeddb(execute_in_page) |
|
65 |
|
|
66 |
v1_url = 'https://hydrilla.koszko.org/api_v1/' |
|
67 |
v2_url = 'https://hydrilla.koszko.org/api_v2/' |
|
68 |
urls_v1 = {'https://sample.url/abc/', v1_url} |
|
69 |
urls_v2 = {'https://sample.url/abc/', v2_url} |
|
70 |
|
|
71 |
for url in urls_v1: |
|
72 |
execute_in_page('returnval(set_repo(arguments[0]));', url) |
|
73 |
|
|
74 |
assert urls_v1 == set(execute_in_page('returnval(get_repos());')) |
|
75 |
|
|
76 |
# Verify that url gets updated to v2 upon database update. |
|
77 |
driver.get(driver.execute_script('return window.location.href;')) |
|
78 |
execute_in_page(load_script('common/indexeddb.js')) |
|
79 |
mock_broadcast(execute_in_page) |
|
80 |
|
|
81 |
database_contents = get_db_contents(execute_in_page) |
|
82 |
|
|
83 |
assert set(execute_in_page('returnval(get_repos());')) == urls_v2 |
|
84 |
|
|
85 |
# Verify that url does not get updated when there is no database update. |
|
86 |
execute_in_page('returnval(del_repo(arguments[0]));', v2_url) |
|
87 |
execute_in_page('returnval(set_repo(arguments[0]));', v1_url) |
|
88 |
|
|
89 |
driver.get(driver.execute_script('return window.location.href;')) |
|
90 |
execute_in_page(load_script('common/indexeddb.js')) |
|
91 |
mock_broadcast(execute_in_page) |
|
92 |
|
|
93 |
database_contents = get_db_contents(execute_in_page) |
|
94 |
|
|
95 |
assert set(execute_in_page('returnval(get_repos());')) == urls_v1 |
|
96 |
|
|
53 | 97 |
@pytest.mark.get_page('https://gotmyowndoma.in') |
54 | 98 |
def test_haketilodb_item_modifications(driver, execute_in_page): |
55 | 99 |
""" |
Also available in: Unified diff
automatically change repo url to point to api v2 endpoint