crudie 0.0.3 → 0.0.4

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: 8f3f88d5b9eec16f4c0fba4969a5f7604270142e
4
- data.tar.gz: f2f70f61ee00c11db2714c4dd57c9716ece759eb
3
+ metadata.gz: 57c9008695012cf6225661e85f53a2eede894431
4
+ data.tar.gz: e627a68ce7147a58d357f1a7bc4024ba6799ea6c
5
5
  SHA512:
6
- metadata.gz: a59c7eeaaa56ade9b4964c0512b4d20b6df4defd679f30445e902d592382e6742e139b99c4b6d7ffc4986bd758c5f6beaff87d9ae11b066ff57cc107a427ac09
7
- data.tar.gz: 41367bb695c77c8eae7a08cff457fcb598e8ddacafb132004fb69d5310237a2ec5f1afe7e169209dcfb9a015796e21e24d58549915e6e425c651f73f1dbf74d9
6
+ metadata.gz: 624b8ac1074195d0b9e139fadd5cd80e1e9b1997d0723b091e711cc5b5d632765c26a1853f612edf00c45d54f438a624c7a2e78c67ab6b0939578f014f41ca55
7
+ data.tar.gz: cc4d2bce18d21f29acd4cb44c8e647d060418c1098ebd51b1866b62c8618ab4d4993a2d5585f08a6691c79b6bc8493e5bbac22912fd4f238605c94ab5efb7005
@@ -1,155 +1,15 @@
1
1
  # Crudie spec
2
+ #
3
+ # Crudie::Spec::Unit
2
4
  # usage:
3
5
  # RSpec.describe ProjectsController, :type => :controller do
4
6
  # include Crudie::Spec
5
7
  # include_crudie_spec_for :project, :context_name => :user
6
8
  # end
9
+
7
10
  module Crudie
8
11
  module Spec
9
-
10
- def self.included base
11
- class << base
12
- def include_crudie_spec_for resource, options = {}
13
- context_name = options[:context_name]
14
-
15
- methods_to_test = options[:only] || [ :create, :index, :update, :show, :destroy ]
16
- excluded_methods = options[:except] || []
17
- methods_to_test = methods_to_test - excluded_methods
18
-
19
- describe "Crudie spec for `#{resource}`" do
20
- let(:resource) { resource }
21
- let(:resources) { resource.to_s.pluralize }
22
- context
23
-
24
- methods_to_test.each { |m| send("test_#{m}".to_sym, resource, context_name) }
25
- end
26
- end
27
-
28
- private
29
- def context
30
- let(:crudie_context) { double(:crudie_context, :find => crudie_instance) }
31
- let(:crudie_instance) { double(:crudie_instance, :valid? => true) }
32
- before :each do
33
- allow(controller).to receive(:crudie_context).and_return(crudie_context)
34
- end
35
- end
36
-
37
- def test_index resource, context_name
38
- describe 'GET :index' do
39
- let(:params) do
40
- prm = {}
41
- prm["#{context_name}_id"] = 123 if context_name
42
- prm
43
- end
44
- it "returns projects of user" do
45
- get :index, params
46
- expect(controller.instance_variable_get("@#{resources}")).to be(crudie_context)
47
- expect(response.status).to eq 200
48
- end
49
- end
50
-
51
- end
52
-
53
- def test_create resource, context_name
54
- describe "POST :create" do
55
- let(:params) do
56
- prm = {}
57
- prm["#{context_name}_id".to_sym] = 123 if context_name
58
- prm[resource] = { 'key' => 'val' }
59
- prm
60
- end
61
-
62
- before :each do
63
- allow(controller).to receive(:crudie_params).and_return(params[resource])
64
- expect(crudie_context).to receive(:create).with(params[resource]).and_return(crudie_instance)
65
- end
66
-
67
- it "creates a #{resource} under context" do
68
- post :create, params
69
- end
70
-
71
- it "sets controller.@#{resource} as #{resource}" do
72
- post :create, params
73
-
74
- expect(controller.instance_variable_get("@#{resource}")).to be(crudie_instance)
75
- end
76
-
77
- it "returns 409 if resource is not valid" do
78
- allow(crudie_instance).to receive_messages(:valid? => false,
79
- :errors => double(:messages => 'the messages'))
80
- post :create, params
81
- expect(response.status).to eq 409
82
- end
83
- end
84
- end
85
-
86
-
87
- def test_show resource, context_name
88
- describe "GET :show" do
89
- let(:params) do
90
- prm = { :id => 123 }
91
- prm["#{context_name}_id"] = 123 if context_name
92
- prm
93
- end
94
-
95
- it "shows the resource instance by id" do
96
- get :show, params
97
- expect(controller.instance_variable_get("@#{resource}")).to be crudie_instance
98
- end
99
- end
100
-
101
- end
102
-
103
- def test_update resource, context_name
104
- describe "PUT :update" do
105
- let(:params) do
106
- prm = { :id => 123, resource => { 'key' => 'val' } }
107
- prm["#{context_name}_id"] = 123 if context_name
108
- prm
109
- end
110
- before :each do
111
- allow(controller).to receive(:crudie_params).and_return(params[resource])
112
- end
113
-
114
- it "updates instance" do
115
- expect(crudie_instance).to receive(:update_attributes).with(params[resource])
116
- .and_return(true)
117
- put :update, params
118
- expect(controller.instance_variable_get("@#{resource}")).to be crudie_instance
119
- end
120
-
121
- it "render 409 if updating failed" do
122
- expect(crudie_instance).to receive(:update_attributes)
123
- .with(params[resource]).and_return(false)
124
- expect(crudie_instance).to receive(:errors).and_return(double(:messages => 'the messages'))
125
-
126
- put :update, params
127
- expect(response.status).to eq 409
128
- end
129
-
130
- end
131
-
132
- end
133
-
134
- def test_destroy resource, context_name
135
- describe "DELETE :destroy" do
136
- let(:params) do
137
- prm = { :id => 123 }
138
- prm["#{context_name}_id"] = 123 if context_name
139
- prm
140
- end
141
-
142
- it "destroy the instance" do
143
- expect(crudie_instance).to receive(:destroy)
144
- delete :destroy, params
145
- end
146
- end
147
-
148
- end
149
-
150
- end
151
- end
152
-
153
-
12
+ require 'crudie/spec/unit'
13
+ require 'crudie/spec/acceptance'
154
14
  end
