From 521782fc9c7809d90d8ff47d77b303079aff7884 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Thu, 10 Sep 2020 11:48:10 +0800 Subject: [PATCH] FIX: Search checkboxes incorrectly being checked on similar prefix. Incorrect search filters like `in:personalasd` will end up checking the checkbox for `in:personal` because the regexp used was only doing prefix matching. --- .../app/components/search-advanced-options.js | 8 ++--- .../acceptance/search-full-test.js | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/search-advanced-options.js b/app/assets/javascripts/discourse/app/components/search-advanced-options.js index 80e1b9a8250..375177a080c 100644 --- a/app/assets/javascripts/discourse/app/components/search-advanced-options.js +++ b/app/assets/javascripts/discourse/app/components/search-advanced-options.js @@ -21,10 +21,10 @@ const REGEXP_MIN_POST_COUNT_PREFIX = /^min_post_count:/gi; const REGEXP_POST_TIME_PREFIX = /^(before|after):/gi; const REGEXP_TAGS_REPLACE = /(^(tags?:|#(?=[a-z0-9\-]+::tag))|::tag\s?$)/gi; -const REGEXP_SPECIAL_IN_LIKES_MATCH = /^in:likes/gi; -const REGEXP_SPECIAL_IN_TITLE_MATCH = /^in:title/gi; -const REGEXP_SPECIAL_IN_PERSONAL_MATCH = /^in:personal/gi; -const REGEXP_SPECIAL_IN_SEEN_MATCH = /^in:seen/gi; +const REGEXP_SPECIAL_IN_LIKES_MATCH = /^in:likes$/gi; +const REGEXP_SPECIAL_IN_TITLE_MATCH = /^in:title$/gi; +const REGEXP_SPECIAL_IN_PERSONAL_MATCH = /^in:personal$/gi; +const REGEXP_SPECIAL_IN_SEEN_MATCH = /^in:seen$/gi; const REGEXP_CATEGORY_SLUG = /^(\#[a-zA-Z0-9\-:]+)/gi; const REGEXP_CATEGORY_ID = /^(category:[0-9]+)/gi; diff --git a/test/javascripts/acceptance/search-full-test.js b/test/javascripts/acceptance/search-full-test.js index 1f8081e4dbb..9d2967508f1 100644 --- a/test/javascripts/acceptance/search-full-test.js +++ b/test/javascripts/acceptance/search-full-test.js @@ -188,6 +188,13 @@ QUnit.test( "none in:title", 'has updated search term to "none in:title"' ); + + await fillIn(".search-query", "none in:titleasd"); + + assert.not( + exists(".search-advanced-options .in-title:checked"), + "does not populate title only checkbox" + ); } ); @@ -221,11 +228,19 @@ QUnit.test( exists(".search-advanced-options .in-private:checked"), 'has "are in my messages" populated' ); + assert.equal( find(".search-query").val(), "none in:personal", 'has updated search term to "none in:personal"' ); + + await fillIn(".search-query", "none in:personal-direct"); + + assert.not( + exists(".search-advanced-options .in-private:checked"), + "does not populate messages checkbox" + ); } ); @@ -246,6 +261,13 @@ QUnit.test( "none in:seen", "it should update the search term" ); + + await fillIn(".search-query", "none in:seenasdan"); + + assert.not( + exists(".search-advanced-options .in-seen:checked"), + "does not populate seen checkbox" + ); } ); @@ -382,9 +404,17 @@ QUnit.test("validate advanced search when initially empty", async (assert) => { selectKit(".search-advanced-options .in-likes:checked"), 'has "I liked" populated' ); + assert.equal( find(".search-query").val(), "in:likes", 'has updated search term to "in:likes"' ); + + await fillIn(".search-query", "in:likesasdas"); + + assert.not( + exists(".search-advanced-options .in-likes:checked"), + "does not populate the likes checkbox" + ); });