<!DOCTYPE html>
<!--
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-admin-view</title>

<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-admin-view.html">

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

<test-fixture id="basic">
  <template>
    <gr-admin-view></gr-admin-view>
  </template>
</test-fixture>

<script>
  suite('gr-admin-view tests', () => {
    let element;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
      stub('gr-rest-api-interface', {
        getProjectConfig() {
          return Promise.resolve({});
        },
      });
    });

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

    test('_computeURLHelper', () => {
      const path = '/test';
      const host = 'http://www.testsite.com';
      const computedPath = element._computeURLHelper(host, path);
      assert.equal(computedPath, '//http://www.testsite.com/test');
    });

    test('link URLs', () => {
      assert.equal(
          element._computeLinkURL({url: '/test', noBaseUrl: true}),
          '//' + window.location.host + '/test');

      sandbox.stub(element, 'getBaseUrl').returns('/foo');
      assert.equal(
          element._computeLinkURL({url: '/test', noBaseUrl: true}),
          '//' + window.location.host + '/foo/test');
      assert.equal(element._computeLinkURL({url: '/test'}), '/test');
      assert.equal(
          element._computeLinkURL({url: '/test', target: '_blank'}),
          '/test');
    });

    test('current page gets selected and is displayed', () => {
      element._filteredLinks = [{
        name: 'Repositories',
        url: '/admin/repos',
        view: 'gr-repo-list',
        children: [],
      }];

      element.params = {
        view: 'admin',
        adminView: 'gr-repo-list',
      };

      flushAsynchronousOperations();
      assert.equal(Polymer.dom(element.root).querySelectorAll(
          '.selected').length, 1);
      assert.ok(element.$$('gr-repo-list'));
      assert.isNotOk(element.$$('gr-admin-create-repo'));
    });

    test('_filteredLinks admin', done => {
      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
        return Promise.resolve({
          createGroup: true,
          createProject: true,
          viewPlugins: true,
        });
      });
      element._loadAccountCapabilities().then(() => {
        assert.equal(element._filteredLinks.length, 3);

        // Repos
        assert.equal(element._filteredLinks[0].children.length, 0);
        assert.isNotOk(element._filteredLinks[0].subsection);

        // Groups
        assert.equal(element._filteredLinks[1].children.length, 0);

        // Plugins
        assert.equal(element._filteredLinks[2].children.length, 0);
        done();
      });
    });

    test('_filteredLinks non admin authenticated', done => {
      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
        return Promise.resolve({});
      });
      element._loadAccountCapabilities().then(() => {
        assert.equal(element._filteredLinks.length, 2);

        // Repos
        assert.equal(element._filteredLinks[0].children.length, 0);
        assert.isNotOk(element._filteredLinks[0].subsection);

        // Groups
        assert.equal(element._filteredLinks[1].children.length, 0);
        done();
      });
    });

    test('_filteredLinks non admin unathenticated', done => {
      element.reload().then(() => {
        assert.equal(element._filteredLinks.length, 1);

        // Repos
        assert.equal(element._filteredLinks[0].children.length, 0);
        assert.isNotOk(element._filteredLinks[0].subsection);
        done();
      });
    });

    test('Repo shows up in nav', done => {
      element._repoName = 'Test Repo';
      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
        return Promise.resolve({
          createGroup: true,
          createProject: true,
          viewPlugins: true,
        });
      });
      element._loadAccountCapabilities().then(() => {
        assert.equal(element._filteredLinks.length, 3);

        // Repos
        assert.equal(element._filteredLinks[0].children.length, 0);
        assert.equal(element._filteredLinks[0].subsection.name, 'Test Repo');

        // Groups
        assert.equal(element._filteredLinks[1].children.length, 0);

        // Plugins
        assert.equal(element._filteredLinks[2].children.length, 0);
        done();
      });
    });

    test('Nav is reloaded when repo changes', () => {
      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
        return Promise.resolve({
          createGroup: true,
          createProject: true,
          viewPlugins: true,
        });
      });
      sandbox.stub(element.$.restAPI, 'getAccount', () => {
        return Promise.resolve({_id: 1});
      });
      sandbox.stub(element, 'reload');
      element.params = {repo: 'Test Repo', adminView: 'gr-repo'};
      assert.equal(element.reload.callCount, 1);
      element.params = {repo: 'Test Repo 2',
        adminView: 'gr-repo'};
      assert.equal(element.reload.callCount, 2);
    });

    test('Nav is reloaded when group changes', () => {
      sandbox.stub(element, '_computeGroupName');
      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
        return Promise.resolve({
          createGroup: true,
          createProject: true,
          viewPlugins: true,
        });
      });
      sandbox.stub(element.$.restAPI, 'getAccount', () => {
        return Promise.resolve({_id: 1});
      });
      sandbox.stub(element, 'reload');
      element.params = {groupId: '1', adminView: 'gr-group'};
      assert.equal(element.reload.callCount, 1);
    });

    test('Nav is reloaded when group name changes', done => {
      const newName = 'newName';
      sandbox.stub(element, '_computeGroupName');
      sandbox.stub(element, 'reload', () => {
        assert.equal(element._groupName, newName);
        assert.isTrue(element.reload.called);
        done();
      });
      element.params = {group: 1, view: Gerrit.Nav.View.GROUP};
      element._groupName = 'oldName';
      flushAsynchronousOperations();
      element.$$('gr-group').fire('name-changed', {name: newName});
    });

    suite('_computeSelectedClass', () => {
      setup(() => {
        sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
          return Promise.resolve({
            createGroup: true,
            createProject: true,
            viewPlugins: true,
          });
        });
        sandbox.stub(element.$.restAPI, 'getAccount', () => {
          return Promise.resolve({_id: 1});
        });

        return element.reload();
      });

      suite('repos', () => {
        setup(() => {
          stub('gr-repo-access', {
            _repoChanged: () => {},
          });
        });

        test('repo list', () => {
          element.params = {
            view: Gerrit.Nav.View.ADMIN,
            adminView: 'gr-repo-list',
            openCreateModal: false,
          };
          flushAsynchronousOperations();
          const selected = element.$$('gr-page-nav .selected');
          assert.isOk(selected);
          assert.equal(selected.textContent.trim(), 'Repositories');
        });

        test('repo', () => {
          element.params = {
            view: Gerrit.Nav.View.REPO,
            repoName: 'foo',
          };
          element._repoName = 'foo';
          return element.reload().then(() => {
            flushAsynchronousOperations();
            const selected = element.$$('gr-page-nav .selected');
            assert.isOk(selected);
            assert.equal(selected.textContent.trim(), 'foo');
          });
        });

        test('repo access', () => {
          element.params = {
            view: Gerrit.Nav.View.REPO,
            detail: Gerrit.Nav.RepoDetailView.ACCESS,
            repoName: 'foo',
          };
          element._repoName = 'foo';
          return element.reload().then(() => {
            flushAsynchronousOperations();
            const selected = element.$$('gr-page-nav .selected');
            assert.isOk(selected);
            assert.equal(selected.textContent.trim(), 'Access');
          });
        });

        test('repo dashboards', () => {
          element.params = {
            view: Gerrit.Nav.View.REPO,
            detail: Gerrit.Nav.RepoDetailView.DASHBOARDS,
            repoName: 'foo',
          };
          element._repoName = 'foo';
          return element.reload().then(() => {
            flushAsynchronousOperations();
            const selected = element.$$('gr-page-nav .selected');
            assert.isOk(selected);
            assert.equal(selected.textContent.trim(), 'Dashboards');
          });
        });
      });

      suite('groups', () => {
        setup(() => {
          stub('gr-group', {
            _loadGroup: () => Promise.resolve({}),
          });
          stub('gr-group-members', {
            _loadGroupDetails: () => {},
          });

          sandbox.stub(element.$.restAPI, 'getGroupConfig')
              .returns(Promise.resolve({
                name: 'foo',
              }));
          sandbox.stub(element.$.restAPI, 'getIsGroupOwner')
              .returns(Promise.resolve(true));
        });

        test('group list', () => {
          element.params = {
            view: Gerrit.Nav.View.ADMIN,
            adminView: 'gr-admin-group-list',
            openCreateModal: false,
          };
          flushAsynchronousOperations();
          const selected = element.$$('gr-page-nav .selected');
          assert.isOk(selected);
          assert.equal(selected.textContent.trim(), 'Groups');
        });

        test('group', () => {
          element.params = {
            view: Gerrit.Nav.View.GROUP,
            groupId: 1234,
          };
          element._groupName = 'foo';
          return element.reload().then(() => {
            flushAsynchronousOperations();
            const selected = element.$$('gr-page-nav .selected');
            assert.isOk(selected);
            assert.equal(selected.textContent.trim(), 'foo');
          });
        });

        test('group members', () => {
          element.params = {
            view: Gerrit.Nav.View.GROUP,
            detail: Gerrit.Nav.GroupDetailView.MEMBERS,
            groupId: 1234,
          };
          element._groupName = 'foo';
          return element.reload().then(() => {
            flushAsynchronousOperations();
            const selected = element.$$('gr-page-nav .selected');
            assert.isOk(selected);
            assert.equal(selected.textContent.trim(), 'Members');
          });
        });
      });
    });
  });
</script>
