1 ENV["RAILS_ENV"] = "test" if (ENV["RAILS_ENV"] != "diagnostics" and ENV["RAILS_ENV"] != "performance")
3 unless ENV["NO_COVERAGE_TEST"]
6 require 'simplecov-rcov'
7 class SimpleCov::Formatter::MergedFormatter
9 SimpleCov::Formatter::HTMLFormatter.new.format(result)
10 SimpleCov::Formatter::RcovFormatter.new.format(result)
13 SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
16 add_filter 'initializers/secret_token'
19 $stderr.puts "SimpleCov unavailable (#{e}). Proceeding without."
23 require File.expand_path('../../config/environment', __FILE__)
24 require 'rails/test_help'
25 require 'mocha/mini_test'
27 class ActiveSupport::TestCase
28 # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in
31 # Note: You'll currently still have to declare fixtures explicitly
32 # in integration tests -- they do not yet inherit this setting
34 def use_token token_name
35 was = Thread.current[:arvados_api_token]
36 auth = api_fixture('api_client_authorizations')[token_name.to_s]
37 Thread.current[:arvados_api_token] = auth['api_token']
40 Thread.current[:arvados_api_token] = was
45 Thread.current[:arvados_api_token] = nil
46 Thread.current[:user] = nil
47 Thread.current[:reader_tokens] = nil
48 # Diagnostics suite doesn't run a server, so there's no cache to clear.
49 Rails.cache.clear unless (Rails.env == "diagnostics")
50 # Restore configuration settings changed during tests
51 self.class.reset_application_config
54 def self.reset_application_config
55 $application_config.each do |k,v|
57 Rails.configuration.send (k + '='), v
63 module ApiFixtureLoader
64 def self.included(base)
65 base.extend(ClassMethods)
70 def api_fixture(name, *keys)
71 # Returns the data structure from the named API server test fixture.
72 @@api_fixtures[name] ||= \
74 path = File.join(ApiServerForTests::ARV_API_SERVER_DIR,
75 'test', 'fixtures', "#{name}.yml")
77 trim_index = file.index('# Test Helper trims the rest of the file')
78 file = file[0, trim_index] if trim_index
81 keys.inject(@@api_fixtures[name]) { |hash, key| hash[key] }
84 def api_fixture(name, *keys)
85 self.class.api_fixture(name, *keys)
88 def find_fixture(object_class, name)
89 object_class.find(api_fixture(object_class.to_s.pluralize.underscore,
95 def stub_api_calls_with_body body, status_code=200
97 stubbed_client = ArvadosApiClient.new
98 stubbed_client.instance_eval do
99 resp.responds_like_instance_of HTTP::Message
100 resp.stubs(:content).returns body
101 resp.stubs(:status_code).returns status_code
102 @api_client = HTTPClient.new
103 @api_client.stubs(:post).returns resp
105 ArvadosApiClient.stubs(:new_or_current).returns(stubbed_client)
108 def stub_api_calls_with_invalid_json
109 stub_api_calls_with_body ']"omg,bogus"['
113 class ActiveSupport::TestCase
114 include ApiMockHelpers
117 class ActiveSupport::TestCase
118 include ApiFixtureLoader
119 def session_for api_client_auth_name
121 arvados_api_token: api_fixture('api_client_authorizations')[api_client_auth_name.to_s]['api_token']
125 Oj.load(@response.body)
129 class ApiServerForTests
130 PYTHON_TESTS_DIR = File.expand_path('../../../../sdk/python/tests', __FILE__)
131 ARV_API_SERVER_DIR = File.expand_path('../../../../services/api', __FILE__)
132 SERVER_PID_PATH = File.expand_path('tmp/pids/test-server.pid', ARV_API_SERVER_DIR)
133 WEBSOCKET_PID_PATH = File.expand_path('tmp/pids/test-server.pid', ARV_API_SERVER_DIR)
134 @main_process_pid = $$
135 @@server_is_running = false
139 Bundler.with_clean_env do
140 output = IO.popen *args do |io|
144 raise RuntimeError, "Command failed (#{$?}): #{args.inspect}"
152 Dir.chdir PYTHON_TESTS_DIR do
153 env_script = check_call %w(python ./run_test_server.py start --auth admin)
156 env_script.each_line do |line|
158 if 0 == line.index('export ')
159 toks = line.sub('export ', '').split '=', 2
160 $stderr.puts "run_test_server.py: #{toks[0]}=#{toks[1]}"
161 test_env[toks[0]] = toks[1]
168 Dir.chdir PYTHON_TESTS_DIR do
169 # This is a no-op if we're running within run-tests.sh
170 check_call %w(python ./run_test_server.py stop)
172 @@server_is_running = false
176 return if @@server_is_running
178 # Stop server left over from interrupted previous run
181 ::MiniTest.after_run do
185 test_env = run_test_server
186 $application_config['arvados_login_base'] = "https://#{test_env['ARVADOS_API_HOST']}/login"
187 $application_config['arvados_v1_base'] = "https://#{test_env['ARVADOS_API_HOST']}/arvados/v1"
188 $application_config['arvados_insecure_host'] = true
189 ActiveSupport::TestCase.reset_application_config
191 @@server_is_running = true
194 def run_rake_task task_name, arg_string
195 Dir.chdir ARV_API_SERVER_DIR do
196 check_call ['bundle', 'exec', 'rake', "#{task_name}[#{arg_string}]"]
201 class ActionController::TestCase
206 def check_counter action
209 assert_equal 1, 2, "Multiple actions in controller test"
213 [:get, :post, :put, :patch, :delete].each do |method|
214 define_method method do |action, *args|
221 # Test classes can call reset_api_fixtures(when_to_reset,flag) to
222 # override the default. Example:
224 # class MySuite < ActionDispatch::IntegrationTest
225 # reset_api_fixtures :after_each_test, false
226 # reset_api_fixtures :after_suite, true
230 # The default behavior is reset_api_fixtures(:after_each_test,true).
232 class ActiveSupport::TestCase
234 def self.inherited subclass
235 subclass.class_eval do
237 attr_accessor :want_reset_api_fixtures
239 @want_reset_api_fixtures = {
240 after_each_test: true,
247 # Existing subclasses of ActiveSupport::TestCase (ones that already
248 # existed before we set up the self.inherited hook above) will not
249 # get their own instance variable. They're not real test cases
250 # anyway, so we give them a "don't reset anywhere" stub.
251 def self.want_reset_api_fixtures
255 def self.reset_api_fixtures where, t=true
256 if not want_reset_api_fixtures.has_key? where
257 raise ArgumentError, "There is no #{where.inspect} hook"
259 self.want_reset_api_fixtures[where] = t
263 reset_api_fixtures_now if want_reset_api_fixtures[:before_suite]
265 reset_api_fixtures_now if want_reset_api_fixtures[:after_suite]
270 if self.class.want_reset_api_fixtures[:after_each_test]
271 self.class.reset_api_fixtures_now
277 def self.reset_api_fixtures_now
278 # Never try to reset fixtures when we're just using test
279 # infrastructure to run performance/diagnostics suites.
280 return unless Rails.env == 'test'
282 auth = api_fixture('api_client_authorizations')['admin_trustedclient']
283 Thread.current[:arvados_api_token] = auth['api_token']
284 ArvadosApiClient.new.api(nil, '../../database/reset', {})
285 Thread.current[:arvados_api_token] = nil
289 # If it quacks like a duck, it must be a HTTP request object.
306 # apps/workbench$ RAILS_ENV=test bundle exec irb -Ilib:test
307 # > load 'test/test_helper.rb'
308 # > singletest 'integration/collection_upload_test.rb', 'Upload two empty files'
310 def singletest test_class_file, test_name
311 load File.join('test', test_class_file)
312 Minitest.run ['-v', '-n', "test_#{test_name.gsub ' ', '_'}"]
313 Object.send(:remove_const,
314 test_class_file.gsub(/.*\/|\.rb$/, '').camelize.to_sym)
315 ::Minitest::Runnable.runnables.reject! { true }
318 if ENV["RAILS_ENV"].eql? 'test'
319 ApiServerForTests.new.run
320 ApiServerForTests.new.run ["--websockets"]
323 # Reset fixtures now (i.e., before any tests run).
324 ActiveSupport::TestCase.reset_api_fixtures_now