<!DOCTYPE html>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<script src="imports.js"></script>
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">

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

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

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

    setup((done) => {
      sandbox = sinon.sandbox.create();
      const getCheckerPromise = new Promise((resolve, reject) => {
        resolveGetChecker = resolve;
        rejectGetChecker = reject;
      });
      getCheckerSpy = sinon.stub();
      getCheckerSpy.returns(getCheckerPromise);
      retryCheckSpy = sinon.stub();
      retryCheckSpy.returns(Promise.resolve());

      element = fixture('basic', {
        getChecker: getCheckerSpy,
        retryCheck: retryCheckSpy,
        check: {
          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",
        },
      });
      flush(done);
    });

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

    suite('checker name', () => {
      test('calls getChecker', () => {
        assert.isTrue(getCheckerSpy.called);
        assert.isTrue(getCheckerSpy.calledWith('test-check-id'));
      });

      function assertCheckerText(text) {
        const name = element.$$('td:nth-child(1)');
        assert.equal(name.textContent.trim(), text);
      }

      suite('on success', () => {
        setup(done => {
          resolveGetChecker({description: 'test checker name'});
          flush(done);
        });

        test('renders the checker name on success', () => {
          assertCheckerText('test checker name');
        });
      });

      suite('on empty response', () => {
        setup(done => {
          resolveGetChecker();
          flush(done);
        });

        test('renders the id when there is no description', () => {
          assertCheckerText('test-check-id');
        });
      });

      suite('on error', () => {
        setup(done => {
          rejectGetChecker(new Error('broken'));
          flush(done);
        });

        test('renders the id when the call fails', () => {
          assertCheckerText('test-check-id');
        });
      });
    });

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

    test('renders the checking system', () => {
      const checkingSystem = element.$$('td:nth-child(4)');
      assert.equal(checkingSystem .textContent.trim(), "Check System");
    });

    test('renders the run date', () => {
      const name = element.$$('td:nth-child(5)');
      assert.equal(name .textContent.trim(), "2/6/2019");
    });

    suite('duration', () => {
      test('renders the run duration', () => {
        const name = element.$$('td:nth-child(6)');
        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',
          logUrl: 'http://example.com/test-log-url',
          startTime: "2019-02-06T22:25:19.269Z",
          finishTime: "2019-02-06T22:25:19.269Z",
        };
        const name = element.$$('td:nth-child(6)');
        assert.equal(name .textContent.trim(), "0 sec");
      });
    });

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

    suite('retryCheck', () => {
      let retryCheckLink;

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

      test('shows a link to the log url', () => {
        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>
