-
Notifications
You must be signed in to change notification settings - Fork 248
Expand file tree
/
Copy pathtest_helper.rb
More file actions
96 lines (74 loc) · 2.51 KB
/
Copy pathtest_helper.rb
File metadata and controls
96 lines (74 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# frozen_string_literal: true
require 'securerandom'
ENV['RAILS_ENV'] = 'test'
ENV['WITH_ADVISORY_LOCK_PREFIX'] ||= SecureRandom.hex
require 'dotenv'
Dotenv.load
require_relative 'dummy/config/environment'
require 'rails/test_help'
require 'with_advisory_lock'
require 'minitest/autorun'
require 'database_cleaner'
require 'database_cleaner/active_record'
require 'support/query_counter'
require 'parallel'
require 'timecop'
# Configure parallel tests
Thread.abort_on_exception = true
class ActiveSupport::TestCase
# Configure DatabaseCleaner
self.use_transactional_tests = false
parallelize(workers: 1)
def self.startup
# Validate environment variables when tests actually start running
%w[DATABASE_URL_PG DATABASE_URL_MYSQL].each do |var|
warn "Warning: Missing environment variable: #{var}" if ENV[var].nil? || ENV[var].empty?
end
end
setup do
# Configure DatabaseCleaner for each database connection
DatabaseCleaner[:active_record, db: ApplicationRecord].strategy = :truncation
DatabaseCleaner[:active_record, db: SecondaryRecord].strategy = :truncation
DatabaseCleaner[:active_record, db: LiteRecord].strategy = :truncation
DatabaseCleaner.start
end
teardown do
DatabaseCleaner.clean
end
def exceed_query_limit(num, &)
counter = QueryCounter.new
ActiveSupport::Notifications.subscribed(counter.to_proc, 'sql.active_record', &)
assert counter.query_count <= num, "Expected to run maximum #{num} queries, but ran #{counter.query_count}"
end
class QueryCounter
attr_reader :query_count
def initialize
@query_count = 0
end
def to_proc
method(:callback)
end
def callback(_name, _start, _finish, _message_id, values)
@query_count += 1 unless %w[CACHE SCHEMA].include?(values[:name])
end
end
end
# Helper methods available globally
def env_db(connection = ActiveRecord::Base.connection)
connection.adapter_name.downcase.to_sym
end
def sqlite?(connection = ActiveRecord::Base.connection)
env_db(connection) == :sqlite3
end
def postgresql?(connection = ActiveRecord::Base.connection)
env_db(connection) == :postgresql
end
def mysql?(connection = ActiveRecord::Base.connection)
%i[mysql2 trilogy].include?(env_db(connection))
end
# Load support files
require_relative 'support/query_counter'
# Include QueryCounter in Minitest
Minitest::Test.include QueryCounter
puts "Testing ActiveRecord #{ActiveRecord.gem_version} and Ruby #{RUBY_VERSION}"
puts "Connection Pool size: #{ActiveRecord::Base.connection_pool.size}"