ippy04-remarkable_mongo 0.1.3

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.
@@ -0,0 +1,147 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'validate_length_of' do
4
+ include ModelBuilder
5
+
6
+ # Defines a model, create a validation and returns a raw matcher
7
+ def define_and_validate(options={})
8
+ options = options.merge(:within => 3..5) if options.slice(:within, :maximum, :minimum, :is).empty?
9
+
10
+ @model = define_model :product do
11
+ include MongoMapper::Document
12
+
13
+ key :size, String
14
+ key :category, String
15
+
16
+ validates_length_of :size, options
17
+ end
18
+
19
+ validate_length_of(:size)
20
+ end
21
+
22
+ describe 'messages' do
23
+ before(:each){ @matcher = define_and_validate }
24
+
25
+ it 'should contain a description' do
26
+ @matcher.within(3..5)
27
+ @matcher.description.should == 'ensure length of size is within 3..5 characters'
28
+
29
+ @matcher.within(nil).is(3)
30
+ @matcher.description.should == 'ensure length of size is equal to 3 characters'
31
+
32
+ @matcher.is(nil).maximum(5)
33
+ @matcher.description.should == 'ensure length of size is maximum 5 characters'
34
+
35
+ @matcher.maximum(nil).minimum(3)
36
+ @matcher.description.should == 'ensure length of size is minimum 3 characters'
37
+
38
+ @matcher.allow_nil(false)
39
+ @matcher.description.should == 'ensure length of size is minimum 3 characters and not allowing nil values'
40
+
41
+ @matcher.allow_blank
42
+ @matcher.description.should == 'ensure length of size is minimum 3 characters, not allowing nil values, and allowing blank values'
43
+ end
44
+
45
+ it 'should set less_than_min_length? message' do
46
+ @matcher.within(4..5).matches?(@model)
47
+ @matcher.failure_message.should == 'Expected Product to be invalid when size length is less than 4 characters'
48
+ end
49
+
50
+ it 'should set exactly_min_length? message' do
51
+ @matcher.should_receive(:less_than_min_length?).and_return(true)
52
+ @matcher.within(2..5).matches?(@model)
53
+ @matcher.failure_message.should == 'Expected Product to be valid when size length is 2 characters'
54
+ end
55
+
56
+ it 'should set more_than_max_length? message' do
57
+ @matcher.within(3..4).matches?(@model)
58
+ @matcher.failure_message.should == 'Expected Product to be invalid when size length is more than 4 characters'
59
+ end
60
+
61
+ it 'should set exactly_max_length? message' do
62
+ @matcher.should_receive(:more_than_max_length?).and_return(true)
63
+ @matcher.within(3..6).matches?(@model)
64
+ @matcher.failure_message.should == 'Expected Product to be valid when size length is 6 characters'
65
+ end
66
+
67
+ it 'should set allow_blank? message' do
68
+ @matcher.within(3..5).allow_blank.matches?(@model)
69
+ @matcher.failure_message.should == 'Expected Product to allow blank values for size'
70
+ end
71
+
72
+ it 'should set allow_nil? message' do
73
+ @matcher.within(3..5).allow_nil.matches?(@model)
74
+ @matcher.failure_message.should == 'Expected Product to allow nil values for size'
75
+ end
76
+ end
77
+
78
+ describe 'matcher' do
79
+ # Wrap specs without options. Usually a couple specs.
80
+ describe 'without options' do
81
+ before(:each){ define_and_validate }
82
+
83
+ it { should validate_length_of(:size, :within => 3..5) }
84
+ it { should_not validate_length_of(:category, :within => 3..5) }
85
+ end
86
+
87
+ describe "with message option" do
88
+
89
+ # if RAILS_VERSION =~ /^2.3/
90
+ # it { should define_and_validate(:message => 'not valid').within(3..5).message('not valid') }
91
+ # it { should_not define_and_validate(:message => 'not valid').within(3..5).message('valid') }
92
+ # else
93
+ # it { should define_and_validate(:too_short => 'not valid', :too_long => 'not valid').within(3..5).message('not valid') }
94
+ # it { should_not define_and_validate(:too_short => 'not valid', :too_long => 'not valid').within(3..5).message('valid') }
95
+ # end
96
+
97
+ it { should define_and_validate(:is => 4, :message => 'not valid').is(4).message('not valid') }
98
+ it { should_not define_and_validate(:is => 4, :message => 'not valid').is(4).message('valid') }
99
+ end
100
+
101
+ describe "with within option" do
102
+ it { should define_and_validate(:within => 3..5).within(3..5) }
103
+ it { should_not define_and_validate(:within => 3..5).within(2..5) }
104
+ it { should_not define_and_validate(:within => 3..5).within(4..5) }
105
+ it { should_not define_and_validate(:within => 3..5).within(3..4) }
106
+ it { should_not define_and_validate(:within => 3..5).within(3..6) }
107
+ end
108
+
109
+ describe "with minimum option" do
110
+ it { should define_and_validate(:minimum => 3).minimum(3) }
111
+ it { should_not define_and_validate(:minimum => 3).minimum(2) }
112
+ it { should_not define_and_validate(:minimum => 3).minimum(4) }
113
+ end
114
+
115
+ describe "with maximum option" do
116
+ it { should define_and_validate(:maximum => 3).maximum(3) }
117
+ it { should_not define_and_validate(:maximum => 3).maximum(2) }
118
+ it { should_not define_and_validate(:maximum => 3).maximum(4) }
119
+ end
120
+
121
+ describe "with is option" do
122
+ it { should define_and_validate(:is => 3).is(3) }
123
+ it { should_not define_and_validate(:is => 3).is(2) }
124
+ it { should_not define_and_validate(:is => 3).is(4) }
125
+ end
126
+
127
+ # Those are macros to test optionals which accept only boolean values
128
+ create_optional_boolean_specs(:allow_nil, self)
129
+ create_optional_boolean_specs(:allow_blank, self)
130
+ end
131
+
132
+ # In macros we include just a few tests to assure that everything works properly
133
+ describe 'macros' do
134
+ before(:each) { define_and_validate }
135
+
136
+ should_validate_length_of :size, :within => 3..5
137
+
138
+ should_not_validate_length_of :size, :within => 2..5
139
+ should_not_validate_length_of :size, :within => 4..5
140
+ should_not_validate_length_of :size, :within => 3..4
141
+ should_not_validate_length_of :size, :within => 3..6
142
+
143
+ should_validate_length_of :size do |m|
144
+ m.within = 3..5
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'validate_presence_of' do
4
+ subject do
5
+ Article.new
6
+ end
7
+
8
+ describe 'messages' do
9
+
10
+ it 'should contain a description' do
11
+ matcher = validate_presence_of(:title, :body)
12
+ matcher.description.should == 'require title and body to be set'
13
+ end
14
+
15
+ it 'should set allow_nil? message' do
16
+ matcher = validate_presence_of(:body)
17
+ matcher.matches?(subject)
18
+ matcher.failure_message.should == 'Expected Article to require body to be set'
19
+ matcher.negative_failure_message.should == 'Did not expect Article to require body to be set'
20
+ end
21
+
22
+ end
23
+
24
+ describe 'matchers' do
25
+ it { should validate_presence_of(:title) }
26
+ it { should_not validate_presence_of(:body) }
27
+ end
28
+
29
+ describe 'macros' do
30
+ should_validate_presence_of(:title)
31
+ should_not_validate_presence_of(:body)
32
+ end
33
+ end
@@ -0,0 +1,64 @@
1
+ # This is based on Shoulda model builder for Test::Unit.
2
+ #
3
+ module ModelBuilder
4
+ def self.included(base)
5
+ return unless base.name =~ /^Spec/
6
+
7
+ base.class_eval do
8
+ after(:each) do
9
+ if @defined_constants
10
+ @defined_constants.each do |class_name|
11
+ Object.send(:remove_const, class_name)
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ base.extend ClassMethods
18
+ end
19
+
20
+ def define_constant(class_name, &block)
21
+ class_name = class_name.to_s.camelize
22
+
23
+ klass = Class.new
24
+ Object.const_set(class_name, klass)
25
+
26
+ klass.class_eval(&block) if block_given?
27
+
28
+ @defined_constants ||= []
29
+ @defined_constants << class_name
30
+
31
+ klass
32
+ end
33
+
34
+ def define_model(name, columns = {}, &block)
35
+ instance = define_constant(name.to_s.classify, &block).new
36
+
37
+ self.class.subject { instance } if self.class.respond_to?(:subject)
38
+ instance
39
+ end
40
+
41
+ module ClassMethods
42
+ # This is a macro to run validations of boolean optionals such as :allow_nil
43
+ # and :allow_blank. This macro tests all scenarios. The specs must have a
44
+ # define_and_validate method defined.
45
+ #
46
+ def create_optional_boolean_specs(optional, base, options={})
47
+ base.describe "with #{optional} option" do
48
+ it { should define_and_validate(options.merge(optional => true)).send(optional) }
49
+ it { should define_and_validate(options.merge(optional => false)).send(optional, false) }
50
+ it { should_not define_and_validate(options.merge(optional => true)).send(optional, false) }
51
+ it { should_not define_and_validate(options.merge(optional => false)).send(optional) }
52
+ end
53
+ end
54
+
55
+ def create_message_specs(base)
56
+ base.describe "with message option" do
57
+ it { should define_and_validate(:message => 'valid_message').message('valid_message') }
58
+ it { should_not define_and_validate(:message => 'not_valid').message('valid_message') }
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+
@@ -0,0 +1,42 @@
1
+ class Article
2
+ include MongoMapper::Document
3
+
4
+ key :title, String, :required => true
5
+ key :body, String
6
+
7
+ many :comments
8
+ many :unknowns
9
+ many :ratings, :class_name => "Rate"
10
+ many :assets
11
+ belongs_to :user
12
+ belongs_to :unknown
13
+ belongs_to :site, :class_name => 'Site'
14
+ end
15
+
16
+ class Comment
17
+ include MongoMapper::EmbeddedDocument
18
+
19
+ key :body, String
20
+ end
21
+
22
+ class User
23
+ include MongoMapper::Document
24
+
25
+ key :login, String
26
+ end
27
+
28
+ class Rate
29
+ include MongoMapper::EmbeddedDocument
30
+ end
31
+
32
+ class Rating
33
+ include MongoMapper::EmbeddedDocument
34
+ end
35
+
36
+ class Site
37
+ include MongoMapper::Document
38
+ end
39
+
40
+ class Webiste
41
+ include MongoMapper::EmbeddedDocument
42
+ end
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,17 @@
1
+ require "rubygems"
2
+ require "mongo_mapper"
3
+
4
+ MongoMapper.database = "remarkable_mongomapper"
5
+
6
+ def reset_test_db!
7
+ MongoMapper.connection.drop_database("remarkable_mongomapper")
8
+ end
9
+
10
+ Spec::Runner.configure do |config|
11
+ config.before(:all) { reset_test_db! }
12
+ config.after(:all) { reset_test_db! }
13
+ end
14
+
15
+ require File.join(File.dirname(__FILE__), "..", "lib", "remarkable/mongo_mapper")
16
+ require File.join(File.dirname(__FILE__), "models")
17
+ require File.join(File.dirname(__FILE__), "model_builder")
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ippy04-remarkable_mongo
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 3
9
+ version: 0.1.3
10
+ platform: ruby
11
+ authors:
12
+ - Nicolas Merouze
13
+ - Justin Ip
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-02-27 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: remarkable
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 1
31
+ - 8
32
+ version: 3.1.8
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: mongo_mapper
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ - 7
45
+ - 0
46
+ version: 0.7.0
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description:
50
+ email: nicolas.merouze@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - LICENSE
57
+ - README.md
58
+ files:
59
+ - .gitignore
60
+ - LICENSE
61
+ - README.md
62
+ - Rakefile
63
+ - VERSION
64
+ - lib/remarkable/mongo_mapper.rb
65
+ - lib/remarkable/mongo_mapper/base.rb
66
+ - lib/remarkable/mongo_mapper/describe.rb
67
+ - lib/remarkable/mongo_mapper/human_names.rb
68
+ - lib/remarkable/mongo_mapper/matchers/allow_values_for_matcher.rb
69
+ - lib/remarkable/mongo_mapper/matchers/association_matcher.rb
70
+ - lib/remarkable/mongo_mapper/matchers/have_key_matcher.rb
71
+ - lib/remarkable/mongo_mapper/matchers/validate_confirmation_of_matcher.rb
72
+ - lib/remarkable/mongo_mapper/matchers/validate_length_of_matcher.rb
73
+ - lib/remarkable/mongo_mapper/matchers/validate_presence_of_matcher.rb
74
+ - locales/en.yml
75
+ - remarkable_mongo.gemspec
76
+ - spec/matchers/allow_values_for_matcher_spec.rb
77
+ - spec/matchers/association_matcher_spec.rb
78
+ - spec/matchers/have_key_matcher_spec.rb
79
+ - spec/matchers/validate_confirmation_of_matcher_spec.rb
80
+ - spec/matchers/validate_length_of_matcher_spec.rb
81
+ - spec/matchers/validate_presence_of_matcher_spec.rb
82
+ - spec/model_builder.rb
83
+ - spec/models.rb
84
+ - spec/spec.opts
85
+ - spec/spec_helper.rb
86
+ has_rdoc: true
87
+ homepage: http://github.com/ippy04/remarkable_mongo
88
+ licenses: []
89
+
90
+ post_install_message:
91
+ rdoc_options:
92
+ - --charset=UTF-8
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.3.6
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Remarkable Matchers for MongoDB ORMs
116
+ test_files:
117
+ - spec/matchers/allow_values_for_matcher_spec.rb
118
+ - spec/matchers/association_matcher_spec.rb
119
+ - spec/matchers/have_key_matcher_spec.rb
120
+ - spec/matchers/validate_confirmation_of_matcher_spec.rb
121
+ - spec/matchers/validate_length_of_matcher_spec.rb
122
+ - spec/matchers/validate_presence_of_matcher_spec.rb
123
+ - spec/model_builder.rb
124
+ - spec/models.rb
125
+ - spec/spec_helper.rb