2023-02-22 11:55:31 +11:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-05-10 00:59:58 +10:00
|
|
|
if ENV['DISABLE_SIMPLECOV'] != 'true'
|
|
|
|
require 'simplecov'
|
|
|
|
SimpleCov.start 'rails' do
|
2023-07-12 17:51:59 +10:00
|
|
|
add_filter 'lib/linter'
|
2023-02-28 02:35:47 +11:00
|
|
|
add_group 'Policies', 'app/policies'
|
2018-05-10 00:59:58 +10:00
|
|
|
add_group 'Presenters', 'app/presenters'
|
2023-02-28 02:35:47 +11:00
|
|
|
add_group 'Serializers', 'app/serializers'
|
|
|
|
add_group 'Services', 'app/services'
|
2018-05-10 00:59:58 +10:00
|
|
|
add_group 'Validators', 'app/validators'
|
|
|
|
end
|
2016-02-25 10:17:01 +11:00
|
|
|
end
|
|
|
|
|
|
|
|
RSpec.configure do |config|
|
2023-02-19 09:38:14 +11:00
|
|
|
config.example_status_persistence_file_path = 'tmp/rspec/examples.txt'
|
2016-02-25 10:17:01 +11:00
|
|
|
config.expect_with :rspec do |expectations|
|
|
|
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
|
|
|
end
|
|
|
|
|
|
|
|
config.mock_with :rspec do |mocks|
|
|
|
|
mocks.verify_partial_doubles = true
|
2017-04-16 11:40:33 +10:00
|
|
|
|
|
|
|
config.around(:example, :without_verify_partial_doubles) do |example|
|
|
|
|
mocks.verify_partial_doubles = false
|
|
|
|
example.call
|
|
|
|
mocks.verify_partial_doubles = true
|
|
|
|
end
|
2016-02-25 10:17:01 +11:00
|
|
|
end
|
2016-09-06 01:46:36 +10:00
|
|
|
|
2018-02-10 09:04:47 +11:00
|
|
|
config.before :suite do
|
2019-07-19 09:44:42 +10:00
|
|
|
Rails.application.load_seed
|
2018-02-10 09:04:47 +11:00
|
|
|
Chewy.strategy(:bypass)
|
|
|
|
end
|
|
|
|
|
2017-01-29 22:25:10 +11:00
|
|
|
config.after :suite do
|
2023-05-04 13:50:40 +10:00
|
|
|
FileUtils.rm_rf(Dir[Rails.root.join('spec', 'test_files')])
|
2016-09-06 01:46:36 +10:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def body_as_json
|
|
|
|
json_str_to_hash(response.body)
|
|
|
|
end
|
|
|
|
|
|
|
|
def json_str_to_hash(str)
|
2016-09-22 06:07:18 +10:00
|
|
|
JSON.parse(str, symbolize_names: true)
|
2016-02-25 10:17:01 +11:00
|
|
|
end
|
2022-02-11 05:42:45 +11:00
|
|
|
|
|
|
|
def expect_push_bulk_to_match(klass, matcher)
|
|
|
|
expect(Sidekiq::Client).to receive(:push_bulk).with(hash_including({
|
2023-02-19 09:38:14 +11:00
|
|
|
'class' => klass,
|
|
|
|
'args' => matcher,
|
2022-02-11 05:42:45 +11:00
|
|
|
}))
|
|
|
|
end
|
2023-07-29 07:09:49 +10:00
|
|
|
|
|
|
|
class StreamingServerManager
|
|
|
|
@running_thread = nil
|
|
|
|
|
|
|
|
def initialize
|
|
|
|
at_exit { stop }
|
|
|
|
end
|
|
|
|
|
|
|
|
def start(port: 4020)
|
|
|
|
return if @running_thread
|
|
|
|
|
|
|
|
queue = Queue.new
|
|
|
|
|
|
|
|
@queue = queue
|
|
|
|
|
|
|
|
@running_thread = Thread.new do
|
|
|
|
Open3.popen2e(
|
|
|
|
{
|
|
|
|
'REDIS_NAMESPACE' => ENV.fetch('REDIS_NAMESPACE'),
|
|
|
|
'DB_NAME' => "#{ENV.fetch('DB_NAME', 'mastodon')}_test#{ENV.fetch('TEST_ENV_NUMBER', '')}",
|
|
|
|
'RAILS_ENV' => ENV.fetch('RAILS_ENV', 'test'),
|
|
|
|
'NODE_ENV' => ENV.fetch('STREAMING_NODE_ENV', 'development'),
|
|
|
|
'PORT' => port.to_s,
|
|
|
|
},
|
|
|
|
'node index.js', # must not call yarn here, otherwise it will fail because yarn does not send signals to its child process
|
|
|
|
chdir: Rails.root.join('streaming')
|
|
|
|
) do |_stdin, stdout_err, process_thread|
|
|
|
|
status = :starting
|
|
|
|
|
|
|
|
# Spawn a thread to listen on streaming server output
|
|
|
|
output_thread = Thread.new do
|
|
|
|
stdout_err.each_line do |line|
|
|
|
|
Rails.logger.info "Streaming server: #{line}"
|
|
|
|
|
|
|
|
if status == :starting && line.match('Streaming API now listening on')
|
|
|
|
status = :started
|
|
|
|
@queue.enq 'started'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# And another thread to listen on commands from the main thread
|
|
|
|
loop do
|
|
|
|
msg = queue.pop
|
|
|
|
|
|
|
|
case msg
|
|
|
|
when 'stop'
|
|
|
|
# we need to properly stop the reading thread
|
|
|
|
output_thread.kill
|
|
|
|
|
|
|
|
# Then stop the node process
|
|
|
|
Process.kill('KILL', process_thread.pid)
|
|
|
|
|
|
|
|
# And we stop ourselves
|
|
|
|
@running_thread.kill
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# wait for 10 seconds for the streaming server to start
|
|
|
|
Timeout.timeout(10) do
|
|
|
|
loop do
|
|
|
|
break if @queue.pop == 'started'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def stop
|
|
|
|
return unless @running_thread
|
|
|
|
|
|
|
|
@queue.enq 'stop'
|
|
|
|
|
|
|
|
# Wait for the thread to end
|
|
|
|
@running_thread.join
|
|
|
|
end
|
|
|
|
end
|
2023-09-09 00:17:55 +10:00
|
|
|
|
|
|
|
class SearchDataManager
|
|
|
|
def prepare_test_data
|
|
|
|
4.times do |i|
|
|
|
|
username = "search_test_account_#{i}"
|
|
|
|
account = Fabricate.create(:account, username: username, indexable: i.even?, discoverable: i.even?, note: "Lover of #{i}.")
|
|
|
|
2.times do |j|
|
|
|
|
Fabricate.create(:status, account: account, text: "#{username}'s #{j} post", visibility: j.even? ? :public : :private)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
3.times do |i|
|
|
|
|
Fabricate.create(:tag, name: "search_test_tag_#{i}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def indexes
|
|
|
|
[
|
|
|
|
AccountsIndex,
|
|
|
|
PublicStatusesIndex,
|
|
|
|
StatusesIndex,
|
|
|
|
TagsIndex,
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def populate_indexes
|
|
|
|
indexes.each do |index_class|
|
|
|
|
index_class.purge!
|
|
|
|
index_class.import!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def remove_indexes
|
|
|
|
indexes.each(&:delete!)
|
|
|
|
end
|
|
|
|
|
|
|
|
def cleanup_test_data
|
|
|
|
Status.destroy_all
|
|
|
|
Account.destroy_all
|
|
|
|
Tag.destroy_all
|
|
|
|
end
|
|
|
|
end
|