JonathanTron-rspec_sequel_matchers 0.0.2 → 0.1.0

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.
Files changed (33) hide show
  1. data/README.rdoc +29 -4
  2. data/VERSION +1 -1
  3. data/lib/rspec_sequel/association.rb +1 -1
  4. data/lib/rspec_sequel/base.rb +1 -1
  5. data/lib/rspec_sequel/matchers/validate_exact_length.rb +2 -2
  6. data/lib/rspec_sequel/matchers/validate_format.rb +25 -0
  7. data/lib/rspec_sequel/matchers/validate_includes.rb +25 -0
  8. data/lib/rspec_sequel/matchers/validate_integer.rb +21 -0
  9. data/lib/rspec_sequel/matchers/validate_length_range.rb +25 -0
  10. data/lib/rspec_sequel/matchers/validate_max_length.rb +25 -0
  11. data/lib/rspec_sequel/matchers/validate_min_length.rb +25 -0
  12. data/lib/rspec_sequel/matchers/validate_not_string.rb +21 -0
  13. data/lib/rspec_sequel/matchers/validate_numeric.rb +21 -0
  14. data/lib/rspec_sequel/matchers/validate_presence.rb +1 -1
  15. data/lib/rspec_sequel/matchers/validate_unique.rb +33 -0
  16. data/lib/rspec_sequel/validation.rb +5 -1
  17. data/rspec_sequel_matchers.gemspec +30 -3
  18. data/spec/have_column_matcher_spec.rb +15 -14
  19. data/spec/have_many_to_many_matcher_spec.rb +8 -7
  20. data/spec/have_many_to_one_matcher_spec.rb +8 -7
  21. data/spec/have_one_to_many_matcher_spec.rb +8 -7
  22. data/spec/validate_exact_length_matcher_spec.rb +12 -10
  23. data/spec/validate_format_matcher_spec.rb +88 -0
  24. data/spec/validate_includes_matcher_spec.rb +88 -0
  25. data/spec/validate_integer_matcher_spec.rb +77 -0
  26. data/spec/validate_length_range_matcher_spec.rb +88 -0
  27. data/spec/validate_max_length_matcher_spec.rb +88 -0
  28. data/spec/validate_min_length_matcher_spec.rb +88 -0
  29. data/spec/validate_not_string_matcher_spec.rb +77 -0
  30. data/spec/validate_numeric_matcher_spec.rb +77 -0
  31. data/spec/validate_presence_matcher_spec.rb +11 -9
  32. data/spec/validate_unique_matcher_spec.rb +79 -0
  33. metadata +28 -1
@@ -20,26 +20,27 @@ describe "have_many_to_many_matcher" do
20
20
  it "should set failure messages" do
21
21
  @matcher = have_many_to_many :items
22
22
  @matcher.matches? subject
23
- @matcher.failure_message.should == "expected Comment to have a many_to_many association :items"
24
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
23
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
25
25
  end
26
26
  end
27
27
  describe "with options" do
28
28
  it "should contain a description" do
29
29
  @matcher = have_many_to_many :items, :class_name => "Item"
30
- @matcher.description.should == 'have a many_to_many association :items with :class_name => "Item"'
30
+ @matcher.description.should == 'have a many_to_many association :items with option(s) :class_name => "Item"'
31
31
  end
32
32
  it "should set failure messages" do
33
33
  @matcher = have_many_to_many :items, :class_name => "Item"
34
34
  @matcher.matches? subject
35
- @matcher.failure_message.should == 'expected Comment to have a many_to_many association :items with :class_name => "Item"'
36
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
35
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
37
37
  end
38
38
  it "should explicit used options if different than expected" do
39
39
  @matcher = have_many_to_many :items, :class_name => "Price"
40
40
  @matcher.matches? subject
41
- @matcher.failure_message.should == 'expected Comment to have a many_to_many association :items with :class_name => "Price" expected :class_name == "Price" but found "Item" instead'
42
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
41
+ explanation = ' expected :class_name == "Price" but found "Item" instead'
42
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description + explanation
43
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description + explanation
43
44
  end
