summaryrefslogtreecommitdiffstats
path: root/storage/test/unit/test_storage_ext_fts5.js
diff options
context:
space:
mode:
Diffstat (limited to 'storage/test/unit/test_storage_ext_fts5.js')
-rw-r--r--storage/test/unit/test_storage_ext_fts5.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/storage/test/unit/test_storage_ext_fts5.js b/storage/test/unit/test_storage_ext_fts5.js
new file mode 100644
index 0000000000..7adf4e8b83
--- /dev/null
+++ b/storage/test/unit/test_storage_ext_fts5.js
@@ -0,0 +1,122 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This file tests support for the fts5 extension.
+
+// Some example statements in this tests are taken from the SQLite FTS5
+// documentation page: https://sqlite.org/fts5.html
+
+add_setup(async function () {
+ cleanup();
+});
+
+add_task(async function test_synchronous() {
+ info("Testing synchronous connection");
+ let conn = getOpenedUnsharedDatabase();
+ Assert.throws(
+ () =>
+ conn.executeSimpleSQL(
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body);"
+ ),
+ /NS_ERROR_FAILURE/,
+ "Should not be able to use FTS5 without loading the extension"
+ );
+
+ await loadFTS5Extension(conn);
+
+ conn.executeSimpleSQL(
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body, tokenize='trigram');"
+ );
+
+ conn.executeSimpleSQL(
+ `INSERT INTO email(sender, title, body) VALUES
+ ('Mark', 'Fox', 'The quick brown fox jumps over the lazy dog.'),
+ ('Marco', 'Cat', 'The quick brown cat jumps over the lazy dog.'),
+ ('James', 'Hamster', 'The quick brown hamster jumps over the lazy dog.')`
+ );
+
+ var stmt = conn.createStatement(
+ `SELECT sender, title, highlight(email, 2, '<', '>')
+ FROM email
+ WHERE email MATCH 'ham'
+ ORDER BY bm25(email)`
+ );
+ Assert.ok(stmt.executeStep());
+ Assert.equal(stmt.getString(0), "James");
+ Assert.equal(stmt.getString(1), "Hamster");
+ Assert.equal(
+ stmt.getString(2),
+ "The quick brown <ham>ster jumps over the lazy dog."
+ );
+ stmt.reset();
+ stmt.finalize();
+
+ cleanup();
+});
+
+add_task(async function test_asynchronous() {
+ info("Testing asynchronous connection");
+ let conn = await openAsyncDatabase(getTestDB());
+
+ await Assert.rejects(
+ executeSimpleSQLAsync(
+ conn,
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body);"
+ ),
+ err => err.message.startsWith("no such module"),
+ "Should not be able to use FTS5 without loading the extension"
+ );
+
+ await loadFTS5Extension(conn);
+
+ await executeSimpleSQLAsync(
+ conn,
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body);"
+ );
+
+ await asyncClose(conn);
+ await IOUtils.remove(getTestDB().path, { ignoreAbsent: true });
+});
+
+add_task(async function test_clone() {
+ info("Testing cloning synchronous connection loads extensions in clone");
+ let conn1 = getOpenedUnsharedDatabase();
+ await loadFTS5Extension(conn1);
+
+ let conn2 = conn1.clone(false);
+ conn2.executeSimpleSQL(
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body);"
+ );
+
+ conn2.close();
+ cleanup();
+});
+
+add_task(async function test_asyncClone() {
+ info("Testing asynchronously cloning connection loads extensions in clone");
+ let conn1 = getOpenedUnsharedDatabase();
+ await loadFTS5Extension(conn1);
+
+ let conn2 = await asyncClone(conn1, false);
+ await executeSimpleSQLAsync(
+ conn2,
+ "CREATE VIRTUAL TABLE email USING fts5(sender, title, body);"
+ );
+
+ await asyncClose(conn2);
+ await asyncClose(conn1);
+ await IOUtils.remove(getTestDB().path, { ignoreAbsent: true });
+});
+
+async function loadFTS5Extension(conn) {
+ await new Promise((resolve, reject) => {
+ conn.loadExtension("fts5", status => {
+ if (Components.isSuccessCode(status)) {
+ resolve();
+ } else {
+ reject(status);
+ }
+ });
+ });
+}