forked from shakacode/react-webpack-rails-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrails_helper.rb
200 lines (166 loc) · 7.49 KB
/
rails_helper.rb
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# This file is copied to spec/ when you run "rails generate rspec:install"
ENV["RAILS_ENV"] ||= "test"
require "coveralls"
Coveralls.wear!("rails") # must occur before any of your application code is required
require "spec_helper"
require File.expand_path("../../config/environment", __FILE__)
require "rspec/rails"
require "capybara/rspec"
require "capybara/poltergeist"
require "capybara-screenshot/rspec"
require "database_cleaner"
# Add additional requires below this line. Rails is not loaded until this point!
# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!
# Requires supporting files with custom matchers and macros, etc,
# in ./support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
# Next line will ensure that assets are built if webpack -w is not running
ReactOnRails::TestHelper.configure_rspec_to_compile_assets(config, :feature_spec)
# Because we're using some CSS Webpack files, we need to ensure the webpack files are generated
# for all feature specs. https://github.com/shakacode/react_on_rails/issues/792
config.define_derived_metadata(file_path: %r{spec/features}) do |metadata|
metadata[:feature_spec] = true
end
# For Poltergeist
# Turning animations off results in about a 10 sec difference:
# Using errors_ok as there is a timing issue causing crashes without this setting
# https://github.com/teampoltergeist/poltergeist/issues/830
default_driver = :poltergeist_no_animations
supported_drivers = %i( poltergeist poltergeist_errors_ok
poltergeist_no_animations webkit
selenium_chrome selenium_firefox selenium)
driver = ENV["DRIVER"].try(:to_sym) || default_driver
Capybara.default_driver = driver
unless supported_drivers.include?(driver)
raise "Unsupported driver: #{driver} (supported = #{supported_drivers})"
end
case driver
when :poltergeist, :poltergeist_errors_ok, :poltergeist_no_animations
basic_opts = {
window_size: [1300, 1800],
screen_size: [1400, 1900],
phantomjs_options: ["--load-images=no", "--ignore-ssl-errors=true"],
timeout: 180
}
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, basic_opts)
end
no_animation_opts = basic_opts.merge( # Leaving animations off, as a sleep was still needed.
extensions: ["#{Rails.root}/spec/support/phantomjs-disable-animations.js"]
)
Capybara.register_driver :poltergeist_no_animations do |app|
Capybara::Poltergeist::Driver.new(app, no_animation_opts)
end
Capybara.register_driver :poltergeist_errors_ok do |app|
Capybara::Poltergeist::Driver.new(app, no_animation_opts.merge(js_errors: false))
end
Capybara::Screenshot.register_driver(:poltergeist) do |js_driver, path|
js_driver.browser.save_screenshot(path)
end
Capybara::Screenshot.register_driver(:poltergeist_no_animations) do |js_driver, path|
js_driver.render(path, full: true)
end
Capybara::Screenshot.register_driver(:poltergeist_errors_ok) do |js_driver, path|
js_driver.render(path, full: true)
end
when :selenium_chrome
DriverRegistration.register_selenium_chrome
when :selenium_firefox, :selenium
DriverRegistration.register_selenium_firefox
driver = :selenium_firefox
end
Capybara.javascript_driver = driver
Capybara.default_driver = driver
Capybara.register_server(Capybara.javascript_driver) do |app, port|
require "rack/handler/puma"
Rack::Handler::Puma.run(app, Port: port)
end
# Capybara.default_max_wait_time = 15
puts "Capybara using driver: #{Capybara.javascript_driver}"
Capybara.save_path = Rails.root.join("tmp", "capybara")
Capybara::Screenshot.prune_strategy = { keep: 10 }
config.use_transactional_fixtures = false
config.before(:suite) do
if config.use_transactional_fixtures?
raise(<<-MSG)
Delete line `config.use_transactional_fixtures = true` from rails_helper.rb
(or set it to false) to prevent uncommitted transactions being used in
JavaScript-dependent specs.
During testing, the app-under-test that the browser driver connects to
uses a different database connection to the database connection used by
the spec. The app's database connection would not be able to access
uncommitted transaction data setup over the spec's database connection.
MSG
end
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, type: :feature) do
# :rack_test driver's Rack app under test shares database connection
# with the specs, so continue to use transaction strategy for speed.
driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test
unless driver_shares_db_connection_with_specs
# Driver is probably for an external browser with an app
# under test that does *not* share a database connection with the
# specs, so use truncation strategy.
DatabaseCleaner.strategy = :truncation
end
end
config.before(:each) do
DatabaseCleaner.start
end
config.append_after(:each) do
DatabaseCleaner.clean
Capybara.reset_sessions!
end
# RSpec Rails can automatically mix in different behaviours to your tests
# based on their file location, for example enabling you to call `get` and
# `post` in specs under `spec/controllers`.
#
# You can disable this behaviour by removing the line below, and instead
# explicitly tag your specs with their type, e.g.:
#
# RSpec.describe UsersController, :type => :controller do
# # ...
# end
#
# The different available types are documented in the features, such as in
# https://relishapp.com/rspec/rspec-rails/docs
config.infer_spec_type_from_file_location!
# This will insert a <base> tag with the asset host into the pages created by
# save_and_open_page, meaning that relative links will be loaded from the
# development server if it is running.
Capybara.asset_host = "http://localhost:3000"
def js_errors_driver
Capybara.javascript_driver == :poltergeist ? :poltergeist_errors_ok : Capybara.javascript_driver
end
def js_selenium_driver
driver = Capybara.javascript_driver == :selenium_firefox ? :selenium_firefox : :selenium_chrome
if driver == :selenium_firefox
DriverRegistration.register_selenium_firefox
else
DriverRegistration.register_selenium_chrome
end
driver
end
end