Register the method for converting objects to PDF as #to_pdf.
+
Register the incoming mime-type "Accept" header as application/pdf.
+
Specify a new header for PDF types so it will set Content-Encoding to gzip.
+
+
+
You can then do:
+
+ class Foo < Application
+ provides :pdf
+ end
+
+
+
Where can I find help?
+
If you have any questions or if you can't figure something out, please take a
+ look at our project page,
+ feel free to come chat at irc.freenode.net, channel #merb,
+ or post to merb mailing list
+ on Google Groups.
+
+
What if I've found a bug?
+
If you want to file a bug or make your own contribution to Merb,
+ feel free to register and create a ticket at our
+ project development page
+ on Lighthouse.
+
+
How do I edit this page?
+
You can change what people see when this happens by editing app/views/exceptions/not_acceptable.html.erb.
+
+
+
+
+
diff --git a/spec/integration/merb/app/views/exceptions/not_found.html.erb b/spec/integration/merb/app/views/exceptions/not_found.html.erb
new file mode 100644
index 0000000..42b41a8
--- /dev/null
+++ b/spec/integration/merb/app/views/exceptions/not_found.html.erb
@@ -0,0 +1,47 @@
+
+
+
+
+
pocket rocket web framework
+
+
+
+
+
Exception:
+
<%= request.exceptions.first.message %>
+
+
+
+
Welcome to Merb!
+
Merb is a light-weight MVC framework written in Ruby. We hope you enjoy it.
+
+
Where can I find help?
+
If you have any questions or if you can't figure something out, please take a
+ look at our project page,
+ feel free to come chat at irc.freenode.net, channel #merb,
+ or post to merb mailing list
+ on Google Groups.
+
+
What if I've found a bug?
+
If you want to file a bug or make your own contribution to Merb,
+ feel free to register and create a ticket at our
+ project development page
+ on Lighthouse.
+
+
How do I edit this page?
+
You're seeing this page because you need to edit the following files:
+
app/views/layout/application.html.erb (change this layout)
+
+
+
+
+
+
diff --git a/spec/integration/merb/app/views/layout/application.html.erb b/spec/integration/merb/app/views/layout/application.html.erb
new file mode 100644
index 0000000..4637ef2
--- /dev/null
+++ b/spec/integration/merb/app/views/layout/application.html.erb
@@ -0,0 +1,12 @@
+
+
+
+ Fresh Merb App
+
+
+
+
+ <%#= message[:notice] %>
+ <%= catch_content :for_layout %>
+
+
\ No newline at end of file
diff --git a/spec/integration/merb/app/views/testing/show_form.html.erb b/spec/integration/merb/app/views/testing/show_form.html.erb
new file mode 100644
index 0000000..cee070b
--- /dev/null
+++ b/spec/integration/merb/app/views/testing/show_form.html.erb
@@ -0,0 +1,22 @@
+
Webrat Form
+
+
\ No newline at end of file
diff --git a/spec/integration/merb/config/environments/development.rb b/spec/integration/merb/config/environments/development.rb
new file mode 100644
index 0000000..d6d4ab3
--- /dev/null
+++ b/spec/integration/merb/config/environments/development.rb
@@ -0,0 +1,15 @@
+Merb.logger.info("Loaded DEVELOPMENT Environment...")
+Merb::Config.use { |c|
+ c[:exception_details] = true
+ c[:reload_templates] = true
+ c[:reload_classes] = true
+ c[:reload_time] = 0.5
+ c[:ignore_tampered_cookies] = true
+ c[:log_auto_flush ] = true
+ c[:log_level] = :debug
+
+ c[:log_stream] = STDOUT
+ c[:log_file] = nil
+ # Or redirect logging into a file:
+ # c[:log_file] = Merb.root / "log" / "development.log"
+}
diff --git a/spec/integration/merb/config/environments/rake.rb b/spec/integration/merb/config/environments/rake.rb
new file mode 100644
index 0000000..5e4b9a7
--- /dev/null
+++ b/spec/integration/merb/config/environments/rake.rb
@@ -0,0 +1,11 @@
+Merb.logger.info("Loaded RAKE Environment...")
+Merb::Config.use { |c|
+ c[:exception_details] = true
+ c[:reload_classes] = false
+ c[:log_auto_flush ] = true
+
+ c[:log_stream] = STDOUT
+ c[:log_file] = nil
+ # Or redirect logging into a file:
+ # c[:log_file] = Merb.root / "log" / "development.log"
+}
diff --git a/spec/integration/merb/config/environments/test.rb b/spec/integration/merb/config/environments/test.rb
new file mode 100644
index 0000000..cc1dc98
--- /dev/null
+++ b/spec/integration/merb/config/environments/test.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + "/../../../../../lib/webrat"
+
+Merb.logger.info("Loaded TEST Environment...")
+Merb::Config.use { |c|
+ c[:testing] = true
+ c[:exception_details] = true
+ c[:log_auto_flush ] = true
+ # log less in testing environment
+ c[:log_level] = :error
+
+ #c[:log_file] = Merb.root / "log" / "test.log"
+ # or redirect logger using IO handle
+ c[:log_stream] = STDOUT
+}
diff --git a/spec/integration/merb/config/init.rb b/spec/integration/merb/config/init.rb
new file mode 100644
index 0000000..e7268e9
--- /dev/null
+++ b/spec/integration/merb/config/init.rb
@@ -0,0 +1,25 @@
+# Go to http://wiki.merbivore.com/pages/init-rb
+
+# Specify a specific version of a dependency
+# dependency "RedCloth", "> 3.0"
+
+# use_orm :none
+use_test :rspec
+use_template_engine :erb
+
+Merb::Config.use do |c|
+ c[:use_mutex] = false
+ c[:session_store] = 'cookie' # can also be 'memory', 'memcache', 'container', 'datamapper
+
+ # cookie session store configuration
+ c[:session_secret_key] = 'adb9ea7a0e94b5513503f58623a393c5efe18851' # required for cookie session store
+ c[:session_id_key] = '_merb_session_id' # cookie session id key, defaults to "_session_id"
+end
+
+Merb::BootLoader.before_app_loads do
+ # This will get executed after dependencies have been loaded but before your app's classes have loaded.
+end
+
+Merb::BootLoader.after_app_loads do
+ # This will get executed after your app's classes have been loaded.
+end
\ No newline at end of file
diff --git a/spec/integration/merb/config/rack.rb b/spec/integration/merb/config/rack.rb
new file mode 100644
index 0000000..494c687
--- /dev/null
+++ b/spec/integration/merb/config/rack.rb
@@ -0,0 +1,11 @@
+# use PathPrefix Middleware if :path_prefix is set in Merb::Config
+if prefix = ::Merb::Config[:path_prefix]
+ use Merb::Rack::PathPrefix, prefix
+end
+
+# comment this out if you are running merb behind a load balancer
+# that serves static files
+use Merb::Rack::Static, Merb.dir_for(:public)
+
+# this is our main merb application
+run Merb::Rack::Application.new
\ No newline at end of file
diff --git a/spec/integration/merb/config/router.rb b/spec/integration/merb/config/router.rb
new file mode 100644
index 0000000..3b06c55
--- /dev/null
+++ b/spec/integration/merb/config/router.rb
@@ -0,0 +1,32 @@
+# Merb::Router is the request routing mapper for the merb framework.
+#
+# You can route a specific URL to a controller / action pair:
+#
+# match("/contact").
+# to(:controller => "info", :action => "contact")
+#
+# You can define placeholder parts of the url with the :symbol notation. These
+# placeholders will be available in the params hash of your controllers. For example:
+#
+# match("/books/:book_id/:action").
+# to(:controller => "books")
+#
+# Or, use placeholders in the "to" results for more complicated routing, e.g.:
+#
+# match("/admin/:module/:controller/:action/:id").
+# to(:controller => ":module/:controller")
+#
+# You can specify conditions on the placeholder by passing a hash as the second
+# argument of "match"
+#
+# match("/registration/:course_name", :course_name => /^[a-z]{3,5}-\d{5}$/).
+# to(:controller => "registration")
+#
+# You can also use regular expressions, deferred routes, and many other options.
+# See merb/specs/merb/router.rb for a fairly complete usage sample.
+
+Merb.logger.info("Compiling routes...")
+Merb::Router.prepare do
+ match("/").to(:controller => "testing", :action => "show_form")
+ match("/redirect").to(:controller => "testing", :action => "redirect_to_root")
+end
\ No newline at end of file
diff --git a/spec/integration/merb/spec/spec.opts b/spec/integration/merb/spec/spec.opts
new file mode 100644
index 0000000..4e1e0d2
--- /dev/null
+++ b/spec/integration/merb/spec/spec.opts
@@ -0,0 +1 @@
+--color
diff --git a/spec/integration/merb/spec/spec_helper.rb b/spec/integration/merb/spec/spec_helper.rb
new file mode 100644
index 0000000..81682a1
--- /dev/null
+++ b/spec/integration/merb/spec/spec_helper.rb
@@ -0,0 +1,24 @@
+require "rubygems"
+
+# Add the local gems dir if found within the app root; any dependencies loaded
+# hereafter will try to load from the local gems before loading system gems.
+if (local_gem_dir = File.join(File.dirname(__FILE__), '..', 'gems')) && $BUNDLE.nil?
+ $BUNDLE = true; Gem.clear_paths; Gem.path.unshift(local_gem_dir)
+end
+
+require "merb-core"
+require "spec" # Satisfies Autotest and anyone else not using the Rake tasks
+
+# this loads all plugins required in your init file so don't add them
+# here again, Merb will do it for you
+Merb.start_environment(:testing => true, :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'test')
+
+Spec::Runner.configure do |config|
+ config.include(Merb::Test::ViewHelper)
+ config.include(Merb::Test::RouteHelper)
+ config.include(Merb::Test::ControllerHelper)
+end
+
+Webrat.configure do |config|
+ config.mode = :merb
+end
\ No newline at end of file
diff --git a/spec/integration/merb/spec/webrat_spec.rb b/spec/integration/merb/spec/webrat_spec.rb
new file mode 100644
index 0000000..1675a2c
--- /dev/null
+++ b/spec/integration/merb/spec/webrat_spec.rb
@@ -0,0 +1,21 @@
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Webrat" do
+ it "should visit pages" do
+ response = visit "/"
+ response.should contain("Webrat Form")
+ end
+
+ it "should submit forms" do
+ visit "/"
+ fill_in "Text field", :with => "Hello"
+ check "TOS"
+ select "January"
+ click_button "Test"
+ end
+
+ it "should follow redirects" do
+ response = visit "/redirect"
+ response.should contain("Webrat Form")
+ end
+end
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/app_script.rb b/spec/integration/merb/tasks/merb.thor/app_script.rb
new file mode 100644
index 0000000..fb0e116
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/app_script.rb
@@ -0,0 +1,31 @@
+#!/usr/bin/env ruby
+
+# This was added by Merb's bundler
+
+require "rubygems"
+require File.join(File.dirname(__FILE__), "common")
+
+gems_dir = File.join(File.dirname(__FILE__), '..', 'gems')
+
+if File.directory?(gems_dir)
+ $BUNDLE = true
+ Gem.clear_paths
+ Gem.path.replace([File.expand_path(gems_dir)])
+ ENV["PATH"] = "#{File.dirname(__FILE__)}:#{ENV["PATH"]}"
+
+ gem_file = File.join(gems_dir, "specifications", "<%= spec.name %>-*.gemspec")
+
+ if local_gem = Dir[gem_file].last
+ version = File.basename(local_gem)[/-([\.\d]+)\.gemspec$/, 1]
+ end
+end
+
+version ||= "<%= Gem::Requirement.default %>"
+
+if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
+ version = $1
+ ARGV.shift
+end
+
+gem '<%= @spec.name %>', version
+load '<%= bin_file_name %>'
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/common.rb b/spec/integration/merb/tasks/merb.thor/common.rb
new file mode 100644
index 0000000..0258520
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/common.rb
@@ -0,0 +1,64 @@
+# This was added via Merb's bundler
+
+require "rubygems"
+require "rubygems/source_index"
+
+module Gem
+ BUNDLED_SPECS = File.join(Dir.pwd, "gems", "specifications")
+ MAIN_INDEX = Gem::SourceIndex.from_gems_in(BUNDLED_SPECS)
+ FALLBACK_INDEX = Gem::SourceIndex.from_installed_gems
+
+ def self.source_index
+ MultiSourceIndex.new
+ end
+
+ def self.searcher
+ MultiPathSearcher.new
+ end
+
+ class ArbitrarySearcher < GemPathSearcher
+ def initialize(source_index)
+ @source_index = source_index
+ super()
+ end
+
+ def init_gemspecs
+ @source_index.map { |_, spec| spec }.sort { |a,b|
+ (a.name <=> b.name).nonzero? || (b.version <=> a.version)
+ }
+ end
+ end
+
+ class MultiPathSearcher
+ def initialize
+ @main_searcher = ArbitrarySearcher.new(MAIN_INDEX)
+ @fallback_searcher = ArbitrarySearcher.new(FALLBACK_INDEX)
+ end
+
+ def find(path)
+ try = @main_searcher.find(path)
+ return try if try
+ @fallback_searcher.find(path)
+ end
+
+ def find_all(path)
+ try = @main_searcher.find_all(path)
+ return try unless try.empty?
+ @fallback_searcher.find_all(path)
+ end
+ end
+
+ class MultiSourceIndex
+ def search(*args)
+ try = MAIN_INDEX.search(*args)
+ return try unless try.empty?
+ FALLBACK_INDEX.search(*args)
+ end
+
+ def find_name(*args)
+ try = MAIN_INDEX.find_name(*args)
+ return try unless try.empty?
+ FALLBACK_INDEX.find_name(*args)
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/gem_ext.rb b/spec/integration/merb/tasks/merb.thor/gem_ext.rb
new file mode 100644
index 0000000..61bd474
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/gem_ext.rb
@@ -0,0 +1,124 @@
+require "erb"
+
+Gem.pre_install_hooks.push(proc do |installer|
+ $INSTALLING << installer.spec
+
+ unless File.file?(installer.bin_dir / "common.rb")
+ FileUtils.mkdir_p(installer.bin_dir)
+ FileUtils.cp(File.dirname(__FILE__) / "common.rb", installer.bin_dir / "common.rb")
+ end
+
+ include ColorfulMessages
+ name = installer.spec.name
+ if $GEMS && versions = ($GEMS.assoc(name) || [])[1]
+ dep = Gem::Dependency.new(name, versions)
+ unless dep.version_requirements.satisfied_by?(installer.spec.version)
+ error "Cannot install #{installer.spec.full_name} " \
+ "for #{$INSTALLING.map {|x| x.full_name}.join(", ")}; " \
+ "you required #{dep}"
+ ::Thor::Tasks::Merb::Gem.rollback_trans
+ exit!
+ end
+ end
+ success "Installing #{installer.spec.full_name}"
+end)
+
+class ::Gem::Uninstaller
+ def self._with_silent_ui
+
+ ui = Gem::DefaultUserInteraction.ui
+ def ui.say(str)
+ puts "- #{str}"
+ end
+
+ yield
+
+ class << Gem::DefaultUserInteraction.ui
+ remove_method :say
+ end
+ end
+
+ def self._uninstall(source_index, name, op, version)
+ unless source_index.find_name(name, "#{op} #{version}").empty?
+ uninstaller = Gem::Uninstaller.new(
+ name,
+ :version => "#{op} #{version}",
+ :install_dir => Dir.pwd / "gems",
+ :all => true,
+ :ignore => true
+ )
+ _with_silent_ui { uninstaller.uninstall }
+ end
+ end
+
+ def self._uninstall_others(source_index, name, version)
+ _uninstall(source_index, name, "<", version)
+ _uninstall(source_index, name, ">", version)
+ end
+end
+
+Gem.post_install_hooks.push(proc do |installer|
+ $INSTALLING.pop
+ source_index = installer.instance_variable_get("@source_index")
+ ::Gem::Uninstaller._uninstall_others(
+ source_index, installer.spec.name, installer.spec.version
+ )
+end)
+
+class ::Gem::DependencyInstaller
+ alias old_fg find_gems_with_sources
+
+ def find_gems_with_sources(dep)
+ if @source_index.any? { |_, installed_spec|
+ installed_spec.satisfies_requirement?(dep)
+ }
+ return []
+ end
+
+ old_fg(dep)
+ end
+end
+
+class ::Gem::SpecFetcher
+ alias old_fetch fetch
+ def fetch(dependency, all = false, matching_platform = true)
+ idx = Gem::SourceIndex.from_installed_gems
+
+ dep = idx.search(dependency).sort.last
+
+ if dep
+ file = dep.loaded_from.dup
+ file.gsub!(/specifications/, "cache")
+ file.gsub!(/gemspec$/, "gem")
+ spec = ::Gem::Format.from_file_by_path(file).spec
+ [[spec, file]]
+ else
+ old_fetch(dependency, all, matching_platform)
+ end
+ end
+end
+
+class ::Gem::Installer
+ def app_script_text(bin_file_name)
+ template = File.read(File.dirname(__FILE__) / "app_script.rb")
+ erb = ERB.new(template)
+ erb.result(binding)
+ end
+end
+
+class ::Gem::Specification
+ def recursive_dependencies(from, index = Gem.source_index)
+ specs = self.runtime_dependencies.map do |dep|
+ spec = index.search(dep).last
+ unless spec
+ from_name = from.is_a?(::Gem::Specification) ? from.full_name : from.to_s
+ wider_net = index.find_name(dep.name).last
+ ThorUI.error "Needed #{dep} for #{from_name}, but could not find it"
+ ThorUI.error "Found #{wider_net.full_name}" if wider_net
+ ::Thor::Tasks::Merb::Gem.rollback_trans
+ end
+ spec
+ end
+ specs + specs.map {|s| s.recursive_dependencies(self, index)}.flatten.uniq
+ end
+end
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/main.thor b/spec/integration/merb/tasks/merb.thor/main.thor
new file mode 100644
index 0000000..ea6438b
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/main.thor
@@ -0,0 +1,150 @@
+require "rubygems"
+require "rubygems/source_index"
+require "rubygems/dependency_installer"
+require "rubygems/uninstaller"
+require "fileutils"
+require File.join(File.dirname(__FILE__), "utils")
+require File.join(File.dirname(__FILE__), "gem_ext")
+require File.join(File.dirname(__FILE__), "ops")
+
+$INSTALLING = []
+
+module Merb
+
+ class Gem < Thor
+ extend ColorfulMessages
+
+ def initialize
+ dirs = [Dir.pwd, File.dirname(__FILE__) / ".."]
+ root = dirs.find {|d| File.file?(d / "config" / "dependencies.rb")}
+
+ if root
+ @depsrb = root / "config" / "dependencies.rb"
+ else
+ self.class.error "dependencies.rb was not found"
+ exit!
+ end
+
+ FileUtils.mkdir_p(Dir.pwd / "gems")
+
+ @list = Collector.collect(File.read(@depsrb))
+ @idx = ::Gem::SourceIndex.new.load_gems_in("gems/specifications")
+ end
+
+ def list
+ require "pp"
+ pp @list
+ end
+
+ desc "redeploy", "Syncs up gems/cache with gems/gems. All gems in the cache " \
+ "that are not already installed will be installed from the " \
+ "cache. All installed gems that are not in the cache will " \
+ "be uninstalled."
+ def redeploy
+ gem_dir = Dir.pwd / "gems" / "gems"
+ cache_dir = Dir.pwd / "gems" / "cache"
+
+ gems = Dir[gem_dir / "*"].map! {|n| File.basename(n)}
+ cache = Dir[cache_dir / "*.gem"].map! {|n| File.basename(n, ".gem")}
+ new_gems = cache - gems
+ outdated = gems - cache
+ idx = ::Gem::SourceIndex.new
+ idx.load_gems_in(Dir.pwd / "gems" / "specifications")
+
+ new_gems.each do |g|
+ installer = ::Gem::Installer.new(cache_dir / "#{g}.gem",
+ :bin_dir => Dir.pwd / "bin",
+ :install_dir => Dir.pwd / "gems",
+ :ignore_dependencies => true,
+ :user_install => false,
+ :wrappers => true,
+ :source_index => idx)
+
+ installer.install
+ end
+
+ outdated.each do |g|
+ /(.*)\-(.*)/ =~ g
+ name, version = $1, $2
+ uninstaller = ::Gem::Uninstaller.new(name,
+ :version => version,
+ :bin_dir => Dir.pwd / "bin",
+ :install_dir => Dir.pwd / "gems",
+ :ignore => true,
+ :executables => true
+ )
+ uninstaller.uninstall
+ end
+ end
+
+ desc "confirm", "Confirm the current setup. merb:gem:install will " \
+ "automatically run this task before committing the " \
+ "changes it makes."
+ def confirm(gems = @list)
+ ::Gem.path.replace([Dir.pwd / "gems"])
+ ::Gem.source_index.load_gems_in(Dir.pwd / "gems" / "specifications")
+
+ self.class.info "Confirming configuration..."
+
+ ::Gem.loaded_specs.clear
+
+ begin
+ gems.each do |name, versions|
+ versions ||= []
+ ::Gem.activate name, *versions
+ end
+ rescue ::Gem::LoadError => e
+ self.class.error "Configuration could not be confirmed: #{e.message}"
+ self.class.rollback_trans
+ end
+ self.class.info "Confirmed"
+ end
+
+ desc 'install', 'Sync up your bundled gems with the list in config/dependencies.rb'
+ def install(*gems)
+ if gems.empty?
+ gems = @list
+ else
+ gems = gems.map {|desc| name, *versions = desc.split(" ") }
+ end
+
+ $GEMS = gems
+
+ self.class.begin_trans
+
+ gems.each do |name, versions|
+ dep = ::Gem::Dependency.new(name, versions || [])
+ unless @idx.search(dep).empty?
+ next
+ end
+
+ rescue_failures do
+ $INSTALLING = []
+ _install(dep)
+ end
+ end
+
+ gem_dir = Dir.pwd / "gems" / "gems"
+ installed_gems = Dir[gem_dir / "*"].map! {|n| File.basename(n)}
+
+ list = full_list.map {|x| x.full_name}.compact
+
+ (installed_gems - list).each do |g|
+ /^(.*)\-(.*)$/ =~ g
+ name, version = $1, $2
+ uninstaller = ::Gem::Uninstaller.new(name,
+ :version => version,
+ :bin_dir => (Dir.pwd / "bin").to_s,
+ :install_dir => (Dir.pwd / "gems").to_s,
+ :ignore => true,
+ :executables => true
+ )
+ uninstaller.uninstall
+ end
+
+ confirm(gems)
+
+ self.class.commit_trans
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/ops.rb b/spec/integration/merb/tasks/merb.thor/ops.rb
new file mode 100644
index 0000000..c758af2
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/ops.rb
@@ -0,0 +1,93 @@
+module Thor::Tasks
+ module Merb
+ class Collector
+ attr_reader :dependencies
+
+ def self.collect(str)
+ collector = new
+ collector.instance_eval(str)
+ collector.dependencies
+ end
+
+ def initialize
+ @dependencies = []
+ end
+
+ def dependency(name, *versions)
+ versions.pop if versions.last.is_a?(Hash)
+ @dependencies << [name, versions]
+ end
+ end
+
+ class Gem < Thor
+ def full_list
+ @idx.load_gems_in("gems/specifications")
+
+ @list.map do |name, versions|
+ dep = ::Gem::Dependency.new(name, versions)
+ spec = @idx.search(dep).last
+ unless spec
+ self.class.error "A required dependency #{dep} was not found"
+ self.class.rollback_trans
+ end
+ deps = spec.recursive_dependencies(dep, @idx)
+ [spec] + deps
+ end.flatten.uniq
+ end
+
+ def rescue_failures(error = StandardError, prc = nil)
+ begin
+ yield
+ rescue error => e
+ if prc
+ prc.call(e)
+ else
+ puts e.message
+ puts e.backtrace
+ end
+ self.class.rollback_trans
+ end
+ end
+
+ def self.begin_trans
+ note "Beginning transaction"
+ FileUtils.cp_r(Dir.pwd / "gems", Dir.pwd / ".original_gems")
+ end
+
+ def self.commit_trans
+ note "Committing transaction"
+ FileUtils.rm_rf(Dir.pwd / ".original_gems")
+ end
+
+ def self.rollback_trans
+ if File.exist?(Dir.pwd / ".original_gems")
+ note "Rolling back transaction"
+ FileUtils.rm_rf(Dir.pwd / "gems")
+ FileUtils.mv(Dir.pwd / ".original_gems", Dir.pwd / "gems")
+ end
+ exit!
+ end
+
+ private
+ def _install(dep)
+ @idx.load_gems_in("gems/specifications")
+ return if @idx.search(dep).last
+
+ installer = ::Gem::DependencyInstaller.new(
+ :bin_dir => Dir.pwd / "bin",
+ :install_dir => Dir.pwd / "gems",
+ :user_install => false)
+
+ begin
+ installer.install dep.name, dep.version_requirements
+ rescue ::Gem::GemNotFoundException => e
+ puts "Cannot find #{dep}"
+ rescue ::Gem::RemoteFetcher::FetchError => e
+ puts e.message
+ puts "Retrying..."
+ retry
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/integration/merb/tasks/merb.thor/utils.rb b/spec/integration/merb/tasks/merb.thor/utils.rb
new file mode 100644
index 0000000..1b1caa6
--- /dev/null
+++ b/spec/integration/merb/tasks/merb.thor/utils.rb
@@ -0,0 +1,40 @@
+class String
+ def /(other)
+ (Pathname.new(self) + other).to_s
+ end
+end
+
+module ColorfulMessages
+
+ # red
+ def error(*messages)
+ puts messages.map { |msg| "\033[1;31m#{msg}\033[0m" }
+ end
+
+ # yellow
+ def warning(*messages)
+ puts messages.map { |msg| "\033[1;33m#{msg}\033[0m" }
+ end
+
+ # green
+ def success(*messages)
+ puts messages.map { |msg| "\033[1;32m#{msg}\033[0m" }
+ end
+
+ alias_method :message, :success
+
+ # magenta
+ def note(*messages)
+ puts messages.map { |msg| "\033[1;35m#{msg}\033[0m" }
+ end
+
+ # blue
+ def info(*messages)
+ puts messages.map { |msg| "\033[1;34m#{msg}\033[0m" }
+ end
+
+end
+
+module ThorUI
+ extend ColorfulMessages
+end
diff --git a/spec/integration/rails/.gitignore b/spec/integration/rails/.gitignore
new file mode 100644
index 0000000..ea0fb5d
--- /dev/null
+++ b/spec/integration/rails/.gitignore
@@ -0,0 +1 @@
+vendor/plugins/webrat
\ No newline at end of file
diff --git a/spec/integration/rails/Rakefile b/spec/integration/rails/Rakefile
new file mode 100644
index 0000000..3bb0e85
--- /dev/null
+++ b/spec/integration/rails/Rakefile
@@ -0,0 +1,10 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require(File.join(File.dirname(__FILE__), 'config', 'boot'))
+
+require 'rake'
+require 'rake/testtask'
+require 'rake/rdoctask'
+
+require 'tasks/rails'
diff --git a/spec/integration/rails/app/controllers/application.rb b/spec/integration/rails/app/controllers/application.rb
new file mode 100644
index 0000000..58b3052
--- /dev/null
+++ b/spec/integration/rails/app/controllers/application.rb
@@ -0,0 +1,15 @@
+# Filters added to this controller apply to all controllers in the application.
+# Likewise, all the methods added will be available for all controllers.
+
+class ApplicationController < ActionController::Base
+ helper :all # include all helpers, all the time
+
+ # See ActionController::RequestForgeryProtection for details
+ # Uncomment the :secret if you're not using the cookie session store
+ protect_from_forgery # :secret => 'ceaca978d06f1c9db5c84193c1447572'
+
+ # See ActionController::Base for details
+ # Uncomment this to filter the contents of submitted sensitive data parameters
+ # from your application log (in this case, all fields with names like "password").
+ # filter_parameter_logging :password
+end
diff --git a/spec/integration/rails/app/controllers/webrat_controller.rb b/spec/integration/rails/app/controllers/webrat_controller.rb
new file mode 100644
index 0000000..23f0e82
--- /dev/null
+++ b/spec/integration/rails/app/controllers/webrat_controller.rb
@@ -0,0 +1,14 @@
+class WebratController < ApplicationController
+
+ def form
+ end
+
+ def submit
+ render :text => "OK"
+ end
+
+ def redirect
+ redirect_to :submit
+ end
+
+end
\ No newline at end of file
diff --git a/spec/integration/rails/app/views/webrat/form.html.erb b/spec/integration/rails/app/views/webrat/form.html.erb
new file mode 100644
index 0000000..5c89281
--- /dev/null
+++ b/spec/integration/rails/app/views/webrat/form.html.erb
@@ -0,0 +1,17 @@
+
Webrat Form
+
+<% form_tag submit_path do %>
+
+
+
+
+
+
+ <%= submit_tag "Test" %>
+<% end %>
\ No newline at end of file
diff --git a/spec/integration/rails/config/boot.rb b/spec/integration/rails/config/boot.rb
new file mode 100644
index 0000000..0a51688
--- /dev/null
+++ b/spec/integration/rails/config/boot.rb
@@ -0,0 +1,109 @@
+# Don't change this file!
+# Configure your app in config/environment.rb and config/environments/*.rb
+
+RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+
+module Rails
+ class << self
+ def boot!
+ unless booted?
+ preinitialize
+ pick_boot.run
+ end
+ end
+
+ def booted?
+ defined? Rails::Initializer
+ end
+
+ def pick_boot
+ (vendor_rails? ? VendorBoot : GemBoot).new
+ end
+
+ def vendor_rails?
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
+ end
+
+ def preinitialize
+ load(preinitializer_path) if File.exist?(preinitializer_path)
+ end
+
+ def preinitializer_path
+ "#{RAILS_ROOT}/config/preinitializer.rb"
+ end
+ end
+
+ class Boot
+ def run
+ load_initializer
+ Rails::Initializer.run(:set_load_path)
+ end
+ end
+
+ class VendorBoot < Boot
+ def load_initializer
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
+ Rails::Initializer.run(:install_gem_spec_stubs)
+ end
+ end
+
+ class GemBoot < Boot
+ def load_initializer
+ self.class.load_rubygems
+ load_rails_gem
+ require 'initializer'
+ end
+
+ def load_rails_gem
+ if version = self.class.gem_version
+ gem 'rails', version
+ else
+ gem 'rails'
+ end
+ rescue Gem::LoadError => load_error
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
+ exit 1
+ end
+
+ class << self
+ def rubygems_version
+ Gem::RubyGemsVersion rescue nil
+ end
+
+ def gem_version
+ if defined? RAILS_GEM_VERSION
+ RAILS_GEM_VERSION
+ elsif ENV.include?('RAILS_GEM_VERSION')
+ ENV['RAILS_GEM_VERSION']
+ else
+ parse_gem_version(read_environment_rb)
+ end
+ end
+
+ def load_rubygems
+ require 'rubygems'
+ min_version = '1.3.1'
+ unless rubygems_version >= min_version
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
+ exit 1
+ end
+
+ rescue LoadError
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
+ exit 1
+ end
+
+ def parse_gem_version(text)
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
+ end
+
+ private
+ def read_environment_rb
+ File.read("#{RAILS_ROOT}/config/environment.rb")
+ end
+ end
+ end
+end
+
+# All that for this:
+Rails.boot!
diff --git a/spec/integration/rails/config/environment.rb b/spec/integration/rails/config/environment.rb
new file mode 100644
index 0000000..279f1ab
--- /dev/null
+++ b/spec/integration/rails/config/environment.rb
@@ -0,0 +1,75 @@
+# Be sure to restart your server when you modify this file
+
+# Uncomment below to force Rails into production mode when
+# you don't control web/app server and can't set it the proper way
+# ENV['RAILS_ENV'] ||= 'production'
+
+# Specifies gem version of Rails to use when vendor/rails is not present
+RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION
+
+# Bootstrap the Rails environment, frameworks, and default configuration
+require File.join(File.dirname(__FILE__), 'boot')
+
+Rails::Initializer.run do |config|
+ # Settings in config/environments/* take precedence over those specified here.
+ # Application configuration should go into files in config/initializers
+ # -- all .rb files in that directory are automatically loaded.
+ # See Rails::Configuration for more options.
+
+ # Skip frameworks you're not going to use. To use Rails without a database
+ # you must remove the Active Record framework.
+ config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
+
+ # Specify gems that this application depends on.
+ # They can then be installed with "rake gems:install" on new installations.
+ # You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3)
+ # config.gem "bj"
+ # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
+ # config.gem "sqlite3-ruby", :lib => "sqlite3"
+ # config.gem "aws-s3", :lib => "aws/s3"
+
+ # Only load the plugins named here, in the order given. By default, all plugins
+ # in vendor/plugins are loaded in alphabetical order.
+ # :all can be used as a placeholder for all plugins not explicitly named
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
+
+ # Add additional load paths for your own custom dirs
+ # config.load_paths += %W( #{RAILS_ROOT}/extras )
+
+ # Force all environments to use the same logger level
+ # (by default production uses :info, the others :debug)
+ # config.log_level = :debug
+
+ # Make Time.zone default to the specified zone, and make Active Record store time values
+ # in the database in UTC, and return them converted to the specified local zone.
+ # Run "rake -D time" for a list of tasks for finding time zone names. Comment line to use default local time.
+ config.time_zone = 'UTC'
+
+ # The internationalization framework can be changed to have another default locale (standard is :en) or more load paths.
+ # All files from config/locales/*.rb,yml are added automatically.
+ # config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
+ # config.i18n.default_locale = :de
+
+ # Your secret key for verifying cookie session data integrity.
+ # If you change this key, all old sessions will become invalid!
+ # Make sure the secret is at least 30 characters and all random,
+ # no regular words or you'll be exposed to dictionary attacks.
+ config.action_controller.session = {
+ :session_key => '_rails_app_session',
+ :secret => '81f33872c27349e86f1dc2cd6708995b9c26578e6e2d8992e567cd64d96e844343149f6e2f44bf178304141db9ce39e741e0e60699867c29c51c6d7ef7dc9556'
+ }
+
+ # Use the database for sessions instead of the cookie-based default,
+ # which shouldn't be used to store highly confidential information
+ # (create the session table with "rake db:sessions:create")
+ # config.action_controller.session_store = :active_record_store
+
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
+ # like if you have constraints or database-specific column types
+ # config.active_record.schema_format = :sql
+
+ # Activate observers that should always be running
+ # Please note that observers generated using script/generate observer need to have an _observer suffix
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
+end
diff --git a/spec/integration/rails/config/environments/development.rb b/spec/integration/rails/config/environments/development.rb
new file mode 100644
index 0000000..85c9a60
--- /dev/null
+++ b/spec/integration/rails/config/environments/development.rb
@@ -0,0 +1,17 @@
+# Settings specified here will take precedence over those in config/environment.rb
+
+# In the development environment your application's code is reloaded on
+# every request. This slows down response time but is perfect for development
+# since you don't have to restart the webserver when you make code changes.
+config.cache_classes = false
+
+# Log error messages when you accidentally call methods on nil.
+config.whiny_nils = true
+
+# Show full error reports and disable caching
+config.action_controller.consider_all_requests_local = true
+config.action_view.debug_rjs = true
+config.action_controller.perform_caching = false
+
+# Don't care if the mailer can't send
+config.action_mailer.raise_delivery_errors = false
\ No newline at end of file
diff --git a/spec/integration/rails/config/environments/test.rb b/spec/integration/rails/config/environments/test.rb
new file mode 100644
index 0000000..1e709e1
--- /dev/null
+++ b/spec/integration/rails/config/environments/test.rb
@@ -0,0 +1,22 @@
+# Settings specified here will take precedence over those in config/environment.rb
+
+# The test environment is used exclusively to run your application's
+# test suite. You never need to work with it otherwise. Remember that
+# your test database is "scratch space" for the test suite and is wiped
+# and recreated between test runs. Don't rely on the data there!
+config.cache_classes = true
+
+# Log error messages when you accidentally call methods on nil.
+config.whiny_nils = true
+
+# Show full error reports and disable caching
+config.action_controller.consider_all_requests_local = true
+config.action_controller.perform_caching = false
+
+# Disable request forgery protection in test environment
+config.action_controller.allow_forgery_protection = false
+
+# Tell Action Mailer not to deliver emails to the real world.
+# The :test delivery method accumulates sent emails in the
+# ActionMailer::Base.deliveries array.
+config.action_mailer.delivery_method = :test
diff --git a/spec/integration/rails/config/initializers/inflections.rb b/spec/integration/rails/config/initializers/inflections.rb
new file mode 100644
index 0000000..d531b8b
--- /dev/null
+++ b/spec/integration/rails/config/initializers/inflections.rb
@@ -0,0 +1,10 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new inflection rules using the following format
+# (all these examples are active by default):
+# ActiveSupport::Inflector.inflections do |inflect|
+# inflect.plural /^(ox)$/i, '\1en'
+# inflect.singular /^(ox)en/i, '\1'
+# inflect.irregular 'person', 'people'
+# inflect.uncountable %w( fish sheep )
+# end
diff --git a/spec/integration/rails/config/initializers/mime_types.rb b/spec/integration/rails/config/initializers/mime_types.rb
new file mode 100644
index 0000000..72aca7e
--- /dev/null
+++ b/spec/integration/rails/config/initializers/mime_types.rb
@@ -0,0 +1,5 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new mime types for use in respond_to blocks:
+# Mime::Type.register "text/richtext", :rtf
+# Mime::Type.register_alias "text/html", :iphone
diff --git a/spec/integration/rails/config/initializers/new_rails_defaults.rb b/spec/integration/rails/config/initializers/new_rails_defaults.rb
new file mode 100644
index 0000000..78e0117
--- /dev/null
+++ b/spec/integration/rails/config/initializers/new_rails_defaults.rb
@@ -0,0 +1,17 @@
+# These settings change the behavior of Rails 2 apps and will be defaults
+# for Rails 3. You can remove this initializer when Rails 3 is released.
+
+if defined?(ActiveRecord)
+ # Include Active Record class name as root for JSON serialized output.
+ ActiveRecord::Base.include_root_in_json = true
+
+ # Store the full class name (including module namespace) in STI type column.
+ ActiveRecord::Base.store_full_sti_class = true
+end
+
+# Use ISO 8601 format for JSON serialized times and dates.
+ActiveSupport.use_standard_json_time_format = true
+
+# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
+# if you're including raw json in an HTML page.
+ActiveSupport.escape_html_entities_in_json = false
\ No newline at end of file
diff --git a/spec/integration/rails/config/locales/en.yml b/spec/integration/rails/config/locales/en.yml
new file mode 100644
index 0000000..f265c06
--- /dev/null
+++ b/spec/integration/rails/config/locales/en.yml
@@ -0,0 +1,5 @@
+# Sample localization file for English. Add more files in this directory for other locales.
+# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
+
+en:
+ hello: "Hello world"
\ No newline at end of file
diff --git a/spec/integration/rails/config/routes.rb b/spec/integration/rails/config/routes.rb
new file mode 100644
index 0000000..41d6ff5
--- /dev/null
+++ b/spec/integration/rails/config/routes.rb
@@ -0,0 +1,8 @@
+ActionController::Routing::Routes.draw do |map|
+ map.with_options :controller => "webrat" do |webrat|
+ webrat.submit "/submit", :action => "submit"
+ webrat.redirect "/redirect", :action => "redirect"
+
+ webrat.root :action => "form"
+ end
+end
diff --git a/spec/integration/rails/public/404.html b/spec/integration/rails/public/404.html
new file mode 100644
index 0000000..eff660b
--- /dev/null
+++ b/spec/integration/rails/public/404.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ The page you were looking for doesn't exist (404)
+
+
+
+
+
+
+
The page you were looking for doesn't exist.
+
You may have mistyped the address or the page may have moved.
+
+
+
\ No newline at end of file
diff --git a/spec/integration/rails/public/422.html b/spec/integration/rails/public/422.html
new file mode 100644
index 0000000..b54e4a3
--- /dev/null
+++ b/spec/integration/rails/public/422.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ The change you wanted was rejected (422)
+
+
+
+
+
+
+
The change you wanted was rejected.
+
Maybe you tried to change something you didn't have access to.
+
+
+
\ No newline at end of file
diff --git a/spec/integration/rails/public/500.html b/spec/integration/rails/public/500.html
new file mode 100644
index 0000000..0cd07c1
--- /dev/null
+++ b/spec/integration/rails/public/500.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+ We're sorry, but something went wrong (500)
+
+
+
+
+
+
+
We're sorry, but something went wrong.
+
We've been notified about this issue and we'll take a look at it shortly.
+
(If you're the administrator of this website, then please read
+ the log file "<%=h RAILS_ENV %>.log"
+ to find out what went wrong.)
+
+
+
diff --git a/spec/integration/rails/script/about b/spec/integration/rails/script/about
new file mode 100755
index 0000000..ed8deb0
--- /dev/null
+++ b/spec/integration/rails/script/about
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+$LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info"
+require 'commands/about'
\ No newline at end of file
diff --git a/spec/integration/rails/script/console b/spec/integration/rails/script/console
new file mode 100755
index 0000000..498077a
--- /dev/null
+++ b/spec/integration/rails/script/console
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/console'
diff --git a/spec/integration/rails/script/dbconsole b/spec/integration/rails/script/dbconsole
new file mode 100755
index 0000000..caa60ce
--- /dev/null
+++ b/spec/integration/rails/script/dbconsole
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/dbconsole'
diff --git a/spec/integration/rails/script/destroy b/spec/integration/rails/script/destroy
new file mode 100755
index 0000000..a4df765
--- /dev/null
+++ b/spec/integration/rails/script/destroy
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/destroy'
diff --git a/spec/integration/rails/script/generate b/spec/integration/rails/script/generate
new file mode 100755
index 0000000..173a9f1
--- /dev/null
+++ b/spec/integration/rails/script/generate
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/generate'
diff --git a/spec/integration/rails/script/performance/benchmarker b/spec/integration/rails/script/performance/benchmarker
new file mode 100755
index 0000000..c842d35
--- /dev/null
+++ b/spec/integration/rails/script/performance/benchmarker
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/performance/benchmarker'
diff --git a/spec/integration/rails/script/performance/profiler b/spec/integration/rails/script/performance/profiler
new file mode 100755
index 0000000..d855ac8
--- /dev/null
+++ b/spec/integration/rails/script/performance/profiler
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/performance/profiler'
diff --git a/spec/integration/rails/script/performance/request b/spec/integration/rails/script/performance/request
new file mode 100755
index 0000000..ae3f38c
--- /dev/null
+++ b/spec/integration/rails/script/performance/request
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/performance/request'
diff --git a/spec/integration/rails/script/plugin b/spec/integration/rails/script/plugin
new file mode 100755
index 0000000..87cd207
--- /dev/null
+++ b/spec/integration/rails/script/plugin
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/plugin'
diff --git a/spec/integration/rails/script/process/inspector b/spec/integration/rails/script/process/inspector
new file mode 100755
index 0000000..bf25ad8
--- /dev/null
+++ b/spec/integration/rails/script/process/inspector
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/inspector'
diff --git a/spec/integration/rails/script/process/reaper b/spec/integration/rails/script/process/reaper
new file mode 100755
index 0000000..c77f045
--- /dev/null
+++ b/spec/integration/rails/script/process/reaper
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/reaper'
diff --git a/spec/integration/rails/script/process/spawner b/spec/integration/rails/script/process/spawner
new file mode 100755
index 0000000..7118f39
--- /dev/null
+++ b/spec/integration/rails/script/process/spawner
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/spawner'
diff --git a/spec/integration/rails/script/runner b/spec/integration/rails/script/runner
new file mode 100755
index 0000000..a4a7cb2
--- /dev/null
+++ b/spec/integration/rails/script/runner
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/runner'
diff --git a/spec/integration/rails/script/server b/spec/integration/rails/script/server
new file mode 100755
index 0000000..3c67f39
--- /dev/null
+++ b/spec/integration/rails/script/server
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/server'
diff --git a/spec/integration/rails/test/integration/webrat_test.rb b/spec/integration/rails/test/integration/webrat_test.rb
new file mode 100644
index 0000000..ec83c1c
--- /dev/null
+++ b/spec/integration/rails/test/integration/webrat_test.rb
@@ -0,0 +1,22 @@
+require 'test_helper'
+
+class WebratTest < ActionController::IntegrationTest
+ test "should visit pages" do
+ visit root_path
+ assert_tag "Webrat Form"
+ assert response.body.include?("Webrat Form")
+ end
+
+ test "should submit forms" do
+ visit root_path
+ fill_in "Text field", :with => "Hello"
+ check "TOS"
+ select "January"
+ click_button "Test"
+ end
+
+ test "should follow redirects" do
+ visit redirect_path
+ assert response.body.include?("OK")
+ end
+end
diff --git a/spec/integration/rails/test/test_helper.rb b/spec/integration/rails/test/test_helper.rb
new file mode 100644
index 0000000..82bc995
--- /dev/null
+++ b/spec/integration/rails/test/test_helper.rb
@@ -0,0 +1,21 @@
+ENV["RAILS_ENV"] = "test"
+require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
+require 'test_help'
+require "redgreen"
+
+require File.dirname(__FILE__) + "/../../../../lib/webrat"
+
+Webrat.configure do |config|
+ config.mode = :rails
+end
+
+ActionController::Base.class_eval do
+ def perform_action
+ perform_action_without_rescue
+ end
+end
+Dispatcher.class_eval do
+ def self.failsafe_response(output, status, exception = nil)
+ raise exception
+ end
+end
\ No newline at end of file
diff --git a/spec/webrat/core/configuration_spec.rb b/spec/private/core/configuration_spec.rb
similarity index 80%
rename from spec/webrat/core/configuration_spec.rb
rename to spec/private/core/configuration_spec.rb
index 6c22565..b29d473 100755
--- a/spec/webrat/core/configuration_spec.rb
+++ b/spec/private/core/configuration_spec.rb
@@ -25,6 +25,16 @@ describe Webrat::Configuration do
config.should open_error_files
end
+ it "should use 'selenium' as the selenium environment by default" do
+ config = Webrat::Configuration.new
+ config.selenium_environment.should == :selenium
+ end
+
+ it "should use 3001 as the selenium port by default" do
+ config = Webrat::Configuration.new
+ config.selenium_port.should == 3001
+ end
+
it "should be configurable with a block" do
Webrat.configure do |config|
config.open_error_files = false
diff --git a/spec/webrat/core/field_spec.rb b/spec/private/core/field_spec.rb
similarity index 100%
rename from spec/webrat/core/field_spec.rb
rename to spec/private/core/field_spec.rb
diff --git a/spec/webrat/core/link_spec.rb b/spec/private/core/link_spec.rb
similarity index 100%
rename from spec/webrat/core/link_spec.rb
rename to spec/private/core/link_spec.rb
diff --git a/spec/webrat/core/logging_spec.rb b/spec/private/core/logging_spec.rb
similarity index 100%
rename from spec/webrat/core/logging_spec.rb
rename to spec/private/core/logging_spec.rb
diff --git a/spec/webrat/core/session_spec.rb b/spec/private/core/session_spec.rb
similarity index 82%
rename from spec/webrat/core/session_spec.rb
rename to spec/private/core/session_spec.rb
index 013668a..d4f9b2a 100644
--- a/spec/webrat/core/session_spec.rb
+++ b/spec/private/core/session_spec.rb
@@ -1,47 +1,47 @@
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
describe Webrat::Session do
-
+
it "should not have a doc_root" do
session = Webrat::Session.new
session.doc_root.should be_nil
end
-
+
it "should expose the current_dom" do
session = Webrat::Session.new
-
+
def session.response
Object.new
end
-
+
def session.response_body
""
end
-
+
session.should respond_to(:current_dom)
end
-
+
it "should open the page in the browser in MacOSX" do
session = Webrat::Session.new
session.stub!(:ruby_platform => 'darwin')
session.should_receive(:`).with("open path")
session.open_in_browser("path")
end
-
+
it "should open the page in the browser in cygwin" do
session = Webrat::Session.new
session.stub!(:ruby_platform => 'i386-cygwin')
session.should_receive(:`).with("rundll32 url.dll,FileProtocolHandler path\\to\\file")
session.open_in_browser("path/to/file")
end
-
+
it "should open the page in the browser in Win32" do
session = Webrat::Session.new
session.stub!(:ruby_platform => 'win32')
session.should_receive(:`).with("rundll32 url.dll,FileProtocolHandler path\\to\\file")
session.open_in_browser("path/to/file")
end
-
+
it "should provide a current_page for backwards compatibility" do
session = Webrat::Session.new
current_page = session.current_page
@@ -58,7 +58,7 @@ describe Webrat::Session do
it "should return a copy of the headers to be sent" do
session = Webrat::Session.new
- session.instance_eval {
+ session.instance_eval {
@default_headers = {'HTTP_X_FORWARDED_FOR' => '192.168.1.1'}
@custom_headers = {'Accept' => 'application/xml'}
}
@@ -89,17 +89,17 @@ describe Webrat::Session do
before(:each) do
webrat_session = Webrat::Session.new
end
-
+
it "should raise an error if the request is not a success" do
webrat_session.stub!(:get)
webrat_session.stub!(:response_body => "Exception caught")
webrat_session.stub!(:response_code => 500)
webrat_session.stub!(:formatted_error => "application error")
webrat_session.stub!(:save_and_open_page)
-
+
lambda { webrat_session.request_page('some url', :get, {}) }.should raise_error(Webrat::PageLoadError)
end
-
+
it "should raise an error but not open if the request is not a success and config quashes save_and_open" do
Webrat.configure do |config|
config.open_error_files = false
@@ -109,8 +109,33 @@ describe Webrat::Session do
webrat_session.stub!(:response_code => 500)
webrat_session.stub!(:formatted_error => "application error")
webrat_session.should_not_receive(:save_and_open_page)
-
+
lambda { webrat_session.request_page('some url', :get, {}) }.should raise_error(Webrat::PageLoadError)
end
+
+ it "should follow redirects" do
+ webrat_session.should_receive(:redirect?).twice.and_return(true, false)
+ webrat_session.response.should_receive(:headers).once.and_return({ "Location" => "/newurl" })
+
+ webrat_session.request_page("/oldurl", :get, {})
+
+ webrat_session.current_url.should == "/newurl"
+ end
end
-end
+
+ describe "#redirect?" do
+ before(:each) do
+ webrat_session = Webrat::Session.new
+ end
+
+ it "should return true if the last response was a redirect" do
+ webrat_session.stub!(:response_code => 301)
+ webrat_session.redirect?.should be_true
+ end
+
+ it "should return false if the last response wasn't a redirect" do
+ webrat_session.stub!(:response_code => 200)
+ webrat_session.redirect?.should be_false
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/private/mechanize/mechanize_session_spec.rb b/spec/private/mechanize/mechanize_session_spec.rb
new file mode 100644
index 0000000..075d97d
--- /dev/null
+++ b/spec/private/mechanize/mechanize_session_spec.rb
@@ -0,0 +1,81 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+
+require "webrat/mechanize"
+
+describe Webrat::MechanizeSession do
+ before :each do
+ Webrat.configuration.mode = :mechanize
+ end
+
+ before(:each) do
+ @mech = Webrat::MechanizeSession.new
+ end
+
+ describe "headers method" do
+ it "should return empty headers for a newly initialized session" do
+ @mech.headers.should == {}
+ end
+ end
+
+ describe "post" do
+ def url
+ 'http://test.host/users'
+ end
+
+ def data
+ {:user => {:first_name => 'Nancy', :last_name => 'Callahan'}}
+ end
+
+ def flattened_data
+ {'user[first_name]' => 'Nancy', 'user[last_name]' => 'Callahan'}
+ end
+
+ it "should flatten model post data" do
+ mechanize = mock(:mechanize)
+ WWW::Mechanize.stub!(:new => mechanize)
+ mechanize.should_receive(:post).with(url, flattened_data)
+ Webrat::MechanizeSession.new.post(url, data)
+ end
+ end
+
+ describe "#absolute_url" do
+ before(:each) do
+ @session = Webrat::MechanizeSession.new
+ @session.stub!(:current_url).and_return(absolute_url)
+ end
+
+ def absolute_url
+ 'http://test.host/users/fred/cabbages'
+ end
+
+ def rooted_url
+ '/users/fred/cabbages'
+ end
+
+ def relative_url
+ '../../wilma'
+ end
+
+ it "should return unmodified url if prefixed with scheme" do
+ @session.absolute_url(absolute_url).should == absolute_url
+ end
+
+ it "should prefix scheme and hostname if url begins with /" do
+ @session.absolute_url(rooted_url).should == absolute_url
+ end
+
+ it "should resolve sibling URLs relative to current path" do
+ @session.absolute_url(relative_url).should == 'http://test.host/users/wilma'
+ end
+
+ it "should cope with sibling URLs from root of site" do
+ @session.stub!(:current_url).and_return('http://test.host')
+ @session.absolute_url(relative_url).should == 'http://test.host/wilma'
+ end
+
+ it "should cope with https" do
+ @session.stub!(:current_url).and_return('https://test.host')
+ @session.absolute_url(relative_url).should == 'https://test.host/wilma'
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/webrat/merb/indifferent_access_spec.rb b/spec/private/merb/indifferent_access_spec.rb
similarity index 100%
rename from spec/webrat/merb/indifferent_access_spec.rb
rename to spec/private/merb/indifferent_access_spec.rb
diff --git a/spec/private/merb/merb_session_spec.rb b/spec/private/merb/merb_session_spec.rb
new file mode 100644
index 0000000..6cac7c0
--- /dev/null
+++ b/spec/private/merb/merb_session_spec.rb
@@ -0,0 +1,42 @@
+require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
+
+require "webrat/merb"
+
+describe Webrat::MerbSession do
+ it "should not pass empty params if data is and empty hash" do
+ session = Webrat::MerbSession.new
+ response = OpenStruct.new
+ response.status = 200
+ session.should_receive(:request).with('url', {:params=> nil, :method=>"GET", :headers=>nil}).and_return(response)
+ session.get('url', {}, nil)
+ end
+
+ %w{post put delete}.each do |request_method|
+ it "should call do request with method #{request_method.upcase} for a #{request_method} call" do
+ session = Webrat::MerbSession.new
+ response = OpenStruct.new
+ response.status = 200
+
+ session.should_receive(:request).with('url', {:params=>nil, :method=>request_method.upcase, :headers=>nil}).and_return(response)
+ session.send(request_method, 'url', {}, nil)
+ end
+ end
+
+ context "a session with a response" do
+ setup do
+ @session = Webrat::MerbSession.new
+ @response = OpenStruct.new
+ @response.status = 200
+ @response.body = 'test response'
+ @session.instance_variable_set(:@response, @response)
+ end
+
+ it "should return body of a request as a response_body" do
+ @session.response_body.should == @response.body
+ end
+
+ it "should return status of a request as a response_code" do
+ @session.response_code.should == @response.status
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/webrat/nokogiri_spec.rb b/spec/private/nokogiri_spec.rb
similarity index 100%
rename from spec/webrat/nokogiri_spec.rb
rename to spec/private/nokogiri_spec.rb
diff --git a/spec/webrat/rails/attaches_file_spec.rb b/spec/private/rails/attaches_file_spec.rb
similarity index 100%
rename from spec/webrat/rails/attaches_file_spec.rb
rename to spec/private/rails/attaches_file_spec.rb
diff --git a/spec/private/rails/rails_session_spec.rb b/spec/private/rails/rails_session_spec.rb
new file mode 100644
index 0000000..54ff1bf
--- /dev/null
+++ b/spec/private/rails/rails_session_spec.rb
@@ -0,0 +1,88 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+
+require "webrat/rails"
+
+describe Webrat::RailsSession do
+ before :each do
+ Webrat.configuration.mode = :rails
+ @integration_session = mock("integration_session")
+ end
+
+ it "should delegate response_body to the session response body" do
+ @integration_session.stub!(:response => mock("response", :body => ""))
+ Webrat::RailsSession.new(@integration_session).response_body.should == ""
+ end
+
+ it "should delegate response_code to the session response code" do
+ @integration_session.stub!(:response => mock("response", :code => "42"))
+ Webrat::RailsSession.new(@integration_session).response_code.should == 42
+ end
+
+ it "should delegate get to the integration session" do
+ @integration_session.should_receive(:get).with("url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.get("url", "data", "headers")
+ end
+
+ it "should delegate post to the integration session" do
+ @integration_session.should_receive(:post).with("url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.post("url", "data", "headers")
+ end
+
+ it "should delegate put to the integration session" do
+ @integration_session.should_receive(:put).with("url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.put("url", "data", "headers")
+ end
+
+ it "should delegate delete to the integration session" do
+ @integration_session.should_receive(:delete).with("url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.delete("url", "data", "headers")
+ end
+
+ context "the URL is a full path" do
+ it "should just pass on the path" do
+ @integration_session.stub!(:https!)
+ @integration_session.should_receive(:get).with("/url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.get("http://www.example.com/url", "data", "headers")
+ end
+ end
+
+ context "the URL is https://" do
+ it "should call #https! with true before the request and just pass on the path" do
+ @integration_session.should_receive(:https!).with(true)
+ @integration_session.should_receive(:get).with("/url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.get("https://www.example.com/url", "data", "headers")
+ end
+ end
+
+ context "the URL is http://" do
+ it "should call #https! with true before the request" do
+ @integration_session.stub!(:get)
+ @integration_session.should_receive(:https!).with(false)
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.get("http://www.example.com/url", "data", "headers")
+ end
+ end
+
+ context "the URL include an anchor" do
+ it "should strip out the anchor" do
+ @integration_session.should_receive(:https!).with(false)
+ @integration_session.should_receive(:get).with("/url", "data", "headers")
+ rails_session = Webrat::RailsSession.new(@integration_session)
+ rails_session.get("http://www.example.com/url#foo", "data", "headers")
+ end
+ end
+
+ it "should provide a saved_page_dir" do
+ Webrat::RailsSession.new(mock("integration session")).should respond_to(:saved_page_dir)
+ end
+
+ it "should provide a doc_root" do
+ Webrat::RailsSession.new(mock("integration session")).should respond_to(:doc_root)
+ end
+end
\ No newline at end of file
diff --git a/spec/private/sinatra/helper.rb b/spec/private/sinatra/helper.rb
new file mode 100644
index 0000000..ce5417e
--- /dev/null
+++ b/spec/private/sinatra/helper.rb
@@ -0,0 +1,15 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+require "webrat/sinatra"
+
+class Sinatra::Application
+ # Override this to prevent Sinatra from barfing on the options passed from RSpec
+ def self.load_default_options_from_command_line!
+ end
+end
+
+Sinatra::Application.default_options.merge!(
+ :env => :test,
+ :run => false,
+ :raise_errors => true,
+ :logging => false
+)
\ No newline at end of file
diff --git a/spec/private/sinatra/sinatra_spec.rb b/spec/private/sinatra/sinatra_spec.rb
new file mode 100644
index 0000000..73ab674
--- /dev/null
+++ b/spec/private/sinatra/sinatra_spec.rb
@@ -0,0 +1,28 @@
+require File.expand_path(File.dirname(__FILE__) + '/helper')
+
+describe Webrat::SinatraSession do
+ before :each do
+ Webrat.configuration.mode = :sinatra
+ @sinatra_session = Webrat::SinatraSession.new
+ end
+
+ it "should delegate get to get_it" do
+ @sinatra_session.should_receive(:get_it).with("url", { :env => "headers" })
+ @sinatra_session.get("url", {}, "headers")
+ end
+
+ it "should delegate post to post_it" do
+ @sinatra_session.should_receive(:post_it).with("url", { :env => "headers" })
+ @sinatra_session.post("url", {}, "headers")
+ end
+
+ it "should delegate put to put_it" do
+ @sinatra_session.should_receive(:put_it).with("url", { :env => "headers" })
+ @sinatra_session.put("url", {}, "headers")
+ end
+
+ it "should delegate delete to delete_it" do
+ @sinatra_session.should_receive(:delete_it).with("url", { :env => "headers" })
+ @sinatra_session.delete("url", {}, "headers")
+ end
+end
\ No newline at end of file
diff --git a/spec/api/basic_auth_spec.rb b/spec/public/basic_auth_spec.rb
similarity index 100%
rename from spec/api/basic_auth_spec.rb
rename to spec/public/basic_auth_spec.rb
diff --git a/spec/api/check_spec.rb b/spec/public/check_spec.rb
similarity index 100%
rename from spec/api/check_spec.rb
rename to spec/public/check_spec.rb
diff --git a/spec/api/choose_spec.rb b/spec/public/choose_spec.rb
similarity index 100%
rename from spec/api/choose_spec.rb
rename to spec/public/choose_spec.rb
diff --git a/spec/api/click_area_spec.rb b/spec/public/click_area_spec.rb
similarity index 98%
rename from spec/api/click_area_spec.rb
rename to spec/public/click_area_spec.rb
index 65bfbbe..e039323 100644
--- a/spec/api/click_area_spec.rb
+++ b/spec/public/click_area_spec.rb
@@ -24,7 +24,7 @@ describe "click_area" do
webrat_session.response_code = 501
lambda { click_area "Berlin" }.should raise_error(Webrat::PageLoadError)
end
-
+
[200, 300, 400, 499].each do |status|
it "should consider the #{status} status code as success" do
with_html <<-HTML
@@ -34,11 +34,12 @@ describe "click_area" do
HTML
+ webrat_session.stub!(:redirect? => false)
webrat_session.response_code = status
lambda { click_area "Berlin" }.should_not raise_error
end
end
-
+
it "should fail if the area doesn't exist" do
with_html <<-HTML
@@ -47,12 +48,12 @@ describe "click_area" do
HTML
-
+
lambda {
click_area "Missing area"
}.should raise_error(Webrat::NotFoundError)
end
-
+
it "should not be case sensitive" do
with_html <<-HTML
@@ -64,7 +65,7 @@ describe "click_area" do
webrat_session.should_receive(:get).with("/page", {})
click_area "berlin"
end
-
+
it "should follow relative links" do
webrat_session.stub!(:current_url => "/page")
@@ -78,7 +79,7 @@ describe "click_area" do
webrat_session.should_receive(:get).with("/page/sub", {})
click_area "Berlin"
end
-
+
it "should follow fully qualified local links" do
with_html <<-HTML
diff --git a/spec/api/click_button_spec.rb b/spec/public/click_button_spec.rb
similarity index 99%
rename from spec/api/click_button_spec.rb
rename to spec/public/click_button_spec.rb
index e639b66..ed21488 100644
--- a/spec/api/click_button_spec.rb
+++ b/spec/public/click_button_spec.rb
@@ -7,10 +7,10 @@ describe "click_button" do
HTML
-
+
lambda { click_button }.should raise_error(Webrat::NotFoundError)
end
-
+
it "should fail if input is not a submit button" do
with_html <<-HTML
@@ -23,7 +23,7 @@ describe "click_button" do
lambda { click_button }.should raise_error(Webrat::NotFoundError)
end
-
+
it "should fail if button is disabled" do
with_html <<-HTML
@@ -35,7 +35,7 @@ describe "click_button" do
lambda { click_button }.should raise_error(Webrat::DisabledFieldError)
end
-
+
it "should default to get method" do
with_html <<-HTML
@@ -47,7 +47,7 @@ describe "click_button" do
webrat_session.should_receive(:get)
click_button
end
-
+
it "should assert valid response" do
with_html <<-HTML
@@ -59,7 +59,7 @@ describe "click_button" do
webrat_session.response_code = 501
lambda { click_button }.should raise_error(Webrat::PageLoadError)
end
-
+
[200, 300, 400, 499].each do |status|
it "should consider the #{status} status code as success" do
with_html <<-HTML
@@ -69,11 +69,12 @@ describe "click_button" do
HTML
+ webrat_session.stub!(:redirect? => false)
webrat_session.response_code = status
lambda { click_button }.should_not raise_error
end
end
-
+
it "should submit the first form by default" do
with_html <<-HTML
@@ -88,7 +89,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/form1", {})
click_button
end
-
+
it "should not explode on file fields" do
with_html <<-HTML
@@ -100,7 +101,7 @@ describe "click_button" do
HTML
click_button
end
-
+
it "should submit the form with the specified button" do
with_html <<-HTML
@@ -115,7 +116,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/form2", {})
click_button "Form2"
end
-
+
it "should use action from form" do
with_html <<-HTML
@@ -127,7 +128,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", {})
click_button
end
-
+
it "should use method from form" do
with_html <<-HTML
@@ -139,7 +140,7 @@ describe "click_button" do
webrat_session.should_receive(:post)
click_button
end
-
+
it "should send button as param if it has a name" do
with_html <<-HTML
@@ -152,7 +153,7 @@ describe "click_button" do
webrat_session.should_receive(:post).with("/login", "login" => "Login")
click_button("Login")
end
-
+
it "should not send button as param if it has no name" do
with_html <<-HTML
@@ -177,8 +178,8 @@ describe "click_button" do
HTML
webrat_session.should_receive(:get).with("/login", "user" => {"password" => "mypass"})
click_button
- end
-
+ end
+
it "should send default hidden field values" do
with_html <<-HTML
@@ -191,7 +192,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "user" => {"email" => "test@example.com"})
click_button
end
-
+
it "should send default text field values" do
with_html <<-HTML
@@ -204,7 +205,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "user" => {"email" => "test@example.com"})
click_button
end
-
+
it "should not send disabled field values" do
with_html <<-HTML
@@ -221,7 +222,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", {})
click_button
end
-
+
it "should send default checked fields" do
with_html <<-HTML
@@ -234,7 +235,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "user" => {"tos" => "1"})
click_button
end
-
+
it "should send default radio options" do
with_html <<-HTML
@@ -250,7 +251,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "user" => {"gender" => "F"})
click_button
end
-
+
it "should send correct data for rails style unchecked fields" do
with_html <<-HTML
@@ -264,7 +265,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "user" => {"tos" => "0"})
click_button
end
-
+
it "should send correct data for rails style checked fields" do
with_html <<-HTML
@@ -302,7 +303,7 @@ describe "click_button" do
"response" => { "choices" => [{"selected" => "one"}, {"selected" => "two"}, {"selected" => "two"}]})
click_button
end
-
+
it "should not send default unchecked fields" do
with_html <<-HTML
@@ -315,7 +316,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", {})
click_button
end
-
+
it "should send default textarea values" do
with_html <<-HTML
@@ -328,7 +329,7 @@ describe "click_button" do
webrat_session.should_receive(:post).with("/posts", "post" => {"body" => "Post body here!"})
click_button
end
-
+
it "should properly handle HTML entities in textarea default values" do
spec = lambda do
with_html <<-HTML
@@ -342,14 +343,14 @@ describe "click_button" do
webrat_session.should_receive(:post).with("/posts", "post" => {"body" => "Peanut butter & jelly"})
click_button
end
-
+
if Webrat.on_java?
spec.call
else
pending("needs bug fix", &spec)
end
end
-
+
it "should send default selected option value from select" do
with_html <<-HTML
@@ -381,7 +382,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "month" => "February")
click_button
end
-
+
it "should send first select option value when no option selected" do
with_html <<-HTML
@@ -397,7 +398,7 @@ describe "click_button" do
webrat_session.should_receive(:get).with("/login", "month" => "1")
click_button
end
-
+
it "should handle nested properties" do
with_html <<-HTML
@@ -449,7 +450,7 @@ describe "click_button" do
webrat_session.should_receive(:get)
click_button
end
-
+
it "should find buttons by their IDs" do
with_html <<-HTML
@@ -461,7 +462,7 @@ describe "click_button" do
webrat_session.should_receive(:get)
click_button "my_button"
end
-
+
it "should find image buttons by their alt text" do
with_html <<-HTML
diff --git a/spec/api/click_link_spec.rb b/spec/public/click_link_spec.rb
similarity index 98%
rename from spec/api/click_link_spec.rb
rename to spec/public/click_link_spec.rb
index ac6f1dc..a00549c 100644
--- a/spec/api/click_link_spec.rb
+++ b/spec/public/click_link_spec.rb
@@ -10,7 +10,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "Save & go back"
end
-
+
it "should use get by default" do
with_html <<-HTML
@@ -30,7 +30,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "Link text", :method => :get
end
-
+
it "should click link on substring" do
with_html <<-HTML
@@ -40,7 +40,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "ink tex", :method => :get
end
-
+
it "should click delete links" do
with_html <<-HTML
@@ -50,8 +50,8 @@ describe "click_link" do
webrat_session.should_receive(:delete).with("/page", {})
click_link "Link text", :method => :delete
end
-
-
+
+
it "should click post links" do
with_html <<-HTML
@@ -61,7 +61,7 @@ describe "click_link" do
webrat_session.should_receive(:post).with("/page", {})
click_link "Link text", :method => :post
end
-
+
it "should click put links" do
with_html <<-HTML
@@ -71,7 +71,7 @@ describe "click_link" do
webrat_session.should_receive(:put).with("/page", {})
click_link "Link text", :method => :put
end
-
+
it "should click links by regexp" do
with_html <<-HTML
@@ -81,8 +81,8 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link /link [a-z]/i
end
-
- it "should click links by id" do
+
+ it "should click links by id" do
with_html <<-HTML
Link text
@@ -91,8 +91,8 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "link_text_link"
end
-
- it "should click links by id regexp" do
+
+ it "should click links by id regexp" do
with_html <<-HTML
Link text
@@ -101,7 +101,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link /_text_/
end
-
+
it "should click rails javascript links with authenticity tokens" do
with_html <<-HTML
@@ -122,7 +122,7 @@ describe "click_link" do
webrat_session.should_receive(:post).with("/posts", "authenticity_token" => "aa79cb354597a60a3786e7e291ed4f74d77d3a62")
click_link "Posts"
end
-
+
it "should click rails javascript delete links" do
with_html <<-HTML
@@ -143,7 +143,7 @@ describe "click_link" do
webrat_session.should_receive(:delete).with("/posts/1", {})
click_link "Delete"
end
-
+
it "should click rails javascript post links" do
with_html <<-HTML
@@ -159,7 +159,7 @@ describe "click_link" do
webrat_session.should_receive(:post).with("/posts", {})
click_link "Posts"
end
-
+
it "should click rails javascript post links without javascript" do
with_html <<-HTML
@@ -175,7 +175,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/posts", {})
click_link "Posts", :javascript => false
end
-
+
it "should click rails javascript put links" do
with_html <<-HTML
@@ -196,7 +196,7 @@ describe "click_link" do
webrat_session.should_receive(:put).with("/posts", {})
click_link "Put"
end
-
+
it "should fail if the javascript link doesn't have a value for the _method input" do
with_html <<-HTML
@@ -213,12 +213,12 @@ describe "click_link" do
return false;">Link
HTML
-
+
lambda {
click_link "Link"
}.should raise_error(Webrat::WebratError)
end
-
+
it "should assert valid response" do
with_html <<-HTML
@@ -228,7 +228,7 @@ describe "click_link" do
webrat_session.response_code = 501
lambda { click_link "Link text" }.should raise_error(Webrat::PageLoadError)
end
-
+
[200, 300, 400, 499].each do |status|
it "should consider the #{status} status code as success" do
with_html <<-HTML
@@ -236,23 +236,24 @@ describe "click_link" do
Link text
HTML
+ webrat_session.stub!(:redirect? => false)
webrat_session.response_code = status
lambda { click_link "Link text" }.should_not raise_error
end
end
-
+
it "should fail is the link doesn't exist" do
with_html <<-HTML
Link text
HTML
-
+
lambda {
click_link "Missing link"
}.should raise_error(Webrat::NotFoundError)
end
-
+
it "should not be case sensitive" do
with_html <<-HTML
@@ -262,7 +263,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "LINK TEXT"
end
-
+
it "should match link substrings" do
with_html <<-HTML
@@ -272,7 +273,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "Link text"
end
-
+
it "should work with elements in the link" do
with_html <<-HTML
@@ -282,7 +283,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page", {})
click_link "Link text"
end
-
+
it "should match the first matching link" do
with_html <<-HTML
@@ -293,7 +294,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page1", {})
click_link "Link text"
end
-
+
it "should choose the shortest link text match" do
with_html <<-HTML
@@ -301,22 +302,22 @@ describe "click_link" do
Link
HTML
-
+
webrat_session.should_receive(:get).with("/page2", {})
click_link "Link"
end
-
+
it "should treat non-breaking spaces as spaces" do
with_html <<-HTML
This is a link
HTML
-
+
webrat_session.should_receive(:get).with("/page1", {})
click_link "This is a link"
end
-
+
it "should not match on non-text contents" do
pending "needs fix" do
with_html <<-HTML
@@ -325,12 +326,12 @@ describe "click_link" do
Location
HTML
-
+
webrat_session.should_receive(:get).with("/page2", {})
click_link "Location"
end
end
-
+
it "should click link within a selector" do
with_html <<-HTML
@@ -340,7 +341,7 @@ describe "click_link" do
HTML
-
+
webrat_session.should_receive(:get).with("/page2", {})
click_link_within "#container", "Link"
end
@@ -366,7 +367,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page/sub", {})
click_link "Jump to sub page"
end
-
+
it "should follow fully qualified local links" do
webrat_session.stub!(:current_url => "/page")
with_html <<-HTML
@@ -377,7 +378,7 @@ describe "click_link" do
webrat_session.should_receive(:get).with("http://subdomain.example.com/page/sub", {})
click_link "Jump to sub page"
end
-
+
it "should follow fully qualified local links to example.com" do
with_html <<-HTML
@@ -398,28 +399,28 @@ describe "click_link" do
webrat_session.should_receive(:get).with("/page?foo=bar", {})
click_link "Jump to foo bar"
end
-
+
it "should matches_text? on regexp" do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
link.should_receive(:text).and_return(@link_text_with_nbsp)
link.matches_text?(/link/i).should == 0
end
-
+
it "should matches_text? on link_text" do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
link.should_receive(:text).and_return(@link_text_with_nbsp)
link.matches_text?("Link Text").should == 0
end
-
+
it "should matches_text? on substring" do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
link.should_receive(:text).and_return(@link_text_with_nbsp)
link.matches_text?("nk Te").should_not be_nil
end
-
+
it "should not matches_text? on link_text case insensitive" do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
@@ -428,15 +429,15 @@ describe "click_link" do
link.should_receive(:title).and_return(nil)
link.matches_text?("link_text").should == false
end
-
+
it "should match text not include " do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
link.should_receive(:text).and_return('LinkText')
link.matches_text?("LinkText").should == 0
end
-
- it "should not matches_text? on wrong text" do
+
+ it "should not matches_text? on wrong text" do
pending "need to update these"
link = Webrat::Link.new(webrat_session, nil)
nbsp = [0xA0].pack("U")
@@ -464,5 +465,5 @@ describe "click_link" do
link.should_receive(:inner_html).and_return('')
link.matches_text?('logo.png').should == 10
end
-
+
end
diff --git a/spec/api/fill_in_spec.rb b/spec/public/fill_in_spec.rb
similarity index 100%
rename from spec/api/fill_in_spec.rb
rename to spec/public/fill_in_spec.rb
diff --git a/spec/api/locators/field_by_xpath_spec.rb b/spec/public/locators/field_by_xpath_spec.rb
similarity index 100%
rename from spec/api/locators/field_by_xpath_spec.rb
rename to spec/public/locators/field_by_xpath_spec.rb
diff --git a/spec/api/locators/field_labeled_spec.rb b/spec/public/locators/field_labeled_spec.rb
similarity index 100%
rename from spec/api/locators/field_labeled_spec.rb
rename to spec/public/locators/field_labeled_spec.rb
diff --git a/spec/api/locators/field_with_id_spec.rb b/spec/public/locators/field_with_id_spec.rb
similarity index 100%
rename from spec/api/locators/field_with_id_spec.rb
rename to spec/public/locators/field_with_id_spec.rb
diff --git a/spec/api/matchers_spec.rb b/spec/public/matchers_spec.rb
similarity index 100%
rename from spec/api/matchers_spec.rb
rename to spec/public/matchers_spec.rb
diff --git a/spec/api/reload_spec.rb b/spec/public/reload_spec.rb
similarity index 100%
rename from spec/api/reload_spec.rb
rename to spec/public/reload_spec.rb
diff --git a/spec/api/save_and_open_spec.rb b/spec/public/save_and_open_spec.rb
similarity index 100%
rename from spec/api/save_and_open_spec.rb
rename to spec/public/save_and_open_spec.rb
diff --git a/spec/api/select_date_spec.rb b/spec/public/select_date_spec.rb
similarity index 100%
rename from spec/api/select_date_spec.rb
rename to spec/public/select_date_spec.rb
diff --git a/spec/api/select_datetime_spec.rb b/spec/public/select_datetime_spec.rb
similarity index 100%
rename from spec/api/select_datetime_spec.rb
rename to spec/public/select_datetime_spec.rb
diff --git a/spec/api/select_spec.rb b/spec/public/select_spec.rb
similarity index 100%
rename from spec/api/select_spec.rb
rename to spec/public/select_spec.rb
diff --git a/spec/api/select_time_spec.rb b/spec/public/select_time_spec.rb
similarity index 100%
rename from spec/api/select_time_spec.rb
rename to spec/public/select_time_spec.rb
diff --git a/spec/api/set_hidden_field_spec.rb b/spec/public/set_hidden_field_spec.rb
similarity index 100%
rename from spec/api/set_hidden_field_spec.rb
rename to spec/public/set_hidden_field_spec.rb
diff --git a/spec/api/submit_form_spec.rb b/spec/public/submit_form_spec.rb
similarity index 100%
rename from spec/api/submit_form_spec.rb
rename to spec/public/submit_form_spec.rb
diff --git a/spec/api/visit_spec.rb b/spec/public/visit_spec.rb
similarity index 78%
rename from spec/api/visit_spec.rb
rename to spec/public/visit_spec.rb
index a0e823d..28aa2ba 100644
--- a/spec/api/visit_spec.rb
+++ b/spec/public/visit_spec.rb
@@ -13,22 +13,32 @@ describe "visit" do
webrat_session.should_receive(:get).with("/", {})
visit("/")
end
-
+
it "should assert valid response" do
webrat_session.response_code = 501
lambda { visit("/") }.should raise_error(Webrat::PageLoadError)
end
-
+
[200, 300, 400, 499].each do |status|
it "should consider the #{status} status code as success" do
+ webrat_session.stub!(:redirect? => false)
webrat_session.response_code = status
lambda { visit("/") }.should_not raise_error
end
end
-
+
it "should require a visit before manipulating page" do
lambda { fill_in "foo", :with => "blah" }.should raise_error(Webrat::WebratError)
end
+
+ it "should follow redirects" do
+ webrat_session.should_receive(:redirect?).twice.and_return(true, false)
+ webrat_session.response.should_receive(:headers).once.and_return({ "Location" => "/newurl" })
+
+ visit("/oldurl")
+
+ current_url.should == "/newurl"
+ end
end
describe "visit with referer" do
@@ -45,5 +55,5 @@ describe "visit with referer" do
webrat_session.should_receive(:get).with("/", {}, {"HTTP_REFERER" => "/old_url"})
visit("/")
end
-
+
end
diff --git a/spec/api/within_spec.rb b/spec/public/within_spec.rb
similarity index 100%
rename from spec/api/within_spec.rb
rename to spec/public/within_spec.rb
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index d2012bf..c33b55d 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -46,4 +46,4 @@ end
Webrat.configure do |config|
config.mode = :merb
-end
\ No newline at end of file
+end
diff --git a/spec/webrat/rails/rails_spec.rb b/spec/webrat/rails/rails_spec.rb
deleted file mode 100644
index 86e9855..0000000
--- a/spec/webrat/rails/rails_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# it "should default to current url" do
-# # current_page.stub!(:url => "/page")
-# response_body = <<-HTML
-#
-# HTML
-# @page.stub!(:url => "/current")
-# webrat_session.should_receive(:get).with("/current", {})
-# click_button
-# end
-#
-# it "should follow fully qualified secure local links" do
-# response_body = <<-HTML
-# Jump to sub page
-# HTML
-# webrat_session.should_receive(:https!).with(true)
-# webrat_session.should_receive(:get).with("/page/sub", {})
-# click_link "Jump to sub page"
-# end
\ No newline at end of file
diff --git a/webrat.gemspec b/webrat.gemspec
index 5362361..2988c6d 100644
--- a/webrat.gemspec
+++ b/webrat.gemspec
@@ -4,11 +4,11 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Bryan Helmkamp"]
- s.date = %q{2008-12-25}
+ s.date = %q{2008-12-29}
s.description = %q{Webrat. Ruby Acceptance Testing for Web applications}
s.email = %q{bryan@brynary.com}
s.extra_rdoc_files = ["README.rdoc", "MIT-LICENSE.txt"]
- s.files = ["History.txt", "install.rb", "MIT-LICENSE.txt", "README.rdoc", "Rakefile", "lib/webrat", "lib/webrat/core", "lib/webrat/core/configuration.rb", "lib/webrat/core/elements", "lib/webrat/core/elements/area.rb", "lib/webrat/core/elements/element.rb", "lib/webrat/core/elements/field.rb", "lib/webrat/core/elements/form.rb", "lib/webrat/core/elements/label.rb", "lib/webrat/core/elements/link.rb", "lib/webrat/core/elements/select_option.rb", "lib/webrat/core/locators", "lib/webrat/core/locators/area_locator.rb", "lib/webrat/core/locators/button_locator.rb", "lib/webrat/core/locators/field_by_id_locator.rb", "lib/webrat/core/locators/field_labeled_locator.rb", "lib/webrat/core/locators/field_locator.rb", "lib/webrat/core/locators/field_named_locator.rb", "lib/webrat/core/locators/form_locator.rb", "lib/webrat/core/locators/label_locator.rb", "lib/webrat/core/locators/link_locator.rb", "lib/webrat/core/locators/locator.rb", "lib/webrat/core/locators/select_option_locator.rb", "lib/webrat/core/locators.rb", "lib/webrat/core/logging.rb", "lib/webrat/core/matchers", "lib/webrat/core/matchers/have_content.rb", "lib/webrat/core/matchers/have_selector.rb", "lib/webrat/core/matchers/have_tag.rb", "lib/webrat/core/matchers/have_xpath.rb", "lib/webrat/core/matchers.rb", "lib/webrat/core/methods.rb", "lib/webrat/core/mime.rb", "lib/webrat/core/save_and_open_page.rb", "lib/webrat/core/scope.rb", "lib/webrat/core/session.rb", "lib/webrat/core/xml", "lib/webrat/core/xml/hpricot.rb", "lib/webrat/core/xml/nokogiri.rb", "lib/webrat/core/xml/rexml.rb", "lib/webrat/core/xml.rb", "lib/webrat/core.rb", "lib/webrat/core_extensions", "lib/webrat/core_extensions/blank.rb", "lib/webrat/core_extensions/deprecate.rb", "lib/webrat/core_extensions/detect_mapped.rb", "lib/webrat/core_extensions/hash_with_indifferent_access.rb", "lib/webrat/core_extensions/meta_class.rb", "lib/webrat/core_extensions/nil_to_param.rb", "lib/webrat/mechanize.rb", "lib/webrat/merb.rb", "lib/webrat/rack.rb", "lib/webrat/rails", "lib/webrat/rails/redirect_actions.rb", "lib/webrat/rails.rb", "lib/webrat/rspec-rails.rb", "lib/webrat/selenium", "lib/webrat/selenium/location_strategy_javascript", "lib/webrat/selenium/location_strategy_javascript/button.js", "lib/webrat/selenium/location_strategy_javascript/label.js", "lib/webrat/selenium/location_strategy_javascript/webrat.js", "lib/webrat/selenium/location_strategy_javascript/webratlink.js", "lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js", "lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js", "lib/webrat/selenium/matchers.rb", "lib/webrat/selenium/selenium_extensions.js", "lib/webrat/selenium/selenium_session.rb", "lib/webrat/selenium.rb", "lib/webrat/sinatra.rb", "lib/webrat.rb", "vendor/selenium-server.jar"]
+ s.files = ["History.txt", "install.rb", "MIT-LICENSE.txt", "README.rdoc", "Rakefile", "lib/webrat", "lib/webrat/core", "lib/webrat/core/configuration.rb", "lib/webrat/core/elements", "lib/webrat/core/elements/area.rb", "lib/webrat/core/elements/element.rb", "lib/webrat/core/elements/field.rb", "lib/webrat/core/elements/form.rb", "lib/webrat/core/elements/label.rb", "lib/webrat/core/elements/link.rb", "lib/webrat/core/elements/select_option.rb", "lib/webrat/core/locators", "lib/webrat/core/locators/area_locator.rb", "lib/webrat/core/locators/button_locator.rb", "lib/webrat/core/locators/field_by_id_locator.rb", "lib/webrat/core/locators/field_labeled_locator.rb", "lib/webrat/core/locators/field_locator.rb", "lib/webrat/core/locators/field_named_locator.rb", "lib/webrat/core/locators/form_locator.rb", "lib/webrat/core/locators/label_locator.rb", "lib/webrat/core/locators/link_locator.rb", "lib/webrat/core/locators/locator.rb", "lib/webrat/core/locators/select_option_locator.rb", "lib/webrat/core/locators.rb", "lib/webrat/core/logging.rb", "lib/webrat/core/matchers", "lib/webrat/core/matchers/have_content.rb", "lib/webrat/core/matchers/have_selector.rb", "lib/webrat/core/matchers/have_tag.rb", "lib/webrat/core/matchers/have_xpath.rb", "lib/webrat/core/matchers.rb", "lib/webrat/core/methods.rb", "lib/webrat/core/mime.rb", "lib/webrat/core/save_and_open_page.rb", "lib/webrat/core/scope.rb", "lib/webrat/core/session.rb", "lib/webrat/core/xml", "lib/webrat/core/xml/hpricot.rb", "lib/webrat/core/xml/nokogiri.rb", "lib/webrat/core/xml/rexml.rb", "lib/webrat/core/xml.rb", "lib/webrat/core.rb", "lib/webrat/core_extensions", "lib/webrat/core_extensions/blank.rb", "lib/webrat/core_extensions/deprecate.rb", "lib/webrat/core_extensions/detect_mapped.rb", "lib/webrat/core_extensions/hash_with_indifferent_access.rb", "lib/webrat/core_extensions/meta_class.rb", "lib/webrat/core_extensions/nil_to_param.rb", "lib/webrat/mechanize.rb", "lib/webrat/merb.rb", "lib/webrat/rack.rb", "lib/webrat/rails.rb", "lib/webrat/rspec-rails.rb", "lib/webrat/selenium", "lib/webrat/selenium/location_strategy_javascript", "lib/webrat/selenium/location_strategy_javascript/button.js", "lib/webrat/selenium/location_strategy_javascript/label.js", "lib/webrat/selenium/location_strategy_javascript/webrat.js", "lib/webrat/selenium/location_strategy_javascript/webratlink.js", "lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js", "lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js", "lib/webrat/selenium/matchers.rb", "lib/webrat/selenium/selenium_extensions.js", "lib/webrat/selenium/selenium_session.rb", "lib/webrat/selenium.rb", "lib/webrat/sinatra.rb", "lib/webrat.rb", "vendor/selenium-server.jar"]
s.has_rdoc = true
s.homepage = %q{http://github.com/brynary/webrat}
s.require_paths = ["lib"]
@@ -21,11 +21,11 @@ Gem::Specification.new do |s|
s.specification_version = 2
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
- s.add_runtime_dependency(%q, [">= 1.0.6"])
+ s.add_runtime_dependency(%q, [">= 1.1.0"])
else
- s.add_dependency(%q, [">= 1.0.6"])
+ s.add_dependency(%q, [">= 1.1.0"])
end
else
- s.add_dependency(%q, [">= 1.0.6"])
+ s.add_dependency(%q, [">= 1.1.0"])
end
end