/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

// Tests that Sync can correctly handle a legacy microsummary record
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://gre/modules/PlacesUtils.jsm");

Cu.import("resource://gre/modules/Log.jsm");
Cu.import("resource://services-sync/engines.js");
Cu.import("resource://services-sync/engines/bookmarks.js");
Cu.import("resource://services-sync/record.js");
Cu.import("resource://services-sync/service.js");
Cu.import("resource://services-sync/util.js");

const GENERATORURI_ANNO = "microsummary/generatorURI";
const STATICTITLE_ANNO = "bookmarks/staticTitle";

const TEST_URL = "http://micsum.mozilla.org/";
const TEST_TITLE = "A microsummarized bookmark"
const GENERATOR_URL = "http://generate.micsum/"
const STATIC_TITLE = "Static title"

function newMicrosummary(url, title) {
  let id = PlacesUtils.bookmarks.insertBookmark(
    PlacesUtils.unfiledBookmarksFolderId, NetUtil.newURI(url),
    PlacesUtils.bookmarks.DEFAULT_INDEX, title
  );
  PlacesUtils.annotations.setItemAnnotation(id, GENERATORURI_ANNO,
                                            GENERATOR_URL, 0,
                                            PlacesUtils.annotations.EXPIRE_NEVER);
  PlacesUtils.annotations.setItemAnnotation(id, STATICTITLE_ANNO,
                                            "Static title", 0,
                                            PlacesUtils.annotations.EXPIRE_NEVER);
  return id;
}

function run_test() {

  Service.engineManager.register(BookmarksEngine);
  let engine = Service.engineManager.get("bookmarks");
  let store = engine._store;

  // Clean up.
  store.wipe();

  initTestLogging("Trace");
  Log.repository.getLogger("Sync.Engine.Bookmarks").level = Log.Level.Trace;

  _("Create a microsummarized bookmark.");
  let id = newMicrosummary(TEST_URL, TEST_TITLE);
  let guid = store.GUIDForId(id);
  _("GUID: " + guid);
  do_check_true(!!guid);

  _("Create record object and verify that it's sane.");
  let record = store.createRecord(guid);
  do_check_true(record instanceof Bookmark);
  do_check_eq(record.bmkUri, TEST_URL);

  _("Make sure the new record does not carry the microsummaries annotations.");
  do_check_false("staticTitle" in record);
  do_check_false("generatorUri" in record);

  _("Remove the bookmark from Places.");
  PlacesUtils.bookmarks.removeItem(id);

  _("Convert record to the old microsummaries one.");
  record.staticTitle = STATIC_TITLE;
  record.generatorUri = GENERATOR_URL;
  record.type = "microsummary";

  _("Apply the modified record as incoming data.");
  store.applyIncoming(record);

  _("Verify it has been created correctly as a simple Bookmark.");
  id = store.idForGUID(record.id);
  do_check_eq(store.GUIDForId(id), record.id);
  do_check_eq(PlacesUtils.bookmarks.getItemType(id),
              PlacesUtils.bookmarks.TYPE_BOOKMARK);
  do_check_eq(PlacesUtils.bookmarks.getBookmarkURI(id).spec, TEST_URL);
  do_check_eq(PlacesUtils.bookmarks.getItemTitle(id), TEST_TITLE);
  do_check_eq(PlacesUtils.bookmarks.getFolderIdForItem(id),
              PlacesUtils.unfiledBookmarksFolderId);
  do_check_eq(PlacesUtils.bookmarks.getKeywordForBookmark(id), null);

  do_check_throws(
    () => PlacesUtils.annotations.getItemAnnotation(id, GENERATORURI_ANNO),
    Cr.NS_ERROR_NOT_AVAILABLE
  );

  do_check_throws(
    () => PlacesUtils.annotations.getItemAnnotation(id, STATICTITLE_ANNO),
    Cr.NS_ERROR_NOT_AVAILABLE
  );

  // Clean up.
  store.wipe();
}
