<!DOCTYPE html>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>

<link rel="import" href="/bower_components/polymer/polymer.html">

<title>gr-checks-item</title>
<link rel="import" href="gr-checks-view.html">

<test-fixture id="basic">
  <template is="dom-template">
    <gr-checks-view
      change="[[change]]"
      revision="[[revision]]"
      get-checks="[[getChecks]]"
      is-configured="[[isConfigured]]"
      plugin="[[plugin]]"
      retry-check="[[retryCheck]]">
    </gr-checks-view>
  </template>
</test-fixture>

<script>
  const CHECK1 = {
    checkId: 'test-check-id',
    logUrl: 'http://example.com/test-log-url',
    startTime: "2019-02-06T22:25:19.269Z",
    finishTime: "2019-02-06T22:25:44.574Z",
    checker_name: "test checker"
  };
const REVISION = {
  "kind": "REWORK",
  "_number": 3,
  "created": "2018-05-15 21:56:13.000000000",
  "uploader": {
    "_account_id": 1000000,
  },
  "ref": "refs/changes/00/1000/1",
  "commit": {
    "parents": [],
    "subject": "added test file",
    "message": "added test file\n\nChange-Id: I8df212a28ae23cc239afd10ee4f506887e03ab70\n",
    "commit": "1c9a1dfd38ea51dc7880f3ddf669100710f0c91b"
  },
};

suite('gr-checks-view tests', () => {
  let element;
  let sandbox;
  let getChecksSpy;
  let getChecksResolve;
  let retryCheckSpy;
  let isConfiguredSpy;
  let isConfiguredResolve;
  let getAccountSpy, getAccountPromise, getAccountResolve;
  let fetchJSONSpy, fetchJSONPromise, fetchJSONResolve;
  let getAccountCapabilitiesSpy, getAccountCapabilitiesPromise,
    getAccountCapabilitiesResolve;

  setup((done) => {
    sandbox = sinon.sandbox.create();

    getChecksSpy = sinon.stub();
    const getChecksPromise = new Promise((resolve, reject) => {
      getChecksResolve = resolve;
    });
    getChecksSpy.returns(getChecksPromise);

    isConfiguredSpy = sinon.stub();
    const isConfiguredPromise = new Promise((resolve, reject) => {
      isConfiguredResolve = resolve;
    });
    isConfiguredSpy.returns(isConfiguredPromise);

    retryCheckSpy = sinon.stub();
    retryCheckSpy.returns(Promise.resolve());

    const plugin = {};
    getAccountSpy = sinon.stub();
    const getAccountPromise = new Promise((resolve, reject) => {
      getAccountResolve = resolve;
    })
    getAccountSpy.returns(getAccountPromise);

    fetchJSONSpy = sinon.stub();
    const fetchJSONPromise = new Promise((resolve, reject) => {
      fetchJSONResolve = resolve;
    })
    fetchJSONSpy.returns(fetchJSONPromise)

    getAccountCapabilitiesSpy = sinon.stub();
    const getAccountCapabilitiesPromise = new Promise((resolve, reject) => {
      getAccountCapabilitiesResolve = resolve;
    })
    getAccountCapabilitiesSpy.returns(getAccountCapabilitiesPromise);

    plugin.restApi = () => ({
      getAccount: getAccountSpy,
      fetchJSON: fetchJSONSpy,
      getAccountCapabilities: getAccountCapabilitiesSpy
    });

    element = fixture('basic', {
      retryCheck: retryCheckSpy,
      getChecks: getChecksSpy,
      isConfigured: isConfiguredSpy,
      change: {
        'project': 'test-repository',
        '_number': 2,
        'revisions': {
          'first-sha': "test-revision",
          'second-sha': REVISION,
        },
      },
      plugin: plugin,
      revision: REVISION,
    });
    flush(done);
  });

  teardown(() => { sandbox.restore(); });

  test('renders loading', () => {
    // Element also contains the hidden gr-overlay hence use includes
    assert(element.textContent.trim().includes('Loading...'));
  });

  test('queries the checks', () => {
    assert.isTrue(getChecksSpy.called);
    assert.isTrue(getChecksSpy.calledWith(2, 3));
  });

  suite('no checks returned', () => {
    setup((done) => {
      getChecksResolve([]);
      flush(done);
    });

    test('it calls to check if the checks are configured', () => {
      assert.isTrue(isConfiguredSpy.called);
      assert.isTrue(isConfiguredSpy.calledWith('test-repository'));
    });

    test('no configure button renders', () => {
      assert(!element.$$('gr-button'));
    })

    suite('not configured', () => {
      setup((done) => {
        isConfiguredResolve(false);
        flush(done);
      });

      test('renders checks not configured', () => {
        const header = element.$$('h2');
        assert.equal(header.textContent.trim(), 'Code review checks not configured');
      });

      suite('create checker capability false', () => {
        setup((done) => {
          getAccountResolve(true);
          getAccountCapabilitiesResolve({'checks-administrateCheckers': false});
          flush(done);
        });
        test('checker button does not render', () => {
          assert(!element.$$('gr-button'));
        });
      });

      suite('create checker capability true', () => {
        setup((done) => {
          getAccountResolve(true);
          getAccountCapabilitiesResolve({'checks-administrateCheckers': true});
          flush(done);
        });
        test('checker button renders', () => {
          assert(element.$$('gr-button'));
        });
      });

    });

    suite('no checks ran', () => {
      setup((done) => {
        isConfiguredResolve(true);
        flush(done);
      });

      test('renders checks not configured', () => {
        const header = element.$$('h2');
        assert.equal(header.textContent.trim(), 'No checks ran for this code review');
      });
    });
  });

  suite('with checks', () => {
    setup(done => {
      getChecksResolve([CHECK1, CHECK1, CHECK1]);
      flush(done);
    });

    test('it calls to check if the checks are configured', () => {
      assert.isFalse(isConfiguredSpy.called);
    });

    test('renders the header', () => {
      const header = element.$$('header > h3');
      assert.equal(header.textContent.trim(), 'Latest checks for Patchset 3');
    });

    test('renders a table of all the checks', () => {
      const tbody = element.$$('table > tbody');
      assert.lengthOf(tbody.querySelectorAll('gr-checks-item'), 3)
    });

    suite('create checker capability false', () => {
        setup((done) => {
          getAccountResolve(true);
          getAccountCapabilitiesResolve({'checks-administrateCheckers': false});
          flush(done);
        });
        test('checker button does not render', () => {
          assert(!element.$$('gr-button'));
        });
      });

      suite('create checker capability true', () => {
        setup((done) => {
          getAccountResolve(true);
          getAccountCapabilitiesResolve({'checks-administrateCheckers': true});
          flush(done);
        });
        test('checker button renders', () => {
          assert(element.$$('gr-button'));
        });
      });

  });
});
</script>
