Skip to content

Instantly share code, notes, and snippets.

@resure
Created March 9, 2012 14:22
Show Gist options
  • Save resure/2006719 to your computer and use it in GitHub Desktop.
Save resure/2006719 to your computer and use it in GitHub Desktop.
RSpec & Factory_girl & Validation problems
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
t.string :username
t.string :real_name
t.boolean :author, default: false, null: false
t.boolean :moderator, default: false, null: false
t.boolean :admin, default: false, null: false
t.datetime :banned_at
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Encryptable
# t.string :password_salt
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
## Token authenticatable
# t.string :authentication_token
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
# add_index :users, :authentication_token, :unique => true
add_index :users, :username, unique: true
end
end
Factory.define :user do |f|
f.sequence(:username) { |n| "foo#{n}" }
f.sequence(:email) { |n| "foo#{n}@example.com" }
f.real_name 'Foo Bar'
f.password 'secret'
f.password_confirmation 'secret'
end
Factory.define :page do |f|
f.sequence(:title) { |n| "Page #{n}" }
f.sequence(:url) { |n| "page-#{url}" }
f.user_id = Factory :user
f.content 'Lorem Ipsum'
end
source 'https://rubygems.org'
gem 'rails', '3.2.2'
gem 'pg'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
gem 'therubyracer'
gem 'twitter-bootstrap-rails'
end
group :production do
gem 'thin'
end
gem 'rspec-rails', group: [:test, :development]
group :test do
gem 'capybara'
gem 'factory_girl_rails'
gem 'guard-rspec'
gem 'spork'
gem 'guard-spork'
end
gem 'jquery-rails'
gem 'database_cleaner'
gem 'devise'
gem 'cancan'
gem 'simple_form'
gem 'friendly_id'
~/Work/scpfoundation[pages*]% rspec . > gist -
/Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/validations.rb:56:in `save!': Validation failed: Email has already been taken, Email has already been taken (ActiveRecord::RecordInvalid)
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/transactions.rb:246:in `block in save!'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/transactions.rb:208:in `transaction'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.2/lib/active_record/transactions.rb:246:in `save!'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/definition.rb:9:in `block in initialize'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/strategy/create.rb:11:in `[]'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/strategy/create.rb:11:in `block in result'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/strategy/create.rb:9:in `tap'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/strategy/create.rb:9:in `result'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/factory.rb:48:in `run'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/factory_runner.rb:23:in `run'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/syntax/methods.rb:63:in `create'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/syntax/vintage.rb:50:in `default_strategy'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/syntax/vintage.rb:143:in `Factory'
from /Users/resure/Work/scpfoundation/spec/factories.rb:12:in `block in <top (required)>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/syntax/vintage.rb:30:in `define'
from /Users/resure/Work/scpfoundation/spec/factories.rb:9:in `<top (required)>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/dependencies.rb:245:in `load'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/dependencies.rb:245:in `block in load'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/dependencies.rb:236:in `load_dependency'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/dependencies.rb:245:in `load'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/find_definitions.rb:16:in `block in find_definitions'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/find_definitions.rb:15:in `each'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl-2.6.1/lib/factory_girl/find_definitions.rb:15:in `find_definitions'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/factory_girl_rails-1.7.0/lib/factory_girl_rails/railtie.rb:26:in `block in <class:Railtie>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:34:in `call'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:34:in `execute_hook'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:43:in `block in run_load_hooks'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:42:in `each'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:42:in `run_load_hooks'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/application/finisher.rb:59:in `block in <module:Finisher>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/initializable.rb:30:in `instance_exec'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/initializable.rb:30:in `run'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/initializable.rb:55:in `block in run_initializers'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/initializable.rb:54:in `each'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/initializable.rb:54:in `run_initializers'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/application.rb:136:in `initialize!'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.2/lib/rails/railtie/configurable.rb:30:in `method_missing'
from /Users/resure/Work/scpfoundation/config/environment.rb:5:in `<top (required)>'
from /Users/resure/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/resure/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/resure/Work/scpfoundation/spec/spec_helper.rb:6:in `block in <top (required)>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/spork-1.0.0rc1/lib/spork.rb:23:in `prefork'
from /Users/resure/Work/scpfoundation/spec/spec_helper.rb:4:in `<top (required)>'
from /Users/resure/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/resure/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/resure/Work/scpfoundation/spec/controllers/pages_controller_spec.rb:1:in `<top (required)>'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `block in load_spec_files'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `map'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load_spec_files'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:22:in `run'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run'
from /Users/resure/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun'
require 'rubygems'
require 'spork'
Spork.prefork do
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.include(MailerMacros)
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
reset_email
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.treat_symbols_as_metadata_keys_with_true_values = true
config.filter_run focus: :true
config.run_all_when_everything_filtered = true
end
end
Spork.each_run do
FactoryGirl.reload
end
# encoding: utf-8
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :lockable
attr_accessor :login
validates :email, uniqueness: { case_sensitive: false },
email: true
validates :real_name, format: /^[\wа-яА-Я\d\s\-]*$/, if: :real_name_changed?
validates :username, format: /^[\w\_\d\s\-]+$/, length: { within: 3..30 }
attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :real_name
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
login = conditions.delete(:login)
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.strip.downcase }]).first
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment