fune/browser/modules/test/unit/test_LiveBookmarkMigrator.js
Victor Porof af7d1d3b67 Bug 1561435 - Format browser/modules/, a=automatic-formatting
# ignore-this-changeset

Differential Revision: https://phabricator.services.mozilla.com/D36046

--HG--
extra : source : f3c632037a1064c41b1f8b02f477c854b2fb4362
2019-07-05 09:55:19 +02:00

271 lines
8.1 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
/* globals ChromeUtils, Assert, add_task */
"use strict";
// Ensure we initialize places:
do_get_profile();
ChromeUtils.defineModuleGetter(
this,
"PlacesUIUtils",
"resource:///modules/PlacesUIUtils.jsm"
);
// Needed because we rely on the app name for the OPML file name and title.
ChromeUtils.import("resource://testing-common/AppInfo.jsm", this);
updateAppInfo({
name: "LiveBookmarkMigratorTest",
ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}",
version: "1",
platformVersion: "",
});
const { PlacesUtils } = ChromeUtils.import(
"resource://gre/modules/PlacesUtils.jsm"
);
const { LiveBookmarkMigrator } = ChromeUtils.import(
"resource:///modules/LiveBookmarkMigrator.jsm"
);
const kTestData = {
guid: PlacesUtils.bookmarks.toolbarGuid,
children: [
{
type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
title: "BM 1",
url: new URL("https://example.com/1"),
},
{ type: PlacesUtils.bookmarks.TYPE_FOLDER, title: "LB 1" },
{
type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
title: "BM 2",
url: new URL("https://example.com/2"),
},
{
type: PlacesUtils.bookmarks.TYPE_FOLDER,
title: "Regular old folder",
children: [
{ type: PlacesUtils.bookmarks.TYPE_FOLDER, title: "LB child 1" },
{
type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
title: "BM child 1",
url: new URL("https://example.com/1/1"),
},
{ type: PlacesUtils.bookmarks.TYPE_FOLDER, title: "LB child 2" },
{
type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
title: "BM child 2",
url: new URL("https://example.com/1/2"),
},
],
},
{ type: PlacesUtils.bookmarks.TYPE_FOLDER, title: "LB 2" },
{
type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
title: "BM 3",
url: new URL("https://example.com/3"),
},
{ type: PlacesUtils.bookmarks.TYPE_FOLDER, title: "LB 3" },
// The next two will be skipped because we ignore the feeds we used to ship by default:
{
type: PlacesUtils.bookmarks.TYPE_FOLDER,
title: "Default live bookmark 4",
},
{
type: PlacesUtils.bookmarks.TYPE_FOLDER,
title: "Default live bookmark 5",
},
],
};
const kDefaultFeedURLsToTest = [
"http://en-US.fxfeeds.mozilla.com/",
"http://fxfeeds.mozilla.org/",
];
registerCleanupFunction(async () => {
await PlacesUtils.bookmarks.eraseEverything();
});
add_task(async function setup() {
let insertedItems = await PlacesUtils.bookmarks.insertTree(kTestData);
for (let item of insertedItems) {
if (item.title.includes("LB")) {
let id = await PlacesUtils.promiseItemId(item.guid);
let feedID = item.title.replace(/[^0-9]/g, "");
PlacesUtils.annotations.setItemAnnotation(
id,
PlacesUtils.LMANNO_FEEDURI,
"https://example.com/feed/" + feedID,
0,
PlacesUtils.annotations.EXPIRE_NEVER,
PlacesUtils.bookmarks.SOURCES.DEFAULT,
true
);
// For half the feeds, set a site URI as well.
if (parseInt(feedID) % 2) {
PlacesUtils.annotations.setItemAnnotation(
id,
PlacesUtils.LMANNO_SITEURI,
"https://example.com/feedpage/" + feedID,
0,
PlacesUtils.annotations.EXPIRE_NEVER,
PlacesUtils.bookmarks.SOURCES.DEFAULT,
true
);
}
} else if (item.title.includes("Default live bookmark")) {
let id = await PlacesUtils.promiseItemId(item.guid);
PlacesUtils.annotations.setItemAnnotation(
id,
PlacesUtils.LMANNO_FEEDURI,
kDefaultFeedURLsToTest.pop(),
0,
PlacesUtils.annotations.EXPIRE_NEVER,
PlacesUtils.bookmarks.SOURCES.DEFAULT,
true
);
}
}
});
// Test fetching LB with and without siteURIs works. Check ordering is last-positioned-first.
add_task(async function check_fetches_livemarks_correctly() {
let detectedLiveBookmarks = await LiveBookmarkMigrator._fetch();
Assert.equal(detectedLiveBookmarks.length, 7, "Should have 7 live bookmarks");
Assert.notEqual(
detectedLiveBookmarks.filter(lb => lb.siteURI).length,
0,
"Should have more than 0 items with a siteURI"
);
Assert.notEqual(
detectedLiveBookmarks.filter(lb => !lb.siteURI).length,
0,
"Should have more than 0 items without a siteURI"
);
Assert.equal(
detectedLiveBookmarks.filter(lb => lb.feedURI).length,
7,
"All of them should have a feed URI"
);
info(JSON.stringify(detectedLiveBookmarks));
Assert.deepEqual(
detectedLiveBookmarks.map(bm => bm.index),
[8, 7, 6, 4, 2, 1, 0],
"Should have sorted the items correctly."
);
});
// Test that we write sane OPML for some live bookmarks.
add_task(async function check_opml_writing() {
let bsPass = ChromeUtils.import(
"resource:///modules/LiveBookmarkMigrator.jsm",
null
);
let oldFile = bsPass.OS.File;
registerCleanupFunction(() => {
bsPass.OS.File = oldFile;
});
let lastWriteArgs = null;
bsPass.OS.File = {
writeAtomic() {
lastWriteArgs = Array.from(arguments);
},
openUnique() {
return { file: { close() {} }, path: "foopy.opml" };
},
};
let livemarks = [
{
feedURI: new URL("https://example.com/feed"),
siteURI: new URL("https://example.com/"),
title: "My funky feed",
},
{
feedURI: new URL("https://example.com/otherfeed"),
title: "My other feed",
},
];
await LiveBookmarkMigrator._writeOPML(livemarks);
let expectedOPML = `<?xml version="1.0"?>
<opml version="1.0"><head><title>LiveBookmarkMigratorTest Live Bookmarks</title></head><body>
<outline type="rss" title="My funky feed" text="My funky feed" xmlUrl="https://example.com/feed" htmlUrl="https://example.com/"/>
<outline type="rss" title="My other feed" text="My other feed" xmlUrl="https://example.com/otherfeed"/>
</body></opml>`;
Assert.deepEqual(
lastWriteArgs,
["foopy.opml", expectedOPML, { encoding: "utf-8" }],
"Should have tried to write the right thing."
);
});
// Check all the live bookmarks have been removed, and where they have site URIs, replaced:
add_task(async function check_replace_bookmarks_correctly() {
let oldLiveBookmarks = await LiveBookmarkMigrator._fetch();
await LiveBookmarkMigrator._transformBookmarks(oldLiveBookmarks);
// Check all the remaining bookmarks are not live bookmarks anymore:
let newBookmarkState = await PlacesUtils.promiseBookmarksTree(
PlacesUtils.bookmarks.toolbarGuid
);
function checkNotALiveBookmark(bm) {
Assert.ok(
!bm.annos,
"Bookmark " + bm.title + " shouldn't be a live bookmark"
);
}
function iterate(node, fn) {
fn(node);
if (node.children) {
node.children.forEach(fn);
}
}
iterate(newBookmarkState, checkNotALiveBookmark);
Assert.equal(
(await LiveBookmarkMigrator._fetch()).length,
0,
"Migrator should no longer find live bookmarks"
);
info(JSON.stringify(newBookmarkState));
// Check that all the old live bookmarks have been removed, and where appropriate, replaced:
for (let bm of oldLiveBookmarks) {
let replacements = await PlacesUtils.bookmarks.search({ title: bm.title });
let replacement = replacements && replacements[0];
if (!bm.title.includes("Default live bookmark")) {
if (replacement) {
Assert.equal(
bm.title,
replacement.title,
"Found item should have same title"
);
Assert.equal(
bm.siteURI || bm.feedURI,
replacement.url.href,
"Found item should have matching URL"
);
Assert.equal(
bm.index,
replacement.index,
"Found item should have same position"
);
Assert.equal(
bm.parentGuid,
replacement.parentGuid,
"Found item should have same parent"
);
} else {
Assert.ok(
false,
"Oy! No replacement for `" + bm.title + "` but we expected one!"
);
}
} else {
Assert.ok(!replacement, "Shouldn't have kept the default bookmark items");
}
}
});