208 lines
5.2 KiB
Ruby
208 lines
5.2 KiB
Ruby
require 'test_helper'
|
|
|
|
begin
|
|
gem 'rspec'
|
|
gem 'rspec-rails'
|
|
rescue LoadError => exception
|
|
puts exception.message
|
|
puts "RSpec integration was not tested because RSpec is not available"
|
|
else
|
|
|
|
class RspecTest < ActiveSupport::TestCase
|
|
|
|
SHOULDA_ROOT =
|
|
File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
|
|
|
|
def setup
|
|
build_gemspec
|
|
end
|
|
|
|
def teardown
|
|
FileUtils.rm_rf(project_dir)
|
|
FileUtils.rm_rf("#{shoulda_root}/pkg")
|
|
end
|
|
|
|
should "integrate correctly when using config.gem in test.rb" do
|
|
create_project
|
|
insert(rspec_dependencies, "config/environments/test.rb")
|
|
vendor_gems('test')
|
|
configure_spec_rails
|
|
assert_configured
|
|
end
|
|
|
|
should "integrate correctly when using config.gem in environment.rb" do
|
|
create_project
|
|
insert(rspec_dependencies,
|
|
"config/environment.rb",
|
|
/Rails::Initializer\.run/)
|
|
vendor_gems('development')
|
|
configure_spec_rails
|
|
assert_configured
|
|
end
|
|
|
|
should "integrate correctly when using require in spec_helper" do
|
|
create_project
|
|
configure_spec_rails
|
|
insert(%{gem 'shoulda'; require 'shoulda'},
|
|
"spec/spec_helper.rb",
|
|
%{require 'spec/rails'})
|
|
assert_configured
|
|
end
|
|
|
|
should "integrate correctly when unpacked and required in spec_helper" do
|
|
create_project
|
|
configure_spec_rails
|
|
insert(%{require 'shoulda'},
|
|
"spec/spec_helper.rb",
|
|
%{require 'spec/rails'})
|
|
unpack_gems
|
|
assert_configured
|
|
end
|
|
|
|
def create_project
|
|
command "rails #{project_dir}"
|
|
end
|
|
|
|
def vendor_gems(env)
|
|
project_command "rake gems:unpack RAILS_ENV=#{env}"
|
|
end
|
|
|
|
def unpack_gems
|
|
FileUtils.mkdir_p "#{project_dir}/vendor/gems"
|
|
FileUtils.cd "#{project_dir}/vendor/gems" do
|
|
%w(rspec rspec-rails shoulda).each do |gem|
|
|
command "gem unpack #{gem}"
|
|
end
|
|
end
|
|
|
|
insert('config.load_paths += Dir["#{RAILS_ROOT}/vendor/gems/*/lib"]',
|
|
"config/environment.rb",
|
|
/Rails::Initializer\.run/)
|
|
end
|
|
|
|
def command(command)
|
|
output = `GEM_PATH=#{shoulda_root}/pkg #{command} 2>&1`
|
|
unless $? == 0
|
|
flunk("Command failed with status #{$?}\n#{command}\n#{output}")
|
|
end
|
|
@command_output ||= ''
|
|
@command_output << output
|
|
output
|
|
end
|
|
|
|
def project_command(command)
|
|
result = nil
|
|
FileUtils.cd project_dir do
|
|
result = command(command)
|
|
end
|
|
result
|
|
end
|
|
|
|
def shoulda_command(command)
|
|
FileUtils.cd shoulda_root do
|
|
command(command)
|
|
end
|
|
end
|
|
|
|
def project_name
|
|
'example_rails_project'
|
|
end
|
|
|
|
def project_dir
|
|
File.expand_path(File.join(File.dirname(__FILE__), project_name))
|
|
end
|
|
|
|
def insert(content, path, after = nil)
|
|
path = File.join(project_dir, path)
|
|
contents = IO.read(path)
|
|
if after
|
|
contents.gsub!(/^(.*#{after}.*)$/, "\\1\n#{content}")
|
|
else
|
|
contents << "\n" << content
|
|
end
|
|
File.open(path, 'w') {|file| file.write(contents) }
|
|
end
|
|
|
|
def rspec_dependencies
|
|
return <<-EOS
|
|
config.gem 'rspec', :lib => 'spec'
|
|
config.gem 'rspec-rails', :lib => false
|
|
config.gem 'shoulda', :lib => 'shoulda'
|
|
EOS
|
|
end
|
|
|
|
def configure_spec_rails
|
|
project_command "script/generate rspec"
|
|
end
|
|
|
|
def assert_configured
|
|
create_model
|
|
migrate
|
|
create_controller
|
|
assert_spec_passes
|
|
end
|
|
|
|
def create_model
|
|
project_command "script/generate rspec_model person name:string"
|
|
insert "validates_presence_of :name",
|
|
"app/models/person.rb",
|
|
/class Person/
|
|
insert "it { should validate_presence_of(:name) }",
|
|
"spec/models/person_spec.rb",
|
|
/describe Person do/
|
|
end
|
|
|
|
def create_controller
|
|
project_command "script/generate rspec_controller people"
|
|
insert "def index; render :text => 'Hello'; end",
|
|
"app/controllers/people_controller.rb",
|
|
/class PeopleController/
|
|
shoulda_controller_example = <<-EOS
|
|
describe PeopleController, "on GET index" do
|
|
integrate_views
|
|
subject { controller }
|
|
before(:each) { get :index }
|
|
it { should respond_with(:success) }
|
|
end
|
|
EOS
|
|
insert shoulda_controller_example,
|
|
"spec/controllers/people_controller_spec.rb"
|
|
end
|
|
|
|
def migrate
|
|
project_command "rake db:migrate"
|
|
end
|
|
|
|
def assert_spec_passes
|
|
result = project_command("rake spec SPEC_OPTS=-fs")
|
|
assert_match /should require name to be set/, result
|
|
assert_match /should respond with 200/, result
|
|
end
|
|
|
|
def shoulda_root
|
|
SHOULDA_ROOT
|
|
end
|
|
|
|
def build_gemspec
|
|
backup_gemspec do
|
|
shoulda_command "rake gemspec"
|
|
shoulda_command "rake gem"
|
|
shoulda_command "gem install --no-ri --no-rdoc -i pkg pkg/shoulda*.gem"
|
|
end
|
|
end
|
|
|
|
def backup_gemspec
|
|
actual = "#{shoulda_root}/shoulda.gemspec"
|
|
backup = "#{shoulda_root}/backup.gemspec"
|
|
FileUtils.mv(actual, backup)
|
|
begin
|
|
yield
|
|
ensure
|
|
FileUtils.mv(backup, actual)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|