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

/**
 * Tests history and bookmark results show up when search service
 * initialization has failed.
 */

const { PromiseTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/PromiseTestUtils.sys.mjs"
);

const searchService = Services.search.wrappedJSObject;

add_setup(async function setup() {
  searchService.willThrowErrorDuringInitInTest = true;

  // When search service fails, we want the promise rejection to be uncaught
  // so we can continue running the test. 2147500037 is the exception message
  // for Cr.NS_ERROR_FAILURE.
  PromiseTestUtils.expectUncaughtRejection(
    /Fake error during search service initialization./
  );

  registerCleanupFunction(async () => {
    searchService.willThrowErrorDuringInitInTest = false;
    await cleanupPlaces();
  });
});

add_task(
  async function test_bookmark_results_are_shown_when_search_service_failed() {
    Assert.equal(
      searchService.isInitialized,
      false,
      "Search Service should not be initialized."
    );

    info("Add a bookmark");
    await PlacesUtils.bookmarks.insert({
      parentGuid: PlacesUtils.bookmarks.unfiledGuid,
      url: "http://cat.com/",
      title: "cat",
    });

    let context = createContext("cat", {
      isPrivate: false,
      allowAutofill: false,
    });

    await check_results({
      context,
      matches: [
        makeVisitResult(context, {
          uri: "http://cat/",
          heuristic: true,
          source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
          fallbackTitle: "http://cat/",
        }),
        makeBookmarkResult(context, {
          title: "cat",
          uri: "http://cat.com/",
          source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
        }),
      ],
    });

    Assert.equal(
      searchService.isInitialized,
      true,
      "Search Service should have finished its attempt to initialize."
    );

    Assert.equal(
      searchService.hasSuccessfullyInitialized,
      false,
      "Search Service should have failed to initialize."
    );
    await cleanupPlaces();
  }
);

add_task(
  async function test_history_results_are_shown_when_search_service_failed() {
    Assert.equal(
      searchService.isInitialized,
      true,
      "Search Service should have finished its attempt to initialize in the previous test."
    );

    Assert.equal(
      searchService.hasSuccessfullyInitialized,
      false,
      "Search Service should have failed to initialize."
    );

    info("visit a url in history");
    await PlacesTestUtils.addVisits({
      uri: "http://example.com/",
      title: "example",
    });

    let context = createContext("example", { isPrivate: false });
    await check_results({
      context,
      matches: [
        makeVisitResult(context, {
          type: 3,
          title: "example",
          uri: "http://example.com/",
          heuristic: true,
          source: UrlbarUtils.RESULT_SOURCE.HISTORY,
        }),
      ],
    });
  }
);
