<!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.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<script src="../../../bower_components/moment/min/moment.min.js"></script>
<link rel="import" href="/bower_components/polymer/polymer.html">

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

<test-fixture id="basic">
  <template is="dom-template">
    <gr-checks-item
      check="{{check}}"
      retry-check="[[retryCheck]]">
    </gr-checks-item>
  </template>
</test-fixture>

<script>
  suite('gr-checks-item tests', () => {
    let element;
    let sandbox;
    let retryCheckSpy;

    setup(done => {
      sandbox = sinon.sandbox.create();
      retryCheckSpy = sinon.stub();
      retryCheckSpy.returns(Promise.resolve());

      element = fixture('basic', {
        retryCheck: retryCheckSpy,
        check: {
          checkId: 'test-check-id',
          url: 'http://example.com/test-log-url',
          started: '2019-02-06T22:25:19.269Z',
          finished: '2019-02-06T22:25:44.574Z',
        },
      });
      flush(done);
    });

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

    test('renders the status', () => {
      const status = element.$$('td:nth-child(4) > gr-checks-status');
      assert.exists(status);
    });

    test('renders the run time', () => {
      const name = element.$$('td:nth-child(6)');
      assert.equal(name .textContent.trim(), '11:25:19 PM');
    });

    suite('duration', () => {
      test('renders the run duration', () => {
        const name = element.$$('td:nth-child(7)');
        assert.equal(name .textContent.trim(), '25 sec');
      });

      test('renders 0 sec when the start and end time are the same', () => {
        element.check = {
          checkId: 'test-check-id',
          url: 'http://example.com/test-log-url',
          started: '2019-02-06T22:25:19.269Z',
          finished: '2019-02-06T22:25:19.269Z',
        };
        const name = element.$$('td:nth-child(7)');
        assert.equal(name .textContent.trim(), '0 sec');
      });
    });

    test('renders a link to the log', () => {
      const logLink = element.$$('td:nth-child(8) > a');
      assert.equal(logLink.getAttribute('href'),
          'http://example.com/test-log-url');
      assert.equal(logLink.textContent.trim(), 'View log');
    });

    // pausing this check until retry api is available from backend
    // suite('retryCheck', () => {
    //   let retryCheckLink;

    //   setup(() => {
    //     retryCheckLink = element.$$('td:nth-child(7) > gr-button');
    //   });

    //   test('shows a link to the retry button', () => {
    //     assert.equal(retryCheckLink.textContent.trim(), "Re-run");
    //   });

    //   test('clicking on the link calls the retryCheck property', () => {
    //     assert.isFalse(retryCheckSpy.called);
    //     retryCheckLink.click();
    //     assert.isTrue(retryCheckSpy.called);
    //   });
    // });
  });
</script>