44
45
  end
45
46
  end
@@ -20,26 +20,27 @@ describe "have_many_to_one_matcher" do
20
20
  it "should set failure messages" do
21
21
  @matcher = have_many_to_one :item
22
22
  @matcher.matches? subject
23
- @matcher.failure_message.should == "expected Comment to have a many_to_one association :item"
24
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
23
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
25
25
  end
26
26
  end
27
27
  describe "with options" do
28
28
  it "should contain a description" do
29
29
  @matcher = have_many_to_one :item, :class_name => "Item"
30
- @matcher.description.should == 'have a many_to_one association :item with :class_name => "Item"'
30
+ @matcher.description.should == 'have a many_to_one association :item with option(s) :class_name => "Item"'
31
31
  end
32
32
  it "should set failure messages" do
33
33
  @matcher = have_many_to_one :item, :class_name => "Item"
34
34
  @matcher.matches? subject
35
- @matcher.failure_message.should == 'expected Comment to have a many_to_one association :item with :class_name => "Item"'
36
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
35
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
37
37
  end
38
38
  it "should explicit used options if different than expected" do
39
39
  @matcher = have_many_to_one :item, :class_name => "Price"
40
40
  @matcher.matches? subject
41
- @matcher.failure_message.should == 'expected Comment to have a many_to_one association :item with :class_name => "Price" expected :class_name == "Price" but found "Item" instead'
42
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
41
+ explanation = ' expected :class_name == "Price" but found "Item" instead'
42
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description + explanation
43
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description + explanation
43
44
  end
44
45
  end
45
46
  end
@@ -20,26 +20,27 @@ describe "have_one_to_many_matcher" do
20
20
  it "should set failure messages" do
21
21
  @matcher = have_one_to_many :comments
22
22
  @matcher.matches? subject
23
- @matcher.failure_message.should == "expected Item to have a one_to_many association :comments"
24
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
23
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
25
25
  end
26
26
  end
27
27
  describe "with options" do
28
28
  it "should contain a description" do
29
29
  @matcher = have_one_to_many :comments, :class_name => "Comment"
30
- @matcher.description.should == 'have a one_to_many association :comments with :class_name => "Comment"'
30
+ @matcher.description.should == 'have a one_to_many association :comments with option(s) :class_name => "Comment"'
31
31
  end
32
32
  it "should set failure messages" do
33
33
  @matcher = have_one_to_many :comments, :class_name => "Comment"
34
34
  @matcher.matches? subject
35
- @matcher.failure_message.should == 'expected Item to have a one_to_many association :comments with :class_name => "Comment"'
36
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
35
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
37
37
  end
38
38
  it "should explicit used options if different than expected" do
39
39
  @matcher = have_one_to_many :comments, :class_name => "Price"
40
40
  @matcher.matches? subject
41
- @matcher.failure_message.should == 'expected Item to have a one_to_many association :comments with :class_name => "Price" expected :class_name == "Price" but found "Comment" instead'
42
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to have", "to not have")
41
+ explanation = ' expected :class_name == "Price" but found "Comment" instead'
42
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
43
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
43
44
  end
44
45
  end
45
46
  end
@@ -40,37 +40,39 @@ describe "validate_exact_length_matcher" do
40
40
  describe "without option" do
41
41
  it "should contain a description" do
42
42
  @matcher = validate_exact_length 4, :name
43
- @matcher.description.should == "validate exact length of :name to 4"
43
+ @matcher.description.should == "validate length of :name is exactly 4"
44
44
  end
45
45
  it "should set failure messages" do
46
46
  @matcher = validate_exact_length 4, :name
47
47
  @matcher.matches? subject
48
- @matcher.failure_message.should == "expected Item to validate exact length of :name to 4"
49
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to validate", "to not validate")
48
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
49
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
50
50
  end
51
51
  end
52
52
  describe "with options" do
53
53
  it "should contain a description" do
54
54
  @matcher = validate_exact_length 4, :name, :allow_nil => true
