|  | <!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> | 
|  | <link rel="import" href="../../../test/common-test-setup.html"/> | 
|  | <script src="../../../bower_components/page/page.js"></script> | 
|  |  | 
|  | <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; | 
|  | let sandbox; | 
|  |  | 
|  | setup(() => { | 
|  | sandbox = sinon.sandbox.create(); | 
|  | element = fixture('basic'); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | }); | 
|  |  | 
|  | 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('enter in search input triggers nav', done => { | 
|  | sandbox.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 = sandbox.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'); | 
|  | }); | 
|  |  | 
|  | test('input blurred after commit', () => { | 
|  | sandbox.stub(page, 'show'); | 
|  | const blurSpy = sandbox.spy(element.$.searchInput.$.input, 'blur'); | 
|  | element.$.searchInput.text = 'fate/stay'; | 
|  | MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13, | 
|  | null, 'enter'); | 
|  | assert.isTrue(blurSpy.called); | 
|  | }); | 
|  |  | 
|  | test('empty search query does not trigger nav', () => { | 
|  | const showSpy = sandbox.spy(page, 'show'); | 
|  | element.value = ''; | 
|  | MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13, | 
|  | null, 'enter'); | 
|  | assert.isFalse(showSpy.called); | 
|  | }); | 
|  |  | 
|  | test('keyboard shortcuts', () => { | 
|  | const focusSpy = sandbox.spy(element.$.searchInput, 'focus'); | 
|  | const selectAllSpy = sandbox.spy(element.$.searchInput, 'selectAll'); | 
|  | MockInteractions.pressAndReleaseKeyOn(document.body, 191, null, '/'); | 
|  | assert.isTrue(focusSpy.called); | 
|  | assert.isTrue(selectAllSpy.called); | 
|  | }); | 
|  |  | 
|  | suite('_getSearchSuggestions', () => { | 
|  | test('Autocompletes accounts', () => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | name: 'fred', | 
|  | email: 'fred@goog.co', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | return element._getSearchSuggestions('owner:fr').then(s => { | 
|  | assert.equal(s[0].value, 'owner:fred@goog.co'); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Inserts self as option when valid', done => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | name: 'fred', | 
|  | email: 'fred@goog.co', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | 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 => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | name: 'fred', | 
|  | email: 'fred@goog.co', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | 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 => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () => | 
|  | Promise.resolve({ | 
|  | Polygerrit: 0, | 
|  | gerrit: 0, | 
|  | gerrittest: 0, | 
|  | }) | 
|  | ); | 
|  | element._getSearchSuggestions('ownerin:pol').then(s => { | 
|  | assert.equal(s[0].value, 'ownerin:Polygerrit'); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Autocompletes projects', done => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedProjects', () => | 
|  | Promise.resolve({ | 
|  | Polygerrit: 0, | 
|  | }) | 
|  | ); | 
|  | 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 => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () => | 
|  | Promise.resolve({ | 
|  | Polygerrit: 0, | 
|  | gerrit: 0, | 
|  | gerrittest: 0, | 
|  | }) | 
|  | ); | 
|  | element._getSearchSuggestions('ownerin:gerrit').then(s => { | 
|  | assert.equal(s[0].value, 'ownerin:gerrit'); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Autocomplete respects spaces', done => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | name: 'fred', | 
|  | email: 'fred@goog.co', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | 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(); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Autocompletes accounts with no email', done => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | name: 'fred', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | element._getSearchSuggestions('owner:fr').then(s => { | 
|  | assert.equal(s[0].value, 'owner:"fred"'); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Autocompletes accounts with email', done => { | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () => | 
|  | Promise.resolve([ | 
|  | { | 
|  | email: 'fred@goog.co', | 
|  | }, | 
|  | ]) | 
|  | ); | 
|  | element._getSearchSuggestions('owner:fr').then(s => { | 
|  | assert.equal(s[0].value, 'owner:fred@goog.co'); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | </script> |