/**
 * @license
 * Copyright 2017 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-js-api-interface';
import {GrPluginRestApi} from './gr-plugin-rest-api';
import {
  assertFails,
  makePrefixedJSON,
  stubRestApi,
} from '../../../test/test-utils';
import {assert} from '@open-wc/testing';
import {PluginApi} from '../../../api/plugin';
import {
  createAccountDetailWithId,
  createServerInfo,
} from '../../../test/test-data-generators';
import {HttpMethod} from '../../../api/rest-api';
import {getAppContext} from '../../../services/app-context';

suite('gr-plugin-rest-api tests', () => {
  let instance: GrPluginRestApi;
  let sendStub: sinon.SinonStub;

  setup(() => {
    stubRestApi('getAccount').resolves(createAccountDetailWithId());
    sendStub = stubRestApi('send').resolves({...new Response(), status: 200});
    let pluginApi: PluginApi;
    window.Gerrit.install(
      p => {
        pluginApi = p;
      },
      '0.1',
      'http://test.com/plugins/testplugin/static/test.js'
    );
    instance = new GrPluginRestApi(
      getAppContext().restApiService,
      getAppContext().reportingService,
      pluginApi!
    );
  });

  test('fetch', async () => {
    const payload = {foo: 'foo'};
    const r = await instance.fetch(HttpMethod.POST, '/url', payload);
    assert.isTrue(sendStub.calledWith(HttpMethod.POST, '/url', payload));
    assert.equal(r.status, 200);
  });

  test('send', async () => {
    const payload = {foo: 'foo'};
    const response = {bar: 'bar'};
    sendStub.resolves(new Response(makePrefixedJSON(response)));
    const r = await instance.send(HttpMethod.POST, '/url', payload);
    assert.isTrue(sendStub.calledWith(HttpMethod.POST, '/url', payload));
    assert.deepEqual(r, response);
  });

  test('get', async () => {
    const response = {foo: 'foo'};
    sendStub.resolves(new Response(makePrefixedJSON(response)));
    const r = await instance.get('/url');
    assert.isTrue(sendStub.calledWith('GET', '/url'));
    assert.deepEqual(r, response);
  });

  test('post', async () => {
    const payload = {foo: 'foo'};
    const response = {bar: 'bar'};
    sendStub.resolves(new Response(makePrefixedJSON(response)));
    const r = await instance.post('/url', payload);
    assert.isTrue(sendStub.calledWith('POST', '/url', payload));
    assert.deepEqual(r, response);
  });

  test('put', async () => {
    const payload = {foo: 'foo'};
    const response = {bar: 'bar'};
    sendStub.resolves(new Response(makePrefixedJSON(response)));
    const r = await instance.put('/url', payload);
    assert.isTrue(sendStub.calledWith('PUT', '/url', payload));
    assert.deepEqual(r, response);
  });

  test('delete works', async () => {
    const response = {status: 204};
    sendStub.resolves(response);
    const r = await instance.delete('/url');
    assert.isTrue(sendStub.calledWith('DELETE', '/url'));
    assert.strictEqual(r, response);
  });

  test('delete fails', async () => {
    sendStub.resolves({
      status: 400,
      text() {
        return Promise.resolve('text');
      },
    });
    const error = await assertFails(instance.delete('/url'));
    assert.equal('text', (error as Error).message);
    assert.isTrue(sendStub.calledWith('DELETE', '/url'));
  });

  test('getLoggedIn', async () => {
    const stub = stubRestApi('getLoggedIn').resolves(true);
    const loggedIn = await instance.getLoggedIn();
    assert.isTrue(stub.calledOnce);
    assert.isTrue(loggedIn);
  });

  test('getVersion', async () => {
    const stub = stubRestApi('getVersion').resolves('foo bar');
    const version = await instance.getVersion();
    assert.isTrue(stub.calledOnce);
    assert.equal(version, 'foo bar');
  });

  test('getConfig', async () => {
    const info = createServerInfo();
    const stub = stubRestApi('getConfig').resolves(info);
    const config = await instance.getConfig();
    assert.isTrue(stub.calledOnce);
    assert.equal(config, info);
  });
});
