workbench: Add integration test helper module.
authorBrett Smith <brett@curoverse.com>
Wed, 19 Mar 2014 15:44:49 +0000 (11:44 -0400)
committerBrett Smith <brett@curoverse.com>
Wed, 19 Mar 2014 16:25:16 +0000 (12:25 -0400)
This provide a base test class that provides the Capybara DSL and a
couple of convenience methods.  It also specifies a test runner class
that sets up the API server consistently, with the proper environment.

apps/workbench/test/integration_helper.rb [new file with mode: 0644]

diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb
new file mode 100644 (file)
index 0000000..b6467b5
--- /dev/null
@@ -0,0 +1,59 @@
+require 'test_helper'
+require 'capybara/rails'
+require 'uri'
+require 'yaml'
+
+$ARV_API_SERVER_DIR = File.expand_path('../../../../services/api', __FILE__)
+
+class ActionDispatch::IntegrationTest
+  # Make the Capybara DSL available in all integration tests
+  include Capybara::DSL
+
+  def self.api_fixture(name)
+    # Returns the data structure from the named API server test fixture.
+    path = File.join($ARV_API_SERVER_DIR, 'test', 'fixtures', "#{name}.yml")
+    YAML.load(IO.read(path))
+  end
+
+  @@API_AUTHS = api_fixture('api_client_authorizations')
+
+  def page_with_token(token, path='/')
+    # Generate a page path with an embedded API token.
+    # Typical usage: visit page_with_token('token_name', page)
+    # The token can be specified by the name of an api_client_authorizations
+    # fixture, or passed as a raw string.
+    api_token = ((@@API_AUTHS.include? token) ?
+                 @@API_AUTHS[token]['api_token'] : token)
+    sep = (path.include? '?') ? '&' : '?'
+    q_string = URI.encode_www_form('api_token' => api_token)
+    "#{path}#{sep}#{q_string}"
+  end
+end
+
+class IntegrationTestRunner < MiniTest::Unit
+  # Launch the API server in test mode, with appropriate environment.
+  @@APIENV = {'RAILS_ENV' => 'test'}
+  ['GEM_HOME', 'GEM_PATH', 'PATH'].each { |key| @@APIENV[key] = ENV[key] }
+
+  def _system(*cmd)
+    if not system(@@APIENV, *cmd, {unsetenv_others: true})
+      raise RuntimeError, "#{cmd[0]} returned exit code #{$?.exitstatus}"
+    end
+  end
+
+  def _run(args=[])
+    server_pid = Dir.chdir($ARV_API_SERVER_DIR) do |apidir|
+      _system('bundle', 'exec', 'rake', 'db:test:load')
+      _system('bundle', 'exec', 'rake', 'db:fixtures:load')
+      _system('bundle', 'exec', 'rails', 'server', '-d')
+      `cat tmp/pids/server.pid`.to_i
+    end
+    begin
+      super(args)
+    ensure
+      Process.kill('TERM', server_pid)
+    end
+  end
+end
+
+MiniTest::Unit.runner = IntegrationTestRunner.new