summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js')
-rw-r--r--toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js b/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js
new file mode 100644
index 0000000000..47955a4ea4
--- /dev/null
+++ b/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js
@@ -0,0 +1,117 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* 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/. */
+
+/* Bug 1017502 - Add a foreign_count column to moz_places
+This tests, tests the triggers that adjust the foreign_count when a bookmark is
+added or removed and also the maintenance task to fix wrong counts.
+*/
+
+const T_URI = Services.io.newURI(
+ "https://www.mozilla.org/firefox/nightly/firstrun/"
+);
+
+async function getForeignCountForURL(conn, url) {
+ await PlacesTestUtils.promiseAsyncUpdates();
+ url = url instanceof Ci.nsIURI ? url.spec : url;
+ let rows = await conn.executeCached(
+ `SELECT foreign_count FROM moz_places WHERE url_hash = hash(:t_url)
+ AND url = :t_url`,
+ { t_url: url }
+ );
+ return rows[0].getResultByName("foreign_count");
+}
+
+add_task(async function add_remove_change_bookmark_test() {
+ let conn = await PlacesUtils.promiseDBConnection();
+
+ // Simulate a visit to the url
+ await PlacesTestUtils.addVisits(T_URI);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 0);
+
+ // Add 1st bookmark which should increment foreign_count by 1
+ let bm1 = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ title: "First Run",
+ url: T_URI,
+ });
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 1);
+
+ // Add 2nd bookmark
+ let bm2 = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.menuGuid,
+ title: "First Run",
+ url: T_URI,
+ });
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 2);
+
+ // Remove 2nd bookmark which should decrement foreign_count by 1
+ await PlacesUtils.bookmarks.remove(bm2);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 1);
+
+ // Change first bookmark's URI
+ const URI2 = Services.io.newURI("http://www.mozilla.org");
+ bm1.url = URI2;
+ bm1 = await PlacesUtils.bookmarks.update(bm1);
+ // Check foreign count for original URI
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 0);
+ // Check foreign count for new URI
+ Assert.equal(await getForeignCountForURL(conn, URI2), 1);
+
+ // Cleanup - Remove changed bookmark
+ await PlacesUtils.bookmarks.remove(bm1);
+ Assert.equal(await getForeignCountForURL(conn, URI2), 0);
+});
+
+add_task(async function maintenance_foreign_count_test() {
+ let conn = await PlacesUtils.promiseDBConnection();
+
+ // Simulate a visit to the url
+ await PlacesTestUtils.addVisits(T_URI);
+
+ // Adjust the foreign_count for the added entry to an incorrect value
+ await new Promise(resolve => {
+ let stmt = DBConn().createAsyncStatement(
+ `UPDATE moz_places SET foreign_count = 10 WHERE url_hash = hash(:t_url)
+ AND url = :t_url `
+ );
+ stmt.params.t_url = T_URI.spec;
+ stmt.executeAsync({
+ handleCompletion() {
+ resolve();
+ },
+ });
+ stmt.finalize();
+ });
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 10);
+
+ // Run maintenance
+ const { PlacesDBUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/PlacesDBUtils.sys.mjs"
+ );
+ await PlacesDBUtils.maintenanceOnIdle();
+
+ // Check if the foreign_count has been adjusted to the correct value
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 0);
+});
+
+add_task(async function add_remove_tags_test() {
+ let conn = await PlacesUtils.promiseDBConnection();
+
+ await PlacesTestUtils.addVisits(T_URI);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 0);
+
+ // Check foreign count incremented by 1 for a single tag
+ PlacesUtils.tagging.tagURI(T_URI, ["test tag"]);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 1);
+
+ // Check foreign count is incremented by 2 for two tags
+ PlacesUtils.tagging.tagURI(T_URI, ["one", "two"]);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 3);
+
+ // Check foreign count is set to 0 when all tags are removed
+ PlacesUtils.tagging.untagURI(T_URI, ["test tag", "one", "two"]);
+ Assert.equal(await getForeignCountForURL(conn, T_URI), 0);
+});