From 1f4672f4a30f865f98ec8edf31d14f9ae96be09a Mon Sep 17 00:00:00 2001 From: Mohamed El-Sawy Date: Tue, 10 Dec 2024 21:41:39 +0200 Subject: [PATCH] CV2-5628: fix OR condition and remove projects filter (#2125) * CV2-5628: fix OR condition and remove projects filter * CV2-5628: fix tests 1/2 * CV2-5628: fix tests 2/2 * CV2-5628: fix feed query * CV2-5628: fix tests * CV2-5628: cleanup * CV2-5628: fix feed conditions * CV2-5628: cleanup --- lib/check_search.rb | 70 +++++++++---------- test/controllers/elastic_search_10_test.rb | 12 +--- test/controllers/elastic_search_4_test.rb | 54 +++----------- test/controllers/elastic_search_7_test.rb | 10 ++- test/controllers/elastic_search_test.rb | 34 --------- .../controllers/graphql_controller_10_test.rb | 29 -------- test/controllers/graphql_controller_3_test.rb | 36 ++++------ test/controllers/graphql_controller_6_test.rb | 60 ++++------------ test/lib/team_statistics_test.rb | 2 +- test/models/bot/smooch_5_test.rb | 16 ++--- test/models/project_media_test.rb | 16 ++--- 11 files changed, 85 insertions(+), 254 deletions(-) diff --git a/lib/check_search.rb b/lib/check_search.rb index 3953f762e7..17e64282db 100644 --- a/lib/check_search.rb +++ b/lib/check_search.rb @@ -2,7 +2,7 @@ class CheckSearch include SearchHelper def initialize(options, file = nil, team_id = Team.current&.id) - # Options include keywords, projects, tags, status, report status + # Options include search filters options = begin JSON.parse(options) rescue {} end @options = options.to_h.clone.with_indifferent_access @options['input'] = options.clone @@ -22,9 +22,6 @@ def initialize(options, file = nil, team_id = Team.current&.id) @options['esoffset'] ||= 0 adjust_es_window_size - # Check for non project - @options['none_project'] = @options['projects'].include?('-1') unless @options['projects'].blank? - adjust_project_filter adjust_channel_filter adjust_numeric_range_filter adjust_archived_filter @@ -37,8 +34,6 @@ def initialize(options, file = nil, team_id = Team.current&.id) # Apply feed filters @feed_view = @options['feed_view'] || :fact_check @options.merge!(@feed.get_feed_filters(@feed_view)) if feed_query? - - (Project.current ||= Project.where(id: @options['projects'].last).last) if @options['projects'].to_a.size == 1 @file = file end @@ -244,9 +239,7 @@ def get_pg_results_for_media core_conditions = {} core_conditions['team_id'] = @options['team_id'] if @options['team_id'].is_a?(Array) # Add custom conditions for array values - { - 'project_id' => 'projects', 'user_id' => 'users', 'source_id' => 'sources', 'read' => 'read', 'unmatched' => 'unmatched' - }.each do |k, v| + { 'user_id' => 'users', 'source_id' => 'sources', 'read' => 'read', 'unmatched' => 'unmatched'}.each do |k, v| custom_conditions[k] = [@options[v]].flatten if @options.has_key?(v) end core_conditions.merge!({ archived: @options['archived'] }) @@ -286,6 +279,17 @@ def get_search_field end def medias_query + return build_feed_conditions if feed_query? + and_conditions, or_conditions, not_conditions = build_es_medias_query + # Build ES query using this format: `bool: { must: [{and_conditions}], should: [{or_conditions}, must_not: [{not_conditions}]] }` + query = {} + { must: and_conditions, should: or_conditions, must_not: not_conditions }.each do |k, v| + query[k] = v.flatten unless v.blank? + end + { bool: query } + end + + def build_es_medias_query core_conditions = [] custom_conditions = [] core_conditions << { terms: { get_search_field => @options['project_media_ids'] } } unless @options['project_media_ids'].blank? @@ -313,16 +317,16 @@ def medias_query custom_conditions.concat request_language_conditions custom_conditions.concat report_language_conditions custom_conditions.concat team_tasks_conditions - feed_conditions = build_feed_conditions - conditions = [] + and_conditions = core_conditions + or_conditions = [] + not_conditions = [] if @options['operator'].upcase == 'OR' - and_conditions = { bool: { must: core_conditions } } - or_conditions = { bool: { should: custom_conditions } } - conditions = [and_conditions, or_conditions, feed_conditions] + or_conditions << custom_conditions + not_conditions << { term: { associated_type: { value: "Blank" } } } else - conditions = [{ bool: { must: (core_conditions + custom_conditions) } }, feed_conditions] + and_conditions.concat(custom_conditions) end - { bool: { must: conditions.reject{ |c| c.blank? } } } + return and_conditions, or_conditions, not_conditions end def medias_get_search_result(query) @@ -418,25 +422,6 @@ def adjust_es_window_size @options['eslimit'] = window_size - @options['esoffset'].to_i if current_size > window_size end - def adjust_project_filter - team_id = [@options['team_id']].flatten.first - project_group_ids = [@options['project_group_id']].flatten.reject{ |pgid| pgid.blank? }.map(&:to_i) - unless project_group_ids.empty? - project_ids = @options['projects'].to_a.map(&:to_i) - project_groups_project_ids = Project.where(project_group_id: project_group_ids, team_id: team_id).map(&:id) - - project_ids = project_ids.blank? ? project_groups_project_ids : (project_ids & project_groups_project_ids) - - # Invalidate the search if empty... otherwise, adjust the projects filter - @options['projects'] = project_ids.empty? ? [0] : project_ids - end - if Team.current && !feed_query? && [@options['team_id']].flatten.size == 1 - t = Team.find(team_id) - @options['projects'] = @options['projects'].blank? ? (Project.where(team_id: t.id).map(&:id) + [nil]) : Project.where(id: @options['projects'], team_id: t.id).map(&:id) - end - @options['projects'] += [nil] if @options['none_project'] - end - def adjust_channel_filter if @options['channels'].is_a?(Array) && @options['channels'].include?('any_tipline') channels = @options['channels'] - ['any_tipline'] @@ -700,7 +685,7 @@ def doc_conditions doc_c << { terms: { 'associated_type': types } } end - fields = { 'project_id' => 'projects', 'user_id' => 'users' } + fields = { 'user_id' => 'users' } status_search_fields.each do |field| fields[field] = field end @@ -780,12 +765,21 @@ def hit_es_for_range_filter end def build_feed_conditions - return {} unless feed_query? + return [] unless feed_query? conditions = [] + feed_options = @options.clone + feed_options.delete('feed_id') + feed_options.delete('input') + and_conditions, or_conditions, not_conditions = CheckSearch.new(feed_options.to_json, nil, @options['team_id']).build_es_medias_query @feed.get_team_filters(@options['feed_team_ids']).each do |filters| team_id = filters['team_id'].to_i conditions << CheckSearch.new(filters.merge({ show_similar: !!@options['show_similar'] }).to_json, nil, team_id).medias_query end - { bool: { should: conditions } } + or_conditions.concat(conditions) + query = [] + { must: and_conditions, should: or_conditions, must_not: not_conditions}.each do |k, v| + query << { bool: { "#{k}": v } } unless v.blank? + end + { bool: { must: query } } end end diff --git a/test/controllers/elastic_search_10_test.rb b/test/controllers/elastic_search_10_test.rb index 82199c9852..b5a42a3c98 100644 --- a/test/controllers/elastic_search_10_test.rb +++ b/test/controllers/elastic_search_10_test.rb @@ -140,22 +140,14 @@ def setup end end - test "should filter items by non project and read-unread" do + test "should filter items by read-unread" do t = create_team - p = create_project team: t u = create_user create_team_user team: t, user: u, role: 'admin' with_current_user_and_team(u ,t) do pm = create_project_media team: t, disable_es_callbacks: false - pm2 = create_project_media project: p, disable_es_callbacks: false + pm2 = create_project_media team: t, disable_es_callbacks: false pm3 = create_project_media team: t, quote: 'claim a', disable_es_callbacks: false - results = CheckSearch.new({ projects: ['-1'] }.to_json) - # result should return empty as now all items should have a project CHECK-1150 - assert_empty results.medias.map(&:id) - results = CheckSearch.new({ projects: [p.id, '-1'] }.to_json) - assert_equal [pm2.id], results.medias.map(&:id) - results = CheckSearch.new({ keyword: 'claim', projects: ['-1'] }.to_json) - assert_empty results.medias.map(&:id) # test read/unread pm.read = true pm.save! diff --git a/test/controllers/elastic_search_4_test.rb b/test/controllers/elastic_search_4_test.rb index 5276dc01cb..0cb5351b99 100644 --- a/test/controllers/elastic_search_4_test.rb +++ b/test/controllers/elastic_search_4_test.rb @@ -8,10 +8,8 @@ def setup test "should search with multiple filters" do t = create_team - p = create_project team: t - p2 = create_project team: t - pm = create_project_media project: p, quote: 'report_title', disable_es_callbacks: false - pm2 = create_project_media project: p2, quote: 'report_title', disable_es_callbacks: false + pm = create_project_media team: t, quote: 'report_title', disable_es_callbacks: false + pm2 = create_project_media team: t, quote: 'report_title', disable_es_callbacks: false create_tag tag: 'sports', annotated: pm, disable_es_callbacks: false create_tag tag: 'sports', annotated: pm2, disable_es_callbacks: false create_status status: 'verified', annotated: pm, disable_es_callbacks: false @@ -20,37 +18,16 @@ def setup Team.current = t result = CheckSearch.new({keyword: 'report_title', tags: ['sports']}.to_json) assert_equal [pm2.id, pm.id], result.medias.map(&:id) - # keyword & context - result = CheckSearch.new({keyword: 'report_title', projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) # keyword & status result = CheckSearch.new({keyword: 'report_title', verification_status: ['verified']}.to_json) assert_equal [pm.id], result.medias.map(&:id) - # tags & context - result = CheckSearch.new({projects: [p.id], tags: ['sports']}.to_json) - assert_equal [pm.id], result.medias.map(&:id) - # status & context - result = CheckSearch.new({projects: [p.id], verification_status: ['verified']}.to_json) - assert_equal [pm.id], result.medias.map(&:id) - # keyword & tags & context - result = CheckSearch.new({keyword: 'report_title', tags: ['sports'], projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) - # keyword & status & context - result = CheckSearch.new({keyword: 'report_title', verification_status: ['verified'], projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) - # tags & context & status - result = CheckSearch.new({tags: ['sports'], verification_status: ['verified'], projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) # keyword & tags & status result = CheckSearch.new({keyword: 'report_title', tags: ['sports'], verification_status: ['verified']}.to_json) assert_equal [pm.id], result.medias.map(&:id) - # keyword & tags & context & status - result = CheckSearch.new({keyword: 'report_title', tags: ['sports'], verification_status: ['verified'], projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) # search keyword in comments create_comment text: 'add_comment', annotated: pm, disable_es_callbacks: false sleep 1 - result = CheckSearch.new({keyword: 'add_comment', projects: [p.id]}.to_json) + result = CheckSearch.new({keyword: 'add_comment'}.to_json) assert_equal [pm.id], result.medias.map(&:id) end @@ -200,34 +177,21 @@ def setup c2 = create_claim_media m = create_valid_media t1 = create_team - p1a = create_project team: t1 - p1b = create_project team: t1 - pm1a = create_project_media project: p1a, media: c, disable_es_callbacks: false - sleep 1 - pm1b = create_project_media project: p1b, media: c2, disable_es_callbacks: false - + pm1a = create_project_media team: t1, media: c, disable_es_callbacks: false + pm1b = create_project_media team: t1, media: c2, disable_es_callbacks: false t2 = create_team - p2a = create_project team: t2 - p2b = create_project team: t2 - pm2a = create_project_media project: p2a, media: m, disable_es_callbacks: false - sleep 1 - pm2b = create_project_media project: p2b, disable_es_callbacks: false - + pm2a = create_project_media team: t2, media: m, disable_es_callbacks: false + pm2b = create_project_media team: t2, disable_es_callbacks: false + sleep 2 Team.current = t1 assert_equal [pm1b, pm1a], CheckSearch.new('{}').medias assert_equal 2, CheckSearch.new('{}').project_medias.count - assert_equal 1, CheckSearch.new({ projects: [p1a.id], show: ['claims']}.to_json).project_medias.count - assert_equal [pm1a], CheckSearch.new({ projects: [p1a.id] }.to_json).medias - assert_equal 1, CheckSearch.new({ projects: [p1a.id] }.to_json).project_medias.count + assert_equal 2, CheckSearch.new({ show: ['claims']}.to_json).project_medias.count assert_equal [pm1a, pm1b], CheckSearch.new({ sort_type: 'ASC' }.to_json).medias assert_equal 2, CheckSearch.new({ sort_type: 'ASC' }.to_json).project_medias.count - Team.current = nil - Team.current = t2 assert_equal [pm2b, pm2a], CheckSearch.new('{}').medias assert_equal 2, CheckSearch.new('{}').project_medias.count - assert_equal [pm2a], CheckSearch.new({ projects: [p2a.id] }.to_json).medias - assert_equal 1, CheckSearch.new({ projects: [p2a.id] }.to_json).project_medias.count assert_equal [pm2a, pm2b], CheckSearch.new({ sort_type: 'ASC' }.to_json).medias assert_equal 2, CheckSearch.new({ sort_type: 'ASC' }.to_json).project_medias.count Team.current = nil diff --git a/test/controllers/elastic_search_7_test.rb b/test/controllers/elastic_search_7_test.rb index dca282fad6..128556df40 100644 --- a/test/controllers/elastic_search_7_test.rb +++ b/test/controllers/elastic_search_7_test.rb @@ -159,16 +159,14 @@ def setup test "should parse search options" do t = create_team - p = create_project team: t - p2 = create_project team: t - pm = create_project_media project: p, disable_es_callbacks: false - pm2 = create_project_media project: p2, disable_es_callbacks: false + pm = create_project_media team: t, archived: 0, disable_es_callbacks: false + pm2 = create_project_media team: t, archived: 2, disable_es_callbacks: false sleep 1 Team.current = t - result = CheckSearch.new({projects: [p.id]}.to_json) + result = CheckSearch.new({archived: [0]}.to_json) assert_equal [pm.id], result.medias.map(&:id) # pass wrong format should map to all items - result = CheckSearch.new({projects: [p.id]}) + result = CheckSearch.new({archived: [0]}) assert_equal [pm.id, pm2.id], result.medias.map(&:id).sort end diff --git a/test/controllers/elastic_search_test.rb b/test/controllers/elastic_search_test.rb index 71bddc19f2..16d7f4e6b1 100644 --- a/test/controllers/elastic_search_test.rb +++ b/test/controllers/elastic_search_test.rb @@ -157,40 +157,6 @@ def setup assert_equal [pm.id], result.medias.map(&:id) end - test "should search with context" do - t = create_team - p = create_project team: t - pender_url = CheckConfig.get('pender_url_private') + '/api/medias' - url = 'http://test.com' - response = '{"type":"media","data":{"url":"' + url + '/normalized","type":"item", "title": "search_title", "description":"search_desc"}}' - WebMock.stub_request(:get, pender_url).with({ query: { url: url } }).to_return(body: response) - url2 = 'http://test2.com' - response = '{"type":"media","data":{"url":"' + url2 + '/normalized","type":"item", "title": "search_title", "description":"search_desc"}}' - WebMock.stub_request(:get, pender_url).with({ query: { url: url2 } }).to_return(body: response) - m = create_media(account: create_valid_account, url: url) - m1 = create_media(account: create_valid_account, url: url2) - pm = create_project_media project: p, media: m, disable_es_callbacks: false - keyword = { projects: [0,0,0] }.to_json - sleep 1 - Team.current = t - result = CheckSearch.new(keyword) - assert_empty result.medias - result = CheckSearch.new({projects: [p.id]}.to_json) - assert_equal [pm.id], result.medias.map(&:id) - # add a new context to existing media - p2 = create_project team: t - pm2 = create_project_media project: p2, media: m1, disable_es_callbacks: false - sleep 1 - result = CheckSearch.new({projects: [p.id]}.to_json) - assert_equal [pm.id].sort, result.medias.map(&:id).sort - # add a new media to same context - m2 = create_valid_media - pm2 = create_project_media project: p, media: m2, disable_es_callbacks: false - sleep 1 - result = CheckSearch.new({projects: [p.id]}.to_json) - assert_equal [pm.id, pm2.id].sort, result.medias.map(&:id).sort - end - test "should search with tags or status" do t = create_team p = create_project team: t diff --git a/test/controllers/graphql_controller_10_test.rb b/test/controllers/graphql_controller_10_test.rb index b7ad00320f..fb61cf884e 100644 --- a/test/controllers/graphql_controller_10_test.rb +++ b/test/controllers/graphql_controller_10_test.rb @@ -515,35 +515,6 @@ def setup assert_equal [], JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |pm| pm['node']['dbid'] } end - test "should search by project group" do - u = create_user is_admin: true - t = create_team - create_team_user user: u, team: t, role: 'admin' - authenticate_with_user(u) - - pg = create_project_group team: t - p1 = create_project team: t - p1.project_group = pg - p1.save! - create_project_media project: p1 - p2 = create_project team: t - p2.project_group = pg - p2.save! - create_project_media project: p2 - p3 = create_project team: t - create_project_media project: p3 - - query = 'query CheckSearch { search(query: "{}") { number_of_results } }' - post :create, params: { query: query, team: t.slug } - assert_response :success - assert_equal 3, JSON.parse(@response.body)['data']['search']['number_of_results'] - - query = 'query CheckSearch { search(query: "{\"project_group_id\":' + pg.id.to_s + '}") { number_of_results } }' - post :create, params: { query: query, team: t.slug } - assert_response :success - assert_equal 2, JSON.parse(@response.body)['data']['search']['number_of_results'] - end - test "should not access GraphQL mutation if not authenticated" do post :create, params: { query: 'mutation Test' } assert_response 401 diff --git a/test/controllers/graphql_controller_3_test.rb b/test/controllers/graphql_controller_3_test.rb index 267a64dc83..c8183e8eb4 100644 --- a/test/controllers/graphql_controller_3_test.rb +++ b/test/controllers/graphql_controller_3_test.rb @@ -18,22 +18,17 @@ def setup u = create_user is_admin: true authenticate_with_user(u) t1 = create_team - p1a = create_project team: t1 - p1b = create_project team: t1 - pm1a = create_project_media project: p1a, disable_es_callbacks: false ; sleep 1 - pm1b = create_project_media project: p1b, disable_es_callbacks: false ; sleep 1 + pm1a = create_project_media team: t1, disable_es_callbacks: false ; sleep 1 + pm1b = create_project_media team: t1, disable_es_callbacks: false ; sleep 1 pm1b.disable_es_callbacks = false ; pm1b.updated_at = Time.now ; pm1b.save! ; sleep 1 pm1a.disable_es_callbacks = false ; pm1a.updated_at = Time.now ; pm1a.save! ; sleep 1 - pm1c = create_project_media project: p1a, disable_es_callbacks: false, archived: CheckArchivedFlags::FlagCodes::TRASHED ; sleep 1 + pm1c = create_project_media team: t1, disable_es_callbacks: false, archived: CheckArchivedFlags::FlagCodes::TRASHED ; sleep 1 t2 = create_team - p2 = create_project team: t2 pm2 = [] 6.times do - pm2 << create_project_media(project: p2, disable_es_callbacks: false) - sleep 1 + pm2 << create_project_media(team: t2, disable_es_callbacks: false) end - - sleep 10 + sleep 2 # Default sort criteria and order: recent added, descending query = 'query CheckSearch { search(query: "{}") {medias(first:20){edges{node{dbid}}}}}' @@ -63,13 +58,6 @@ def setup results = JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |x| x['node']['dbid'] } assert_equal [pm1b.id, pm1a.id], results - # Filter by project - query = 'query CheckSearch { search(query: "{\"projects\":[' + p1b.id.to_s + ']}") {medias(first:20){edges{node{dbid}}}}}' - post :create, params: { query: query, team: t1.slug } - assert_response :success - results = JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |x| x['node']['dbid'] } - assert_equal [pm1b.id], results - # Get archived items query = 'query CheckSearch { search(query: "{\"archived\":1}") {medias(first:20){edges{node{dbid}}}}}' post :create, params: { query: query, team: t1.slug } @@ -78,10 +66,10 @@ def setup assert_equal [pm1c.id], results # Relationships - pm1e = create_project_media project: p1a, disable_es_callbacks: false ; sleep 1 - pm1f = create_project_media project: p1a, disable_es_callbacks: false, media: nil, quote: 'Test 1' ; sleep 1 - pm1g = create_project_media project: p1a, disable_es_callbacks: false, media: nil, quote: 'Test 2' ; sleep 1 - pm1h = create_project_media project: p1a, disable_es_callbacks: false, media: nil, quote: 'Test 3' ; sleep 1 + pm1e = create_project_media team: t1, disable_es_callbacks: false ; sleep 1 + pm1f = create_project_media team: t1, disable_es_callbacks: false, media: nil, quote: 'Test 1' ; sleep 1 + pm1g = create_project_media team: t1, disable_es_callbacks: false, media: nil, quote: 'Test 2' ; sleep 1 + pm1h = create_project_media team: t1, disable_es_callbacks: false, media: nil, quote: 'Test 3' ; sleep 1 create_relationship source_id: pm1e.id, target_id: pm1f.id, disable_es_callbacks: false ; sleep 1 create_relationship source_id: pm1e.id, target_id: pm1g.id, disable_es_callbacks: false ; sleep 1 create_relationship source_id: pm1e.id, target_id: pm1h.id, disable_es_callbacks: false ; sleep 1 @@ -94,21 +82,21 @@ def setup assert_equal [pm1f.id, pm1g.id, pm1h.id].sort, results.sort # Paginate, page 1 - query = 'query CheckSearch { search(query: "{\"projects\":[' + p2.id.to_s + '],\"eslimit\":2,\"esoffset\":0}") {medias(first:20){edges{node{dbid}}}}}' + query = 'query CheckSearch { search(query: "{\"eslimit\":2,\"esoffset\":0}") {medias(first:20){edges{node{dbid}}}}}' post :create, params: { query: query, team: t2.slug } assert_response :success results = JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |x| x['node']['dbid'] } assert_equal [pm2[5].id, pm2[4].id], results # Paginate, page 2 - query = 'query CheckSearch { search(query: "{\"projects\":[' + p2.id.to_s + '],\"eslimit\":2,\"esoffset\":2}") {medias(first:20){edges{node{dbid}}}}}' + query = 'query CheckSearch { search(query: "{\"eslimit\":2,\"esoffset\":2}") {medias(first:20){edges{node{dbid}}}}}' post :create, params: { query: query, team: t2.slug } assert_response :success results = JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |x| x['node']['dbid'] } assert_equal [pm2[3].id, pm2[2].id], results # Paginate, page 3 - query = 'query CheckSearch { search(query: "{\"projects\":[' + p2.id.to_s + '],\"eslimit\":2,\"esoffset\":4}") {number_of_results,medias(first:20){edges{node{dbid}}}}}' + query = 'query CheckSearch { search(query: "{\"eslimit\":2,\"esoffset\":4}") {number_of_results,medias(first:20){edges{node{dbid}}}}}' post :create, params: { query: query, team: t2.slug } assert_response :success response = JSON.parse(@response.body)['data']['search'] diff --git a/test/controllers/graphql_controller_6_test.rb b/test/controllers/graphql_controller_6_test.rb index 6c752783a3..ca283d99ea 100644 --- a/test/controllers/graphql_controller_6_test.rb +++ b/test/controllers/graphql_controller_6_test.rb @@ -39,73 +39,40 @@ def teardown assert_not_nil json_response.dig('data', 'team', 'team_bot_installation', 'smooch_enabled_integrations') end - test "should search using OR or AND on PG" do + test "should search using OR or AND" do + setup_elasticsearch + RequestStore.store[:skip_cached_field_update] = false t = create_team - p1 = create_project team: t - p2 = create_project team: t u = create_user + u2 = create_user create_team_user team: t, user: u, role: 'admin' authenticate_with_user(u) - - pm1 = create_project_media team: t, project: p1, read: true - pm2 = create_project_media team: t, project: p2, read: false - - query = 'query CheckSearch { search(query: "{\"operator\":\"AND\",\"read\":true,\"projects\":[' + p2.id.to_s + ']}") { medias(first: 20) { edges { node { dbid } } } } }' + pm1 = create_project_media team: t, user: u, read: true, disable_es_callbacks: false + pm2 = create_project_media team: t, user: u2, read: false, disable_es_callbacks: false + # PG + query = 'query CheckSearch { search(query: "{\"operator\":\"AND\",\"read\":true,\"users\":[' + u2.id.to_s + ']}") { medias(first: 20) { edges { node { dbid } } } } }' post :create, params: { query: query, team: t.slug } assert_response :success assert_equal [], JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |e| e['node']['dbid'] } - - query = 'query CheckSearch { search(query: "{\"operator\":\"OR\",\"read\":true,\"projects\":[' + p2.id.to_s + ']}") { medias(first: 20) { edges { node { dbid } } } } }' + query = 'query CheckSearch { search(query: "{\"operator\":\"OR\",\"read\":true,\"users\":[' + u2.id.to_s + ']}") { medias(first: 20) { edges { node { dbid } } } } }' post :create, params: { query: query, team: t.slug } assert_response :success assert_equal [pm1.id, pm2.id].sort, JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |e| e['node']['dbid'] }.sort - end - - test "should search using OR or AND on ES" do - setup_elasticsearch - RequestStore.store[:skip_cached_field_update] = false - t = create_team - p1 = create_project team: t - p2 = create_project team: t - u = create_user - create_team_user team: t, user: u, role: 'admin' - authenticate_with_user(u) - - pm1 = create_project_media team: t, project: p1, read: true, disable_es_callbacks: false - pm2 = create_project_media team: t, project: p2, read: false, disable_es_callbacks: false - - query = 'query CheckSearch { search(query: "{\"operator\":\"AND\",\"read\":[1],\"projects\":[' + p2.id.to_s + '],\"report_status\":\"unpublished\"}") { medias(first: 20) { edges { node { dbid } } } } }' + # ES + query = 'query CheckSearch { search(query: "{\"operator\":\"AND\",\"read\":[1],\"users\":[' + u2.id.to_s + '],\"report_status\":\"unpublished\"}") { medias(first: 20) { edges { node { dbid } } } } }' post :create, params: { query: query, team: t.slug } assert_response :success assert_equal [], JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |e| e['node']['dbid'] } - - query = 'query CheckSearch { search(query: "{\"operator\":\"OR\",\"read\":[1],\"projects\":[' + p2.id.to_s + '],\"report_status\":\"unpublished\"}") { medias(first: 20) { edges { node { dbid } } } } }' + query = 'query CheckSearch { search(query: "{\"operator\":\"OR\",\"read\":[1],\"users\":[' + u2.id.to_s + '],\"report_status\":\"unpublished\"}") { medias(first: 20) { edges { node { dbid } } } } }' post :create, params: { query: query, team: t.slug } assert_response :success assert_equal [pm1.id, pm2.id].sort, JSON.parse(@response.body)['data']['search']['medias']['edges'].collect{ |e| e['node']['dbid'] }.sort end - test "should search by project" do - t = create_team - p = create_project team: t - u = create_user - create_team_user team: t, user: u, role: 'admin' - authenticate_with_user(u) - - create_project_media team: t, project: nil, project_id: nil - create_project_media project: p - - query = 'query CheckSearch { search(query: "{}") { medias(first: 20) { edges { node { dbid } } } } }' - post :create, params: { query: query, team: t.slug } - assert_response :success - assert_equal 2, JSON.parse(@response.body)['data']['search']['medias']['edges'].size - end - test "should search by similar image on PG" do t = create_team u = create_user is_admin: true authenticate_with_user(u) - pm = create_project_media team: t Bot::Alegre.stubs(:get_items_with_similar_media_v2).returns({ pm.id => 0.8 }) @@ -124,13 +91,11 @@ def teardown t = create_team u = create_user is_admin: true authenticate_with_user(u) - m = create_claim_media quote: 'Test' m2 = create_claim_media quote: 'Another Test' pm = create_project_media team: t, media: m pm2 = create_project_media team: t, media: m2 sleep 2 - Bot::Alegre.stubs(:get_items_with_similar_media_v2).returns({ pm.id => 0.8 }) path = File.join(Rails.root, 'test', 'data', 'rails.png') file = Rack::Test::UploadedFile.new(path, 'image/png') @@ -146,7 +111,6 @@ def teardown t = create_team u = create_user is_admin: true authenticate_with_user(u) - path = File.join(Rails.root, 'test', 'data', 'rails.png') file = Rack::Test::UploadedFile.new(path, 'image/png') query = 'mutation { searchUpload(input: {}) { file_handle, file_url } }' diff --git a/test/lib/team_statistics_test.rb b/test/lib/team_statistics_test.rb index 7cd7a46f61..ca164c628e 100644 --- a/test/lib/team_statistics_test.rb +++ b/test/lib/team_statistics_test.rb @@ -96,7 +96,7 @@ def teardown sleep 2 object = TeamStatistics.new(@team, 'past_week', 'en') - expected = [{ id: fc2.id, label: 'Foo', value: 2 }, { id: fc1.id, label: 'Bar', value: 1 }] + expected = [{ id: pm2.fact_check_id, label: 'Foo', value: 2 }, { id: pm1.fact_check_id, label: 'Bar', value: 1 }] assert_equal expected, object.top_articles_sent end diff --git a/test/models/bot/smooch_5_test.rb b/test/models/bot/smooch_5_test.rb index 0321dca79f..93eef03afe 100644 --- a/test/models/bot/smooch_5_test.rb +++ b/test/models/bot/smooch_5_test.rb @@ -67,18 +67,18 @@ def teardown # Get feed data scoped by teams that are part of the feed, taking into account the filters for the feed # and for each team participating in the feed with_current_user_and_team(u, t1) do - # Keyword search - assert_equal [pm1a, pm1f, pm2a].sort, Bot::Smooch.search_for_similar_published_fact_checks('text', 'Test', [t1.id, t2.id, t3.id, t4.id], nil, f1.id).to_a.sort - + result = Bot::Smooch.search_for_similar_published_fact_checks('text', 'Test', [t1.id, t2.id, t3.id, t4.id], nil, f1.id).map(&:id) + assert_equal [pm1a.id, pm1f.id, pm2a.id].sort, result.sort # Text similarity search - assert_equal [pm1a, pm1d, pm2a], Bot::Smooch.search_for_similar_published_fact_checks('text', 'This is a test', [t1.id, t2.id, t3.id, t4.id], nil, f1.id).to_a - + result = Bot::Smooch.search_for_similar_published_fact_checks('text', 'This is a test', [t1.id, t2.id, t3.id, t4.id], nil, f1.id).map(&:id) + assert_equal [pm1a.id, pm1d.id, pm2a.id].sort, result.sort # Media similarity search - assert_equal [pm1a, pm1d, pm2a], Bot::Smooch.search_for_similar_published_fact_checks('image', random_url, [t1.id, t2.id, t3.id, t4.id], nil, f1.id).to_a - + result = Bot::Smooch.search_for_similar_published_fact_checks('image', random_url, [t1.id, t2.id, t3.id, t4.id], nil, f1.id).map(&:id) + assert_equal [pm1a.id, pm1d.id, pm2a.id], result.sort # URL search - assert_equal [pm1g, pm2b].sort, Bot::Smooch.search_for_similar_published_fact_checks('text', "Test with URL: #{url}", [t1.id, t2.id, t3.id, t4.id], nil, f1.id).to_a.sort + result = Bot::Smooch.search_for_similar_published_fact_checks('text', "Test with URL: #{url}", [t1.id, t2.id, t3.id, t4.id], nil, f1.id).map(&:id) + assert_equal [pm1g.id, pm2b.id].sort, result.sort end Bot::Alegre.unstub(:get_merged_similar_items) diff --git a/test/models/project_media_test.rb b/test/models/project_media_test.rb index cb8de03b95..21ebbda9fe 100644 --- a/test/models/project_media_test.rb +++ b/test/models/project_media_test.rb @@ -12,20 +12,14 @@ def setup test "should query media" do setup_elasticsearch t = create_team - p = create_project team: t - p1 = create_project team: t - p2 = create_project team: t - pm = create_project_media team: t, project_id: p.id, disable_es_callbacks: false - create_project_media team: t, project_id: p1.id, disable_es_callbacks: false - create_project_media team: t, archived: CheckArchivedFlags::FlagCodes::TRASHED, project_id: p.id, disable_es_callbacks: false - pm = create_project_media team: t, project_id: p1.id, disable_es_callbacks: false - create_relationship source_id: pm.id, target_id: create_project_media(team: t, project_id: p.id, disable_es_callbacks: false).id, relationship_type: Relationship.confirmed_type + pm = create_project_media team: t, disable_es_callbacks: false + create_project_media team: t, disable_es_callbacks: false + create_project_media team: t, archived: CheckArchivedFlags::FlagCodes::TRASHED, disable_es_callbacks: false + pm = create_project_media team: t, disable_es_callbacks: false + create_relationship source_id: pm.id, target_id: create_project_media(team: t, disable_es_callbacks: false).id, relationship_type: Relationship.confirmed_type sleep 2 assert_equal 3, CheckSearch.new({ team_id: t.id }.to_json, nil, t.id).medias.size assert_equal 4, CheckSearch.new({ show_similar: true, team_id: t.id }.to_json, nil, t.id).medias.size - assert_equal 2, CheckSearch.new({ team_id: t.id, projects: [p1.id] }.to_json, nil, t.id).medias.size - assert_equal 0, CheckSearch.new({ team_id: t.id, projects: [p2.id] }.to_json, nil, t.id).medias.size - assert_equal 1, CheckSearch.new({ team_id: t.id, projects: [p1.id], eslimit: 1 }.to_json, nil, t.id).medias.size end test "should handle indexing conflicts" do