rspec_extensions_collection 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rspec_extensions_collection.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,49 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rspec_extensions_collection (0.0.3)
5
+ rspec
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ activemodel (3.0.3)
11
+ activesupport (= 3.0.3)
12
+ builder (~> 2.1.2)
13
+ i18n (~> 0.4)
14
+ activesupport (3.0.3)
15
+ bson (1.1.5)
16
+ bson_ext (1.1.5)
17
+ builder (2.1.2)
18
+ diff-lcs (1.1.2)
19
+ i18n (0.5.0)
20
+ mongo (1.1.5)
21
+ bson (>= 1.1.5)
22
+ mongoid (2.0.0.beta.20)
23
+ activemodel (~> 3.0)
24
+ mongo (~> 1.1)
25
+ tzinfo (~> 0.3.22)
26
+ will_paginate (~> 3.0.pre)
27
+ mongoid-rspec (1.2.1)
28
+ bson_ext (>= 1.0.4)
29
+ mongoid (>= 2.0.0.beta.15)
30
+ rspec (>= 2.0.0.beta.19)
31
+ rspec (2.3.0)
32
+ rspec-core (~> 2.3.0)
33
+ rspec-expectations (~> 2.3.0)
34
+ rspec-mocks (~> 2.3.0)
35
+ rspec-core (2.3.1)
36
+ rspec-expectations (2.3.0)
37
+ diff-lcs (~> 1.1.2)
38
+ rspec-mocks (2.3.0)
39
+ tzinfo (0.3.23)
40
+ will_paginate (3.0.pre2)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ bundler (>= 1.0.0)
47
+ mongoid-rspec
48
+ rspec
49
+ rspec_extensions_collection!
data/README.rdoc ADDED
@@ -0,0 +1,55 @@
1
+ = RSpec extensions collection
2
+
3
+ This is a collection of various RSpec extensions I would like to use for multiple projects.
4
+ The primary purpose is for me to use them anywhere so it's not necessarily made for generic use.
5
+
6
+ == Install
7
+
8
+ Put the following in Gemfile:
9
+ gem "rspec_extensions_collection"
10
+ Then execute:
11
+ bundle install
12
+
13
+ == Set up
14
+
15
+ 1. Helpers
16
+
17
+ Include a helper you want to use in Spec.
18
+ Or include a helper in spec_helper.rb. e.g.
19
+ config.include RSpecExtensionsCollection::Matchers::MongoidModelHelpers
20
+
21
+ 2. Matchers
22
+
23
+ Put the following in spec_helper.rb:
24
+ config.include RSpecExtensionsCollection::Matchers
25
+
26
+ == Usage
27
+
28
+ 1. Helpers
29
+
30
+ 2. Matchers
31
+
32
+ 2-1. SearchMatcher
33
+
34
+ search_by(*args)
35
+
36
+ args: List of field name symbols.
37
+ Last argument can be Hash of options.
38
+ :locale - Specifies the locale on which the filtering the search result is based on. "en" or "fr".
39
+
40
+ The method to test: search(keyword)
41
+
42
+ Example: BlogPost.should search_by(:title, :content, :locale => I18n.locale.to_s)
43
+
44
+ 2-2. SearchEmbeddedMatcher - For Mongoid embedded documents.
45
+
46
+ search_embedded_by(association_name, *args)
47
+
48
+ association_name: Name of the embedded document specified in the parent document.
49
+ args: List of field name symbols.
50
+ Last argument can be Hash of options.
51
+ :locale - Specifies the locale on which the filtering the search result is based on. "en" or "fr".
52
+
53
+ The method to test: search_embedded_by(keyword)
54
+
55
+ Example: BlogPost.should search_embedded_by(:comments, :content, :locale => I18n.locale.to_s)
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,3 @@
1
+ require 'rspec_extensions_collection/helpers/mongoid_model_helpers'
2
+ require 'rspec_extensions_collection/matchers/search_matcher'
3
+ require 'rspec_extensions_collection/matchers/search_embedded_matcher'
@@ -0,0 +1,13 @@
1
+ module RSpecExtensionsCollection
2
+ module Matchers
3
+ module MongoidModelHelpers
4
+
5
+ # Mongoid executes query only when it's needed. Until then, it just creates Criteria object.
6
+ # For the purpose of test, this method gets the result models array from Criteria object as usually done in for loop in view.
7
+ def execute_query_to_models(result_array_mongoid_criteria)
8
+ result_array_mongoid_criteria.map { |model| model }
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,62 @@
1
+ require 'rspec_extensions_collection/matchers/search_matcher'
2
+
3
+ module RSpecExtensionsCollection
4
+ module Matchers
5
+
6
+ # Asserts the search is made with the given fields for embedded Mongoid document
7
+ # with the option specifying if the result if filtered by locale.
8
+ # The method to test: search_embedded(keyword)
9
+ #
10
+ # Options:
11
+ #
12
+ # association_name: Name of the embedded document specified in the parent document.
13
+ # args: List of field name symbols.
14
+ # Last argument can be +Hash+ of options.
15
+ # :locale - Specifies the locale on which the filtering the search result is based on. "en" or "fr".
16
+ #
17
+ # Example:
18
+ #
19
+ # <tt>BlogPost.should search_embedded_by(:comments, :title, :content, :locale => I18n.locale.to_s)</tt>
20
+ def search_embedded_by(association_name, *args)
21
+ SearchEmbeddedMatcher.new(association_name, *args)
22
+ end
23
+
24
+ class SearchEmbeddedMatcher < SearchMatcher
25
+
26
+ def initialize(association_name, *args)
27
+ @association_name = association_name
28
+ super(*args)
29
+ end
30
+
31
+ private
32
+ # Executes the method in concern such as search:
33
+ def execute
34
+ @model_class.search_embedded(KEYWORD)
35
+ end
36
+
37
+ def create_model(field_with_keyword, locale = nil)
38
+ # TODO: Replace with factory:
39
+ parent_model = @model_class.create(:title => "Title", :content => "Content")
40
+
41
+ embedded_model = parent_model.send(@association_name).build
42
+ @fields.each do |field|
43
+ field_writer_symbol = "#{field}=".to_sym
44
+ if field == field_with_keyword
45
+ embedded_model.send(field_writer_symbol, FIELD_CONTENT_WITH_KEYWORD)
46
+ else
47
+ embedded_model.send(field_writer_symbol, FIELD_CONTENT_WITHOUT_KEYWORD)
48
+ end
49
+ end
50
+ embedded_model.locale = locale if locale
51
+
52
+ embedded_model.save
53
+
54
+ parent_model.update_attributes(:locale => locale) if locale
55
+
56
+ parent_model
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,104 @@
1
+ module RSpecExtensionsCollection
2
+ module Matchers
3
+
4
+ # Asserts the search is made with the given fields with the option specifying if the result if filtered by locale.
5
+ # The method to test: search(keyword)
6
+ #
7
+ # Options:
8
+ #
9
+ # args: List of field name symbols.
10
+ # Last argument can be +Hash+ of options.
11
+ # :locale - Specifies the locale on which the filtering the search result is based on. "en" or "fr".
12
+ #
13
+ # Example:
14
+ #
15
+ # <tt>BlogPost.should search_by(:title, :content, :locale => I18n.locale.to_s)</tt>
16
+ def search_by(*args)
17
+ SearchMatcher.new(*args)
18
+ end
19
+
20
+ class SearchMatcher
21
+ include MongoidModelHelpers
22
+
23
+ KEYWORD = "temp"
24
+ FIELD_CONTENT_WITH_KEYWORD = "This contains the keyword #{KEYWORD} and something else."
25
+ FIELD_CONTENT_WITHOUT_KEYWORD = "Used for some data."
26
+ LOCALES = ["en", "fr"]
27
+
28
+ def initialize(*args)
29
+ if args.try(:last).instance_of?(Hash)
30
+ @locale = args.pop[:locale]
31
+ end
32
+ @fields = args
33
+ end
34
+
35
+ def matches?(model_class)
36
+ @model_class = model_class
37
+ @model_class.delete_all
38
+ create_models
39
+ @search_result = execute
40
+ execute_query_to_models(@search_result.asc(:_id)) == @matching_models
41
+ end
42
+
43
+ def failure_message_for_should
44
+ "expected #{@model_class} to find #{@matching_models} but got #{execute_query_to_models(@search_result)}"
45
+ end
46
+
47
+ private
48
+ # Executes the method in concern such as search:
49
+ def execute
50
+ @model_class.search(KEYWORD)
51
+ end
52
+
53
+ def create_models
54
+ @all_models = []
55
+ @matching_models = []
56
+
57
+ (0..@fields.size-1).each do |index|
58
+ if @locale
59
+ model_with_matching_locale = create_model(@fields[index], @locale)
60
+ @matching_models << model_with_matching_locale
61
+ @all_models << model_with_matching_locale
62
+
63
+ model_with_other_locale = create_model(@fields[index], other_locale)
64
+ @all_models << model_with_other_locale
65
+ else
66
+ model = create_model(@fields[index])
67
+ @matching_models << model
68
+ @all_models << model
69
+ end
70
+ end
71
+
72
+ if @locale
73
+ LOCALES.each { |locale| @all_models << create_model(nil, locale) }
74
+ else
75
+ @all_models << create_model(nil)
76
+ end
77
+ end
78
+
79
+ def create_model(field_with_keyword, locale = nil)
80
+ model = @model_class.new do |model_object|
81
+ @fields.each do |field|
82
+ field_writer_symbol = "#{field}=".to_sym
83
+ if field == field_with_keyword
84
+ model_object.send(field_writer_symbol, FIELD_CONTENT_WITH_KEYWORD)
85
+ else
86
+ model_object.send(field_writer_symbol, FIELD_CONTENT_WITHOUT_KEYWORD)
87
+ end
88
+ end
89
+ model_object.locale = locale if locale
90
+ end
91
+ model.save!
92
+ model
93
+ end
94
+
95
+ def other_locale
96
+ locales_copy = Array.new(LOCALES)
97
+ locales_copy.delete(@locale)
98
+ locales_copy.first
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ module RspecExtensionsCollection
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/rspec_extensions_collection/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "rspec_extensions_collection"
6
+ s.version = RspecExtensionsCollection::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Tadatoshi Takahashi"]
9
+ s.email = ["tadatoshi.3.takahashi@gmail.com"]
10
+ s.homepage = "http://rubygems.org/gems/rspec_extensions_collection"
11
+ s.summary = "Collection of various RSpec extensions"
12
+ s.description = "Collection of RSpec extensions incluing helper methods, matchers, and macros that the author would like to use for multiple projects."
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "rspec_extensions_collection"
16
+
17
+ s.add_dependency "rspec"
18
+
19
+ s.add_development_dependency "bundler", ">= 1.0.0"
20
+ s.add_development_dependency "rspec"
21
+ s.add_development_dependency "mongoid-rspec"
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
25
+ s.require_path = 'lib'
26
+ end
@@ -0,0 +1,38 @@
1
+ class BlogPost
2
+ include Mongoid::Document
3
+
4
+ field :title
5
+ field :content
6
+ field :locale
7
+
8
+ index :title
9
+ index :locale
10
+
11
+ before_validation :assign_current_locale
12
+
13
+ validates :title, :presence => true
14
+ validates :locale, :presence => true
15
+
16
+ embeds_many :comments, :class_name => "Blogs::Comment"
17
+
18
+ scope :ordered, desc(:_id)
19
+ scope :in_current_locale, lambda { where(:locale => I18n.locale.to_s) }
20
+
21
+ class << self
22
+
23
+ def search(keyword)
24
+ in_current_locale.where("this.title.match(/#{keyword}/i) || this.content.match(/#{keyword}/i)")
25
+ end
26
+
27
+ def search_embedded(keyword)
28
+ in_current_locale.where("comments.content" => Regexp.new(keyword))
29
+ end
30
+
31
+ end
32
+
33
+ private
34
+ def assign_current_locale
35
+ self.locale ||= I18n.locale.to_s
36
+ end
37
+
38
+ end
@@ -0,0 +1,28 @@
1
+ module Blogs
2
+
3
+ class Comment
4
+ include Mongoid::Document
5
+
6
+ field :content
7
+ field :locale
8
+
9
+ index :locale
10
+
11
+ before_validation :assign_current_locale
12
+
13
+ validates :content, :presence => true
14
+ validates :locale, :presence => true
15
+
16
+ embedded_in :blog_post, :inverse_of => :comments
17
+
18
+ scope :ordered, asc(:_id)
19
+ scope :in_current_locale, lambda { where(:locale => I18n.locale.to_s) }
20
+
21
+ private
22
+ def assign_current_locale
23
+ self.locale ||= I18n.locale.to_s
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe "MongoidModelHelpers" do
4
+ include RSpecExtensionsCollection::Matchers::MongoidModelHelpers
5
+
6
+ describe BlogPost do
7
+
8
+ before(:each) do
9
+ BlogPost.delete_all
10
+ end
11
+
12
+ after(:each) do
13
+ BlogPost.delete_all
14
+ end
15
+
16
+ context "Scope" do
17
+
18
+ it "should have the current locale and be ordered by id" do
19
+
20
+ blog_post_1 = BlogPost.create(:locale => "fr", :title => "First blog entry", :content => "This is the first entry")
21
+ blog_post_2 = BlogPost.create(:locale => "fr", :title => "Second blog entry", :content => "This is the second entry")
22
+ blog_post_3 = BlogPost.create(:locale => "en", :title => "Third blog entry", :content => "This is the third entry")
23
+ blog_post_4 = BlogPost.create(:locale => "fr", :title => "Fourth blog entry", :content => "This is the fourth entry")
24
+ blog_post_5 = BlogPost.create(:locale => "en", :title => "Fifth blog entry", :content => "This is the fifth entry")
25
+
26
+ I18n.locale = "en"
27
+ execute_query_to_models(BlogPost.in_current_locale.ordered).should == [blog_post_5, blog_post_3]
28
+ I18n.locale = "fr"
29
+ execute_query_to_models(BlogPost.in_current_locale.ordered).should == [blog_post_4, blog_post_2, blog_post_1]
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe "SearchEmbeddedMatcher" do
4
+
5
+ describe BlogPost do
6
+
7
+ before(:each) do
8
+ BlogPost.delete_all
9
+ I18n.locale = "en"
10
+ end
11
+
12
+ after(:each) do
13
+ BlogPost.delete_all
14
+ I18n.locale = "en"
15
+ end
16
+
17
+ context "Search" do
18
+
19
+ it "should find blog_post with a keyword contained in specified embedded document using custom matcher" do
20
+
21
+ BlogPost.should search_embedded_by(:comments, :content, :locale => I18n.locale.to_s)
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe "SearchMatcher" do
4
+
5
+ describe BlogPost do
6
+
7
+ before(:each) do
8
+ BlogPost.delete_all
9
+ I18n.locale = "en"
10
+ end
11
+
12
+ after(:each) do
13
+ BlogPost.delete_all
14
+ I18n.locale = "en"
15
+ end
16
+
17
+ context "Search" do
18
+
19
+ it "should find blog_post with a keyword using custom matcher" do
20
+
21
+ BlogPost.should search_by(:title, :content, :locale => I18n.locale.to_s)
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1,22 @@
1
+ # $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '/../lib/rspec_extensions_collection'))
2
+
3
+ require 'rspec'
4
+ require 'rspec/core'
5
+ require 'rspec/expectations'
6
+ require 'mongoid'
7
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), '/../lib/', 'rspec_extensions_collection/**/*.rb'))].each {|f| require f}
8
+ Dir[File.join(File.dirname(__FILE__), "models/**/*.rb")].each {|f| require f}
9
+
10
+ Mongoid.configure do |config|
11
+ name = "rspec_extensions_collection_test"
12
+ host = "localhost"
13
+ config.master = Mongo::Connection.new.db(name)
14
+ end
15
+
16
+ RSpec.configure do |config|
17
+ # config.include RSpec::Matchers
18
+ # config.include Mongoid::Matchers
19
+ config.mock_with :rspec
20
+
21
+ config.include RSpecExtensionsCollection::Matchers
22
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec_extensions_collection
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 3
9
+ version: 0.0.3
10
+ platform: ruby
11
+ authors:
12
+ - Tadatoshi Takahashi
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-28 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 1
43
+ - 0
44
+ - 0
45
+ version: 1.0.0
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ type: :development
60
+ version_requirements: *id003
61
+ - !ruby/object:Gem::Dependency
62
+ name: mongoid-rspec
63
+ prerelease: false
64
+ requirement: &id004 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ type: :development
73
+ version_requirements: *id004
74
+ description: Collection of RSpec extensions incluing helper methods, matchers, and macros that the author would like to use for multiple projects.
75
+ email:
76
+ - tadatoshi.3.takahashi@gmail.com
77
+ executables: []
78
+
79
+ extensions: []
80
+
81
+ extra_rdoc_files: []
82
+
83
+ files:
84
+ - .gitignore
85
+ - Gemfile
86
+ - Gemfile.lock
87
+ - README.rdoc
88
+ - Rakefile
89
+ - lib/rspec_extensions_collection.rb
90
+ - lib/rspec_extensions_collection/helpers/mongoid_model_helpers.rb
91
+ - lib/rspec_extensions_collection/matchers/search_embedded_matcher.rb
92
+ - lib/rspec_extensions_collection/matchers/search_matcher.rb
93
+ - lib/rspec_extensions_collection/version.rb
94
+ - rspec_extensions_collection.gemspec
95
+ - spec/models/blog_post.rb
96
+ - spec/models/blogs/comment.rb
97
+ - spec/rspec_extensions_collection/helpers/mongoid_model_helpers_spec.rb
98
+ - spec/rspec_extensions_collection/matchers/search_embedded_matcher_spec.rb
99
+ - spec/rspec_extensions_collection/matchers/search_matcher_spec.rb
100
+ - spec/spec.opts
101
+ - spec/spec_helper.rb
102
+ has_rdoc: true
103
+ homepage: http://rubygems.org/gems/rspec_extensions_collection
104
+ licenses: []
105
+
106
+ post_install_message:
107
+ rdoc_options: []
108
+
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ segments:
125
+ - 1
126
+ - 3
127
+ - 6
128
+ version: 1.3.6
129
+ requirements: []
130
+
131
+ rubyforge_project: rspec_extensions_collection
132
+ rubygems_version: 1.3.7
133
+ signing_key:
134
+ specification_version: 3
135
+ summary: Collection of various RSpec extensions
136
+ test_files: []
137
+