remarkable_activerecord 3.1.9 → 3.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/remarkable_activerecord/base.rb +5 -1
- data/lib/remarkable_activerecord/describe.rb +1 -2
- metadata +20 -42
- data/spec/accept_nested_attributes_for_matcher_spec.rb +0 -130
- data/spec/allow_mass_assignment_of_matcher_spec.rb +0 -106
- data/spec/allow_values_for_matcher_spec.rb +0 -80
- data/spec/association_matcher_spec.rb +0 -671
- data/spec/describe_spec.rb +0 -102
- data/spec/have_column_matcher_spec.rb +0 -78
- data/spec/have_default_scope_matcher_spec.rb +0 -52
- data/spec/have_index_matcher_spec.rb +0 -87
- data/spec/have_readonly_attributes_matcher_spec.rb +0 -47
- data/spec/have_scope_matcher_spec.rb +0 -85
- data/spec/model_builder.rb +0 -101
- data/spec/rcov.opts +0 -2
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -27
- data/spec/validate_acceptance_of_matcher_spec.rb +0 -68
- data/spec/validate_associated_matcher_spec.rb +0 -126
- data/spec/validate_confirmation_of_matcher_spec.rb +0 -58
- data/spec/validate_exclusion_of_matcher_spec.rb +0 -87
- data/spec/validate_inclusion_of_matcher_spec.rb +0 -87
- data/spec/validate_length_of_matcher_spec.rb +0 -218
- data/spec/validate_numericality_of_matcher_spec.rb +0 -186
- data/spec/validate_presence_of_matcher_spec.rb +0 -84
- data/spec/validate_uniqueness_of_matcher_spec.rb +0 -182
data/spec/describe_spec.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
RAILS_I18n = true
|
4
|
-
|
5
|
-
class Post
|
6
|
-
attr_accessor :published, :public, :deleted
|
7
|
-
|
8
|
-
def attributes=(attributes={}, guard=true)
|
9
|
-
attributes.each do |key, value|
|
10
|
-
send(:"#{key}=", value) unless guard
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.human_name(*args)
|
15
|
-
"MyPost"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe Post do
|
20
|
-
it "should use human name on description" do
|
21
|
-
self.class.description.should == "MyPost"
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "default attributes as a hash" do
|
25
|
-
subject_attributes :deleted => true
|
26
|
-
|
27
|
-
it "should set the subject with deleted equals to true" do
|
28
|
-
subject.deleted.should be_true
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should not change the description" do
|
32
|
-
self.class.description.should == "MyPost default attributes as a hash"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "default attributes as a proc" do
|
37
|
-
subject_attributes { my_attributes }
|
38
|
-
|
39
|
-
it "should set the subject with deleted equals to true" do
|
40
|
-
subject.deleted.should be_true
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should not change the description" do
|
44
|
-
self.class.description.should == "MyPost default attributes as a proc"
|
45
|
-
end
|
46
|
-
|
47
|
-
def my_attributes
|
48
|
-
{ :deleted => true }
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe :published => true do
|
53
|
-
it "should set the subject with published equals to true" do
|
54
|
-
subject.published.should be_true
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should generate a readable description" do
|
58
|
-
self.class.description.should == "MyPost when published is true"
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should call human name attribute on the described class" do
|
62
|
-
Post.should_receive(:human_attribute_name).with("comments_count", :locale => :en).and_return("__COMMENTS__COUNT__")
|
63
|
-
self.class.describe(:comments_count => 5) do
|
64
|
-
self.description.should == 'MyPost when published is true and __comments__count__ is 5'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe :public => false do
|
69
|
-
it "should nest subject attributes" do
|
70
|
-
subject.published.should be_true
|
71
|
-
subject.public.should be_false
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should nest descriptions" do
|
75
|
-
self.class.description.should == "MyPost when published is true and public is false"
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "default attributes as a hash" do
|
79
|
-
subject_attributes :deleted => true
|
80
|
-
|
81
|
-
it "should merge describe attributes with subject attributes" do
|
82
|
-
subject.published.should be_true
|
83
|
-
subject.public.should be_false
|
84
|
-
subject.deleted.should be_true
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe :published => true, :public => false do
|
91
|
-
it "should set the subject with published equals to true and public equals to false" do
|
92
|
-
subject.published.should be_true
|
93
|
-
subject.public.should be_false
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should include both published and public in descriptions" do
|
97
|
-
self.class.description.should match(/MyPost/)
|
98
|
-
self.class.description.should match(/public is false/)
|
99
|
-
self.class.description.should match(/published is true/)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'have_column_matcher' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
@model = define_model :product, :table => lambda {|table|
|
8
|
-
table.string :name, :null => true
|
9
|
-
table.string :email, :limit => '255', :default => 'jose.valim@gmail.com'
|
10
|
-
table.decimal :price, :precision => 10, :scale => 2
|
11
|
-
}
|
12
|
-
end
|
13
|
-
|
14
|
-
describe 'messages' do
|
15
|
-
|
16
|
-
it 'should contain a description' do
|
17
|
-
@matcher = have_column(:name, :email)
|
18
|
-
@matcher.description.should == 'have column(s) named name and email'
|
19
|
-
|
20
|
-
@matcher.type(:string)
|
21
|
-
@matcher.description.should == 'have column(s) named name and email with type :string'
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should set column_exists? message' do
|
25
|
-
@matcher = have_column(:password)
|
26
|
-
@matcher.matches?(@model)
|
27
|
-
@matcher.failure_message.should == 'Expected Product to have column named password'
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should set options_match? message' do
|
31
|
-
@matcher = have_column(:name, :type => :integer)
|
32
|
-
@matcher.matches?(@model)
|
33
|
-
@matcher.failure_message.should == 'Expected Product to have column name with options {:type=>"integer"}, got {:type=>"string"}'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe 'matchers' do
|
38
|
-
it { should have_column(:name) }
|
39
|
-
it { should have_columns(:name, :email) }
|
40
|
-
it { should have_columns(:name, :email, :price) }
|
41
|
-
|
42
|
-
it { should have_column(:name).null }
|
43
|
-
it { should have_column(:email).limit(255) }
|
44
|
-
it { should have_column(:email).default('jose.valim@gmail.com') }
|
45
|
-
it { should have_column(:price).precision(10) }
|
46
|
-
it { should have_column(:price).precision(10).scale(2) }
|
47
|
-
|
48
|
-
it { should_not have_column(:name).null(false) }
|
49
|
-
it { should_not have_column(:email).limit(400) }
|
50
|
-
it { should_not have_column(:email).default('') }
|
51
|
-
it { should_not have_column(:price).precision(1) }
|
52
|
-
it { should_not have_column(:price).precision(10).scale(5) }
|
53
|
-
end
|
54
|
-
|
55
|
-
describe 'macros' do
|
56
|
-
should_have_column :name
|
57
|
-
should_have_columns :name, :email
|
58
|
-
should_have_columns :name, :email, :price
|
59
|
-
|
60
|
-
should_have_column :name, :null => true
|
61
|
-
should_have_column :email, :limit => 255
|
62
|
-
should_have_column :email, :default => 'jose.valim@gmail.com'
|
63
|
-
should_have_column :price, :precision => 10
|
64
|
-
should_have_column :price, :precision => 10, :scale => 2
|
65
|
-
|
66
|
-
should_have_column :price do |m|
|
67
|
-
m.scale = 2
|
68
|
-
m.precision = 10
|
69
|
-
end
|
70
|
-
|
71
|
-
should_not_have_column :name, :null => false
|
72
|
-
should_not_have_column :email, :limit => 400
|
73
|
-
should_not_have_column :email, :default => ''
|
74
|
-
should_not_have_column :price, :precision => 1
|
75
|
-
should_not_have_column :price, :precision => 10, :scale => 5
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
if RAILS_VERSION == '2.3.3'
|
4
|
-
describe 'have_default_scope' do
|
5
|
-
include ModelBuilder
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
@model = define_model :product, :published => :boolean do
|
9
|
-
default_scope :order => 'created_at DESC'
|
10
|
-
default_scope :conditions => { :published => true }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe 'messages' do
|
15
|
-
|
16
|
-
it 'should contain a description' do
|
17
|
-
matcher = have_default_scope(:conditions => {:special => true})
|
18
|
-
matcher.description.should == 'have a default scope with {:conditions=>{:special=>true}}'
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should set options_match? message' do
|
22
|
-
matcher = have_default_scope(:conditions => {:special => true})
|
23
|
-
matcher.matches?(@model)
|
24
|
-
matcher.failure_message.should == 'Expected default scope with {:conditions=>{:special=>true}}, got [{:order=>"created_at DESC"}, {:conditions=>{:published=>true}}]'
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
describe 'matchers' do
|
30
|
-
it { should have_default_scope(:order => 'created_at DESC') }
|
31
|
-
it { should have_default_scope(:conditions => { :published => true }) }
|
32
|
-
|
33
|
-
it { should_not have_default_scope(:order => 'created_at ASC') }
|
34
|
-
it { should_not have_default_scope(:conditions => { :published => false }) }
|
35
|
-
it { should_not have_default_scope(:conditions => { :published => true }, :order => 'created_at DESC') }
|
36
|
-
|
37
|
-
describe 'when the model has no default scope' do
|
38
|
-
before(:each){ @model = define_model(:task) }
|
39
|
-
it { @model.should_not have_default_scope }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe 'macros' do
|
44
|
-
should_have_default_scope :order => 'created_at DESC'
|
45
|
-
should_have_default_scope :conditions => { :published => true }
|
46
|
-
|
47
|
-
should_not_have_default_scope :order => 'created_at ASC'
|
48
|
-
should_not_have_default_scope :conditions => { :published => false }
|
49
|
-
should_not_have_default_scope :conditions => { :published => true }, :order => 'created_at DESC'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'have_index_matcher' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
@model = define_model :users, :table => lambda {|table|
|
8
|
-
table.string :name, :null => true
|
9
|
-
table.string :email, :limit => '255', :default => 'jose.valim@gmail.com'
|
10
|
-
}
|
11
|
-
|
12
|
-
create_table "users_watchers" do |t|
|
13
|
-
t.integer :user_id
|
14
|
-
t.integer :watcher_id
|
15
|
-
end
|
16
|
-
|
17
|
-
ActiveRecord::Base.connection.add_index :users, :name
|
18
|
-
ActiveRecord::Base.connection.add_index :users, :email, :unique => true
|
19
|
-
ActiveRecord::Base.connection.add_index :users, [:email, :name], :unique => true
|
20
|
-
ActiveRecord::Base.connection.add_index :users_watchers, :user_id
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'messages' do
|
24
|
-
it 'should contain a description' do
|
25
|
-
@matcher = have_index(:name)
|
26
|
-
@matcher.description.should == 'have index for column(s) name'
|
27
|
-
|
28
|
-
@matcher.unique
|
29
|
-
@matcher.description.should == 'have index for column(s) name with unique values'
|
30
|
-
|
31
|
-
@matcher.table_name("another")
|
32
|
-
@matcher.description.should == 'have index for column(s) name on table another and with unique values'
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should set index_exists? message' do
|
36
|
-
@matcher = have_index(:password).table_name("special_users")
|
37
|
-
@matcher.matches?(@model)
|
38
|
-
@matcher.failure_message.should == 'Expected index password to exist on table special_users'
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should set is_unique? message' do
|
42
|
-
@matcher = have_index(:email, :unique => false)
|
43
|
-
@matcher.matches?(@model)
|
44
|
-
@matcher.failure_message.should == 'Expected index on email with unique equals to false, got true'
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe 'matchers' do
|
49
|
-
it { should have_index(:name) }
|
50
|
-
it { should have_index(:email) }
|
51
|
-
it { should have_index([:email, :name]) }
|
52
|
-
it { should have_index(:name, :email) }
|
53
|
-
|
54
|
-
it { should have_index(:name).unique(false) }
|
55
|
-
it { should have_index(:email).unique }
|
56
|
-
it { should have_index(:user_id).table_name(:users_watchers) }
|
57
|
-
|
58
|
-
it { should_not have_index(:password) }
|
59
|
-
it { should_not have_index(:name).unique(true) }
|
60
|
-
it { should_not have_index(:email).unique(false) }
|
61
|
-
it { should_not have_index(:watcher_id).table_name(:users_watchers) }
|
62
|
-
end
|
63
|
-
|
64
|
-
describe 'macros' do
|
65
|
-
should_have_index :name
|
66
|
-
should_have_index :email
|
67
|
-
should_have_index [:email, :name]
|
68
|
-
should_have_index :name, :email
|
69
|
-
|
70
|
-
should_have_index :name, :unique => false
|
71
|
-
should_have_index :email, :unique => true
|
72
|
-
should_have_index :user_id, :table_name => :users_watchers
|
73
|
-
|
74
|
-
should_not_have_index :password
|
75
|
-
should_not_have_index :name, :unique => true
|
76
|
-
should_not_have_index :email, :unique => false
|
77
|
-
should_not_have_index :watcher_id, :table_name => :users_watchers
|
78
|
-
end
|
79
|
-
|
80
|
-
describe "aliases" do
|
81
|
-
should_have_indices :name
|
82
|
-
should_have_db_index :name
|
83
|
-
should_have_db_indices :name
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'have_readonly_attributes' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
def define_and_validate(options={})
|
7
|
-
@model = define_model :product, :title => :string, :category => :string do
|
8
|
-
attr_readonly :title, :category if options[:readonly] == true
|
9
|
-
attr_readonly *options[:readonly] if options[:readonly].is_a?(Array)
|
10
|
-
end
|
11
|
-
|
12
|
-
have_readonly_attributes(:title, :category)
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'messages' do
|
16
|
-
|
17
|
-
it 'should contain a description' do
|
18
|
-
@matcher = have_readonly_attributes(:title, :category)
|
19
|
-
@matcher.description.should == 'make title and category read-only'
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should set is_readonly? message' do
|
23
|
-
@matcher = define_and_validate(:readonly => [:another])
|
24
|
-
@matcher.matches?(@model)
|
25
|
-
@matcher.failure_message.should == 'Expected Product to make title read-only, got ["another"]'
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
describe 'matchers' do
|
31
|
-
it { should define_and_validate(:readonly => true) }
|
32
|
-
it { should_not define_and_validate(:readonly => false) }
|
33
|
-
it { should_not define_and_validate(:accessible => [:another]) }
|
34
|
-
end
|
35
|
-
|
36
|
-
describe 'macros' do
|
37
|
-
before(:each){ define_and_validate(:readonly => true) }
|
38
|
-
|
39
|
-
should_have_readonly_attributes :title
|
40
|
-
should_have_readonly_attributes :category
|
41
|
-
should_have_readonly_attributes :title, :category
|
42
|
-
|
43
|
-
should_not_have_readonly_attributes :another
|
44
|
-
should_not_have_readonly_attributes :title, :another
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'have_scope' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
@model = define_model :product, :title => :string, :category => :string do
|
8
|
-
named_scope :recent, :order => 'created_at DESC'
|
9
|
-
named_scope :latest, lambda {|c| {:limit => c}}
|
10
|
-
named_scope :since, lambda {|t| {:conditions => ['created_at > ?', t]}}
|
11
|
-
named_scope :between, lambda { |a, b| { :conditions => [ 'created_at > ? and created_at < ?', a, b ] } }
|
12
|
-
|
13
|
-
def self.beginning(c)
|
14
|
-
scoped(:offset => c)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.null
|
18
|
-
nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'messages' do
|
24
|
-
|
25
|
-
it 'should contain a description' do
|
26
|
-
matcher = have_scope(:title)
|
27
|
-
matcher.description.should == 'have to scope itself to {} when :title is called'
|
28
|
-
|
29
|
-
matcher.with(1)
|
30
|
-
matcher.description.should == 'have to scope itself to {} when :title is called with [1] as argument'
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should set is_scope? message' do
|
34
|
-
matcher = have_scope(:null)
|
35
|
-
matcher.matches?(@model)
|
36
|
-
matcher.failure_message.should == 'Expected :null when called on Product return an instance of ActiveRecord::NamedScope::Scope'
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should set options_match? message' do
|
40
|
-
matcher = have_scope(:recent, :conditions => {:special => true})
|
41
|
-
matcher.matches?(@model)
|
42
|
-
matcher.failure_message.should == 'Expected :recent when called on Product scope to {:conditions=>{:special=>true}}, got {:order=>"created_at DESC"}'
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
describe 'matchers' do
|
48
|
-
it { should have_scope(:recent) }
|
49
|
-
it { should have_scope(:recent, :order => 'created_at DESC') }
|
50
|
-
|
51
|
-
it { should have_scope(:latest).with(10).limit(10) }
|
52
|
-
it { should have_scope(:beginning).with(10).offset(10) }
|
53
|
-
it { should have_scope(:since).with(false).conditions(["created_at > ?", false]) }
|
54
|
-
it { should have_scope(:since).with(Time.at(0)).conditions(["created_at > ?", Time.at(0)]) }
|
55
|
-
it { should have_scope(:between).with(2, 10).conditions(["created_at > ? and created_at < ?", 2, 10]) }
|
56
|
-
|
57
|
-
it { should_not have_scope(:null) }
|
58
|
-
it { should_not have_scope(:latest).with(5).limit(10) }
|
59
|
-
it { should_not have_scope(:beginning).with(5).offset(10) }
|
60
|
-
it { should_not have_scope(:since).with(Time.at(0)).conditions(["created_at > ?", Time.at(1)]) }
|
61
|
-
it { should_not have_scope(:between).with(2, 10).conditions(["updated_at > ? and updated_at < ?", 2, 10]) }
|
62
|
-
end
|
63
|
-
|
64
|
-
describe 'macros' do
|
65
|
-
should_have_scope :recent
|
66
|
-
should_have_scope :recent, :order => 'created_at DESC'
|
67
|
-
|
68
|
-
should_have_scope :latest, :with => 10, :limit => 10
|
69
|
-
should_have_scope :beginning, :with => 10, :offset => 10
|
70
|
-
should_have_scope :since, :with => false, :conditions => ["created_at > ?", false]
|
71
|
-
should_have_scope :since, :with => Time.at(0), :conditions => ["created_at > ?", Time.at(0)]
|
72
|
-
should_have_scope :between, :with => [ 2, 10 ], :conditions => [ "created_at > ? and created_at < ?", 2, 10 ]
|
73
|
-
|
74
|
-
should_have_scope :between do |m|
|
75
|
-
m.with(2, 10)
|
76
|
-
m.conditions([ "created_at > ? and created_at < ?", 2, 10 ])
|
77
|
-
end
|
78
|
-
|
79
|
-
should_not_have_scope :null
|
80
|
-
should_not_have_scope :latest, :with => 5, :limit => 10
|
81
|
-
should_not_have_scope :beginning, :with => 5, :offset => 10
|
82
|
-
should_not_have_scope :since, :with => Time.at(0), :conditions => ["created_at > ?", Time.at(1)]
|
83
|
-
should_not_have_scope :between, :with => [ 2, 10 ], :conditions => [ "updated_at > ? and updated_at < ?", 2, 10 ]
|
84
|
-
end
|
85
|
-
end
|