diff --git a/test/models/card/searchable_test.rb b/test/models/card/searchable_test.rb index 33f55673a..546418023 100644 --- a/test/models/card/searchable_test.rb +++ b/test/models/card/searchable_test.rb @@ -1,28 +1,48 @@ require "test_helper" class Card::SearchableTest < ActiveSupport::TestCase + self.use_transactional_tests = false + setup do - Card.all.each(&:reindex) - Comment.all.each(&:reindex) + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy + + @account = Account.create!(name: "Search Test") + @user = User.create!(name: "Test User", account: @account) + @board = Board.create!(name: "Test Board", account: @account, creator: @user) end - test "searching by title" do - skip("TODO:PLANB: search") - assert_includes Card.mentioning("layout is broken"), cards(:layout) + teardown do + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy end - test "searching by comment" do - skip("TODO:PLANB: search") - assert_includes Card.mentioning("overflowing"), cards(:layout) - end + test "card search" do + # Searching by title + card = @board.cards.create!(title: "layout is broken", creator: @user) + results = Card.mentioning("layout", board_ids: [@board.id]) + assert_includes results, card - test "sanitizing search query" do - skip("TODO:PLANB: search") - assert_includes Card.mentioning("broken \""), cards(:layout) - end + # Searching by comment + card_with_comment = @board.cards.create!(title: "Some card", creator: @user) + card_with_comment.comments.create!(body: "overflowing text", creator: @user) + results = Card.mentioning("overflowing", board_ids: [@board.id]) + assert_includes results, card_with_comment - test "a search with no valid terms returns empty results" do - skip("TODO:PLANB: search") - assert_empty Card.mentioning("\"") + # Sanitizing search query + card_broken = @board.cards.create!(title: "broken layout", creator: @user) + results = Card.mentioning("broken \"", board_ids: [@board.id]) + assert_includes results, card_broken + + # Empty query returns no results + assert_empty Card.mentioning("\"", board_ids: [@board.id]) + + # Filtering by board_ids + other_board = Board.create!(name: "Other Board", account: @account, creator: @user) + card_in_board = @board.cards.create!(title: "searchable content", creator: @user) + card_in_other_board = other_board.cards.create!(title: "searchable content", creator: @user) + results = Card.mentioning("searchable", board_ids: [@board.id]) + assert_includes results, card_in_board + assert_not_includes results, card_in_other_board end end diff --git a/test/models/comment/searchable_test.rb b/test/models/comment/searchable_test.rb new file mode 100644 index 000000000..c8fe24c08 --- /dev/null +++ b/test/models/comment/searchable_test.rb @@ -0,0 +1,60 @@ +require "test_helper" + +class Comment::SearchableTest < ActiveSupport::TestCase + self.use_transactional_tests = false + + setup do + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy + + @account = Account.create!(name: "Search Test") + @user = User.create!(name: "Test User", account: @account) + @board = Board.create!(name: "Test Board", account: @account, creator: @user) + @card = @board.cards.create!(title: "Test Card", creator: @user) + end + + teardown do + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy + end + + test "comment search" do + # Comment is indexed on create + comment = @card.comments.create!(body: "searchable comment text", creator: @user) + result = ActiveRecord::Base.connection.execute( + "SELECT COUNT(*) FROM search_index WHERE searchable_type = 'Comment' AND searchable_id = #{comment.id}" + ).first[0] + assert_equal 1, result + + # Comment is updated in index + comment.update!(body: "updated text") + content = ActiveRecord::Base.connection.execute( + "SELECT content FROM search_index WHERE searchable_type = 'Comment' AND searchable_id = #{comment.id}" + ).first[0] + assert_match /updat/, content + + # Comment is removed from index on destroy + comment_id = comment.id + comment.destroy + result = ActiveRecord::Base.connection.execute( + "SELECT COUNT(*) FROM search_index WHERE searchable_type = 'Comment' AND searchable_id = #{comment_id}" + ).first[0] + assert_equal 0, result + + # Finding cards via comment search + card_with_comment = @board.cards.create!(title: "Card One", creator: @user) + card_with_comment.comments.create!(body: "unique searchable phrase", creator: @user) + card_without_comment = @board.cards.create!(title: "Card Two", creator: @user) + results = Card.mentioning("searchable", board_ids: [@board.id]) + assert_includes results, card_with_comment + assert_not_includes results, card_without_comment + + # Comment stores parent card_id and board_id + new_comment = @card.comments.create!(body: "test comment", creator: @user) + row = ActiveRecord::Base.connection.execute( + "SELECT card_id, board_id FROM search_index WHERE searchable_type = 'Comment' AND searchable_id = #{new_comment.id}" + ).first + assert_equal @card.id, row[0] + assert_equal @board.id, row[1] + end +end diff --git a/test/models/search_test.rb b/test/models/search_test.rb index a4d499b06..c9d52c4c5 100644 --- a/test/models/search_test.rb +++ b/test/models/search_test.rb @@ -1,25 +1,47 @@ require "test_helper" class SearchTest < ActiveSupport::TestCase + self.use_transactional_tests = false + setup do - Card.all.each(&:reindex) - Comment.all.each(&:reindex) + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy - @user = users(:kevin) + @account = Account.create!(name: "Search Test") + @user = User.create!(name: "Test User", account: @account) + @board = Board.create!(name: "Test Board", account: @account, creator: @user) end - test "search cards and comments" do - skip("TODO:PLANB: search") - assert @user.search("layout").find { it.card == cards(:layout) } - assert @user.search("overflowing").find { it.comment == comments(:layout_overflowing_david) } + teardown do + ActiveRecord::Base.connection.execute "DELETE FROM search_index" + Account.find_by(name: "Search Test")&.destroy end - test "don't include innaccessible" do - boards(:writebook).update! all_access: false - boards(:writebook).accesses.revoke_from(@user) + test "search" do + # Search cards and comments + card = @board.cards.create!(title: "layout design", creator: @user) + comment_card = @board.cards.create!(title: "Some card", creator: @user) + comment_card.comments.create!(body: "overflowing text", creator: @user) - skip("TODO:PLANB: search") - assert_not @user.search("layout").find { it.card == cards(:layout) } - assert_not @user.search("overflowing").find { it.comment == comments(:layout_overflowing_david) } + results = Search.new(@user, "layout").results + assert results.find { |it| it.card_id == card.id } + + results = Search.new(@user, "overflowing").results + assert results.find { |it| it.card_id == comment_card.id && it.comment_id.present? } + + # Don't include inaccessible boards + other_user = User.create!(name: "Other User", account: @account) + inaccessible_board = Board.create!(name: "Inaccessible Board", account: @account, creator: other_user) + accessible_card = @board.cards.create!(title: "searchable content", creator: @user) + inaccessible_card = inaccessible_board.cards.create!(title: "searchable content", creator: other_user) + + results = Search.new(@user, "searchable").results + assert results.find { |it| it.card_id == accessible_card.id } + assert_not results.find { |it| it.card_id == inaccessible_card.id } + + # Empty board_ids returns no results + user_without_access = User.create!(name: "No Access User", account: @account) + results = Search.new(user_without_access, "anything").results + assert_empty results end end