thoughtbot--shoulda-matchers/spec/acceptance/rails_integration_spec.rb

156 lines
3.6 KiB
Ruby

require 'acceptance_spec_helper'
describe 'shoulda-matchers integrates with Rails' do
before do
create_rails_application
write_file 'db/migrate/1_create_users.rb', <<-FILE
class CreateUsers < #{migration_class_name}
def self.up
create_table :users do |t|
t.string :name
end
end
end
FILE
run_rake_tasks!('db:drop', 'db:create', 'db:migrate')
write_file 'app/models/user.rb', <<-FILE
class User < ActiveRecord::Base
validates_presence_of :name
end
FILE
write_file 'app/controllers/examples_controller.rb', <<-FILE
class ExamplesController < ApplicationController
def index
head :ok
end
end
FILE
configure_routes
end
specify 'in a project that uses the default test framework' do
updating_bundle do
add_gems_for_n_unit
add_shoulda_matchers_to_project(
test_frameworks: [default_test_framework],
libraries: [:rails],
)
end
run_tests_for_n_unit
end
specify 'in a project that uses RSpec' do
updating_bundle do
add_gems_for_rspec
add_shoulda_matchers_to_project(
test_frameworks: [:rspec],
libraries: [:rails],
)
end
run_tests_for_rspec
end
specify 'in a project that uses Spring' do
unless bundle_includes?('spring')
skip "Spring isn't a dependency of this Appraisal"
end
updating_bundle do
add_spring_to_project
add_gems_for_rspec
add_shoulda_matchers_to_project(
test_frameworks: [:rspec],
libraries: [:rails],
manually: true,
)
end
run_command_within_bundle!('spring stop')
run_tests_for_rspec
end
specify 'in a project that combines both RSpec and Test::Unit' do
updating_bundle do
add_gems_for_n_unit
add_gems_for_rspec
add_shoulda_matchers_to_project(
test_frameworks: [:rspec, nil],
libraries: [:rails],
)
end
run_tests_for_n_unit
run_tests_for_rspec
end
def add_gems_for_n_unit
add_gem 'shoulda-context'
end
def add_gems_for_rspec
add_rspec_rails_to_project!
end
def run_tests_for_n_unit
write_file 'test/unit/user_test.rb', <<-FILE
require 'test_helper'
class UserTest < ActiveSupport::TestCase
should validate_presence_of(:name)
end
FILE
write_file 'test/functional/examples_controller_test.rb', <<-FILE
require 'test_helper'
class ExamplesControllerTest < ActionController::TestCase
def setup
get :index
end
should respond_with(:success)
end
FILE
result = run_n_unit_test_suite
expect(result).to indicate_that_tests_were_run(unit: 1, functional: 1)
expect(result).to have_output(
'User should validate that :name cannot be empty/falsy',
)
expect(result).to have_output('should respond with 200')
end
def run_tests_for_rspec
add_rspec_file 'spec/models/user_spec.rb', <<-FILE
describe User do
it { should validate_presence_of(:name) }
end
FILE
add_rspec_file 'spec/controllers/examples_controller_spec.rb', <<-FILE
describe ExamplesController, "index" do
before { get :index }
it { should respond_with(:success) }
end
FILE
result = run_rspec_suite
expect(result).to have_output('2 examples, 0 failures')
expect(result).to have_output(
'is expected to validate that :name cannot be empty/falsy',
)
expect(result).to have_output('is expected to respond with 200')
end
end