55
- @matcher.description.should == "validate exact length of :name to 4 with :allow_nil => true"
55
+ @matcher.description.should == "validate length of :name is exactly 4 with option(s) :allow_nil => true"
56
56
  end
57
57
  it "should set failure messages" do
58
58
  @matcher = validate_exact_length 4, :price, :allow_nil => true
59
59
  @matcher.matches? subject
60
- @matcher.failure_message.should == "expected Item to validate exact length of :price to 4 with :allow_nil => true"
61
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to validate", "to not validate")
60
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
61
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
62
62
  end
63
63
  it "should explicit used options if different than expected" do
64
64
  @matcher = validate_exact_length 4, :name, :allow_blank => true
65
65
  @matcher.matches? subject
66
- @matcher.failure_message.should == "expected Item to validate exact length of :name to 4 with :allow_blank => true but called with option(s) :allow_nil => true instead"
67
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to validate", "to not validate")
66
+ explanation = " but called with option(s) :allow_nil => true instead"
67
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
68
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
68
69
  end
69
70
  it "should warn if invalid options are used" do
70
71
  @matcher = validate_exact_length 4, :name, :allow_anything => true
71
72
  @matcher.matches? subject
72
- @matcher.failure_message.should == "expected Item to validate exact length of :name to 4 with :allow_anything => true but option :allow_anything is not valid"
73
- @matcher.negative_failure_message.should == @matcher.failure_message.gsub("to validate", "to not validate")
73
+ explanation = " but option :allow_anything is not valid"
74
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
75
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
74
76
  end
75
77
  end
76
78
  end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_format_matcher" do
