Fix tag related advanced search tests into one context. Fix dynamic locale and select clause in search by all tags. Fix separator for all tags to plus sign.

This commit is contained in:
Jakub Macina 2017-05-31 17:32:29 +02:00
parent 3eebcccbf2
commit eaec35d230
4 changed files with 20 additions and 23 deletions

View File

@ -234,7 +234,7 @@ export default Em.Component.extend({
const contain_all_tags = this.get('searchedTerms.special.all_tags');
if (match.length !== 0) {
const join_char = contain_all_tags ? ',' : '|';
const join_char = contain_all_tags ? '+' : ',';
const existingInput = _.isArray(tags) ? tags.join(join_char) : tags;
const userInput = match[0].replace(REGEXP_TAGS_REPLACE, '');
@ -376,7 +376,7 @@ export default Em.Component.extend({
const contain_all_tags = this.get('searchedTerms.special.all_tags');
if (tagFilter && tagFilter.length !== 0) {
const join_char = contain_all_tags ? ',' : '|';
const join_char = contain_all_tags ? '+' : ',';
const tags = tagFilter.join(join_char);
if (match.length !== 0) {

View File

@ -49,7 +49,7 @@
</div>
{{/if}}
<div class="container">contain_all_tags
<div class="container">
<div class="control-group pull-left">
<label class="control-label" for="search-in-options">{{i18n "search.advanced.filters.label"}}</label>
<div class="controls">

View File

@ -445,20 +445,19 @@ class Search
end
end
advanced_filter(/tags?:([a-zA-Z0-9,\-_|]+)/) do |posts, match|
if match.include?(',')
tags = match.split(",")
advanced_filter(/tags?:([a-zA-Z0-9,\-_+]+)/) do |posts, match|
if match.include?('+')
tags = match.split('+')
# TODO use ts_query function
posts.where("topics.id IN (
SELECT DISTINCT(tt.topic_id)
SELECT tt.topic_id
FROM topic_tags tt, tags
WHERE tt.tag_id = tags.id
GROUP BY tt.topic_id
HAVING to_tsvector('simple',array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery('simple', ?)
HAVING to_tsvector(#{query_locale}, array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery(#{query_locale}, ?)
)", tags.join('&'))
else
tags = match.split("|")
tags = match.split(",")
posts.where("topics.id IN (
SELECT DISTINCT(tt.topic_id)

View File

@ -694,34 +694,32 @@ describe Search do
expect(Search.execute('this is a test #beta').posts.size).to eq(0)
end
it "can find with tag" do
topic1 = Fabricate(:topic, title: 'Could not, would not, on a boat')
topic1.tags = [Fabricate(:tag, name: 'eggs'), Fabricate(:tag, name: 'ham')]
Fabricate(:post, topic: topic1)
post2 = Fabricate(:post, topic: topic1, raw: "It probably doesn't help that they're green...")
expect(Search.execute('green tags:eggs').posts.map(&:id)).to eq([post2.id])
expect(Search.execute('green tags:plants').posts.size).to eq(0)
end
context 'tags' do
let(:tag1) { Fabricate(:tag, name: 'lunch') }
let(:tag2) { Fabricate(:tag, name: 'eggs') }
let(:topic1) { Fabricate(:topic, tags: [tag2, Fabricate(:tag)]) }
let(:topic2) { Fabricate(:topic, tags: [tag1]) }
let(:topic2) { Fabricate(:topic, tags: [tag2]) }
let(:topic3) { Fabricate(:topic, tags: [tag1, tag2]) }
let!(:post1) { Fabricate(:post, topic: topic1)}
let!(:post2) { Fabricate(:post, topic: topic2)}
let!(:post3) { Fabricate(:post, topic: topic3)}
it 'can find posts with tag' do
post4 = Fabricate(:post, topic: topic3, raw: "It probably doesn't help that they're green...")
expect(Search.execute('green tags:eggs').posts.map(&:id)).to eq([post4.id])
expect(Search.execute('tags:plants').posts.size).to eq(0)
end
it 'can find posts with any tag from multiple tags' do
Fabricate(:post)
expect(Search.execute('tags:eggs|lunch').posts.map(&:id).sort).to eq([post1.id, post2.id, post3.id].sort)
expect(Search.execute('tags:eggs,lunch').posts.map(&:id).sort).to eq([post1.id, post2.id, post3.id].sort)
end
it 'can find posts which contains all provided tags' do
expect(Search.execute('tags:lunch,eggs').posts.map(&:id)).to eq([post3.id])
expect(Search.execute('tags:lunch+eggs').posts.map(&:id)).to eq([post3.id])
expect(Search.execute('tags:eggs+lunch').posts.map(&:id)).to eq([post3.id])
end
end