rspec_candy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.gitignore +8 -0
  2. data/README.md +7 -0
  3. data/Rakefile +18 -0
  4. data/lib/rspec_candy/helpers/disposable_copy.rb +16 -0
  5. data/lib/rspec_candy/helpers/it_should_act_like.rb +39 -0
  6. data/lib/rspec_candy/helpers/new_with_stubs.rb +16 -0
  7. data/lib/rspec_candy/helpers/rails/create_without_callbacks.rb +25 -0
  8. data/lib/rspec_candy/helpers/rails/it_should_run_callbacks.rb +111 -0
  9. data/lib/rspec_candy/helpers/rails/prevent_storage.rb +20 -0
  10. data/lib/rspec_candy/helpers/should_receive_and_execute.rb +38 -0
  11. data/lib/rspec_candy/helpers/should_receive_and_return.rb +17 -0
  12. data/lib/rspec_candy/helpers/should_receive_chain.rb +43 -0
  13. data/lib/rspec_candy/helpers/stub_any_instance.rb +25 -0
  14. data/lib/rspec_candy/helpers/stub_existing.rb +20 -0
  15. data/lib/rspec_candy/switcher.rb +44 -0
  16. data/lib/rspec_candy/version.rb +3 -0
  17. data/lib/rspec_candy.rb +16 -0
  18. data/rspec_candy.gemspec +19 -0
  19. data/spec/rspec1/Gemfile +13 -0
  20. data/spec/rspec1/Rakefile +11 -0
  21. data/spec/rspec1/app_root/config/boot.rb +114 -0
  22. data/spec/rspec1/app_root/config/database.yml +21 -0
  23. data/spec/rspec1/app_root/config/environment.rb +14 -0
  24. data/spec/rspec1/app_root/config/environments/in_memory.rb +0 -0
  25. data/spec/rspec1/app_root/config/environments/mysql.rb +0 -0
  26. data/spec/rspec1/app_root/config/environments/postgresql.rb +0 -0
  27. data/spec/rspec1/app_root/config/environments/sqlite.rb +0 -0
  28. data/spec/rspec1/app_root/config/environments/sqlite3.rb +0 -0
  29. data/spec/rspec1/app_root/config/initializers/state_machine.rb +1 -0
  30. data/spec/rspec1/app_root/config/routes.rb +4 -0
  31. data/spec/rspec1/app_root/log/.gitignore +1 -0
  32. data/spec/rspec1/rcov.opts +2 -0
  33. data/spec/rspec1/spec.opts +4 -0
  34. data/spec/rspec1/spec_helper.rb +24 -0
  35. data/spec/rspec2/.rspec +2 -0
  36. data/spec/rspec2/Gemfile +13 -0
  37. data/spec/rspec2/Rakefile +11 -0
  38. data/spec/rspec2/app_root/.gitignore +4 -0
  39. data/spec/rspec2/app_root/config/application.rb +32 -0
  40. data/spec/rspec2/app_root/config/boot.rb +13 -0
  41. data/spec/rspec2/app_root/config/database.yml +21 -0
  42. data/spec/rspec2/app_root/config/environment.rb +5 -0
  43. data/spec/rspec2/app_root/config/environments/in_memory.rb +0 -0
  44. data/spec/rspec2/app_root/config/environments/mysql.rb +0 -0
  45. data/spec/rspec2/app_root/config/environments/postgresql.rb +0 -0
  46. data/spec/rspec2/app_root/config/environments/sqlite.rb +0 -0
  47. data/spec/rspec2/app_root/config/environments/sqlite3.rb +0 -0
  48. data/spec/rspec2/app_root/config/environments/test.rb +35 -0
  49. data/spec/rspec2/app_root/config/initializers/backtrace_silencers.rb +7 -0
  50. data/spec/rspec2/app_root/config/initializers/inflections.rb +10 -0
  51. data/spec/rspec2/app_root/config/initializers/mime_types.rb +5 -0
  52. data/spec/rspec2/app_root/config/initializers/secret_token.rb +7 -0
  53. data/spec/rspec2/app_root/config/initializers/session_store.rb +8 -0
  54. data/spec/rspec2/app_root/config/initializers/state_machine.rb +1 -0
  55. data/spec/rspec2/app_root/config/locales/en.yml +5 -0
  56. data/spec/rspec2/app_root/config/routes.rb +58 -0
  57. data/spec/rspec2/app_root/log/.gitkeep +0 -0
  58. data/spec/rspec2/rcov.opts +2 -0
  59. data/spec/rspec2/spec_helper.rb +25 -0
  60. data/spec/shared/app_root/app/controllers/application_controller.rb +2 -0
  61. data/spec/shared/app_root/app/models/model.rb +19 -0
  62. data/spec/shared/app_root/app/models/state_machine_model.rb +30 -0
  63. data/spec/shared/app_root/config/initializers/state_machine.rb +1 -0
  64. data/spec/shared/app_root/db/migrate/001_create_model.rb +13 -0
  65. data/spec/shared/app_root/db/migrate/002_create_state_machine_model.rb +13 -0
  66. data/spec/shared/rspec_candy/helpers/disposable_copy_spec.rb +45 -0
  67. data/spec/shared/rspec_candy/helpers/it_should_act_like_spec.rb +139 -0
  68. data/spec/shared/rspec_candy/helpers/new_with_stubs_spec.rb +41 -0
  69. data/spec/shared/rspec_candy/helpers/rails/create_without_callbacks_spec.rb +41 -0
  70. data/spec/shared/rspec_candy/helpers/rails/it_should_run_callbacks_spec.rb +142 -0
  71. data/spec/shared/rspec_candy/helpers/rails/prevent_storage_spec.rb +85 -0
  72. data/spec/shared/rspec_candy/helpers/should_receive_and_execute_spec.rb +32 -0
  73. data/spec/shared/rspec_candy/helpers/should_receive_and_return_spec.rb +30 -0
  74. data/spec/shared/rspec_candy/helpers/should_receive_chain_spec.rb +99 -0
  75. data/spec/shared/rspec_candy/helpers/stub_any_instance_spec.rb +32 -0
  76. data/spec/shared/rspec_candy/helpers/stub_existing_spec.rb +27 -0
  77. data/spec/shared/support/matchers/pass_as_describe_block.rb +32 -0
  78. data/spec/shared/support/matchers/pass_as_example.rb +30 -0
  79. data/template/spec_candy.rails2.rb +171 -0
  80. data/template/spec_candy.rails3.rb +175 -0
  81. metadata +159 -0
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,10 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ HasDefaultSpecApp::Application.config.secret_token = 'cb014a08a45243e7143f31e04774c342c1fba329fd594ae1a480d8283b1a851f425dc08044311fb4be6d000b6e6681de7c76d19148419a5ffa0a9f84556d3b33'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ HasDefaultSpecApp::Application.config.session_store :cookie_store, :key => '_app_root_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rails generate session_migration")
8
+ # HasDefaultSpecApp::Application.config.session_store :active_record_store
@@ -0,0 +1 @@
1
+ Bundler.require(:state_machine) if ENV['REQUIRE_STATE_MACHINE'] == 'true'
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,58 @@
1
+ HasDefaultSpecApp::Application.routes.draw do
2
+ # The priority is based upon order of creation:
3
+ # first created -> highest priority.
4
+
5
+ # Sample of regular route:
6
+ # match 'products/:id' => 'catalog#view'
7
+ # Keep in mind you can assign values other than :controller and :action
8
+
9
+ # Sample of named route:
10
+ # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
11
+ # This route can be invoked with purchase_url(:id => product.id)
12
+
13
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
14
+ # resources :products
15
+
16
+ # Sample resource route with options:
17
+ # resources :products do
18
+ # member do
19
+ # get 'short'
20
+ # post 'toggle'
21
+ # end
22
+ #
23
+ # collection do
24
+ # get 'sold'
25
+ # end
26
+ # end
27
+
28
+ # Sample resource route with sub-resources:
29
+ # resources :products do
30
+ # resources :comments, :sales
31
+ # resource :seller
32
+ # end
33
+
34
+ # Sample resource route with more complex sub-resources
35
+ # resources :products do
36
+ # resources :comments
37
+ # resources :sales do
38
+ # get 'recent', :on => :collection
39
+ # end
40
+ # end
41
+
42
+ # Sample resource route within a namespace:
43
+ # namespace :admin do
44
+ # # Directs /admin/products/* to Admin::ProductsController
45
+ # # (app/controllers/admin/products_controller.rb)
46
+ # resources :products
47
+ # end
48
+
49
+ # You can have the root of your site routed with "root"
50
+ # just remember to delete public/index.html.
51
+ # root :to => "welcome#index"
52
+
53
+ # See how all your routes lay out with "rake routes"
54
+
55
+ # This is a legacy wild controller route that's not recommended for RESTful applications.
56
+ # Note: This route will make all actions in every controller accessible via GET requests.
57
+ match ':controller(/:action(/:id(.:format)))'
58
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ --exclude "spec/*,gems/*"
2
+ --rails
@@ -0,0 +1,25 @@
1
+ $: << File.join(File.dirname(__FILE__), "/../lib" )
2
+
3
+ # Set the default environment to sqlite3's in_memory database
4
+ ENV['RAILS_ENV'] ||= 'in_memory'
5
+ ENV['RAILS_ROOT'] = 'app_root'
6
+
7
+ # Load the Rails environment and testing framework
8
+ require "#{File.dirname(__FILE__)}/app_root/config/environment"
9
+ require 'rspec/rails'
10
+
11
+ # Load dependencies
12
+ require 'rspec_candy'
13
+
14
+ # Require support code
15
+ Dir["../shared/support/**/*.rb"].each {|f| require f}
16
+
17
+ # Run the migrations
18
+ print "\033[30m" # dark gray text
19
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
20
+ print "\033[0m"
21
+
22
+ RSpec.configure do |config|
23
+ config.use_transactional_fixtures = true
24
+ config.use_instantiated_fixtures = false
25
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,19 @@
1
+ class Model < ActiveRecord::Base
2
+
3
+ after_create :after_create_callback
4
+ after_save :after_save_callback1, :after_save_callback2
5
+ before_save :before_save_callback1, :before_save_callback2
6
+
7
+ if respond_to? :around_save
8
+ around_save :around_save_callback1, :around_save_callback2
9
+ end
10
+
11
+ def after_create_callback; end
12
+ def after_save_callback1; end
13
+ def after_save_callback2; end
14
+ def before_save_callback1; end
15
+ def before_save_callback2; end
16
+ def around_save_callback1; yield; end
17
+ def around_save_callback2; yield; end
18
+
19
+ end
@@ -0,0 +1,30 @@
1
+ class StateMachineModel < ActiveRecord::Base
2
+
3
+ if respond_to?(:state_machine)
4
+
5
+ state_machine :initial => :state1 do
6
+
7
+ state :state1
8
+
9
+ state :state2
10
+
11
+ state :state3
12
+
13
+ event :event do
14
+ transition :state1 => :state2
15
+ end
16
+
17
+ event :another_event do
18
+ transition :state1 => :state3
19
+ end
20
+
21
+ after_transition :state1 => :state2, :do => :event_callback
22
+
23
+ end
24
+
25
+ def event_callback
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1 @@
1
+ Bundler.require(:state_machine) if ENV['REQUIRE_STATE_MACHINE'] == 'true'
@@ -0,0 +1,13 @@
1
+ class CreateModel < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table :models do |t|
5
+ t.string :string_field
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :models
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateStateMachineModel < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table :state_machine_models do |t|
5
+ t.string :state
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :state_machine_models
11
+ end
12
+
13
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpecCandy::Helpers::DisposableCopy do
4
+
5
+ describe Class do
6
+
7
+ describe '.disposable_copy' do
8
+
9
+ it 'should return a class' do
10
+ Model.disposable_copy.should be_a(Class)
11
+ end
12
+
13
+ it 'should return a class with the same name as the original class' do
14
+ Model.disposable_copy.name.should == 'Model'
15
+ end
16
+
17
+ it 'should return a class that instantiates objects that are also instances of the original class' do
18
+ instance = Model.disposable_copy.new
19
+ instance.should be_a(Model)
20
+ end
21
+
22
+ it 'should return a class that can be modified without changing the original class' do
23
+ copy = Model.disposable_copy
24
+ copy.class_eval do
25
+ def foo
26
+ end
27
+ end
28
+ copy.new.should respond_to(:foo)
29
+ Model.new.should_not respond_to(:foo)
30
+ end
31
+
32
+ it 'should take a block with is evaluated in the context of the disposable class' do
33
+ copy = Model.disposable_copy do
34
+ def foo
35
+ end
36
+ end
37
+ copy.new.should respond_to(:foo)
38
+ Model.new.should_not respond_to(:foo)
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpecCandy::Helpers::StubAnyInstance do
4
+ describe 'RSpec example group' do
5
+
6
+ describe '#it_should_act_like' do
7
+
8
+ it 'should run a shared example group and pass if all is well' do
9
+ <<-describe_block.should pass_as_describe_block
10
+ shared_examples_for "a passing spec" do
11
+ it 'should pass' do
12
+ end
13
+ end
14
+
15
+ describe "passing" do
16
+ it_should_act_like "a passing spec"
17
+ end
18
+ describe_block
19
+ end
20
+
21
+ it 'should run a shared example group and pass if something is wrong' do
22
+ <<-describe_block.should fail_as_describe_block
23
+ shared_examples_for "a failing spec" do
24
+ it 'should fail' do
25
+ 0.should == 1
26
+ end
27
+ end
28
+
29
+ describe "failing" do
30
+ it_should_act_like "a failing spec"
31
+ end
32
+ describe_block
33
+ end
34
+
35
+ it 'should scope the reused examples so definitions of #let and #subject do not bleed into the calling example group' do
36
+
37
+ <<-describe_block.should pass_as_describe_block
38
+ shared_examples_for "a spec that lets something" do
39
+ let(:foo) { "foo" }
40
+ end
41
+
42
+ describe "scoping" do
43
+ it_should_act_like "a spec that lets something"
44
+
45
+ let(:foo) { "bar" }
46
+
47
+ it_should_act_like "a spec that lets something"
48
+
49
+ it 'should not be affected by the previous it_should_act_like' do
50
+ foo.should == "bar"
51
+ end
52
+ end
53
+ describe_block
54
+
55
+ end
56
+
57
+ it 'should allow to parametrize the reused example group by calling it with a hash, whose keys will become #let variables' do
58
+
59
+ shared_examples = <<-shared_examples
60
+ shared_examples_for "a spec passing foo and bar" do
61
+ it 'should see foo=1' do
62
+ foo.should == 1
63
+ end
64
+
65
+ it 'should see bar=2' do
66
+ bar.should == 2
67
+ end
68
+ end
69
+ shared_examples
70
+
71
+ <<-describe_block.should pass_as_describe_block
72
+
73
+ #{shared_examples}
74
+
75
+ describe "a spec passing the right params" do
76
+ it_should_act_like "a spec passing foo and bar", :foo => 1, :bar => 2
77
+ end
78
+
79
+ describe_block
80
+
81
+ <<-describe_block.should fail_as_describe_block
82
+
83
+ #{shared_examples}
84
+
85
+ describe "a spec passing the wrong params" do
86
+ it_should_act_like "a spec passing foo and bar", :foo => 1, :bar => 3
87
+ end
88
+
89
+ describe_block
90
+ end
91
+
92
+ it 'should allow to parametrize the reused example group by calling it with a block, which will become a #let variable called "block"' do
93
+ shared_examples = <<-shared_examples
94
+ shared_examples_for "a spec passing a block" do
95
+ it 'should get a block evaling as 1' do
96
+ block.call.should == 1
97
+ end
98
+ end
99
+ shared_examples
100
+
101
+ <<-describe_block.should pass_as_describe_block
102
+ #{shared_examples}
103
+
104
+ describe "a spec passing the right block" do
105
+ it_should_act_like "a spec passing a block" do
106
+ 1
107
+ end
108
+ end
109
+ describe_block
110
+
111
+ <<-describe_block.should fail_as_describe_block
112
+ #{shared_examples}
113
+
114
+ describe "a spec passing the right block" do
115
+ it_should_act_like "a spec passing a block" do
116
+ 2
117
+ end
118
+ end
119
+ describe_block
120
+ end
121
+
122
+ if RSpecCandy::Switcher.rspec_version == :rspec2
123
+ it 'should print a deprecation warning' do
124
+ result = RSpecRemote.run_describe_block(<<-describe_block)
125
+ shared_examples "a lazy spec" do
126
+ end
127
+
128
+ describe 'spec' do
129
+ it_should_act_like "a lazy spec"
130
+ end
131
+ describe_block
132
+ result.should include('"it_should_act_like" is deprecated')
133
+ end
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpecCandy::Helpers::NewWithStubs do
4
+
5
+ describe Class do
6
+
7
+ describe '#new_with_stubs'
8
+
9
+ it 'should instantiate a class with an empty constructor and stub out the given methods' do
10
+ klass = Class.new do
11
+ def initialize
12
+ end
13
+ def foo
14
+ 'stubbed foo'
15
+ end
16
+ def bar
17
+ 'unstubbed bar'
18
+ end
19
+ def unstubbed_method
20
+ 'unstubbed result'
21
+ end
22
+ end
23
+ instance = klass.new_with_stubs(:foo => 'stubbed foo', :bar => 'stubbed bar')
24
+ instance.foo.should == 'stubbed foo'
25
+ instance.bar.should == 'stubbed bar'
26
+ instance.unstubbed_method.should == 'unstubbed result'
27
+ end
28
+
29
+ it 'should raise an error when trying to stub non-existing methods' do
30
+ klass = Class.new do
31
+ def initialize
32
+ end
33
+ end
34
+ expect do
35
+ klass.new_with_stubs(:foo => 'foo')
36
+ end.to raise_error(/Attempted to stub non-existing method/)
37
+ end
38
+
39
+ end
40
+
41
+ end