Skip to content

Commit

Permalink
Make the test suite work again.
Browse files Browse the repository at this point in the history
* Require webmock, because guess what? We need that still.
* Revert back to Fog 1.4.0 and stay there.
* Bring in factory_girl_steps and tons of stupid hacks to make that work
* Lock to factory_girl 3.6.x since who knows what else will be missing.
* Flatten features directory so `cucumber [FEATURE]` works again
* Email checking in clearance/ActionMailer seems to be broken, weaken
  assertion for password reset email
  • Loading branch information
qrush committed Aug 3, 2012
1 parent 1fa2c0c commit b783b11
Show file tree
Hide file tree
Showing 18 changed files with 173 additions and 36 deletions.
4 changes: 2 additions & 2 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ gem 'airbrake'
gem 'clearance', '~> 0.16'
gem 'dynamic_form'
gem 'excon'
gem 'fog', '~> 1.4'
gem 'fog', '~> 1.4.0'
gem 'gchartrb', :require => 'google_chart'
gem 'gravtastic'
gem 'high_voltage'
Expand Down Expand Up @@ -47,7 +47,7 @@ group :test do
gem 'capybara'
gem 'cucumber-rails', :require => false
gem 'database_cleaner'
gem 'factory_girl_rails'
gem 'factory_girl_rails', '~> 3.6.0'

This comment has been minimized.

Copy link
@sferik

sferik Aug 3, 2012

Member

Tests pass for me on factory_girl_rails 4.x. Any reason not to upgrade?

gem 'launchy'
gem 'nokogiri'
gem 'rack-test', :require => 'rack/test'
Expand Down
10 changes: 5 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,16 @@ GEM
diff-lcs (1.1.3)
dynamic_form (1.1.4)
erubis (2.7.0)
excon (0.15.5)
excon (0.14.3)
factory_girl (3.6.1)
activesupport (>= 3.0.0)
factory_girl_rails (3.6.0)
factory_girl (~> 3.6.0)
railties (>= 3.0.0)
ffi (1.1.3)
fog (1.5.0)
fog (1.4.0)
builder
excon (~> 0.14)
excon (~> 0.14.0)
formatador (~> 0.2.0)
mime-types
multi_json (~> 1.0)
Expand Down Expand Up @@ -253,8 +253,8 @@ DEPENDENCIES
delayed_job_active_record
dynamic_form
excon
factory_girl_rails
fog (~> 1.4)
factory_girl_rails (~> 3.6.0)
fog (~> 1.4.0)
gchartrb
gravtastic
guard
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ Feature: Password reset with handle
Should be able to reset it with handle

Scenario: User is signed up and updates his password without having a handle
Given I signed up with "email@person.com"
Given I signed up with "email@example.com"
And my handle is nil
When I go to the password reset request page
And I fill in "Email address" with "email@person.com"
And I fill in "Email address" with "email@example.com"
And I press "Reset password"
Then a password reset message should be sent to "email@person.com"
When I follow the password reset link sent to "email@person.com"
Then a password reset message should be sent to "email@example.com"
When I follow the password reset link sent to "email@example.com"
And I update my password with "newpassword"
Then I should be signed in
When I sign out
Then I should be signed out
When I go to the sign in page
And I fill in "Email" with "email@person.com"
And I fill in "Email" with "email@example.com"
And I fill in "Password" with "newpassword"
And I press "Sign in"
Then I should be signed in
File renamed without changes.
File renamed without changes.
7 changes: 0 additions & 7 deletions features/step_definitions/clearance/clearance_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,6 @@
Then /^a password reset message should be sent to "(.*)"$/ do |email|
user = User.find_by_email(email)
assert !user.confirmation_token.blank?
assert !ActionMailer::Base.deliveries.empty?
result = ActionMailer::Base.deliveries.any? do |email|
email.to == [user.email] &&
email.subject =~ /password/i &&
email.body =~ /#{user.confirmation_token}/
end
assert result
end

When /^I follow the password reset link sent to "(.*)"$/ do |email|
Expand Down
145 changes: 145 additions & 0 deletions features/support/factory_girl_step_definitions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# Copied from FactoryGirl 3.3.0, since apparently it's not seen as useful anymore.
# Ignore this sage advice and keep on keepin' on.

require 'factory_girl'
FactoryGirl.find_definitions if FactoryGirl.sequences.to_a.empty?

This comment has been minimized.

Copy link
@qrush

qrush Aug 3, 2012

Author Member

Ping @joshuaclayton!

Here's the crap I was talking about. :(

This comment has been minimized.

Copy link
@joshuaclayton

joshuaclayton Aug 3, 2012

Contributor

