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

View File

@@ -56,6 +56,7 @@ limitations under the License.
setup(() => {
sandbox = sinon.sandbox.create();
sandbox.stub(page, 'show');
element = fixture('basic');
counter = 0;
});
@@ -118,6 +119,11 @@ limitations under the License.
});
suite('filter', () => {
setup(() => {
repos = _.times(25, repoGenerator);
reposFiltered = _.times(1, repoGenerator);
});
test('_paramsChanged', done => {
sandbox.stub(element.$.restAPI, 'getRepos', () => {
return Promise.resolve(repos);
@@ -132,6 +138,19 @@ limitations under the License.
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', () => {