set_global('page_params', { search_pills_enabled: true, }); zrequire('search'); zrequire('search_pill'); zrequire('util'); zrequire('Filter', 'js/filter'); zrequire('search_pill_widget'); const noop = () => {}; const return_true = () => true; const return_false = () => false; set_global('$', global.make_zjquery()); set_global('narrow_state', {}); set_global('search_suggestion', {}); set_global('ui_util', { change_tab_to: noop, }); set_global('narrow', {}); search_pill.append_search_string = noop; global.patch_builtin('setTimeout', func => func()); run_test('clear_search_form', () => { $('#search_query').val('noise'); $('#search_query').focus(); $('.search_button').prop('disabled', false); search.clear_search_form(); assert.equal($('#search_query').is_focused(), false); assert.equal($('#search_query').val(), ''); assert.equal($('.search_button').prop('disabled'), true); }); run_test('update_button_visibility', () => { const search_query = $('#search_query'); const search_button = $('.search_button'); search_query.is = return_false; search_query.val(''); narrow_state.active = return_false; search_button.prop('disabled', false); search.update_button_visibility(); assert(search_button.prop('disabled')); search_query.is = return_true; search_query.val(''); narrow_state.active = return_false; search_button.prop('disabled', true); search.update_button_visibility(); assert(!search_button.prop('disabled')); search_query.is = return_false; search_query.val('Test search term'); narrow_state.active = return_false; search_button.prop('disabled', true); search.update_button_visibility(); assert(!search_button.prop('disabled')); search_query.is = return_false; search_query.val(''); narrow_state.active = return_true; search_button.prop('disabled', true); search.update_button_visibility(); assert(!search_button.prop('disabled')); }); run_test('initizalize', () => { const search_query_box = $('#search_query'); const searchbox_form = $('#searchbox_form'); const search_button = $('.search_button'); const searchbox = $('#searchbox'); searchbox_form.on = (event, func) => { assert.equal(event, 'compositionend'); search.is_using_input_method = false; func(); assert(search.is_using_input_method); }; search_pill.get_search_string_for_current_filter = function () { return 'is:starred'; }; search_suggestion.max_num_of_search_results = 99; search_query_box.typeahead = (opts) => { assert.equal(opts.fixed, true); assert.equal(opts.items, 99); assert.equal(opts.naturalSearch, true); assert.equal(opts.helpOnEmptyStrings, true); assert.equal(opts.matcher(), true); { const search_suggestions = { lookup_table: { 'stream:Verona': { description: 'Stream Verona', search_string: 'stream:Verona', }, ver: { description: 'Search for ver', search_string: 'ver', }, }, strings: ['ver', 'stream:Verona'], }; /* Test source */ search_suggestion.get_suggestions = () => search_suggestions; const expected_source_value = search_suggestions.strings; const source = opts.source('ver'); assert.equal(source, expected_source_value); /* Test highlighter */ let expected_value = 'Search for ver'; assert.equal(opts.highlighter(source[0]), expected_value); expected_value = 'Stream Verona'; assert.equal(opts.highlighter(source[1]), expected_value); /* Test sorter */ assert.equal(opts.sorter(search_suggestions.strings), search_suggestions.strings); } { let operators; let is_blurred; let is_append_search_string_called; search_query_box.blur = () => { is_blurred = true; }; search_pill.append_search_string = () => { is_append_search_string_called = true; }; /* Test updater */ const _setup = (search_box_val) => { is_blurred = false; is_append_search_string_called = false; search_query_box.val(search_box_val); narrow.activate = (raw_operators, options) => { assert.deepEqual(raw_operators, operators); assert.deepEqual(options, {trigger: 'search'}); }; search_pill.get_search_string_for_current_filter = () => { return ''; }; }; operators = [{ negated: false, operator: 'search', operand: 'ver', }]; _setup('ver'); opts.updater('ver'); assert(is_blurred); assert(is_append_search_string_called); operators = [{ negated: false, operator: 'stream', operand: 'Verona', }]; _setup('stream:Verona'); opts.updater('stream:Verona'); assert(is_blurred); assert(is_append_search_string_called); search.is_using_input_method = true; _setup('stream:Verona'); opts.updater('stream:Verona'); assert(!is_blurred); assert(is_append_search_string_called); } }; searchbox_form.keydown = (func) => { const ev = { which: 15, }; search_query_box.is = return_false; assert.equal(func(ev), undefined); ev.which = 13; assert.equal(func(ev), undefined); ev.which = 13; search_query_box.is = return_true; assert.equal(func(ev), false); return search_query_box; }; search_query_box.keyup = (func) => { const ev = {}; let operators; let is_blurred; narrow_state.active = return_false; search_query_box.blur = () => { is_blurred = true; }; const _setup = (search_box_val) => { is_blurred = false; search_button.prop('disabled', false); search_query_box.val(search_box_val); narrow.activate = (raw_operators, options) => { assert.deepEqual(raw_operators, operators); assert.deepEqual(options, {trigger: 'search'}); }; search_pill.get_search_string_for_current_filter = () => { return ''; }; }; operators = []; _setup(''); ev.which = 15; search_query_box.is = return_false; func(ev); assert(!is_blurred); assert(!search_button.prop('disabled')); ev.which = 13; search_query_box.is = return_false; func(ev); assert(!is_blurred); assert(!search_button.prop('disabled')); ev.which = 13; search_query_box.is = return_true; func(ev); assert(is_blurred); assert(search_button.prop('disabled')); operators = [{ negated: false, operator: 'search', operand: 'ver', }]; _setup('ver'); search.is_using_input_method = true; func(ev); // No change on enter keyup event when using input tool assert(!is_blurred); assert(!search_button.prop('disabled')); _setup('ver'); ev.which = 13; search_query_box.is = return_true; func(ev); assert(is_blurred); assert(!search_button.prop('disabled')); }; search_query_box.on = (event, callback) => { if (event === 'focus') { search_button.prop('disabled', true); callback(); assert(!search_button.prop('disabled')); } else if (event === 'blur') { search_query_box.val("test string"); narrow_state.search_string = () => 'ver'; callback(); assert.equal(search_query_box.val(), 'ver'); } }; searchbox.on = (event, callback) => { if (event === 'focusin') { searchbox.css({"box-shadow": "unset"}); callback(); assert.deepEqual(searchbox.css(), {"box-shadow": "inset 0px 0px 0px 2px hsl(204, 20%, 74%)"}); } else if (event === 'focusout') { searchbox.css({"box-shadow": "inset 0px 0px 0px 2px hsl(204, 20%, 74%)"}); callback(); assert.deepEqual(searchbox.css(), {"box-shadow": "unset"}); } }; let is_deactivated; narrow.deactivate = () => { is_deactivated = true; }; search.initialize(); const search_exit_callback = $('#search_exit').get_on_handler('click'); search_exit_callback(); assert(is_deactivated); }); run_test('initiate_search', () => { let is_searchbox_focused = false; $('#search_query').focus = () => { is_searchbox_focused = true; }; search.initiate_search(); assert(is_searchbox_focused); });