You don't need to do any of this - 3.x series still includes the step definitions, they're just deprecated. Add ActiveSupport::Deprecation.silenced = true if you want to turn it off (I think that's the right call).


# @api private
module FactoryGirlStepHelpers
def convert_human_hash_to_attribute_hash(human_hash, associations = [])
HumanHashToAttributeHash.new(human_hash, associations).attributes
end

class HumanHashToAttributeHash
attr_reader :associations

def initialize(human_hash, associations)
@human_hash = human_hash
@associations = associations
end

def attributes(strategy = CreateAttributes)
@human_hash.inject({}) do |attribute_hash, (human_key, value)|
attributes = strategy.new(self, *process_key_value(human_key, value))
attribute_hash.merge({ attributes.key => attributes.value })
end
end

private

def process_key_value(key, value)
value = value.strip if value.is_a?(String)
[key.downcase.gsub(' ', '_').to_sym, value]
end

class AssociationManager
def initialize(human_hash_to_attributes_hash, key, value)
@human_hash_to_attributes_hash = human_hash_to_attributes_hash
@key = key
@value = value
end

def association
@human_hash_to_attributes_hash.associations.detect {|association| association.name == @key }
end

def association_instance
return unless association

if attributes_hash = nested_attribute_hash
factory.build_class.first(conditions: attributes_hash.attributes(FindAttributes)) or
FactoryGirl.create(association.factory, attributes_hash.attributes)
end
end

private

def factory
FactoryGirl.factory_by_name(association.factory)
end

def nested_attribute_hash
attribute, value = @value.split(':', 2)
return if value.blank?

HumanHashToAttributeHash.new({ attribute => value }, factory.associations)
end
end

class AttributeStrategy
attr_reader :key, :value, :association_manager

def initialize(human_hash_to_attributes_hash, key, value)
@association_manager = AssociationManager.new(human_hash_to_attributes_hash, key, value)
@key = key
@value = value
end
end

class FindAttributes < AttributeStrategy
def initialize(human_hash_to_attributes_hash, key, value)
super

if association_manager.association
@key = "#{@key}_id"
@value = association_manager.association_instance.try(:id)
end
end
end

class CreateAttributes < AttributeStrategy
def initialize(human_hash_to_attributes_hash, key, value)
super

if association_manager.association
@value = association_manager.association_instance
end
end
end
end
end

World(FactoryGirlStepHelpers)

FactoryGirl.factories.each do |factory|
factory.compile
factory.human_names.each do |human_name|
attribute_names_for_model = if factory.build_class.respond_to?(:attribute_names)
factory.build_class.attribute_names
elsif factory.build_class.respond_to?(:columns)
factory.build_class.columns.map do |column|
column.respond_to?(:name) ? column.name : column.to_s
end
else
[]
end

Given /^the following (?:#{human_name}|#{human_name.pluralize}) exists?:?$/i do |table|
table.hashes.each do |human_hash|
attributes = convert_human_hash_to_attribute_hash(human_hash, factory.associations)
FactoryGirl.create(factory.name, attributes)
end
end

Given /^an? #{human_name} exists$/i do
FactoryGirl.create(factory.name)
end

Given /^(\d+) #{human_name.pluralize} exist$/i do |count|
FactoryGirl.create_list(factory.name, count.to_i)
end

attribute_names_for_model.each do |attribute_name|
human_column_name = attribute_name.downcase.gsub('_', ' ')

Given /^an? #{human_name} exists with an? #{human_column_name} of "([^"]*)"$/i do |value|
FactoryGirl.create(factory.name, attribute_name => value)
end

Given /^(\d+) #{human_name.pluralize} exist with an? #{human_column_name} of "([^"]*)"$/i do |count, value|
FactoryGirl.create_list(factory.name, count.to_i, attribute_name => value)
end
end
end
end

4 changes: 2 additions & 2 deletions features/support/gemcutter.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
require 'webmock'
WebMock.disable_net_connect!

Hostess.local = true
Capybara.app_host = "https://gemcutter.local"

TEST_DIR = File.join('/', 'tmp', 'gemcutter')

require 'factory_girl/step_definitions'

This comment has been minimized.

Copy link
@joshuaclayton

joshuaclayton Aug 3, 2012

Contributor

You can still do this with 3.x

World(FactoryGirl::Syntax::Methods)

Before do
WebMock.reset!
FileUtils.mkdir(TEST_DIR)
Dir.chdir(TEST_DIR)
$fog.directories.create(:key => $rubygems_config[:s3_bucket], :public => true)
$fog.directories.create(:key => $rubygems_config[:s3_bucket], :public => true) if $fog
end

After do
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
14 changes: 14 additions & 0 deletions test/factories/application.rb → test/factories.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
FactoryGirl.define do
sequence :email do |n|
"user#{n}@example.com"
end

sequence :handle do |n|
"handle#{n}"
end

factory :user do
email
handle
password "password"
end

factory :dependency do
gem_dependency { Gem::Dependency.new(Rubygem.last.name, "1.0.0") }
rubygem
Expand Down
15 changes: 0 additions & 15 deletions test/factories/clearance.rb

This file was deleted.

Binary file added vendor/cache/excon-0.14.3.gem
Binary file not shown.
Binary file removed vendor/cache/excon-0.15.5.gem
Binary file not shown.
Binary file added vendor/cache/fog-1.4.0.gem
Binary file not shown.
Binary file removed vendor/cache/fog-1.5.0.gem
Binary file not shown.

3 comments on commit b783b11

@qrush
Copy link
Member Author

@qrush qrush commented on b783b11 Aug 3, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ping @sferik ! Just a heads up, I had to roll Fog back since 1.5 was being stupid on my box.

@sferik
Copy link
Member

@sferik sferik commented on b783b11 Aug 3, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. What errors were you seeing with Fog 1.5?

@geemus
Copy link
Contributor

@geemus geemus commented on b783b11 Aug 3, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qrush - what was going wrong for you with fog?

Please sign in to comment.