riot-mongo_mapper 0.0.3 → 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.
- data/Rakefile +2 -29
- data/lib/riot-mongo_mapper/has_association.rb +9 -3
- data/lib/riot-mongo_mapper/has_key.rb +1 -1
- data/lib/riot-mongo_mapper/has_validation.rb +30 -11
- data/riot-mongo_mapper.gemspec +3 -5
- data/test/fixtures/test.rb +2 -0
- data/test/has_association_test.rb +14 -13
- data/test/has_key_test.rb +12 -11
- data/test/has_plugin_test.rb +12 -11
- data/test/has_validation_test.rb +11 -9
- data/test/teststrap.rb +1 -2
- metadata +12 -63
data/Rakefile
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'mg'
|
4
|
-
|
5
|
-
MG.new(File.join(File.dirname(__FILE__),"riot-mongo_mapper.gemspec"))
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
6
3
|
|
7
4
|
require 'rake/testtask'
|
8
5
|
Rake::TestTask.new(:test) do |test|
|
@@ -10,27 +7,3 @@ Rake::TestTask.new(:test) do |test|
|
|
10
7
|
test.pattern = 'test/**/*_test.rb'
|
11
8
|
test.verbose = true
|
12
9
|
end
|
13
|
-
|
14
|
-
begin
|
15
|
-
require 'rcov/rcovtask'
|
16
|
-
Rcov::RcovTask.new do |test|
|
17
|
-
test.libs << 'test'
|
18
|
-
test.pattern = 'test/**/*_test.rb'
|
19
|
-
test.verbose = true
|
20
|
-
end
|
21
|
-
rescue LoadError
|
22
|
-
task :rcov do
|
23
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
task :default => :test
|
28
|
-
|
29
|
-
begin
|
30
|
-
require 'yard'
|
31
|
-
YARD::Rake::YardocTask.new
|
32
|
-
rescue LoadError
|
33
|
-
task :yardoc do
|
34
|
-
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
35
|
-
end
|
36
|
-
end
|
@@ -4,14 +4,20 @@ module RiotMongoMapper
|
|
4
4
|
|
5
5
|
def evaluate(model, *association_macro_info)
|
6
6
|
association_name, key_name, options = association_macro_info
|
7
|
-
association = model.associations[key_name.
|
7
|
+
association = model.associations[key_name.to_sym]
|
8
|
+
association_class = case association_name
|
9
|
+
when :many
|
10
|
+
MongoMapper::Plugins::Associations::ManyAssociation
|
11
|
+
when :one
|
12
|
+
MongoMapper::Plugins::Associations::OneAssociation
|
13
|
+
end
|
8
14
|
if association.nil?
|
9
15
|
fail("expected #{model} to have association #{association}")
|
10
16
|
else
|
11
|
-
association_valid = association.
|
17
|
+
association_valid = association.class == association_class
|
12
18
|
options_valid = options ? options.all? { |field,value| association.options[field] == value } : true
|
13
19
|
options_valid && association_valid ? pass("#{model} has association '#{association_name}' on '#{key_name}' with options #{options.inspect}") :
|
14
|
-
|
20
|
+
fail("expected #{model} to have association #{association_name} with options #{options.inspect} on key #{key_name}")
|
15
21
|
end
|
16
22
|
end
|
17
23
|
end
|
@@ -3,20 +3,39 @@ module RiotMongoMapper
|
|
3
3
|
register :has_validation
|
4
4
|
|
5
5
|
def evaluate(model, *validation_macro_info)
|
6
|
-
validation_type,
|
7
|
-
|
8
|
-
|
6
|
+
validation_type, validation_field, options = validation_macro_info
|
7
|
+
type = validation_type.to_s
|
8
|
+
|
9
|
+
%w{validates_ _of}.each { |part| type.gsub!(%r{#{part}},'') }
|
10
|
+
|
11
|
+
validation = model._validators[validation_field].detect do |valid|
|
12
|
+
valid.class.name =~ /#{type.camelize}/
|
9
13
|
end
|
14
|
+
|
10
15
|
options ||= {}
|
16
|
+
|
11
17
|
case
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
when validation_field.nil? || validation_type.nil?
|
19
|
+
fail("validation field, type and potential options must be specified with this assertion macro")
|
20
|
+
|
21
|
+
when validation.nil?
|
22
|
+
fail("expected #{model} to have validation on #{validation_field} of type #{validation_type}")
|
23
|
+
|
24
|
+
when (validation.class.name =~ %r{Length} and options[:within])
|
25
|
+
range = options[:within].to_a
|
26
|
+
if (validation.options[:minimum] == range.first) and (validation.options[:maximum] == range.last)
|
27
|
+
pass("#{model} has '#{validation_type}' validation '#{validation_field}' with options #{options.inspect}")
|
28
|
+
else
|
29
|
+
fail("expected #{model} to have options #{options.inspect} on validation #{validation_type}")
|
30
|
+
end
|
31
|
+
|
32
|
+
else
|
33
|
+
options_valid = options.all? { |key,value| validation.options[key] == value }
|
34
|
+
if options_valid
|
35
|
+
pass("#{model} has '#{validation_type}' validation '#{validation_field}' with options #{options.inspect}")
|
36
|
+
else
|
37
|
+
fail("expected #{model} to have options #{options.inspect} on validation #{validation_type}")
|
38
|
+
end
|
20
39
|
end
|
21
40
|
end
|
22
41
|
end
|
data/riot-mongo_mapper.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "riot-mongo_mapper"
|
3
|
-
s.version = "0.0
|
3
|
+
s.version = "0.1.0"
|
4
4
|
s.required_rubygems_version = ">= 1.3.6"
|
5
5
|
s.authors = ["Arthur Chiu"]
|
6
6
|
s.date = Time.now.strftime("%Y-%m-%d")
|
@@ -12,9 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.rdoc_options = ["--charset=UTF-8"]
|
13
13
|
s.require_paths = ["lib"]
|
14
14
|
s.summary = %q{Riot assertions for MongoMapper}
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.add_runtime_dependency(%q<mongo_mapper>, [">= 0.8.2"])
|
18
|
-
s.add_runtime_dependency(%q<riot>, [">= 0.11.2"])
|
15
|
+
s.add_dependency 'mongo_mapper', '~>0.9.0'
|
16
|
+
s.add_dependency 'riot', '~>0.12.3'
|
19
17
|
end
|
20
18
|
|
data/test/fixtures/test.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('../teststrap', __FILE__)
|
2
2
|
|
3
3
|
context "has_association macro" do
|
4
|
-
|
4
|
+
helper(:macro) { RiotMongoMapper::HasAssociationAssertion.new }
|
5
|
+
|
5
6
|
setup do
|
6
7
|
mock_model do
|
7
8
|
many :persons
|
@@ -9,24 +10,24 @@ context "has_association macro" do
|
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
asserts "passes when has association" do
|
13
|
-
|
13
|
+
asserts "passes when has association" do
|
14
|
+
macro.evaluate(topic, :many, :persons).first
|
14
15
|
end.equals(:pass)
|
15
16
|
|
16
|
-
asserts "fails when has association" do
|
17
|
-
|
17
|
+
asserts "fails when has association" do
|
18
|
+
macro.evaluate(topic, :many, :dogs).first
|
18
19
|
end.equals(:fail)
|
19
20
|
|
20
|
-
asserts "passes when association options is specified" do
|
21
|
-
|
21
|
+
asserts "passes when association options is specified" do
|
22
|
+
macro.evaluate(topic, :many, :categories, :in => :category_ids, :class_name => 'Tags').first
|
22
23
|
end.equals(:pass)
|
23
24
|
|
24
|
-
asserts "fails when the options don't match" do
|
25
|
-
|
25
|
+
asserts "fails when the options don't match" do
|
26
|
+
macro.evaluate(topic, :many, :categories, :foreign_id => 'wtf').first
|
26
27
|
end.equals(:fail)
|
27
28
|
|
28
|
-
asserts "returns a message" do
|
29
|
-
|
29
|
+
asserts "returns a message" do
|
30
|
+
macro.evaluate(topic, :many, :persons).last
|
30
31
|
end.matches %r{has association 'many' on 'persons' with options}
|
31
32
|
|
32
|
-
end
|
33
|
+
end
|
data/test/has_key_test.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('../teststrap', __FILE__)
|
2
2
|
|
3
3
|
context "has_key macro" do
|
4
|
-
|
4
|
+
helper(:macro) { RiotMongoMapper::HasKeyAssertion.new }
|
5
|
+
|
5
6
|
setup do
|
6
7
|
mock_model do
|
7
8
|
key :name, String
|
@@ -11,23 +12,23 @@ context "has_key macro" do
|
|
11
12
|
end
|
12
13
|
|
13
14
|
asserts "passes when the key is specified" do
|
14
|
-
|
15
|
+
macro.evaluate(topic, :name, String).first
|
15
16
|
end.equals(:pass)
|
16
17
|
|
17
|
-
asserts "fails when the key doesn't match" do
|
18
|
-
|
18
|
+
asserts "fails when the key doesn't match" do
|
19
|
+
macro.evaluate(topic, :name, Array).first
|
19
20
|
end.equals(:fail)
|
20
21
|
|
21
|
-
asserts "passes when options are specified" do
|
22
|
-
|
22
|
+
asserts "passes when options are specified" do
|
23
|
+
macro.evaluate(topic, :age, Integer, :required => true, :default => 18).first
|
23
24
|
end.equals(:pass)
|
24
25
|
|
25
|
-
asserts "fails when the options specifed don't match" do
|
26
|
-
|
26
|
+
asserts "fails when the options specifed don't match" do
|
27
|
+
macro.evaluate(topic, :foo, Boolean, :default => true).first
|
27
28
|
end.equals(:fail)
|
28
29
|
|
29
|
-
asserts "returns a message" do
|
30
|
-
|
30
|
+
asserts "returns a message" do
|
31
|
+
macro.evaluate(topic, :name, String).last
|
31
32
|
end.matches %r{has key 'name' with options}
|
32
33
|
|
33
34
|
|
data/test/has_plugin_test.rb
CHANGED
@@ -1,23 +1,24 @@
|
|
1
|
-
require File.
|
2
|
-
require File.
|
1
|
+
require File.expand_path('../teststrap', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/test', __FILE__)
|
3
3
|
|
4
4
|
context "has_plugin macro" do
|
5
|
-
|
5
|
+
helper(:macro) { RiotMongoMapper::HasPluginAssertion.new }
|
6
|
+
|
6
7
|
setup do
|
7
8
|
mock_model do
|
8
9
|
plugin Plugins::Test
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
asserts "passes when has plugin" do
|
13
|
-
|
13
|
+
asserts "passes when has plugin" do
|
14
|
+
macro.evaluate(topic, Plugins::Test).first
|
14
15
|
end.equals(:pass)
|
15
16
|
|
16
|
-
asserts "fails when it doesn't have plugin" do
|
17
|
-
|
17
|
+
asserts "fails when it doesn't have plugin" do
|
18
|
+
macro.evaluate(topic, Plugins::Faux).first
|
18
19
|
end.equals(:fail)
|
19
20
|
|
20
|
-
asserts "returns a message" do
|
21
|
-
|
22
|
-
end.matches %r{has plugin Plugins::Test}
|
23
|
-
end
|
21
|
+
asserts "returns a message" do
|
22
|
+
macro.evaluate(topic, Plugins::Test).last
|
23
|
+
end.matches %r{has plugin Plugins::Test}
|
24
|
+
end
|
data/test/has_validation_test.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('../teststrap', __FILE__)
|
2
2
|
|
3
3
|
context "has_validation macro" do
|
4
|
-
|
4
|
+
|
5
|
+
helper(:macro) { RiotMongoMapper::HasValidationAssertion.new }
|
6
|
+
|
5
7
|
setup do
|
6
8
|
mock_model do
|
7
9
|
key :name, String
|
@@ -15,30 +17,30 @@ context "has_validation macro" do
|
|
15
17
|
end
|
16
18
|
|
17
19
|
asserts "passes when the validation is specified" do
|
18
|
-
|
20
|
+
macro.evaluate(topic, :validates_presence_of, :name).first
|
19
21
|
end.equals(:pass)
|
20
22
|
|
21
23
|
asserts "passes when the validation is specified" do
|
22
|
-
|
24
|
+
macro.evaluate(topic, :validates_presence_of, :surname).first
|
23
25
|
end.equals(:pass)
|
24
26
|
|
25
27
|
asserts "returns useful message" do
|
26
|
-
|
28
|
+
macro.evaluate(topic, :validates_presence_of, :name).last
|
27
29
|
end.matches(/has 'validates_presence_of' validation 'name'/)
|
28
30
|
|
29
31
|
asserts "passes when the validation options is specified" do
|
30
|
-
|
32
|
+
macro.evaluate(topic, :validates_length_of, :surname, :within => 4..40).first
|
31
33
|
end.equals(:pass)
|
32
34
|
|
33
35
|
asserts "passes when the validation options is specified and doesn't match" do
|
34
|
-
|
36
|
+
macro.evaluate(topic, :validates_length_of, :surname, :within => 3..30).first
|
35
37
|
end.equals(:fail)
|
36
38
|
|
37
39
|
asserts "fails when invalid field options are specified" do
|
38
|
-
|
40
|
+
macro.evaluate(topic, :validates_length_of, :name, :type => Date).first
|
39
41
|
end.equals(:fail)
|
40
42
|
|
41
43
|
asserts "passes when another validation is specified" do
|
42
|
-
|
44
|
+
macro.evaluate(topic, :validates_uniqueness_of, :rad).first
|
43
45
|
end.equals(:pass)
|
44
46
|
end
|
data/test/teststrap.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'riot'
|
3
3
|
require 'mongo_mapper'
|
4
|
-
require File.
|
5
|
-
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/riot-mongo_mapper.rb')
|
6
5
|
|
7
6
|
class Riot::Situation
|
8
7
|
def mock_model(&block)
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riot-mongo_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 3
|
10
|
-
version: 0.0.3
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Arthur Chiu
|
@@ -15,69 +10,31 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date:
|
13
|
+
date: 2011-04-16 00:00:00 -07:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
name: riot
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: yard
|
37
|
-
prerelease: false
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
47
|
-
type: :development
|
48
|
-
version_requirements: *id002
|
49
16
|
- !ruby/object:Gem::Dependency
|
50
17
|
name: mongo_mapper
|
51
18
|
prerelease: false
|
52
|
-
requirement: &
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
53
20
|
none: false
|
54
21
|
requirements:
|
55
|
-
- -
|
22
|
+
- - ~>
|
56
23
|
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
segments:
|
59
|
-
- 0
|
60
|
-
- 8
|
61
|
-
- 2
|
62
|
-
version: 0.8.2
|
24
|
+
version: 0.9.0
|
63
25
|
type: :runtime
|
64
|
-
version_requirements: *
|
26
|
+
version_requirements: *id001
|
65
27
|
- !ruby/object:Gem::Dependency
|
66
28
|
name: riot
|
67
29
|
prerelease: false
|
68
|
-
requirement: &
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
69
31
|
none: false
|
70
32
|
requirements:
|
71
|
-
- -
|
33
|
+
- - ~>
|
72
34
|
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
- 11
|
77
|
-
- 2
|
78
|
-
version: 0.11.2
|
35
|
+
version: 0.12.3
|
79
36
|
type: :runtime
|
80
|
-
version_requirements: *
|
37
|
+
version_requirements: *id002
|
81
38
|
description: A collection of assertion macros for testing MongoMapper with Riot
|
82
39
|
email: mr.arthur.chiu@gmail.com
|
83
40
|
executables: []
|
@@ -116,25 +73,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
73
|
requirements:
|
117
74
|
- - ">="
|
118
75
|
- !ruby/object:Gem::Version
|
119
|
-
hash: 3
|
120
|
-
segments:
|
121
|
-
- 0
|
122
76
|
version: "0"
|
123
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
78
|
none: false
|
125
79
|
requirements:
|
126
80
|
- - ">="
|
127
81
|
- !ruby/object:Gem::Version
|
128
|
-
hash: 23
|
129
|
-
segments:
|
130
|
-
- 1
|
131
|
-
- 3
|
132
|
-
- 6
|
133
82
|
version: 1.3.6
|
134
83
|
requirements: []
|
135
84
|
|
136
85
|
rubyforge_project:
|
137
|
-
rubygems_version: 1.
|
86
|
+
rubygems_version: 1.6.1
|
138
87
|
signing_key:
|
139
88
|
specification_version: 3
|
140
89
|
summary: Riot assertions for MongoMapper
|