rspec_sequel_matchers 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +47 -0
  5. data/Rakefile +46 -0
  6. data/lib/rspec_sequel/association.rb +30 -0
  7. data/lib/rspec_sequel/base.rb +33 -0
  8. data/lib/rspec_sequel/matchers/have_column.rb +35 -0
  9. data/lib/rspec_sequel/matchers/have_many_to_many.rb +22 -0
  10. data/lib/rspec_sequel/matchers/have_many_to_one.rb +22 -0
  11. data/lib/rspec_sequel/matchers/have_one_to_many.rb +22 -0
  12. data/lib/rspec_sequel/matchers/validate_exact_length.rb +25 -0
  13. data/lib/rspec_sequel/matchers/validate_format.rb +25 -0
  14. data/lib/rspec_sequel/matchers/validate_includes.rb +25 -0
  15. data/lib/rspec_sequel/matchers/validate_integer.rb +21 -0
  16. data/lib/rspec_sequel/matchers/validate_length_range.rb +25 -0
  17. data/lib/rspec_sequel/matchers/validate_max_length.rb +25 -0
  18. data/lib/rspec_sequel/matchers/validate_min_length.rb +25 -0
  19. data/lib/rspec_sequel/matchers/validate_not_string.rb +21 -0
  20. data/lib/rspec_sequel/matchers/validate_numeric.rb +21 -0
  21. data/lib/rspec_sequel/matchers/validate_presence.rb +21 -0
  22. data/lib/rspec_sequel/matchers/validate_unique.rb +33 -0
  23. data/lib/rspec_sequel/validation.rb +77 -0
  24. data/lib/rspec_sequel_matchers.rb +9 -0
  25. data/rspec_sequel_matchers.gemspec +107 -0
  26. data/spec/have_column_matcher_spec.rb +89 -0
  27. data/spec/have_many_to_many_matcher_spec.rb +56 -0
  28. data/spec/have_many_to_one_matcher_spec.rb +55 -0
  29. data/spec/have_one_to_many_matcher_spec.rb +55 -0
  30. data/spec/migrations/001_create_items.rb +15 -0
  31. data/spec/migrations/002_create_comments.rb +17 -0
  32. data/spec/migrations/003_create_comments_items.rb +15 -0
  33. data/spec/spec_helper.rb +51 -0
  34. data/spec/validate_exact_length_matcher_spec.rb +88 -0
  35. data/spec/validate_format_matcher_spec.rb +88 -0
  36. data/spec/validate_includes_matcher_spec.rb +88 -0
  37. data/spec/validate_integer_matcher_spec.rb +77 -0
  38. data/spec/validate_length_range_matcher_spec.rb +88 -0
  39. data/spec/validate_max_length_matcher_spec.rb +88 -0
  40. data/spec/validate_min_length_matcher_spec.rb +88 -0
  41. data/spec/validate_not_string_matcher_spec.rb +77 -0
  42. data/spec/validate_numeric_matcher_spec.rb +77 -0
  43. data/spec/validate_presence_matcher_spec.rb +77 -0
  44. data/spec/validate_unique_matcher_spec.rb +79 -0
  45. metadata +153 -0
