// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
// META: script=resources.js
'use strict';

contentIndexTest(async (t, index) => {
  // Exposure of the interface and method.
  assert_own_property(window, 'ContentIndex');
  assert_own_property(ContentIndex.prototype, 'add');

  assert_idl_attribute(index, 'add');
  assert_idl_attribute(index, 'delete');
  assert_idl_attribute(index, 'getAll');

}, 'The Content Index API is exposed');

contentIndexTest(async (t, index) => {
  await expectTypeError(
      index.add(createDescription({category: 'fake-category'})));

  await expectTypeError(
      index.add(createDescription({iconUrl: 'file://some-local-file.png'})));
  await expectTypeError(index.add(createDescription({iconUrl: '/non-existent-icon.png'})));
  await expectTypeError(index.add(createDescription({iconUrl: '/images/broken.png'})));

  await expectTypeError(index.add(createDescription({url: 'https://other-domain.com/'})));
  await expectTypeError(index.add(createDescription({url: '/different-scope'})));

  await index.add(createDescription({}));

}, 'index.add parameters are validated.');

contentIndexTest(async (t, index) => {
  const description = createDescription({});

  // Initially there are no descriptions.
  assert_array_equals(await index.getAll(), []);

  await index.add(description);

  const descriptions = await index.getAll();
  assert_equals(descriptions.length, 1);

  assert_object_equals(descriptions[0], description);

}, 'index.getAll returns the same objects provided.');

contentIndexTest(async (t, index) => {
  const description1 = createDescription({title: 'title1'});
  const description2 = createDescription({title: 'title2'});

  await index.add(description1);
  await index.add(description2);

  // There should be one description.
  const descriptions = await index.getAll();
  assert_equals(descriptions.length, 1);

  assert_object_equals(descriptions[0], description2);

}, 'index.add with same ID overwrites existing entry.');

contentIndexTest(async (t, index) => {
  const description1 = createDescription({id: 'id1'});
  const description2 = createDescription({id: 'id2'});

  await index.add(description1);
  await index.add(description2);

  // There should be two descriptions.
  assert_equals((await index.getAll()).length, 2);

  await index.delete('id1');

  // There should be one description.
  const descriptions = await index.getAll();
  assert_equals(descriptions.length, 1);

  assert_object_equals(descriptions[0], description2);

}, 'index.delete removes entry.');

contentIndexTest(async (t, index) => {
  const descriptions = await index.getAll();
  assert_equals(descriptions.length, 0);

  await index.delete('id');

}, 'index.delete works on invalid ID.');
