Check filter text before setting repos

This prevents a race condition where a longer response can resolve after
an earlier one. This treatment is similar to that used in
gr-autocomplete.

Bug: Issue 8593
Change-Id: Ic581d1e0eb05cab97d9293d88b237c3bdd79a4f9
This commit is contained in:
Becky Siegel
2018-04-10 16:11:35 -07:00
parent bcbd1daf52
commit 40ef9dfafd
2 changed files with 25 additions and 2 deletions

View File

@@ -63,7 +63,10 @@
type: Boolean, type: Boolean,
value: true, value: true,
}, },
_filter: String, _filter: {
type: String,
value: '',
},
}, },
behaviors: [ behaviors: [
@@ -115,7 +118,8 @@
this._repos = []; this._repos = [];
return this.$.restAPI.getRepos(filter, reposPerPage, offset) return this.$.restAPI.getRepos(filter, reposPerPage, offset)
.then(repos => { .then(repos => {
if (!repos) { return; } // Late response.
if (filter !== this._filter || !repos) { return; }
this._repos = Object.keys(repos) this._repos = Object.keys(repos)
.map(key => { .map(key => {
const repo = repos[key]; const repo = repos[key];

View File

@@ -56,6 +56,7 @@ limitations under the License.
setup(() => { setup(() => {
sandbox = sinon.sandbox.create(); sandbox = sinon.sandbox.create();
sandbox.stub(page, 'show');
element = fixture('basic'); element = fixture('basic');
counter = 0; counter = 0;
}); });
@@ -118,6 +119,11 @@ limitations under the License.
}); });
suite('filter', () => { suite('filter', () => {
setup(() => {
repos = _.times(25, repoGenerator);
reposFiltered = _.times(1, repoGenerator);
});
test('_paramsChanged', done => { test('_paramsChanged', done => {
sandbox.stub(element.$.restAPI, 'getRepos', () => { sandbox.stub(element.$.restAPI, 'getRepos', () => {
return Promise.resolve(repos); return Promise.resolve(repos);
@@ -132,6 +138,19 @@ limitations under the License.
done(); done();
}); });
}); });
test('latest repos requested are always set', done => {
const repoStub = sandbox.stub(element.$.restAPI, 'getRepos');
repoStub.withArgs('test').returns(Promise.resolve(repos));
repoStub.withArgs('filter').returns(Promise.resolve(reposFiltered));
element._filter = 'test';
// Repos are not set because the element._filter differs.
element._getRepos('filter', 25, 0).then(() => {
assert.deepEqual(element._repos, []);
done();
});
});
}); });
suite('loading', () => { suite('loading', () => {