diff --git a/app/assets/javascripts/discourse/adapters/topic-list.js.es6 b/app/assets/javascripts/discourse/adapters/topic-list.js.es6 index 46a3a5668..bb7375597 100644 --- a/app/assets/javascripts/discourse/adapters/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/adapters/topic-list.js.es6 @@ -1,6 +1,6 @@ import RestAdapter from 'discourse/adapters/rest'; -function finderFor(filter, params) { +export function finderFor(filter, params) { return function() { let url = Discourse.getURL("/") + filter + ".json"; @@ -9,7 +9,7 @@ function finderFor(filter, params) { encoded = []; keys.forEach(function(p) { - const value = params[p]; + const value = encodeURI(params[p]); if (typeof value !== 'undefined') { encoded.push(p + "=" + value); } diff --git a/test/javascripts/adapaters/topic-list-test.js.es6 b/test/javascripts/adapaters/topic-list-test.js.es6 new file mode 100644 index 000000000..89af1b922 --- /dev/null +++ b/test/javascripts/adapaters/topic-list-test.js.es6 @@ -0,0 +1,13 @@ +module("adapter:topic-list"); + +import { finderFor } from 'discourse/adapters/topic-list'; + +test("finderFor", function() { + // Mocking instead of using a pretender which decodes the path and thus does + // not reflect the behavior of an actual web server. + var mock = sandbox.mock(Discourse); + mock.expects("ajax").withArgs("/search.json?q=test%25%25"); + var finderForFunction = finderFor('search', { q: "test%%" }); + finderForFunction(); + mock.verify(); +});