diff --git a/.jshintrc b/.jshintrc index 0278d2ab579..74450971d74 100644 --- a/.jshintrc +++ b/.jshintrc @@ -20,6 +20,7 @@ "blank", "present", "visit", + "andThen", "click", "currentPath", "currentRouteName", diff --git a/app/assets/javascripts/discourse/templates/search.js.handlebars b/app/assets/javascripts/discourse/templates/search.js.handlebars index 17a43005379..114029e990c 100644 --- a/app/assets/javascripts/discourse/templates/search.js.handlebars +++ b/app/assets/javascripts/discourse/templates/search.js.handlebars @@ -1,4 +1,4 @@ -{{view Discourse.SearchTextField valueBinding="term" searchContextBinding="searchContext"}} +{{view Discourse.SearchTextField valueBinding="term" searchContextBinding="searchContext" id="search-term"}} {{#unless loading}} {{#unless noResults}} {{#each resultType in content}} diff --git a/test/javascripts/integration/header_test.js b/test/javascripts/integration/header_test.js index 99a0649600a..74640655952 100644 --- a/test/javascripts/integration/header_test.js +++ b/test/javascripts/integration/header_test.js @@ -11,6 +11,8 @@ integration("Header", { return scope; }); + sinon.stub(Ember.run, "debounce").callsArg(1); + var originalCategories = Discourse.Category.list(); sinon.stub(Discourse.Category, "list").returns(originalCategories); @@ -20,6 +22,7 @@ integration("Header", { teardown: function() { I18n.t.restore(); + Ember.run.debounce.restore(); Discourse.Category.list.restore(); Discourse.User.current.restore(); } @@ -119,3 +122,52 @@ test("sitemap dropdown", function() { ok(exists($siteMapDropdown.find(".new-posts")), "has displaying category badges correctly bound"); }); }); + +test("search dropdown", function() { + Discourse.SiteSettings.min_search_term_length = 2; + Ember.run(function() { + Discourse.URL_FIXTURES["/search"] = [ + { + type: "topic", + more: true, + results: [ + { + url: "some-url" + } + ] + } + ]; + }); + + visit("/"); + andThen(function() { + not(exists("#search-dropdown:visible"), "initially search box is closed"); + }); + click("#search-button"); + andThen(function() { + ok(exists("#search-dropdown:visible"), "after clicking a button search box opens"); + not(exists("#search-dropdown .heading"), "initially, immediately after opening, search box is empty"); + }); + fillIn("#search-term", "ab"); + andThen(function() { + ok(exists("#search-dropdown .heading"), "when user completes a search, search box shows search results"); + equal(find("#search-dropdown .selected a").attr("href"), "some-url", "the first search result is selected"); + }); + andThen(function() { + Discourse.URL_FIXTURES["/search"] = [ + { + type: "topic", + more: true, + results: [ + { + url: "another-url" + } + ] + } + ]; + }); + click("#search-dropdown .filter"); + andThen(function() { + equal(find("#search-dropdown .selected a").attr("href"), "another-url", "after clicking 'more of type' link, results are reloaded"); + }); +}); diff --git a/test/javascripts/templates/search_test.js b/test/javascripts/templates/search_test.js index 0280fc572b0..8277ae96ea6 100644 --- a/test/javascripts/templates/search_test.js +++ b/test/javascripts/templates/search_test.js @@ -1,4 +1,4 @@ -var controller, oldSearchTextField, oldSearchResultsTypeView; +var controller, oldSearchTextField, oldSearchResultsTypeView, oldViews; var SearchTextFieldStub = Ember.View.extend({ classNames: ["search-text-field-stub"], @@ -18,7 +18,6 @@ var setUpController = function(properties) { var appendView = function() { Ember.run(function() { - Discourse.advanceReadiness(); Ember.View.create({ container: Discourse.__container__, controller: controller, @@ -42,6 +41,9 @@ module("Template: search", { oldSearchResultsTypeView = Discourse.SearchResultsTypeView; Discourse.SearchResultsTypeView = SearchResultsTypeViewStub; + oldViews = Ember.View.views; + Ember.View.views = {}; + controller = Ember.ArrayController.create(); }, @@ -50,6 +52,8 @@ module("Template: search", { Discourse.SearchTextField = oldSearchTextField; Discourse.SearchResultsTypeView = oldSearchResultsTypeView; + + Ember.View.views = oldViews; } });