@@ -0,0 +1,107 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rspec_sequel_matchers}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jonathan Tron", "Joseph Halter"]
12
+ s.date = %q{2010-03-02}
13
+ s.email = %q{team@openhood.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "lib/rspec_sequel/association.rb",
25
+ "lib/rspec_sequel/base.rb",
26
+ "lib/rspec_sequel/matchers/have_column.rb",
27
+ "lib/rspec_sequel/matchers/have_many_to_many.rb",
28
+ "lib/rspec_sequel/matchers/have_many_to_one.rb",
29
+ "lib/rspec_sequel/matchers/have_one_to_many.rb",
30
+ "lib/rspec_sequel/matchers/validate_exact_length.rb",
31
+ "lib/rspec_sequel/matchers/validate_format.rb",
32
+ "lib/rspec_sequel/matchers/validate_includes.rb",
33
+ "lib/rspec_sequel/matchers/validate_integer.rb",
34
+ "lib/rspec_sequel/matchers/validate_length_range.rb",
35
+ "lib/rspec_sequel/matchers/validate_max_length.rb",
36
+ "lib/rspec_sequel/matchers/validate_min_length.rb",
37
+ "lib/rspec_sequel/matchers/validate_not_string.rb",
38
+ "lib/rspec_sequel/matchers/validate_numeric.rb",
39
+ "lib/rspec_sequel/matchers/validate_presence.rb",
40
+ "lib/rspec_sequel/matchers/validate_unique.rb",
41
+ "lib/rspec_sequel/validation.rb",
42
+ "lib/rspec_sequel_matchers.rb",
43
+ "rspec_sequel_matchers.gemspec",
44
+ "spec/have_column_matcher_spec.rb",
45
+ "spec/have_many_to_many_matcher_spec.rb",
46
+ "spec/have_many_to_one_matcher_spec.rb",
47
+ "spec/have_one_to_many_matcher_spec.rb",
48
+ "spec/migrations/001_create_items.rb",
49
+ "spec/migrations/002_create_comments.rb",
50
+ "spec/migrations/003_create_comments_items.rb",
51
+ "spec/spec_helper.rb",
52
+ "spec/validate_exact_length_matcher_spec.rb",
53
+ "spec/validate_format_matcher_spec.rb",
54
+ "spec/validate_includes_matcher_spec.rb",
55
+ "spec/validate_integer_matcher_spec.rb",
56
+ "spec/validate_length_range_matcher_spec.rb",
57
+ "spec/validate_max_length_matcher_spec.rb",
58
+ "spec/validate_min_length_matcher_spec.rb",
59
+ "spec/validate_not_string_matcher_spec.rb",
60
+ "spec/validate_numeric_matcher_spec.rb",
61
+ "spec/validate_presence_matcher_spec.rb",
62
+ "spec/validate_unique_matcher_spec.rb"
63
+ ]
64
+ s.homepage = %q{http://github.com/openhood/rspec_sequel_matchers}
65
+ s.rdoc_options = ["--charset=UTF-8"]
66
+ s.require_paths = ["lib"]
67
+ s.rubygems_version = %q{1.3.6}
68
+ s.summary = %q{RSpec Matchers for Sequel}
69
+ s.test_files = [
70
+ "spec/have_column_matcher_spec.rb",
71
+ "spec/have_many_to_many_matcher_spec.rb",
72
+ "spec/have_many_to_one_matcher_spec.rb",
73
+ "spec/have_one_to_many_matcher_spec.rb",
74
+ "spec/migrations/001_create_items.rb",
75
+ "spec/migrations/002_create_comments.rb",
76
+ "spec/migrations/003_create_comments_items.rb",
77
+ "spec/spec_helper.rb",
78
+ "spec/validate_exact_length_matcher_spec.rb",
79
+ "spec/validate_format_matcher_spec.rb",
80
+ "spec/validate_includes_matcher_spec.rb",
81
+ "spec/validate_integer_matcher_spec.rb",
82
+ "spec/validate_length_range_matcher_spec.rb",
83
+ "spec/validate_max_length_matcher_spec.rb",
84
+ "spec/validate_min_length_matcher_spec.rb",
85
+ "spec/validate_not_string_matcher_spec.rb",
86
+ "spec/validate_numeric_matcher_spec.rb",
87
+ "spec/validate_presence_matcher_spec.rb",
88
+ "spec/validate_unique_matcher_spec.rb"
89
+ ]
90
+
91
+ if s.respond_to? :specification_version then
92
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
93
+ s.specification_version = 3
94
+
95
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
96
+ s.add_runtime_dependency(%q<rspec>, [">= 2.0.0.a"])
97
+ s.add_runtime_dependency(%q<sequel>, [">= 3.8.0"])
98
+ else
99
+ s.add_dependency(%q<rspec>, [">= 2.0.0.a"])
100
+ s.add_dependency(%q<sequel>, [">= 3.8.0"])
101
+ end
102
+ else
103
+ s.add_dependency(%q<rspec>, [">= 2.0.0.a"])
104
+ s.add_dependency(%q<sequel>, [">= 3.8.0"])
105
+ end
106
+ end
107
+
@@ -0,0 +1,89 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "have_column_matcher" do
4
+
5
+ before do
6
+ define_model :item
7
+ end
8
+
9
+ subject{ Item }
10
+
11
+ describe "messages" do
12
+ describe "without type" do
13
+ it "should contain a description" do
14
+ @matcher = have_column :name
15
+ @matcher.description.should == "have a column :name"
16
+ end
17
+ it "should set failure messages" do
18
+ @matcher = have_column :name
19
+ @matcher.matches? subject
20
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
21
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
22
+ end
23
+ end
24
+ describe "with type as symbol" do
25
+ it "should contain a description" do
26
+ @matcher = have_column :name, :type => :string
27
+ @matcher.description.should == "have a column :name with type string"
28
+ end
29
+ it "should set failure messages" do
30
+ @matcher = have_column :password, :type => :string
31
+ @matcher.matches? subject
32
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
33
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
34
+ end
35
+ end
36
+ describe "with type as object" do
37
+ it "should contain a description" do
38
+ @matcher = have_column :name, :type => String
39
+ @matcher.description.should == "have a column :name with type String"
40
+ end
41
+ it "should set failure messages" do
42
+ @matcher = have_column :password, :type => String
43
+ @matcher.matches? subject
44
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
45
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
46
+ end
47
+ it "should explicit found type if different than expected" do
48
+ @matcher = have_column :name, :type => Integer
49
+ @matcher.matches? subject
50
+ explanation = " (type found: string, varchar(255))"
51
+ @matcher.failure_message.should == "expected Item to " + @matcher.description + explanation
52
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description + explanation
53
+ end
54
+ end
55
+ describe "on anonymous Sequel::Model class" do
56
+ it "should set failure messages" do
57
+ @matcher = have_column :password
58
+ @matcher.matches? Sequel::Model(:comments)
59
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
60
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
61
+ end
62
+ end
63
+ describe "on Sequel::Model class" do
64
+ it "should set failure messages" do
65
+ @matcher = have_column :password
66
+ @matcher.matches? Item
67
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
68
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
69
+ end
70
+ end
71
+ describe "on Sequel::Model instance" do
72
+ it "should set failure messages" do
73
+ @matcher = have_column :password
74
+ @matcher.matches? Item.new
75
+ @matcher.failure_message.should == "expected #<Item @values={}> to " + @matcher.description
76
+ @matcher.negative_failure_message.should == "expected #<Item @values={}> to not " + @matcher.description
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "matchers" do
82
+ it{ should have_column(:name) }
83
+ it{ should have_column(:name, :type => :string) }
84
+ it{ should have_column(:name, :type => String) }
85
+ it{ should_not have_column(:password) }
86
+ it{ should_not have_column(:name, :type => :integer) }
87
+ end
88
+
89
+ end
@@ -0,0 +1,56 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "have_many_to_many_matcher" do
4
+
5
+ before do
6
+ define_model :item
7
+ define_model :comment do
8
+ many_to_many :items
9
+ end
10
+ end
11
+
12
+ subject{ Comment }
13
+
14
+ describe "messages" do
15
+ describe "without option" do
16
+ it "should contain a description" do
17
+ @matcher = have_many_to_many :items
18
+ @matcher.description.should == "have a many_to_many association :items"
19
+ end
20
+ it "should set failure messages" do
21
+ @matcher = have_many_to_many :items
22
+ @matcher.matches? subject
23
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
25
+ end
26
+ end
27
+ describe "with options" do
28
+ it "should contain a description" do
29
+ @matcher = have_many_to_many :items, :class_name => "Item"
30
+ @matcher.description.should == 'have a many_to_many association :items with option(s) :class_name => "Item"'
31
+ end
32
+ it "should set failure messages" do
33
+ @matcher = have_many_to_many :items, :class_name => "Item"
34
+ @matcher.matches? subject
35
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
37
+ end
38
+ it "should explicit used options if different than expected" do
39
+ @matcher = have_many_to_many :items, :class_name => "Price"
40
+ @matcher.matches? subject
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
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "matchers" do
49
+ it{ should have_many_to_many(:items) }
50
+ it{ should have_many_to_many(:items, :class_name => "Item", :join_table => :comments_items) }
51
+ it{ should_not have_many_to_many(:prices) }
52
+ it{ should_not have_many_to_many(:items, :class_name => "Price") }
53
+ it{ should_not have_many_to_many(:items, :join_table => :items_comments) }
54
+ end
55
+
56
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "have_many_to_one_matcher" do
4
+
5
+ before do
6
+ define_model :item
7
+ define_model :comment do
8
+ many_to_one :item
9
+ end
10
+ end
11
+
12
+ subject{ Comment }
13
+
14
+ describe "messages" do
15
+ describe "without option" do
16
+ it "should contain a description" do
17
+ @matcher = have_many_to_one :item
18
+ @matcher.description.should == "have a many_to_one association :item"
19
+ end
20
+ it "should set failure messages" do
21
+ @matcher = have_many_to_one :item
22
+ @matcher.matches? subject
23
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
25
+ end
26
+ end
27
+ describe "with options" do
28
+ it "should contain a description" do
29
+ @matcher = have_many_to_one :item, :class_name => "Item"
30
+ @matcher.description.should == 'have a many_to_one association :item with option(s) :class_name => "Item"'
31
+ end
32
+ it "should set failure messages" do
33
+ @matcher = have_many_to_one :item, :class_name => "Item"
34
+ @matcher.matches? subject
35
+ @matcher.failure_message.should == "expected Comment to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Comment to not " + @matcher.description
37
+ end
38
+ it "should explicit used options if different than expected" do
39
+ @matcher = have_many_to_one :item, :class_name => "Price"
40
+ @matcher.matches? subject
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
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "matchers" do
49
+ it{ should have_many_to_one(:item) }
50
+ it{ should have_many_to_one(:item, :class_name => "Item") }
51
+ it{ should_not have_many_to_one(:price) }
52
+ it{ should_not have_many_to_one(:item, :class_name => "Price") }
53
+ end
54
+
55
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "have_one_to_many_matcher" do
4
+
5
+ before do
6
+ define_model :item do
7
+ one_to_many :comments
8
+ end
9
+ define_model :comment
10
+ end
11
+
12
+ subject{ Item }
13
+
14
+ describe "messages" do
15
+ describe "without option" do
16
+ it "should contain a description" do
17
+ @matcher = have_one_to_many :comments
18
+ @matcher.description.should == "have a one_to_many association :comments"
19
+ end
20
+ it "should set failure messages" do
21
+ @matcher = have_one_to_many :comments
22
+ @matcher.matches? subject
23
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
24
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
25
+ end
26
+ end
27
+ describe "with options" do
28
+ it "should contain a description" do
29
+ @matcher = have_one_to_many :comments, :class_name => "Comment"
30
+ @matcher.description.should == 'have a one_to_many association :comments with option(s) :class_name => "Comment"'
31
+ end
32
+ it "should set failure messages" do
33
+ @matcher = have_one_to_many :comments, :class_name => "Comment"
34
+ @matcher.matches? subject
35
+ @matcher.failure_message.should == "expected Item to " + @matcher.description
36
+ @matcher.negative_failure_message.should == "expected Item to not " + @matcher.description
37
+ end
38
+ it "should explicit used options if different than expected" do
39
+ @matcher = have_one_to_many :comments, :class_name => "Price"
40
+ @matcher.matches? subject
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
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "matchers" do
49
+ it{ should have_one_to_many(:comments) }
50
+ it{ should have_one_to_many(:comments, :class_name => "Comment") }
51
+ it{ should_not have_one_to_many(:prices) }
52
+ it{ should_not have_one_to_many(:comments, :class_name => "Price") }
53
+ end
54
+
55
+ end
@@ -0,0 +1,15 @@
1
+ class CreateItems < Sequel::Migration
2
+
3
+ def up
4
+ create_table :items do
5
+ primary_key :id
6
+ String :name
7
+ Float :price
8
+ end
9
+ end
10
+
11
+ def down
12
+ drop_table :items
13
+ end
14
+
15
+ end
@@ -0,0 +1,17 @@
1
+ class CreateComments < Sequel::Migration
2
+
3
+ def up
4
+ create_table :comments do
5
+ primary_key :id
6
+ foreign_key :item_id, :items, :type => Fixnum
7
+ String :content
8
+ DateTime :created_at
9
+ index :item_id
10
+ end
11
+ end
12
+
13
+ def down
14
+ drop_table :comments
15
+ end
16
+
17
+ end
@@ -0,0 +1,15 @@
1
+ class CreateCommentsItems < Sequel::Migration
2
+
3
+ def up
4
+ create_table :comments_items do
5
+ foreign_key :comment_id, :comments, :type => Fixnum
6
+ foreign_key :item_id, :items, :type => Fixnum
7
+ index [:comment_id, :item_id], :unique => true
8
+ end
9
+ end
10
+
11
+ def down
12
+ drop_table :comments_items
13
+ end
14
+
15
+ end
@@ -0,0 +1,51 @@
1
+ require "rspec"
2
+ require "rubygems"
3
+ require "sequel"
4
+ require "sequel/extensions/inflector"
5
+ require "sequel/extensions/migration"
6
+ require File.join(File.dirname(__FILE__), "..", "lib", "rspec_sequel_matchers")
7
+
8
+ # connect to an in-memory database
9
+ begin
10
+ Sequel.sqlite
11
+ rescue Sequel::AdapterNotFound
12
+ puts "sqlite not available. Install it with: sudo gem install sqlite3-ruby"
13
+ exit 1 # failure
14
+ end
15
+
16
+ # drop all tables and migrate on start
17
+ db = Sequel::Model.db
18
+ db.tables.each do |table_name|
19
+ db.drop_table table_name
20
+ end
21
+ Sequel::Migrator.apply(db, File.join(File.dirname(__FILE__), "migrations"))
22
+
23
+ module RspecHelpers
24
+ def define_model(model, &block)
25
+ model_name = model.to_s.camelize.to_sym
26
+ table_name = model.to_s.tableize.to_sym
27
+ @defined_models ||= []
28
+ @defined_models << model_name
29
+ klass = Object.const_set model_name, Sequel::Model(table_name)
30
+ klass.class_eval &block if block_given?
31
+ end
32
+ end
33
+
34
+ Rspec.configure do |c|
35
+ c.mock_framework = :rspec
36
+ c.color_enabled = true
37
+ c.include(RspecHelpers)
38
+ c.include(RspecSequel::Matchers)
39
+ # undefine models defined via define_model (if any)
40
+ # truncate all tables between each spec
41
+ c.after(:each) do
42
+ db = Sequel::Model.db
43
+ db.tables.each do |table_name|
44
+ db["TRUNCATE #{table_name}"]
45
+ end
46
+ (@defined_models||[]).each do |model_name|
47
+ Object.send(:remove_const, model_name)
48
+ end
49
+ @defined_models = nil
50
+ end
51
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_exact_length_matcher" do
4
+
5
+ before do
6
+ define_model :item do
7
+ plugin :validation_helpers
8
+ def validate
9
+ validates_exact_length 4, :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_exact_length
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ it "should require additionnal parameters" do
23
+ lambda{
24
+ @matcher = validate_exact_length :name
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ it "should refuse invalid additionnal parameters" do
28
+ lambda{
29
+ @matcher = validate_exact_length :id, :name
30
+ }.should raise_error(ArgumentError)
31
+ end
32
+ it "should accept valid additionnal parameters" do
33
+ lambda{
34
+ @matcher = validate_exact_length 4, :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_exact_length 4, :name
43
+ @matcher.description.should == "validate length of :name is exactly 4"
44
+ end
45
+ it "should set failure messages" do
46
+ @matcher = validate_exact_length 4, :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_exact_length 4, :name, :allow_nil => true
55
+ @matcher.description.should == "validate length of :name is exactly 4 with option(s) :allow_nil => true"
56
+ end
57
+ it "should set failure messages" do
58
+ @matcher = validate_exact_length 4, :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_exact_length 4, :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_exact_length 4, :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_exact_length(4, :name) }
82
+ it{ should validate_exact_length(4, :name, :allow_nil => true) }
83
+ it{ should_not validate_exact_length(4, :price) }
84
+ it{ should_not validate_exact_length(3, :name) }
85
+ it{ should_not validate_exact_length(4, :name, :allow_blank => true) }
86
+ end
87
+
88
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "validate_format_matcher" do
4
+
5
+ before 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