evelpidon_test_helpers 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/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+
6
+ # IntelliJ
7
+ .idea
8
+ *.iml
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create @evelpidon_test_helpers
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Evelpidon Test Helpers changelog
2
+
3
+ ## 0.1.0 / 2011-10-13
4
+
5
+ * Birthday!
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in evelpidon_test_helpers.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyrignt (c) 2010 Kriss 'nu7hatch' Kowalik
2
+ Copyright (c) 2009-2010 BehindLogic
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # Evelpidon Test Helpers for Rails projects
2
+
3
+ Collection of various Test::Unit / ActiveSupport::Test helpers, mainly for Rails projects.
4
+
5
+ ## Author(s)
6
+
7
+ * [Nikos Dimitrakopoulos](http://github.com/nikosd)
8
+ * [Panayotis Matsinopoulos](http://github.com/pmatsinopoulos)
9
+ * [Eric Cohen](http://github.com/eirc)
10
+
11
+ ## Installation
12
+
13
+ You can install it easy using rubygems:
14
+
15
+ gem install evelpidon_test_helpers
16
+
17
+ Or using bundler
18
+
19
+ gem 'evelpidon_test_helpers'
20
+
21
+ ## Features
22
+
23
+ * ActiveModel helpers
24
+ * ActionController helpers
25
+ * Generic helpers (for example for Date/Time objects)
26
+ * Sunspot mocking
27
+
28
+ ## TODOs
29
+
30
+ * Generic documentation for usage
31
+ * Specific code documentation
32
+ * Tests (?)
33
+
34
+ ## Note on Patches/Pull Requests
35
+
36
+ * Fork the project.
37
+ * Make your feature addition or bug fix.
38
+ * Add tests for it. This is important so I don't break it in a
39
+ future version unintentionally (not really...).
40
+ * Commit, do not mess with gemspec, version, or history.
41
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
42
+ * Send me a pull request. Bonus points for topic branches.
43
+
44
+ ## Copyright
45
+
46
+ * Copyrignt (c) 2011 Fraudpointer.com
47
+ * Copyrignt (c) 2011 E-Travel S.A.
48
+
49
+ See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "evelpidon_test_helpers/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "evelpidon_test_helpers"
7
+ s.version = EvelpidonTestHelpers::VERSION
8
+ s.authors = ["Nikos Dimitrakopoulos", "Panayotis Matsinopoulos", "Eric Cohen"]
9
+ s.email = ["n.dimitrakopoulos@pamediakopes.gr", "p.matsinopoulos@fraudpointer.com", "e.koen@pamediakopes.gr"]
10
+ s.homepage = ""
11
+ s.summary = %q{Various test helpers for Rails projects}
12
+ s.description = ""
13
+
14
+ s.rubyforge_project = "evelpidon_test_helpers"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "activemodel", ">=3.0"
23
+ s.add_development_dependency "actionpack", ">=3.0"
24
+ s.add_runtime_dependency "activesupport", ">=3.0"
25
+ end
@@ -0,0 +1,19 @@
1
+ module EvelpidonTestHelpers
2
+ module ActionController
3
+ # Asserts that the controller assigned an instance variable with the given +instance_variable_name+
4
+ # and optionally checks that it's 'is equal with the given +expected_value+.
5
+ def assert_assigns(instance_variable_name, expected_value = nil)
6
+ assert_not_nil assigns(instance_variable_name), "#{instance_variable_name} was not assigned."
7
+ unless expected_value.nil?
8
+ assert_equal expected_value, assigns(instance_variable_name)
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+
15
+ module ActionController
16
+ class TestCase
17
+ include EvelpidonTestHelpers::ActionController
18
+ end
19
+ end if defined?(ActionController)
@@ -0,0 +1,120 @@
1
+ module EvelpidonTestHelpers
2
+ # +ActiveModel+ related helpers
3
+ module ActiveModel
4
+ # Asserts that the given ++ActiveModel++ is "valid".
5
+ # If not, the error message is the full error messages.
6
+ def assert_valid(object, additional_message = nil)
7
+ is_valid = object.valid?
8
+ error_message = additional_message ?
9
+ "#{additional_message}\n\nErrors:\n\n#{object.errors.full_messages.join("\n")}\n\n" :
10
+ "Errors:\n#{object.errors.full_messages.join("\n")}\n\n"
11
+ assert is_valid, error_message
12
+ end
13
+
14
+ # Asserts that the given +attribute+ on the given +ActiveModel+ contains no errors.
15
+ # If not, the error message is the joint string of the errors on this +attribute+.
16
+ def assert_valid_attribute(object, attribute, message = "")
17
+ object.valid?
18
+ errors_on_attribute = object.errors[attribute].length
19
+ error_messages = object.errors[attribute].join(',')
20
+ message << "\nExpected zero errors on #{attribute} but got #{errors_on_attribute} :\n#{error_messages}"
21
+ assert_equal 0, errors_on_attribute, message
22
+ end
23
+
24
+ # Asserts that the given ++ActiveModel++ is "invalid".
25
+ # The ++attributes_with_errors++ options should a hash of attributes to be specifically
26
+ # examined for having errors. For example : {:email => 1, :username => 2} (etc).
27
+ def assert_invalid(object, attributes_with_errors = {})
28
+ assert object.invalid?, "Expected #{object} to be invalid, but was actually valid"
29
+
30
+ attributes_with_errors.each do |attribute, expected_number_of_errors|
31
+ actual_errors_on_attribute = object.errors[attribute].length
32
+ error_message = "Expected #{expected_number_of_errors} errors on #{attribute}, but were actually #{actual_errors_on_attribute} : \n"
33
+ error_message << "#{object.errors[attribute].join("\n")}"
34
+ assert_equal expected_number_of_errors, actual_errors_on_attribute, error_message
35
+ end
36
+ end
37
+
38
+ # Asserts that the given +attribute+ on the given +ActiveModel+ contains at least one error.
39
+ def assert_invalid_attribute(object, attribute, message = "")
40
+ object.valid?
41
+ errors_on_attribute = object.errors[attribute].length
42
+ error_messages = object.errors[attribute].join(',')
43
+ message << "\nExpected at least one error on #{attribute} but got #{errors_on_attribute} :\n#{error_messages}"
44
+ assert errors_on_attribute > 0, message
45
+ end
46
+
47
+ # Asserts that the given +attributes+ result to a valid +ActiveModel+ instance.
48
+ #
49
+ # This helper chooses the model name based on the current test name, so for example
50
+ # when the test that is running is named FooTest it will try to instantiate a new Foo
51
+ # model, update the attributes (by-passing mass assignment protection) and then call
52
+ # +assert_valid+ on it.
53
+ def assert_valid_model_attributes(attributes)
54
+ model = self.class.to_s.gsub("Controller", "").gsub("Test", "").constantize
55
+ instance = model.new
56
+
57
+ attributes.each do |attribute_name, attribute_value|
58
+ instance.send("#{attribute_name}=", attribute_value)
59
+ end
60
+
61
+ assert_valid instance, instance.inspect
62
+ end
63
+
64
+ # Asserts that all the records for the current model under test are valid.
65
+ #
66
+ # This helper chooses the model name based on the current test name, so for example
67
+ # when the test that is running is named FooTest it will try to load all the records of Foo
68
+ # through Foo.all and then call +assert_valid+ on each one of them.
69
+ def assert_valid_fixtures
70
+ model = self.class.to_s.gsub("Controller", "").gsub("Test", "").constantize
71
+ model.all.each do |fixture|
72
+ assert_valid fixture, fixture.inspect
73
+ end
74
+ end
75
+
76
+ # Asserts that the given +attribute+ on the given +model+ cannot be assigned through
77
+ # mass-assignment (like +update_attributes).
78
+ #
79
+ # @param model [ActiveModel] A properly initialized instance of the class that we want to test.
80
+ # @param attribute [Symbol] The attribute that is protected
81
+ # @param value [Object] An optional value to use when trying to assign the attribute.
82
+ def assert_attribute_protected(model, attribute, value = "foo")
83
+ model.send("#{attribute}=", nil)
84
+ model.attributes = {attribute => value}
85
+ assert_nil model.send(attribute), "#{attribute} could be set through 'update_attributes' call"
86
+
87
+ model.send("#{attribute}=", value)
88
+ assert_equal value, model.send(attribute)
89
+ end
90
+
91
+ # Asserts that the given +observer+ class will receive the +notification+.
92
+ #
93
+ # @param observer [Class] the observer class
94
+ # @param notification [Symbol] the notification
95
+ # @param options [Hash] extra options :
96
+ # * :object [Object, Mocha::ParameterMatchers::Base] the object that should be passed to the observer.
97
+ # * :times [Integer] the number of times that the notification should be sent to the observer.
98
+ #
99
+ def assert_observer_notified(observer, notification, options = {})
100
+ options.reverse_merge!(:times => 1, :object => anything)
101
+ observer.instance.expects(notification).with(options[:object]).times(options[:times])
102
+ end
103
+
104
+ # Asserts that the given +observer+ class will never receive the +notification+.
105
+ #
106
+ # @param observer [Class] the observer class
107
+ # @param notification [Symbol] the notification
108
+ # @param options [Hash] extra options
109
+ #
110
+ def assert_observer_not_notified(observer, notification, options = {})
111
+ observer.instance.expects(notification).never
112
+ end
113
+ end
114
+ end
115
+
116
+ module ActiveSupport
117
+ class TestCase
118
+ include EvelpidonTestHelpers::ActiveModel
119
+ end
120
+ end if defined?(ActiveModel)
@@ -0,0 +1,14 @@
1
+ module EvelpidonTestHelpers
2
+ module Date
3
+ # Asserts that the two ++Time++ or ++DateTime++ refer to same Date/Month/Year.
4
+ def assert_equal_date(expected, actual)
5
+ assert_equal expected.strftime("%j%Y"), actual.strftime("%j%Y")
6
+ end
7
+ end
8
+ end
9
+
10
+ module ActiveSupport
11
+ class TestCase
12
+ include EvelpidonTestHelpers::Date
13
+ end
14
+ end
@@ -0,0 +1,53 @@
1
+ module EvelpidonTestHelpers
2
+ ##
3
+ # Stubbing out Solr
4
+ #
5
+ # Taken from : http://timcowlishaw.co.uk/post/3179661158/testing-sunspot-with-test-unit
6
+ module TestSunspot
7
+ class << self
8
+ attr_accessor :pid, :original_session, :stub_session, :server
9
+
10
+ def setup
11
+ TestSunspot.original_session = Sunspot.session
12
+ Sunspot.session = TestSunspot.stub_session = Sunspot::Rails::StubSessionProxy.new(Sunspot.session)
13
+ end
14
+ end
15
+
16
+ def self.included(klass)
17
+ klass.instance_eval do
18
+ def startup
19
+ Sunspot.session = TestSunspot.original_session
20
+ rd, wr = IO.pipe
21
+ pid = fork do
22
+ STDOUT.reopen(wr)
23
+ STDERR.reopen(wr)
24
+ TestSunspot.server ||= Sunspot::Rails::Server.new
25
+ begin
26
+ TestSunspot.server.run
27
+ ensure
28
+ wr.close
29
+ end
30
+ end
31
+ TestSunspot.pid = pid
32
+ ready = false
33
+ until ready do
34
+ ready = true if rd.gets =~ /Started\ SocketConnector/
35
+ sleep 0.5
36
+ end
37
+ rd.close
38
+ end
39
+
40
+ def shutdown
41
+ Sunspot.remove_all!
42
+ Process.kill("HUP",TestSunspot.pid)
43
+ Process.wait
44
+ Sunspot.session = TestSunspot.stub_session
45
+ end
46
+ end
47
+
48
+ def teardown
49
+ Sunspot.remove_all!
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module EvelpidonTestHelpers
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,10 @@
1
+ require "evelpidon_test_helpers/version"
2
+
3
+ module EvelpidonTestHelpers
4
+ end
5
+
6
+ # TODO : Possibly stop requiring these here and let the gem user decide what he wants to use.
7
+ require "evelpidon_test_helpers/date"
8
+ require "evelpidon_test_helpers/active_model"
9
+ require "evelpidon_test_helpers/action_controller"
10
+ require "evelpidon_test_helpers/sunspot"
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evelpidon_test_helpers
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Nikos Dimitrakopoulos
14
+ - Panayotis Matsinopoulos
15
+ - Eric Cohen
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2011-10-13 00:00:00 +03:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: activemodel
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 7
32
+ segments:
33
+ - 3
34
+ - 0
35
+ version: "3.0"
36
+ type: :development
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: actionpack
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 7
47
+ segments:
48
+ - 3
49
+ - 0
50
+ version: "3.0"
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: activesupport
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 7
62
+ segments:
63
+ - 3
64
+ - 0
65
+ version: "3.0"
66
+ type: :runtime
67
+ version_requirements: *id003
68
+ description: ""
69
+ email:
70
+ - n.dimitrakopoulos@pamediakopes.gr
71
+ - p.matsinopoulos@fraudpointer.com
72
+ - e.koen@pamediakopes.gr
73
+ executables: []
74
+
75
+ extensions: []
76
+
77
+ extra_rdoc_files: []
78
+
79
+ files:
80
+ - .gitignore
81
+ - .rvmrc
82
+ - CHANGELOG.md
83
+ - Gemfile
84
+ - LICENSE
85
+ - README.md
86
+ - Rakefile
87
+ - evelpidon_test_helpers.gemspec
88
+ - lib/evelpidon_test_helpers.rb
89
+ - lib/evelpidon_test_helpers/action_controller.rb
90
+ - lib/evelpidon_test_helpers/active_model.rb
91
+ - lib/evelpidon_test_helpers/date.rb
92
+ - lib/evelpidon_test_helpers/sunspot.rb
93
+ - lib/evelpidon_test_helpers/version.rb
94
+ has_rdoc: true
95
+ homepage: ""
96
+ licenses: []
97
+
98
+ post_install_message:
99
+ rdoc_options: []
100
+
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ hash: 3
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ hash: 3
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ requirements: []
122
+
123
+ rubyforge_project: evelpidon_test_helpers
124
+ rubygems_version: 1.6.2
125
+ signing_key:
126
+ specification_version: 3
127
+ summary: Various test helpers for Rails projects
128
+ test_files: []
129
+