diff --git a/frontend_tests/node_tests/filter.js b/frontend_tests/node_tests/filter.js index b117fe7ac5..20c0916264 100644 --- a/frontend_tests/node_tests/filter.js +++ b/frontend_tests/node_tests/filter.js @@ -1179,10 +1179,31 @@ run_test('term_type', () => { {operator: 'sender', operand: 'steve@foo.com'}, {operator: 'stream', operand: 'Verona'}, ]; - const filter = new Filter(terms); + let filter = new Filter(terms); const term_types = filter.sorted_term_types(); assert.deepEqual(term_types, ['stream', 'topic', 'sender']); + + // test caching of term types + // init and stub + filter = new Filter(terms); + filter.stub = filter._build_sorted_term_types; + filter._build_sorted_term_types = function () { + this._build_sorted_term_types_called = true; + return this.stub(); + }; + + // uncached trial + filter._build_sorted_term_types_called = false; + const built_terms = filter.sorted_term_types(); + assert.deepEqual(built_terms, ['stream', 'topic', 'sender']); + assert(filter._build_sorted_term_types_called); + + // cached trial + filter._build_sorted_term_types_called = false; + const cached_terms = filter.sorted_term_types(); + assert.deepEqual(cached_terms, ['stream', 'topic', 'sender']); + assert(!filter._build_sorted_term_types_called); }); run_test('first_valid_id_from', () => { diff --git a/static/js/filter.js b/static/js/filter.js index 1da86e8990..499750c239 100644 --- a/static/js/filter.js +++ b/static/js/filter.js @@ -502,6 +502,13 @@ Filter.prototype = { }, sorted_term_types: function () { + if (this._sorted_term_types === undefined) { + this._sorted_term_types = this._build_sorted_term_types(); + } + return this._sorted_term_types; + }, + + _build_sorted_term_types: function () { const terms = this._operators; const term_types = terms.map(Filter.term_type); const sorted_terms = Filter.sorted_term_types(term_types);