155
15
  end
@@ -0,0 +1,181 @@
1
+ # Acceptance spec helper
2
+ # Usage:
3
+ # 1. for resource without parent:
4
+ # include Crudie::Spec::Acceptance
5
+ # include_acceptance_spec_for :resource => {
6
+ # :name => :user,
7
+ # :creator => Proc.new {|index| User.create :name => index },
8
+ # :context => Proc.new { User.all }
9
+ # },
10
+ # :parameters => {
11
+ # :name => {
12
+ # :desc => 'user name',
13
+ # :value => 'the new user name',
14
+ # :options => {
15
+ # :scope => :user,
16
+ # :required => true
17
+ # }
18
+ # }
19
+ # }
20
+ #
21
+ # 2. for resource with parent:
22
+ # include Crudie::Spec::Acceptance
23
+ # include_acceptance_spec_for :parent => {
24
+ # :name => :user,
25
+ # :creator => Proc.new { User.create :name => 'jack' }
26
+ # },
27
+ # :resource => {
28
+ # :name => :project,
29
+ # :creator => Proc.new {|i, user| user.projects.create :name => i },
30
+ # :context => Proc.new {|parent| parent.projects }
31
+ # },
32
+ # :parameters => {
33
+ # :name => {
34
+ # :desc => 'project name',
35
+ # :value => 'the new project name',
36
+ # :options => {
37
+ # :scope => :project,
38
+ # :required => true
39
+ # }
40
+ # }
41
+ # }
42
+
43
+ module Crudie::Spec::Acceptance
44
+ def self.included base
45
+ class << base
46
+ def include_acceptance_spec_for options
47
+ resource_names = options[:resource][:name].to_s.pluralize
48
+ resource_name_id = "#{options[:resource][:name]}_id"
49
+ resource_creator = options[:resource][:creator]
50
+ resource_context = options[:resource][:context]
51
+
52
+ request_parameters = options[:parameters]
53
+
54
+ parent_exists = ! options[:parent].nil?
55
+
56
+ if parent_exists
57
+ parent_names = options[:parent][:name].to_s.pluralize
58
+ parent_creator = options[:parent][:creator]
59
+ parent_name_id = "#{options[:parent][:name]}_id"
60
+
61
+ plural_url = "/#{parent_names}/:#{parent_name_id}/#{resource_names}"
62
+ singular_url = "#{plural_url}/:#{resource_name_id}"
63
+
64
+ let(:parent_instance) { self.instance_eval &parent_creator}
65
+ let(parent_name_id) { parent_instance.id }
66
+ else
67
+ plural_url = "/#{resource_names}"
68
+ singular_url = "#{plural_url}/:#{resource_name_id}"
69
+ end
70
+
71
+ only_actions = options[:only] || [ :index, :show, :update, :destroy, :create ]
72
+ except = options[:except] || []
73
+ actions = only_actions - except
74
+
75
+ shared_context 'with_single_resource_instance' do
76
+ let!(:resource_instance) do
77
+ if parent_exists
78
+ resource_creator.call(1, parent_instance)
79
+ else
80
+ resource_creator.call(1)
81
+ end
82
+ end
83
+ end
84
+
85
+ shared_context 'with_parameters' do
86
+ request_parameters.each do |key, detail|
87
+ parameter key, detail[:desc], detail[:options]
88
+ let(key) { detail[:value] }
89
+ end
90
+ let(resource_name_id) { resource_instance.id }
91
+ end
92
+
93
+ # index spec
94
+ if actions.include?(:index)
95
+ get plural_url do
96
+ let!(:resources) do
97
+ 3.times do |i|
98
+ parent_exists ?
99
+ resource_creator.call(i, parent_instance) :
100
+ resource_creator.call(i)
101
+ end
102
+ end
103
+
104
+ example 'Index' do
105
+ do_request
106
+ expect(response_status).to eq 200
107
+ expect(JSON.parse(response_body).count).to eq 3
108
+ end
109
+ end
110
+ end
111
+
112
+ # show spec
113
+ if actions.include?(:show)
114
+ get singular_url do
115
+ include_context 'with_single_resource_instance'
116
+ let(resource_name_id) { resource_instance.id }
117
+
118
+ example 'Show' do
119
+ do_request
120
+ expect(JSON.parse(response_body)['id']).to eq(resource_instance.id)
121
+ end
122
+ end
123
+ end
124
+
125
+ # Create spec
126
+ if actions.include?(:create)
127
+ post plural_url do
128
+ include_context 'with_parameters'
129
+ example 'Create' do
130
+ do_request
131
+
132
+ if parent_exists
133
+ expect(resource_context.call(parent_instance).count).to eq 1
134
+ else
135
+ expect(resource_context.call.count).to eq 1
136
+ end
137
+
138
+ end
139
+ end
140
+ end
141
+
142
+ # Update spec
143
+ if actions.include?(:update)
144
+ put singular_url do
145
+ include_context 'with_single_resource_instance'
146
+ include_context 'with_parameters'
147
+
148
+ example 'Updating' do
149
+ do_request
150
+
151
+ resource_instance.reload
152
+ request_parameters.each do |key, val|
153
+ expect(resource_instance.send(key)).to eq(send(key))
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ # destroy spec
160
+ if actions.include?(:destroy)
161
+ delete singular_url do
162
+ include_context 'with_single_resource_instance'
163
+ let(resource_name_id) { resource_instance.id }
164
+
165
+ example 'Deletion' do
166
+ do_request
167
+ if parent_exists
168
+ expect(resource_context.call(parent_instance)
169
+ .where(:id => resource_instance.id)).to be_empty
170
+ else
171
+ expect(resource_context.call
172
+ .where(:id => resource_instance.id)).to be_empty
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,150 @@
1
+ # Crudie spec
2
+ # usage:
3
+ # RSpec.describe ProjectsController, :type => :controller do
4
+ # include Crudie::Spec
5
+ # include_crudie_spec_for :project, :context_name => :user
6
+ # end
7
+ module Crudie::Spec::Unit
8
+ def self.included base
9
+ class << base
10
+ def include_crudie_spec_for resource, options = {}
11
+ context_name = options[:context_name]
12
+
13
+ methods_to_test = options[:only] || [ :create, :index, :update, :show, :destroy ]
14
+ excluded_methods = options[:except] || []
15
+ methods_to_test = methods_to_test - excluded_methods
16
+
17
+ describe "Crudie spec for `#{resource}`" do
18
+ let(:resource) { resource }
19
+ let(:resources) { resource.to_s.pluralize }
20
+ context
21
+
22
+ methods_to_test.each { |m| send("test_#{m}".to_sym, resource, context_name) }
23
+ end
24
+ end
25
+
26
+ private
27
+ def context
28
+ let(:crudie_context) { double(:crudie_context, :find => crudie_instance) }
29
+ let(:crudie_instance) { double(:crudie_instance, :valid? => true) }
30
+ before :each do
31
+ allow(controller).to receive(:crudie_context).and_return(crudie_context)
32
+ end
33
+ end
34
+
35
+ def test_index resource, context_name
36
+ describe 'GET :index' do
37
+ let(:params) do
38
+ prm = {}
39
+ prm["#{context_name}_id"] = 123 if context_name
40
+ prm
41
+ end
42
+ it "returns projects of user" do
43
+ get :index, params
44
+ expect(controller.instance_variable_get("@#{resources}")).to be(crudie_context)
45
+ expect(response.status).to eq 200
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ def test_create resource, context_name
52
+ describe "POST :create" do
53
+ let(:params) do
54
+ prm = {}
55
+ prm["#{context_name}_id".to_sym] = 123 if context_name
56
+ prm[resource] = { 'key' => 'val' }
57
+ prm
58
+ end
59
+
60
+ before :each do
61
+ allow(controller).to receive(:crudie_params).and_return(params[resource])
62
+ expect(crudie_context).to receive(:create).with(params[resource]).and_return(crudie_instance)
63
+ end
64
+
65
+ it "creates a #{resource} under context" do
66
+ post :create, params
67
+ end
68
+
69
+ it "sets controller.@#{resource} as #{resource}" do
70
+ post :create, params
71
+
72
+ expect(controller.instance_variable_get("@#{resource}")).to be(crudie_instance)
73
+ end
74
+
75
+ it "returns 409 if resource is not valid" do
76
+ allow(crudie_instance).to receive_messages(:valid? => false,
77
+ :errors => double(:messages => 'the messages'))
78
+ post :create, params
79
+ expect(response.status).to eq 409
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ def test_show resource, context_name
86
+ describe "GET :show" do
87
+ let(:params) do
88
+ prm = { :id => 123 }
89
+ prm["#{context_name}_id"] = 123 if context_name
90
+ prm
91
+ end
92
+
93
+ it "shows the resource instance by id" do
94
+ get :show, params
95
+ expect(controller.instance_variable_get("@#{resource}")).to be crudie_instance
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ def test_update resource, context_name
102
+ describe "PUT :update" do
103
+ let(:params) do
104
+ prm = { :id => 123, resource => { 'key' => 'val' } }
105
+ prm["#{context_name}_id"] = 123 if context_name
106
+ prm
107
+ end
108
+ before :each do
109
+ allow(controller).to receive(:crudie_params).and_return(params[resource])
110
+ end
111
+
112
+ it "updates instance" do
113
+ expect(crudie_instance).to receive(:update_attributes).with(params[resource])
114
+ .and_return(true)
115
+ put :update, params
116
+ expect(controller.instance_variable_get("@#{resource}")).to be crudie_instance
117
+ end
118
+
119
+ it "render 409 if updating failed" do
120
+ expect(crudie_instance).to receive(:update_attributes)
121
+ .with(params[resource]).and_return(false)
122
+ expect(crudie_instance).to receive(:errors).and_return(double(:messages => 'the messages'))
123
+
124
+ put :update, params
125
+ expect(response.status).to eq 409
126
+ end
127
+
128
+ end
129
+
130
+ end
131
+
132
+ def test_destroy resource, context_name
133
+ describe "DELETE :destroy" do
134
+ let(:params) do
135
+ prm = { :id => 123 }
136
+ prm["#{context_name}_id"] = 123 if context_name
137
+ prm
138
+ end
139
+
140
+ it "destroy the instance" do
141
+ expect(crudie_instance).to receive(:destroy)
142
+ delete :destroy, params
143
+ end
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+ end
150
+ end
@@ -1,3 +1,3 @@
1
1
  module Crudie
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crudie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yang-Hsing Lin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-26 00:00:00.000000000 Z
11
+ date: 2015-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec_api_documentation
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl_rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: jbuilder
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  description: A rails plugin to abstract CRUD api in controller
56
98
  email:
57
99
  - yanghsing.lin@gmail.com
@@ -64,6 +106,8 @@ files:
64
106
  - lib/crudie.rb
65
107
  - lib/crudie/controller_methods.rb
66
108
  - lib/crudie/spec.rb
109
+ - lib/crudie/spec/acceptance.rb
110
+ - lib/crudie/spec/unit.rb
67
111
  - lib/crudie/version.rb
68
112
  - lib/tasks/crudie_tasks.rake
69
113
  homepage: ''