<!DOCTYPE html>
<!--
Copyright (C) 2015 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-search-bar</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<script src="../../../bower_components/page/page.js"></script>

<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-search-bar.html">
<script src="../../../scripts/util.js"></script>

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

<test-fixture id="basic">
  <template>
    <gr-search-bar></gr-search-bar>
  </template>
</test-fixture>

<script>
  suite('gr-search-bar tests', () => {
    let element;

    setup(() => {
      element = fixture('basic');
    });

    test('value is propagated to _inputVal', () => {
      element.value = 'foo';
      assert.equal(element._inputVal, 'foo');
    });

    getActiveElement = () => {
      return document.activeElement.shadowRoot ?
          document.activeElement.shadowRoot.activeElement :
          document.activeElement;
    };

    test('tap on search button triggers nav', done => {
      sinon.stub(page, 'show', () => {
        page.show.restore();
        assert.notEqual(getActiveElement(), element.$.searchInput);
        assert.notEqual(getActiveElement(), element.$.searchButton);
        done();
      });
      element.value = 'test';
      MockInteractions.tap(element.$.searchButton);
    });

    test('enter in search input triggers nav', done => {
      sinon.stub(page, 'show', () => {
        page.show.restore();
        assert.notEqual(getActiveElement(), element.$.searchInput);
        assert.notEqual(getActiveElement(), element.$.searchButton);
        done();
      });
      element.value = 'test';
      MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
          null, 'enter');
    });

    test('search query should be double-escaped', () => {
      const showStub = sinon.stub(page, 'show');
      element.$.searchInput.text = 'fate/stay';
      MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
          null, 'enter');
      assert.equal(showStub.lastCall.args[0], '/q/fate%252Fstay');
      showStub.restore();
    });

    test('input blurred after commit', () => {
      const showStub = sinon.stub(page, 'show');
      const blurSpy = sinon.spy(element.$.searchInput.$.input, 'blur');
      element.$.searchInput.text = 'fate/stay';
      MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
          null, 'enter');
      assert.isTrue(blurSpy.called);
      showStub.restore();
      blurSpy.restore();
    });

    test('empty search query does not trigger nav', () => {
      const showSpy = sinon.spy(page, 'show');
      element.value = '';
      MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
          null, 'enter');
      assert.isFalse(showSpy.called);
    });

    test('keyboard shortcuts', () => {
      const focusSpy = sinon.spy(element.$.searchInput, 'focus');
      const selectAllSpy = sinon.spy(element.$.searchInput, 'selectAll');
      MockInteractions.pressAndReleaseKeyOn(document.body, 191, null, '/');
      assert.isTrue(focusSpy.called);
      assert.isTrue(selectAllSpy.called);
    });

    suite('_getSearchSuggestions', () => {
      setup(() => {
        sinon.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
          Promise.resolve([
            {
              name: 'fred',
              email: 'fred@goog.co',
            },
          ])
        );
        sinon.stub(element.$.restAPI, 'getSuggestedGroups', () =>
          Promise.resolve({
            Polygerrit: 0,
            gerrit: 0,
            gerrittest: 0,
          })
        );
        sinon.stub(element.$.restAPI, 'getSuggestedProjects', () =>
          Promise.resolve({
            Polygerrit: 0,
          })
        );
      });

      teardown(() => {
        element.$.restAPI.getSuggestedAccounts.restore();
        element.$.restAPI.getSuggestedGroups.restore();
        element.$.restAPI.getSuggestedProjects.restore();
      });

      test('Autocompletes accounts', done => {
        element._getSearchSuggestions('owner:fr').then(s => {
          assert.equal(s[0].value, 'owner:"fred <fred@goog.co>"');
          done();
        });
      });

      test('Inserts self as option when valid', done => {
        element._getSearchSuggestions('owner:s').then(s => {
          assert.equal(s[0].value, 'owner:self');
        }).then(() => {
          element._getSearchSuggestions('owner:selfs').then(s => {
            assert.notEqual(s[0].value, 'owner:self');
            done();
          });
        });
      });

      test('Inserts me as option when valid', done => {
        element._getSearchSuggestions('owner:m').then(s => {
          assert.equal(s[0].value, 'owner:me');
        }).then(() => {
          element._getSearchSuggestions('owner:meme').then(s => {
            assert.notEqual(s[0].value, 'owner:me');
            done();
          });
        });
      });

      test('Autocompletes groups', done => {
        element._getSearchSuggestions('ownerin:pol').then(s => {
          assert.equal(s[0].value, 'ownerin:Polygerrit');
          done();
        });
      });

      test('Autocompletes projects', done => {
        element._getSearchSuggestions('project:pol').then(s => {
          assert.equal(s[0].value, 'project:Polygerrit');
          done();
        });
      });

      test('Autocompletes simple searches', done => {
        element._getSearchSuggestions('is:o').then(s => {
          assert.equal(s[0].name, 'is:open');
          assert.equal(s[0].value, 'is:open');
          assert.equal(s[1].name, 'is:owner');
          assert.equal(s[1].value, 'is:owner');
          done();
        });
      });

      test('Does not autocomplete with no match', done => {
        element._getSearchSuggestions('asdasdasdasd').then(s => {
          assert.equal(s.length, 0);
          done();
        });
      });

      test('Autocomplete doesnt override exact matches to input', done => {
        element._getSearchSuggestions('ownerin:gerrit').then(s => {
          assert.equal(s[0].value, 'ownerin:gerrit');
          done();
        });
      });

      test('Autocomplete respects spaces', done => {
        element._getSearchSuggestions('is:ope').then(s => {
          assert.equal(s[0].name, 'is:open');
          assert.equal(s[0].value, 'is:open');
          element._getSearchSuggestions('is:ope ').then(s => {
            assert.equal(s.length, 0);
            done();
          });
        });
      });
    });
  });
</script>
