resource_spec 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41c01c8d22dd537442114ef20b0b4191620589ce
4
- data.tar.gz: 08783f47f460b39eae770a759909a794b9de0cdd
3
+ metadata.gz: 9bb861e58b40cf18f77d6ce576d3d88f2d43e526
4
+ data.tar.gz: 12e5208fed9ff5cfd9be32d10429f51990da34e2
5
5
  SHA512:
6
- metadata.gz: 3e5a976cb1342b0d0571ae1e773c2fd10eadd710506e871b43cfd79080a4dfe788e6a2b62f5c68c8fde603cbe4d3651277f09033cda1cefce6f6b1957ada80a4
7
- data.tar.gz: 6bc8512c1a5be47b889b3dc1206ceb1fb3f572b4c7fcf3fcb9136d89ef859d548cf9939512ac7d8ad920ab96443a20b7b0ccca7f3ce90b80a04c72aedeec4495
6
+ metadata.gz: 459e7463835bb1d49b42316ddb43780dc71e7590cf3ee013b4e7f11a2a2e774f6e16c8bfa497acaac9bfeeedab6b184769cd8b4499f3f2d95e828d486e7dc274
7
+ data.tar.gz: cc0b200afaa66ae59bb5a0340783c74d03e9d222343807c201f768b0c810ceda91dbf30ef5f682f61a1d5136e0611f6b894b25776d9847ea7d6f9d70a63ca939
data/README.md CHANGED
@@ -1,10 +1,16 @@
1
1
  # ResourceSpec
2
2
 
