/* 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/. */

/*
 * TEST DESCRIPTION:
 *
 * Tests patch to Bug 412132:
 * https://bugzilla.mozilla.org/show_bug.cgi?id=412132
 */

const TEST_URL0 = "http://example.com/";
const TEST_URL1 = "http://example.com/1";
const TEST_URL2 = "http://example.com/2";

add_task(async function changeuri_unvisited_bookmark() {
  info(
    "After changing URI of bookmark, frecency of bookmark's " +
      "original URI should be zero if original URI is unvisited and " +
      "no longer bookmarked."
  );
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.unfiledGuid,
    title: "bookmark title",
    url: TEST_URL1,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  Assert.notEqual(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL1,
    }),
    0,
    "Bookmarked => frecency of URI should be != 0"
  );

  await PlacesUtils.bookmarks.update({
    guid: bookmark.guid,
    url: TEST_URL2,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  Assert.equal(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL1,
    }),
    0,
    "Unvisited URI no longer bookmarked => frecency should = 0"
  );

  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
});

add_task(async function changeuri_visited_bookmark() {
  info(
    "After changing URI of bookmark, frecency of bookmark's " +
      "original URI should not be zero if original URI is visited."
  );
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.unfiledGuid,
    title: "bookmark title",
    url: TEST_URL1,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  Assert.notEqual(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL1,
    }),
    0,
    "Bookmarked => frecency of URI should be != 0"
  );

  await PlacesTestUtils.addVisits(TEST_URL1);

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  await PlacesUtils.bookmarks.update({
    guid: bookmark.guid,
    url: TEST_URL2,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  Assert.notEqual(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL1,
    }),
    0,
    "*Visited* URI no longer bookmarked => frecency should != 0"
  );

  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
});

add_task(async function changeuri_bookmark_still_bookmarked() {
  info(
    "After changing URI of bookmark, frecency of bookmark's " +
      "original URI should not be zero if original URI is still " +
      "bookmarked."
  );
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.unfiledGuid,
    title: "bookmark 1 title",
    url: TEST_URL1,
  });

  await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.unfiledGuid,
    title: "bookmark 2 title",
    url: TEST_URL1,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  Assert.notEqual(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL1,
    }),
    0,
    "Bookmarked => frecency of URI should be != 0"
  );

  await PlacesUtils.bookmarks.update({
    guid: bookmark.guid,
    url: TEST_URL2,
  });

  await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();

  info("URI still bookmarked => frecency should != 0");
  Assert.notEqual(
    await PlacesTestUtils.getDatabaseValue("moz_places", "frecency", {
      url: TEST_URL2,
    }),
    0
  );

  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
});

add_task(async function changeuri_nonexistent_bookmark() {
  // Try a bogus guid.
  await Assert.rejects(
    PlacesUtils.bookmarks.update({
      guid: "ABCDEDFGHIJK",
      url: TEST_URL2,
    }),
    /No bookmarks found for the provided GUID/,
    "Changing the URI of a non-existent bookmark should fail."
  );

  // Now add a bookmark, delete it, and check.
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.unfiledGuid,
    title: "bookmark title",
    url: TEST_URL0,
  });

  await PlacesUtils.bookmarks.remove(bookmark.guid);

  await Assert.rejects(
    PlacesUtils.bookmarks.update({
      guid: bookmark.guid,
      url: TEST_URL2,
    }),
    /No bookmarks found for the provided GUID/,
    "Changing the URI of a non-existent bookmark should fail."
  );

  await PlacesUtils.bookmarks.eraseEverything();
  await PlacesUtils.history.clear();
});