4
+
5
+ before :all do
6
+ define_model :item do
7
+ plugin :validation_helpers
8
+ def validate
9
+ validates_format /[abc]+/, :name, :allow_nil => true
10
+ end
11
+ end
12
+ end
13
+
14
+ subject{ Item }
15
+
16
+ describe "arguments" do
17
+ it "should require attribute" do
18
+ lambda{
19
+ @matcher = validate_format
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ it "should require additionnal parameters" do
23
+ lambda{
24
+ @matcher = validate_format :name
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ it "should refuse invalid additionnal parameters" do
28
+ lambda{
29
+ @matcher = validate_format :id, :name
30
+ }.should raise_error(ArgumentError)
31
+ end
32
+ it "should accept valid additionnal parameters" do
33
+ lambda{
34
+ @matcher = validate_format /[abc]+/, :name
35
+ }.should_not raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ describe "messages" do
40
+ describe "without option" do
41
+ it "should contain a description" do
42
+ @matcher = validate_format /[abc]+/, :name
43
+ @matcher.description.should == "validate format of :name against /[abc]+/"
44
+ end
45
+ it "should set failure messages" do
46
+ @matcher = validate_format /[abc]+/, :name
47
+ @matcher.matches? subject
48
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
49
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
50
+ end
51
+ end
52
+ describe "with options" do
53
+ it "should contain a description" do
54
+ @matcher = validate_format /[abc]+/, :name, :allow_nil => true
55
+ @matcher.description.should == "validate format of :name against /[abc]+/ with option(s) :allow_nil => true"
56
+ end
57
+ it "should set failure messages" do
58
+ @matcher = validate_format /[abc]+/, :price, :allow_nil => true
59
+ @matcher.matches? subject
60
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
61
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
62
+ end
63
+ it "should explicit used options if different than expected" do
64
+ @matcher = validate_format /[abc]+/, :name, :allow_blank => true
65
+ @matcher.matches? subject
66
+ explanation = " but called with option(s) :allow_nil => true instead"
67
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
68
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
69
+ end
70
+ it "should warn if invalid options are used" do
71
+ @matcher = validate_format /[abc]+/, :name, :allow_anything => true
72
+ @matcher.matches? subject
73
+ explanation = " but option :allow_anything is not valid"
74
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
75
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "matchers" do
81
+ it{ should validate_format(/[abc]+/, :name) }
82
+ it{ should validate_format(/[abc]+/, :name, :allow_nil => true) }
83
+ it{ should_not validate_format(/[abc]+/, :price) }
84
+ it{ should_not validate_format(/[abc]/, :name) }
85
+ it{ should_not validate_format(/[abc]+/, :name, :allow_blank => true) }
86
+ end
87
+
88
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_includes_matcher" do
4
+
5
+ before :all do
6
+ define_model :item do
7
+ plugin :validation_helpers
8
+ def validate
9
+ validates_includes ["Joseph", "Jonathan"], :name, :allow_nil => true
10
+ end
11
+ end
12
+ end
13
+
14
+ subject{ Item }
15
+
16
+ describe "arguments" do
17
+ it "should require attribute" do
18
+ lambda{
19
+ @matcher = validate_includes
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ it "should require additionnal parameters" do
23
+ lambda{
24
+ @matcher = validate_includes :name
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ it "should refuse invalid additionnal parameters" do
28
+ lambda{
29
+ @matcher = validate_includes :id, :name
30
+ }.should raise_error(ArgumentError)
31
+ end
32
+ it "should accept valid additionnal parameters" do
33
+ lambda{
34
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name
35
+ }.should_not raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ describe "messages" do
40
+ describe "without option" do
41
+ it "should contain a description" do
42
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name
43
+ @matcher.description.should == 'validate that :name is included in ["Joseph", "Jonathan"]'
44
+ end
45
+ it "should set failure messages" do
46
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name
47
+ @matcher.matches? subject
48
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
49
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
50
+ end
51
+ end
52
+ describe "with options" do
53
+ it "should contain a description" do
54
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name, :allow_nil => true
55
+ @matcher.description.should == 'validate that :name is included in ["Joseph", "Jonathan"] with option(s) :allow_nil => true'
56
+ end
57
+ it "should set failure messages" do
58
+ @matcher = validate_includes ["Joseph", "Jonathan"], :price, :allow_nil => true
59
+ @matcher.matches? subject
60
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
61
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
62
+ end
63
+ it "should explicit used options if different than expected" do
64
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name, :allow_blank => true
65
+ @matcher.matches? subject
66
+ explanation = " but called with option(s) :allow_nil => true instead"
67
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
68
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
69
+ end
70
+ it "should warn if invalid options are used" do
71
+ @matcher = validate_includes ["Joseph", "Jonathan"], :name, :allow_anything => true
72
+ @matcher.matches? subject
73
+ explanation = " but option :allow_anything is not valid"
74
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
75
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "matchers" do
81
+ it{ should validate_includes(["Joseph", "Jonathan"], :name) }
82
+ it{ should validate_includes(["Joseph", "Jonathan"], :name, :allow_nil => true) }
83
+ it{ should_not validate_includes(["Joseph", "Jonathan"], :price) }
84
+ it{ should_not validate_includes(["Joseph", "Jonathan", "Alice"], :name) }
85
+ it{ should_not validate_includes(["Joseph", "Jonathan"], :name, :allow_blank => true) }
86
+ end
87
+
88
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_integer_matcher" do
4
+
5
+ before :all do
6
+ define_model :item do
7
+ plugin :validation_helpers
8
+ def validate
9
+ validates_integer [:id, :name], :allow_nil => true
10
+ end
11
+ end
12
+ end
13
+
14
+ subject{ Item }
15
+
16
+ describe "arguments" do
17
+ it "should require attribute" do
18
+ lambda{
19
+ @matcher = validate_integer
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ it "should refuse additionnal parameters" do
23
+ lambda{
24
+ @matcher = validate_integer :name, :id
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ end
28
+
29
+ describe "messages" do
30
+ describe "without option" do
31
+ it "should contain a description" do
32
+ @matcher = validate_integer :name
33
+ @matcher.description.should == "validate that :name is a valid integer"
34
+ end
35
+ it "should set failure messages" do
36
+ @matcher = validate_integer :name
37
+ @matcher.matches? subject
38
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
39
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
40
+ end
41
+ end
42
+ describe "with options" do
43
+ it "should contain a description" do
44
+ @matcher = validate_integer :name, :allow_nil => true
45
+ @matcher.description.should == "validate that :name is a valid integer with option(s) :allow_nil => true"
46
+ end
47
+ it "should set failure messages" do
48
+ @matcher = validate_integer :price, :allow_nil => true
49
+ @matcher.matches? subject
50
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
51
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
52
+ end
53
+ it "should explicit used options if different than expected" do
54
+ @matcher = validate_integer :name, :allow_blank => true
55
+ @matcher.matches? subject
56
+ explanation = " but called with option(s) :allow_nil => true instead"
57
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
58
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
59
+ end
60
+ it "should warn if invalid options are used" do
61
+ @matcher = validate_integer :name, :allow_anything => true
62
+ @matcher.matches? subject
63
+ explanation = " but option :allow_anything is not valid"
64
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
65
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "matchers" do
71
+ it{ should validate_integer(:name) }
72
+ it{ should validate_integer(:name, :allow_nil => true) }
73
+ it{ should_not validate_integer(:price) }
74
+ it{ should_not validate_integer(:name, :allow_blank => true) }
75
+ end
76
+
77
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_length_range_matcher" do
4
+
5
+ before :all do
6
+ define_model :item do
7
+ plugin :validation_helpers
8
+ def validate
9
+ validates_length_range 1..10, :name, :allow_nil => true
10
+ end
11
+ end
12
+ end
13
+
14
+ subject{ Item }
15
+
16
+ describe "arguments" do
17
+ it "should require attribute" do
18
+ lambda{
19
+ @matcher = validate_length_range
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ it "should require additionnal parameters" do
23
+ lambda{
24
+ @matcher = validate_length_range :name
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ it "should refuse invalid additionnal parameters" do
28
+ lambda{
29
+ @matcher = validate_length_range :id, :name
30
+ }.should raise_error(ArgumentError)
31
+ end
32
+ it "should accept valid additionnal parameters" do
33
+ lambda{
34
+ @matcher = validate_length_range 1..10, :name
35
+ }.should_not raise_error(ArgumentError)
36
+ end
37
+ end
38
+
39
+ describe "messages" do
40
+ describe "without option" do
41
+ it "should contain a description" do
42
+ @matcher = validate_length_range 1..10, :name
43
+ @matcher.description.should == "validate length of :name is included in 1..10"
44
+ end
45
+ it "should set failure messages" do
46
+ @matcher = validate_length_range 1..10, :name
47
+ @matcher.matches? subject
48
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
49
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
50
+ end
51
+ end
52
+ describe "with options" do
53
+ it "should contain a description" do
54
+ @matcher = validate_length_range 1..10, :name, :allow_nil => true
55
+ @matcher.description.should == "validate length of :name is included in 1..10 with option(s) :allow_nil => true"
56
+ end
57
+ it "should set failure messages" do
58
+ @matcher = validate_length_range 1..10, :price, :allow_nil => true
59
+ @matcher.matches? subject
60
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
61
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
62
+ end
63
+ it "should explicit used options if different than expected" do
64
+ @matcher = validate_length_range 1..10, :name, :allow_blank => true
65
+ @matcher.matches? subject
66
+ explanation = " but called with option(s) :allow_nil => true instead"
67
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
68
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
69
+ end
70
+ it "should warn if invalid options are used" do
71
+ @matcher = validate_length_range 1..10, :name, :allow_anything => true
72
+ @matcher.matches? subject
73
+ explanation = " but option :allow_anything is not valid"
74
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
75
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "matchers" do
81
+ it{ should validate_length_range(1..10, :name) }
82
+ it{ should validate_length_range(1..10, :name, :allow_nil => true) }
83
+ it{ should_not validate_length_range(1..10, :price) }
84
+ it{ should_not validate_length_range(0..10, :name) }
85
+ it{ should_not validate_length_range(1..10, :name, :allow_blank => true) }
86
+ end
87
+
88
+ end