<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-repo-detail-list</title>

<script src="../../../bower_components/page/page.js"></script>
<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<link rel="import" href="gr-repo-detail-list.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <gr-repo-detail-list></gr-repo-detail-list>
  </template>
</test-fixture>

<script>
  let counter;
  const branchGenerator = () => {
    return {
      ref: `refs/heads/test${++counter}`,
      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
      web_links: [
        {
          name: 'diffusion',
          url: `https://git.example.org/branch/test;refs/heads/test${counter}`,
        },
      ],
    };
  };
  const tagGenerator = () => {
    return {
      ref: `refs/tags/test${++counter}`,
      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
      web_links: [
        {
          name: 'diffusion',
          url: `https://git.example.org/tag/test;refs/tags/test${counter}`,
        },
      ],
      message: 'Annotated tag',
      tagger: {
        name: 'Test User',
        email: 'test.user@gmail.com',
        date: '2017-09-19 14:54:00.000000000',
        tz: 540,
      },
    };
  };

  suite('Branches', () => {
    let element;
    let branches;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
      element.detailType = 'branches';
      counter = 0;
      sandbox.stub(page, 'show');
    });

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

    suite('list of repo branches', () => {
      setup(done => {
        branches = [{
          ref: 'HEAD',
          revision: 'master',
        }].concat(_.times(25, branchGenerator));

        stub('gr-rest-api-interface', {
          getRepoBranches(num, project, offset) {
            return Promise.resolve(branches);
          },
        });

        const params = {
          repo: 'test',
          detail: 'branches',
        };

        element._paramsChanged(params).then(() => { flush(done); });
      });

      test('test for branch in the list', done => {
        flush(() => {
          assert.equal(element._items[2].ref, 'refs/heads/test2');
          done();
        });
      });

      test('test for web links in the branches list', done => {
        flush(() => {
          assert.equal(element._items[2].web_links[0].url,
              'https://git.example.org/branch/test;refs/heads/test2');
          done();
        });
      });

      test('test for refs/heads/ being striped from ref', done => {
        flush(() => {
          assert.equal(element._stripRefs(element._items[2].ref,
              element.detailType), 'test2');
          done();
        });
      });

      test('_shownItems', () => {
        assert.equal(element._shownItems.length, 25);
      });

      test('Edit HEAD button not admin', done => {
        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
        sandbox.stub(element.$.restAPI, 'getRepoAccess').returns(
            Promise.resolve({
              test: {is_owner: false},
            }));
        element._determineIfOwner('test').then(() => {
          assert.equal(element._isOwner, false);
          assert.equal(getComputedStyle(Polymer.dom(element.root)
              .querySelector('.revisionNoEditing')).display, 'inline');
          assert.equal(getComputedStyle(Polymer.dom(element.root)
              .querySelector('.revisionEdit')).display, 'none');
          done();
        });
      });

      test('Edit HEAD button admin', done => {
        const saveBtn = Polymer.dom(element.root).querySelector('.saveBtn');
        const cancelBtn = Polymer.dom(element.root).querySelector('.cancelBtn');
        const editBtn = Polymer.dom(element.root).querySelector('.editBtn');
        const revisionNoEditing = Polymer.dom(element.root)
              .querySelector('.revisionNoEditing');
        const revisionWithEditing = Polymer.dom(element.root)
              .querySelector('.revisionWithEditing');

        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
        sandbox.stub(element.$.restAPI, 'getRepoAccess').returns(
            Promise.resolve({
              test: {is_owner: true},
            }));
        sandbox.stub(element, '_handleSaveRevision');
        element._determineIfOwner('test').then(() => {
          assert.equal(element._isOwner, true);
          // The revision container for non-editing enabled row is not visible.
          assert.equal(getComputedStyle(revisionNoEditing).display, 'none');

          // The revision container for editing enabled row is visible.
          assert.notEqual(getComputedStyle(Polymer.dom(element.root)
              .querySelector('.revisionEdit')).display, 'none');

          // The revision and edit button are visible.
          assert.notEqual(getComputedStyle(revisionWithEditing).display,
              'none');
          assert.notEqual(getComputedStyle(editBtn).display, 'none');

          // The input, cancel, and save buttons are not visible.
          const hiddenElements = Polymer.dom(element.root)
              .querySelectorAll('.canEdit .editItem');

          for (const item of hiddenElements) {
            assert.equal(getComputedStyle(item).display, 'none');
          }

          MockInteractions.tap(editBtn);
          flushAsynchronousOperations();
          // The revision and edit button are not visible.
          assert.equal(getComputedStyle(revisionWithEditing).display, 'none');
          assert.equal(getComputedStyle(editBtn).display, 'none');

          // The input, cancel, and save buttons are not visible.
          for (item of hiddenElements) {
            assert.notEqual(getComputedStyle(item).display, 'none');
          }

          // The revised ref was set correctly
          assert.equal(element._revisedRef, 'master');

          assert.isFalse(saveBtn.disabled);

          // Delete the ref.
          element._revisedRef = '';
          assert.isTrue(saveBtn.disabled);

          // Change the ref to something else
          element._revisedRef = 'newRef';
          element._repo = 'test';
          assert.isFalse(saveBtn.disabled);

          // Save button calls handleSave. since this is stubbed, the edit
          // section remains open.
          MockInteractions.tap(saveBtn);
          assert.isTrue(element._handleSaveRevision.called);

          // When cancel is tapped, the edit secion closes.
          MockInteractions.tap(cancelBtn);
          flushAsynchronousOperations();

          // The revision and edit button are visible.
          assert.notEqual(getComputedStyle(revisionWithEditing).display,
              'none');
          assert.notEqual(getComputedStyle(editBtn).display, 'none');

          // The input, cancel, and save buttons are not visible.
          for (const item of hiddenElements) {
            assert.equal(getComputedStyle(item).display, 'none');
          }
          done();
        });
      });

      test('_handleSaveRevision with invalid rev', done => {
        const event = {model: {set: sandbox.stub()}};
        element._isEditing = true;
        sandbox.stub(element.$.restAPI, 'setRepoHead').returns(
            Promise.resolve({
              status: 400,
            })
        );

        element._setRepoHead('test', 'newRef', event).then(() => {
          assert.isTrue(element._isEditing);
          assert.isFalse(event.model.set.called);
          done();
        });
      });

      test('_handleSaveRevision with valid rev', done => {
        const event = {model: {set: sandbox.stub()}};
        element._isEditing = true;
        sandbox.stub(element.$.restAPI, 'setRepoHead').returns(
            Promise.resolve({
              status: 200,
            })
        );

        element._setRepoHead('test', 'newRef', event).then(() => {
          assert.isFalse(element._isEditing);
          assert.isTrue(event.model.set.called);
          done();
        });
      });

      test('test _computeItemName', () => {
        assert.deepEqual(element._computeItemName('branches'), 'Branch');
        assert.deepEqual(element._computeItemName('tags'), 'Tag');
      });
    });

    suite('list with less then 25 branches', () => {
      setup(done => {
        branches = _.times(25, branchGenerator);

        stub('gr-rest-api-interface', {
          getRepoBranches(num, repo, offset) {
            return Promise.resolve(branches);
          },
        });

        const params = {
          repo: 'test',
          detail: 'branches',
        };

        element._paramsChanged(params).then(() => { flush(done); });
      });

      test('_shownItems', () => {
        assert.equal(element._shownItems.length, 25);
      });
    });

    suite('filter', () => {
      test('_paramsChanged', done => {
        sandbox.stub(element.$.restAPI, 'getRepoBranches', () => {
          return Promise.resolve(branches);
        });
        const params = {
          detail: 'branches',
          repo: 'test',
          filter: 'test',
          offset: 25,
        };
        element._paramsChanged(params).then(() => {
          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[0],
              'test');
          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[1],
              'test');
          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[2],
              25);
          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[3],
              25);
          done();
        });
      });
    });

    suite('404', () => {
      test('fires page-error', done => {
        const response = {status: 404};
        sandbox.stub(element.$.restAPI, 'getRepoBranches',
            (filter, repo, reposBranchesPerPage, opt_offset, errFn) => {
              errFn(response);
            });

        element.addEventListener('page-error', e => {
          assert.deepEqual(e.detail.response, response);
          done();
        });

        const params = {
          detail: 'branches',
          repo: 'test',
          filter: 'test',
          offset: 25,
        };
        element._paramsChanged(params);
      });
    });
  });

  suite('Tags', () => {
    let element;
    let tags;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
      element.detailType = 'tags';
      counter = 0;
      sandbox.stub(page, 'show');
    });

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

    test('_computeMessage', () => {
      let message = 'v2.15-rc1↵-----BEGIN PGP SIGNATURE-----↵Version: GnuPG v' +
      '1↵↵iQIcBAABAgAGBQJZ27O7AAoJEF/XxZqaEoiMy6kQAMoQCpGr3J6JITI4BVWsr7QM↵xy' +
      'EcWH5YPUko5EPTbkABHmaVyFmKGkuIQdn6c+NIbqJOk+5XT4oUyRSo1T569HPJ↵3kyxEJi' +
      'T1ryvp5BIHwdvHx58fjw1+YkiWLZuZq1FFkUYqnWTYCrkv7Fok98pdOmV↵CL1Hgugi5uK8' +
      '/kxf1M7+Nv6piaZ140pwSb1h6QdAjaZVfaBCnoxlG4LRUqHvEYay↵f4QYgFT67auHIGkZ4' +
      'moUcsp2Du/1jSsCWL/CPwjPFGbbckVAjLCMT9yD3NKwpEZF↵pfsiZyHI9dL0M+QjVrM+RD' +
      'HwIIJwra8R0IMkDlQ6MDrFlKNqNBbo588S6UPrm71L↵YuiwWlcrK9ZIybxT6LzbR65Rvez' +
      'DSitQ+xeIfpZE19/X6BCnvlARLE8k/tC2JksI↵lEZi7Lf3FQdIcwwyt98tJkS9HX9v9jbC' +
      '5QXifnoj3Li8tHSLuQ1dJCxHQiis6ojI↵OWUFkm0IHBXVNHA2dqYBdM+pL12mlI3wp6Ica' +
      '4cdEVDwzu+j1xnVSFUa+d+Y2xJF↵7mytuyhHiKG4hm+zbhMv6WD8Q3FoDsJZeLY99l0hYQ' +
      'SnnkMduFVroIs45pAs8gUA↵RvYla8mm9w/543IJAPzzFarPVLSsSyQ7tJl3UBzjKRNH/rX' +
      'W+F22qyWD1zyHPUIR↵C00ItmwlAvveImYKpQAH↵=L+K9↵-----END PGP SIGNATURE---' +
      '--';
      assert.equal(element._computeMessage(message), 'v2.15-rc1↵');
      message = 'v2.15-rc1';
      assert.equal(element._computeMessage(message), 'v2.15-rc1');
    });

    suite('list of repo tags', () => {
      setup(done => {
        tags = _.times(26, tagGenerator);

        stub('gr-rest-api-interface', {
          getRepoTags(num, repo, offset) {
            return Promise.resolve(tags);
          },
        });

        const params = {
          repo: 'test',
          detail: 'tags',
        };

        element._paramsChanged(params).then(() => { flush(done); });
      });

      test('test for tag in the list', done => {
        flush(() => {
          assert.equal(element._items[1].ref, 'refs/tags/test2');
          done();
        });
      });

      test('test for tag message in the list', done => {
        flush(() => {
          assert.equal(element._items[1].message, 'Annotated tag');
          done();
        });
      });

      test('test for tagger in the tag list', done => {
        const tagger = {
          name: 'Test User',
          email: 'test.user@gmail.com',
          date: '2017-09-19 14:54:00.000000000',
          tz: 540,
        };
        flush(() => {
          assert.deepEqual(element._items[1].tagger, tagger);
          done();
        });
      });

      test('test for web links in the tags list', done => {
        flush(() => {
          assert.equal(element._items[1].web_links[0].url,
              'https://git.example.org/tag/test;refs/tags/test2');
          done();
        });
      });

      test('test for refs/tags/ being striped from ref', done => {
        flush(() => {
          assert.equal(element._stripRefs(element._items[1].ref,
              element.detailType), 'test2');
          done();
        });
      });

      test('_shownItems', () => {
        assert.equal(element._shownItems.length, 25);
      });

      test('_computeHideTagger', () => {
        const testObject1 = {
          tagger: 'test',
        };
        assert.equal(element._computeHideTagger(testObject1), '');

        assert.equal(element._computeHideTagger(undefined), 'hide');
      });
    });

    suite('list with less then 25 tags', () => {
      setup(done => {
        tags = _.times(25, tagGenerator);

        stub('gr-rest-api-interface', {
          getRepoTags(num, project, offset) {
            return Promise.resolve(tags);
          },
        });

        const params = {
          repo: 'test',
          detail: 'tags',
        };

        element._paramsChanged(params).then(() => { flush(done); });
      });

      test('_shownItems', () => {
        assert.equal(element._shownItems.length, 25);
      });
    });

    suite('filter', () => {
      test('_paramsChanged', done => {
        sandbox.stub(element.$.restAPI, 'getRepoTags', () => {
          return Promise.resolve(tags);
        });
        const params = {
          repo: 'test',
          detail: 'tags',
          filter: 'test',
          offset: 25,
        };
        element._paramsChanged(params).then(() => {
          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[0],
              'test');
          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[1],
              'test');
          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[2],
              25);
          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[3],
              25);
          done();
        });
      });
    });

    suite('create new', () => {
      test('_handleCreateClicked called when create-click fired', () => {
        sandbox.stub(element, '_handleCreateClicked');
        element.$$('gr-list-view').fire('create-clicked');
        assert.isTrue(element._handleCreateClicked.called);
      });

      test('_handleCreateClicked opens modal', () => {
        const openStub = sandbox.stub(element.$.createOverlay, 'open');
        element._handleCreateClicked();
        assert.isTrue(openStub.called);
      });

      test('_handleCreateItem called when confirm fired', () => {
        sandbox.stub(element, '_handleCreateItem');
        element.$.createDialog.fire('confirm');
        assert.isTrue(element._handleCreateItem.called);
      });

      test('_handleCloseCreate called when cancel fired', () => {
        sandbox.stub(element, '_handleCloseCreate');
        element.$.createDialog.fire('cancel');
        assert.isTrue(element._handleCloseCreate.called);
      });
    });

    suite('404', () => {
      test('fires page-error', done => {
        const response = {status: 404};
        sandbox.stub(element.$.restAPI, 'getRepoTags',
            (filter, repo, reposTagsPerPage, opt_offset, errFn) => {
              errFn(response);
            });

        element.addEventListener('page-error', e => {
          assert.deepEqual(e.detail.response, response);
          done();
        });

        const params = {
          repo: 'test',
          detail: 'tags',
          filter: 'test',
          offset: 25,
        };
        element._paramsChanged(params);
      });
    });

    test('test _computeHideDeleteClass', () => {
      assert.deepEqual(element._computeHideDeleteClass(true, false), 'show');
      assert.deepEqual(element._computeHideDeleteClass(false, true), 'show');
      assert.deepEqual(element._computeHideDeleteClass(false, false), '');
    });
  });
</script>
