From 7df97d7929364c7af53533b532c3e2f71614a39f Mon Sep 17 00:00:00 2001 From: Joe Ferris Date: Wed, 13 Jan 2010 15:48:34 -0500 Subject: [PATCH] Added a test for the installation process --- .gitignore | 1 + Rakefile | 32 ++++++++++-- features/rails.feature | 12 +++++ .../rails_application_steps.rb | 39 ++++++++++++++ features/support/env.rb | 12 +++++ features/support/hoptoad_shim.rb.template | 5 ++ features/support/terminal.rb | 51 +++++++++++++++++++ generators/hoptoad/hoptoad_generator.rb | 8 +-- init.rb | 1 - lib/hoptoad_notifier.rb | 1 + lib/hoptoad_notifier/rails.rb | 11 ++++ rails/init.rb | 12 +---- 12 files changed, 165 insertions(+), 20 deletions(-) create mode 100644 features/rails.feature create mode 100644 features/step_definitions/rails_application_steps.rb create mode 100644 features/support/env.rb create mode 100644 features/support/hoptoad_shim.rb.template create mode 100644 features/support/terminal.rb delete mode 100644 init.rb create mode 100644 lib/hoptoad_notifier/rails.rb diff --git a/.gitignore b/.gitignore index 8e833d9..0a447b9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ tags .yardoc doc pkg +*.gemspec diff --git a/Rakefile b/Rakefile index b83ae2e..0c5ad51 100644 --- a/Rakefile +++ b/Rakefile @@ -2,9 +2,10 @@ require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'rake/gempackagetask' +require 'cucumber/rake/task' desc 'Default: run unit tests.' -task :default => :test +task :default => [:test, :cucumber] desc 'Test the hoptoad_notifier gem.' Rake::TestTask.new(:test) do |t| @@ -29,8 +30,8 @@ begin rescue LoadError end -PLUGIN_ROOT = File.dirname(__FILE__).freeze -VERSION_FILE = File.join(PLUGIN_ROOT, 'lib', 'hoptoad_notifier', 'version') +GEM_ROOT = File.dirname(__FILE__).freeze +VERSION_FILE = File.join(GEM_ROOT, 'lib', 'hoptoad_notifier', 'version') require VERSION_FILE @@ -40,7 +41,7 @@ gemspec = Gem::Specification.new do |s| s.summary = %q{Send your application errors to our hosted service and reclaim your inbox.} s.files = FileList['[A-Z]*', 'generators/**/*.*', 'lib/**/*.rb', - 'test/**/*.rb', 'rails/**.*.rb', 'recipes/**/*.rb', + 'test/**/*.rb', 'rails/**/*.rb', 'recipes/**/*.rb', 'tasks/**/*.rake'] s.require_path = 'lib' s.test_files = Dir[*['test/**/*_test.rb']] @@ -71,3 +72,26 @@ task :gemspec do end end +LOCAL_GEM_ROOT = File.join(GEM_ROOT, 'tmp', 'local_gems').freeze +LOCAL_GEMS = %w(rails sham_rack) + +task :vendor_test_gems do + LOCAL_GEMS.each do |gem_name| + pattern = File.join(LOCAL_GEM_ROOT, 'gems', "#{gem_name}-*") + existing = Dir.glob(pattern).first + unless existing + command = "gem install -i #{LOCAL_GEM_ROOT} --no-ri --no-rdoc #{gem_name}" + puts "Vendoring #{gem_name}..." + unless system(command) + $stderr.puts "Command failed: #{command}" + end + end + end +end + +Cucumber::Rake::Task.new(:cucumber) do |t| + t.fork = true + t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')] +end + +task :cucumber => [:gemspec, :vendor_test_gems] diff --git a/features/rails.feature b/features/rails.feature new file mode 100644 index 0000000..1ddd66c --- /dev/null +++ b/features/rails.feature @@ -0,0 +1,12 @@ +Feature: Install the Gem in a Rails application + + Background: + Given I have built and installed the "hoptoad_notifier" gem + + Scenario: Use config.gem without vendoring the gem in a Rails application + When I generate a new Rails application + And I configure the Hoptoad shim + And I configure my application to require the "hoptoad_notifier" gem + And I run "script/generate hoptoad -k myapikey" + And I run "rake hoptoad:test --trace" + Then I should receive a Hoptoad notification diff --git a/features/step_definitions/rails_application_steps.rb b/features/step_definitions/rails_application_steps.rb new file mode 100644 index 0000000..e908995 --- /dev/null +++ b/features/step_definitions/rails_application_steps.rb @@ -0,0 +1,39 @@ +When /^I generate a new Rails application$/ do + @terminal.cd(TEMP_DIR) + @terminal.run("rails rails_root") +end + +Given /^I have installed the "([^\"]*)" gem$/ do |gem_name| + @terminal.install_gem(gem_name) +end + +Given /^I have built and installed the "([^\"]*)" gem$/ do |gem_name| + @terminal.build_and_install_gem(File.join(PROJECT_ROOT, "#{gem_name}.gemspec")) +end + +When /^I configure my application to require the "([^\"]*)" gem$/ do |gem_name| + path = File.join(RAILS_ROOT, 'config', 'environment.rb') + run = "Rails::Initializer.run do |config|" + insert = " config.gem '#{gem_name}'" + content = File.read(path) + if content.sub!(run, "#{run}\n#{insert}") + File.open(path, 'wb') { |file| file.write(content) } + else + raise "Couldn't find #{run.inspect} in #{path}" + end +end + +When /^I run "([^\"]*)"$/ do |command| + @terminal.cd(RAILS_ROOT) + @terminal.run(command) +end + +Then /^I should receive a Hoptoad notification$/ do + @terminal.output.should include("[Hoptoad] Success: Net::HTTPOK") +end + +When /^I configure the Hoptoad shim$/ do + shim_file = File.join(PROJECT_ROOT, 'features', 'support', 'hoptoad_shim.rb.template') + target = File.join(RAILS_ROOT, 'config', 'initializers', 'hoptoad_shim.rb') + FileUtils.cp(shim_file, target) +end diff --git a/features/support/env.rb b/features/support/env.rb new file mode 100644 index 0000000..c92e9a1 --- /dev/null +++ b/features/support/env.rb @@ -0,0 +1,12 @@ +PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze +TEMP_DIR = File.join(PROJECT_ROOT, 'tmp').freeze +RAILS_ROOT = File.join(TEMP_DIR, 'rails_root').freeze +BUILT_GEM_ROOT = File.join(TEMP_DIR, 'built_gems').freeze +LOCAL_GEM_ROOT = File.join(TEMP_DIR, 'local_gems').freeze + +Before do + FileUtils.mkdir_p(TEMP_DIR) + FileUtils.rm_rf(BUILT_GEM_ROOT) + FileUtils.rm_rf(RAILS_ROOT) + FileUtils.mkdir_p(BUILT_GEM_ROOT) +end diff --git a/features/support/hoptoad_shim.rb.template b/features/support/hoptoad_shim.rb.template new file mode 100644 index 0000000..427667a --- /dev/null +++ b/features/support/hoptoad_shim.rb.template @@ -0,0 +1,5 @@ +require 'sham_rack' + +ShamRack.at("hoptoadapp.com") do |env| + ["200 OK", { "Content-type" => "text/xml" }, ""] +end diff --git a/features/support/terminal.rb b/features/support/terminal.rb new file mode 100644 index 0000000..477ffed --- /dev/null +++ b/features/support/terminal.rb @@ -0,0 +1,51 @@ +Before do + @terminal = Terminal.new +end + +class Terminal + + attr_reader :output, :status + + def initialize + @cwd = FileUtils.pwd + @output = "" + @status = 0 + end + + def cd(directory) + @cwd = directory + end + + def run(command) + output << "#{command}\n" + FileUtils.cd(@cwd) do + result = `#{environment_settings} #{command} 2>&1` + output << result + end + @status = $? + end + + def build_and_install_gem(gemspec) + pkg_dir = File.join(TEMP_DIR, 'pkg') + FileUtils.mkdir_p(pkg_dir) + `gem build #{gemspec} 2>&1` + gem_file = Dir.glob("*.gem").first + target = File.join(pkg_dir, gem_file) + FileUtils.mv(gem_file, target) + install_gem_to(BUILT_GEM_ROOT, target) + end + + def install_gem(gem) + install_gem_to(LOCAL_GEM_ROOT, gem) + end + + private + + def install_gem_to(root, gem) + `gem install -i #{root} --no-ri --no-rdoc #{gem}` + end + + def environment_settings + "GEM_HOME=#{LOCAL_GEM_ROOT} GEM_PATH=#{LOCAL_GEM_ROOT}:#{BUILT_GEM_ROOT}" + end +end diff --git a/generators/hoptoad/hoptoad_generator.rb b/generators/hoptoad/hoptoad_generator.rb index ffe21d7..77cca6d 100644 --- a/generators/hoptoad/hoptoad_generator.rb +++ b/generators/hoptoad/hoptoad_generator.rb @@ -14,14 +14,14 @@ def manifest record do |m| m.directory 'lib/tasks' m.file 'hoptoad_notifier_tasks.rake', 'lib/tasks/hoptoad_notifier_tasks.rake' - if File.exists?('config/deploy.rb') - m.insert_into 'config/deploy.rb', "require 'hoptoad_notifier/recipes/hoptoad'" - end + # if File.exists?('config/deploy.rb') + # m.insert_into 'config/deploy.rb', "require 'hoptoad_notifier/recipes/hoptoad'" + # end unless options[:api_key].nil? m.template 'initializer.rb', 'config/initializers/hoptoad.rb', :assigns => {:api_key => options[:api_key]} end - m.rake "hoptoad:test", :generate_only => true + # m.rake "hoptoad:test", :generate_only => true end end end diff --git a/init.rb b/init.rb deleted file mode 100644 index 6dbfa4c..0000000 --- a/init.rb +++ /dev/null @@ -1 +0,0 @@ -require File.join(File.dirname(__FILE__), 'rails', 'init') diff --git a/lib/hoptoad_notifier.rb b/lib/hoptoad_notifier.rb index aef1ccc..62bdb22 100644 --- a/lib/hoptoad_notifier.rb +++ b/lib/hoptoad_notifier.rb @@ -2,6 +2,7 @@ require 'net/https' require 'rubygems' require 'active_support' +require 'hoptoad_notifier/version' require 'hoptoad_notifier/configuration' require 'hoptoad_notifier/notice' require 'hoptoad_notifier/sender' diff --git a/lib/hoptoad_notifier/rails.rb b/lib/hoptoad_notifier/rails.rb new file mode 100644 index 0000000..1e6ff74 --- /dev/null +++ b/lib/hoptoad_notifier/rails.rb @@ -0,0 +1,11 @@ +if defined?(ActionController::Base) && !ActionController::Base.include?(HoptoadNotifier::Catcher) + ActionController::Base.send(:include, HoptoadNotifier::Catcher) +end + +require 'hoptoad_notifier/rails_initializer' +HoptoadNotifier::RailsInitializer.initialize + +HoptoadNotifier.configure(true) do |config| + config.environment_name = RAILS_ENV + config.project_root = RAILS_ROOT +end diff --git a/rails/init.rb b/rails/init.rb index 9e9c5e0..bdf59f9 100644 --- a/rails/init.rb +++ b/rails/init.rb @@ -1,11 +1 @@ -if defined?(ActionController::Base) && !ActionController::Base.include?(HoptoadNotifier::Catcher) - ActionController::Base.send(:include, HoptoadNotifier::Catcher) -end - -require File.join(File.dirname(__FILE__), '..', 'lib', 'hoptoad_notifier', 'rails_initializer') -HoptoadNotifier::RailsInitializer.initialize - -HoptoadNotifier.configure(true) do |config| - config.environment_name = RAILS_ENV - config.project_root = RAILS_ROOT -end +require 'hoptoad_notifier/rails'