/**
 * @license
 * Copyright 2022 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../test/common-test-setup';
import './plugins-model';
import {ChecksApiConfig, ChecksProvider, ResponseCode} from '../../api/checks';
import {ChecksPlugin, ChecksUpdate, PluginsModel} from './plugins-model';
import {createRun, createRunResult} from '../../test/test-data-generators';
import {assert} from '@open-wc/testing';

const PLUGIN_NAME = 'test-plugin';

const CONFIG: ChecksApiConfig = {
  fetchPollingIntervalSeconds: 1000,
};

function createProvider(): ChecksProvider {
  return {
    fetch: () =>
      Promise.resolve({
        responseCode: ResponseCode.OK,
        runs: [],
      }),
  };
}

suite('plugins-model tests', () => {
  let model: PluginsModel;
  let checksPlugins: ChecksPlugin[] = [];
  const register = function () {
    model.checksRegister({
      pluginName: PLUGIN_NAME,
      provider: createProvider(),
      config: CONFIG,
    });
  };

  setup(() => {
    model = new PluginsModel();
    model.state$.subscribe(s => {
      checksPlugins = s.checksPlugins;
    });
  });

  teardown(() => {
    model.finalize();
  });

  test('checksRegister', async () => {
    assert.isFalse(checksPlugins.some(p => p.pluginName === PLUGIN_NAME));

    register();

    assert.isTrue(checksPlugins.some(p => p.pluginName === PLUGIN_NAME));
  });

  test('checksAnnounce', async () => {
    let announcement: ChecksPlugin | undefined;
    model.checksAnnounce$.subscribe(a => (announcement = a));
    assert.isUndefined(announcement?.pluginName);

    register();
    model.checksAnnounce(PLUGIN_NAME);

    assert.equal(announcement?.pluginName, PLUGIN_NAME);
  });

  test('checksUpdate', async () => {
    let update: ChecksUpdate | undefined;
    model.checksUpdate$.subscribe(u => (update = u));
    assert.isUndefined(update?.pluginName);

    register();
    model.checksUpdate({
      pluginName: PLUGIN_NAME,
      run: createRun(),
      result: createRunResult(),
    });

    assert.equal(update?.pluginName, PLUGIN_NAME);
  });
});