3
+ [![Build Status](https://travis-ci.org/gzigzigzeo/resource_spec.svg)](http://travis-ci.org/gzigzigzeo/resource_spec/fias)
4
+
5
+ <a href="https://evilmartians.com/?utm_source=resource_spec-gem">
6
+ <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54">
7
+ </a>
8
+
3
9
  Test your RESTful Rails controllers with ease.
4
10
 
5
11
  ### Motivation
6
12
 
7
- In every rails app we have a set of controllers which incapsulates simple CRUD logic, especially in admin area. Most of such controllers stays uncovered: it often seems excessive to test typical things. In other hand, in such typical places there always exists some unusual logic, which had to be tested. Furthermore, 100% test coverage rocks.
13
+ In every Rails app we have a set of controllers which encapsulates simple CRUD logic, especially in the admin area. Most of such controllers stays uncovered: it often seems excessive to test typical things. In other hand, in such typical places there always exists some unusual logic, which had to be tested. Furthermore, 100% test coverage rocks.
8
14
 
9
15
  ## Simple Use Case
10
16
 
@@ -23,7 +29,7 @@ include_context "ResourceSpec", User do
23
29
  end
24
30
  ```
25
31
 
26
- `FactoryGirl` factory for `User` must be defined. Calls to `FactoryGirl` or other factory engine can be overriden with settings.
32
+ `FactoryGirl` factory for `User` must be defined. Calls to `FactoryGirl` or other factory engine can be overridden with settings.
27
33
 
28
34
  ## Customization
29
35
 
@@ -59,7 +65,7 @@ This will make nested resources like `/category/:category_id/groups` work:
59
65
  let(:category) { create(:category) }
60
66
 
61
67
  include_context "ResourceSpec", Group do
62
- let(:url_args) { { category_id: category.id } }
68
+ let(:base_url_args) { { category_id: category.id } }
63
69
 
64
70
  ...
65
71
  end
@@ -90,6 +96,19 @@ around { |example| travel_to(Time.now, &example) }
90
96
 
91
97
  If you have Date columns - use `#to_date` in factory.
92
98
 
99
+ ### Additional action expectations
100
+
101
+ ```ruby
102
+ include_context "ResourceSpec", User do
103
+ it_behaves_like "GET :new" do
104
+ it "includes form tag" do
105
+ expect(response.body).to include("form")
106
+ end
107
+ end
108
+ ...
109
+ end
110
+ ```
111
+
93
112
  ## Installation
94
113
 
95
114
  Add this line to your application's Gemfile:
@@ -1,4 +1,5 @@
1
1
  require "resource_spec/context"
2
+ require "resource_spec/shared"
2
3
  require "resource_spec/index"
3
4
  require "resource_spec/new"
4
5
  require "resource_spec/edit"
@@ -2,35 +2,46 @@ RSpec.shared_context "ResourceSpec" do |model|
2
2
  let(:model) { model }
3
3
 
4
4
  let(:param_name) { model.model_name.param_key }
5
- let(:primary_key_param_name) { :id }
6
- let(:factory_name) { model }
5
+ let(:primary_key_param_name) { :id } # /resource/:id/edit
6
+ let(:factory_name) { model } # FactoryGirl(Namespaced::Model) fails
7
7
 
8
8
  let(:attributes) { FactoryGirl.attributes_for(factory_name).except(:id) }
9
- let(:not_expected_params) { [] }
10
9
  let(:params) { attributes }
11
- let(:invalid_params) { Hash[params.keys.zip([""] * params.keys.size)] }
10
+
11
+ # Used to skip values changing on record save.
12
+ #
13
+ # POST /users/create?user[name]=John&user[password]=5
14
+ # expect(user).to have_attributes({name: "John"})
15
+ #
16
+ # No need to check password: it's encrypted
17
+ let(:not_expected_params) { [] } # Usually :password, :image, etc.
12
18
  let(:params_to_expect) { params.except(*not_expected_params) }
13
19
 
20
+ # Valid params with blank values by default
21
+ let(:invalid_params) { Hash[params.keys.zip([""] * params.keys.size)] }
22
+
23
+ # Returns active object instance from controller. Could be `controller.resource` if you use decent_exposure.
14
24
  let(:resource) { assigns[param_name] }
15
25
  let(:instance) { FactoryGirl.create(factory_name) }
16
26
 
27
+ # Returns collection, same as :resource
17
28
  let(:collection) { assigns[param_name.to_s.pluralize.to_sym] }
18
29
 
19
- let(:url_args) { {} }
30
+ let(:default_url_args) { {} }
20
31
 
21
32
  let(:index_url_args) { {} }
22
33
 
23
- let(:new_url_args) { url_args.merge(param_name => params) }
34
+ let(:new_url_args) { default_url_args.merge(param_name => params) }
24
35
 
25
36
  let(:success_resource_url) do
26
37
  controller.url_for(action: :show, primary_key_param_name => resource.id)
27
38
  end
28
39
 
29
40
  let(:create_url_args) { new_url_args }
30
- let(:invalid_create_url_args) { url_args.merge(param_name => invalid_params) }
41
+ let(:invalid_create_url_args) { default_url_args.merge(param_name => invalid_params) }
31
42
  let(:success_create_url) { success_resource_url }
32
43
 
33
- let(:edit_url_args) { url_args.merge(primary_key_param_name => instance.id) }
44
+ let(:edit_url_args) { default_url_args.merge(primary_key_param_name => instance.id) }
34
45
 
35
46
  let(:update_url_args) { edit_url_args.merge(new_url_args) }
36
47
  let(:invalid_update_url_args) do
@@ -1,20 +1,30 @@
1
1
  RSpec.shared_examples "POST :create" do
2
2
  describe "POST :create" do
3
- it "301" do
4
- post :create, create_url_args
3
+ include_examples "POST :create, success"
4
+ end
5
+ end
6
+
7
+ RSpec.shared_examples "POST :create, success" do
8
+ context "success" do
9
+ let(:url_args) { create_url_args }
10
+ let(:redirect_url) { success_create_url }
5
11
 
6
- expect(resource.errors).to be_blank, "Given params: #{create_url_args} failed with errors: #{resource.errors.full_messages}, "
7
- expect(resource).to be_persisted
8
- expect(resource.reload).to have_attributes(params_to_expect)
12
+ before { post :create, url_args }
13
+
14
+ include_examples "responds 301"
15
+ include_examples "resource has no errors"
16
+ include_examples "resource persisted"
17
+ include_examples "resource has expected attributes"
18
+ end
19
+ end
9
20
 
10
- expect(response).to redirect_to(success_create_url)
11
- end
21
+ RSpec.shared_examples "POST :create, fail" do
22
+ context "fail" do
23
+ let(:url_args) { invalid_create_url_args }
12
24
 
13
- it "422" do
14
- post :create, invalid_create_url_args
25
+ before { post :create, url_args }
15
26
 
16
- expect(response).to be_success
17
- expect(resource.errors).to be_present
18
- end
27
+ include_examples "responds 200"
28
+ include_examples "resource has errors"
19
29
  end
20
30
  end
@@ -1,14 +1,21 @@
1
1
  RSpec.shared_examples "DELETE :destroy" do |**kwargs|
2
2
  describe "DELETE :destroy" do
3
- it "301" do
4
- delete :destroy, destroy_url_args
3
+ context "success" do
4
+ let(:url_args) { destroy_url_args }
5
+ let(:redirect_url) { success_destroy_url }
5
6
 
6
- expect(response).to redirect_to(success_destroy_url)
7
+ before { delete :destroy, url_args }
7
8
 
8
- if kwargs[:paranoid]
9
- expect(resource.deleted_at).to be_present
10
- else
11
- expect { resource.reload }.to raise_error(ActiveRecord::RecordNotFound)
9
+ include_examples "responds 301"
10
+
11
+ it "resource destroyed" do
12
+ if kwargs[:paranoid]
13
+ expect(resource.deleted_at).to be_present
14
+ else
15
+ expect { resource.reload }.to raise_error(
16
+ ActiveRecord::RecordNotFound
17
+ )
18
+ end
12
19
  end
13
20
  end
14
21
  end
@@ -1,9 +1,12 @@
1
1
  RSpec.shared_examples "GET :edit" do
2
2
  describe "GET :edit" do
3
- it "200" do
4
- get :edit, edit_url_args
3
+ let(:url_args) { edit_url_args }
5
4
 
6
- expect(response).to be_success
5
+ before { get :edit, url_args }
6
+
7
+ include_examples "responds 200"
8
+
9
+ it "resource loaded" do
7
10
  expect(resource).to eq(instance)
8
11
  end
9
12
  end
@@ -1,11 +1,16 @@
1
1
  RSpec.shared_examples "GET :new" do
2
2
  describe "GET :new" do
3
- it "200" do
4
- get :new, new_url_args
3
+ let(:url_args) { new_url_args }
5
4
 
6
- expect(response).to be_success
5
+ before { get :new, url_args }
7
6
 
8
- expect(resource).to be_present, "let(:resource) must point to controller variable containing instance, assigns[#{param_name}] by default"
7
+ include_examples "responds 200"
8
+
9
+ it "resource exists" do
10
+ expect(resource).to be_present
11
+ end
12
+
13
+ it "resource is new record" do
9
14
  expect(resource).to be_new_record
10
15
  end
11
16
  end
@@ -0,0 +1,35 @@
1
+ RSpec.shared_examples "responds 200" do
2
+ it "responds 200" do
3
+ expect(response).to be_success
4
+ end
5
+ end
6
+
7
+ RSpec.shared_examples "responds 301" do
8
+ it "responds 301" do
9
+ expect(response).to redirect_to(redirect_url)
10
+ end
11
+ end
12
+
13
+ RSpec.shared_examples "resource has no errors" do
14
+ it "resource has no errors" do
15
+ expect(resource.errors).to be_blank, "Given params: #{url_args} failed with errors: #{resource.errors.full_messages}"
16
+ end
17
+ end
18
+
19
+ RSpec.shared_examples "resource has errors" do
20
+ it "resource has errors" do
21
+ expect(resource.errors).to be_present
22
+ end
23
+ end
24
+
25
+ RSpec.shared_examples "resource persisted" do
26
+ it "resource persisted" do
27
+ expect(resource).to be_persisted
28
+ end
29
+ end
30
+
31
+ RSpec.shared_examples "resource has expected attributes" do
32
+ it "resource has expected attributes" do
33
+ expect(resource.reload).to have_attributes(params_to_expect)
34
+ end
35
+ end
@@ -1,19 +1,30 @@
1
1
  RSpec.shared_examples "PUT :update" do
2
2
  describe "PUT :update" do
3
- it "301" do
4
- put :update, update_url_args
3
+ include_examples "PUT :update, success"
4
+ include_examples "PUT :update, fail"
5
+ end
6
+ end
7
+
8
+ RSpec.shared_examples "PUT :update, success" do
9
+ context "success" do
10
+ let(:url_args) { update_url_args }
11
+ let(:redirect_url) { success_update_url }
5
12
 
6
- expect(resource.errors).to be_blank, "Given params: #{create_url_args} failed with errors: #{resource.errors.full_messages}, "
7
- expect(resource.reload).to have_attributes(params_to_expect)
13
+ before { put :update, url_args }
14
+
15
+ include_examples "responds 301"
16
+ include_examples "resource has no errors"
17
+ include_examples "resource has expected attributes"
18
+ end
19
+ end
8
20
 
9
- expect(response).to redirect_to(success_update_url)
10
- end
21
+ RSpec.shared_examples "PUT :update, fail" do
22
+ context "fail" do
23
+ let(:url_args) { invalid_update_url_args }
11
24
 
12
- it "422" do
13
- put :update, invalid_update_url_args
25
+ before { post :update, url_args }
14
26
 
15
- expect(response).to be_success
16
- expect(resource.errors).to be_present
17
- end
27
+ include_examples "responds 200"
28
+ include_examples "resource has errors"
18
29
  end
19
30
  end
@@ -1,3 +1,3 @@
1
1
  module ResourceSpec
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resource_spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Sokolov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-11 00:00:00.000000000 Z
11
+ date: 2015-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -174,6 +174,7 @@ files:
174
174
  - lib/resource_spec/edit.rb
175
175
  - lib/resource_spec/index.rb
176
176
  - lib/resource_spec/new.rb
177
+ - lib/resource_spec/shared.rb
177
178
  - lib/resource_spec/update.rb
178
179
  - lib/resource_spec/version.rb
179
180
  - resource_spec.gemspec