dry_crud 2.1.2 → 3.0.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 +5 -13
- data/README.rdoc +1 -2
- data/VERSION +1 -1
- data/app/controllers/crud_controller.rb +96 -61
- data/app/controllers/dry_crud/generic_model.rb +1 -5
- data/app/controllers/dry_crud/rememberable.rb +1 -1
- data/app/controllers/dry_crud/render_callbacks.rb +2 -4
- data/app/controllers/list_controller.rb +4 -5
- data/app/helpers/dry_crud/form/builder.rb +4 -30
- data/app/helpers/format_helper.rb +2 -0
- data/app/helpers/utility_helper.rb +2 -3
- data/app/views/crud/show.json.jbuilder +1 -0
- data/app/views/layouts/_flash.html.erb +1 -1
- data/app/views/layouts/_flash.html.haml +1 -1
- data/app/views/list/index.json.jbuilder +4 -0
- data/config/locales/crud.de.yml +1 -1
- data/lib/generators/dry_crud/templates/spec/controllers/crud_test_models_controller_spec.rb +141 -139
- data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/form/builder_spec.rb +47 -48
- data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/table/builder_spec.rb +6 -6
- data/lib/generators/dry_crud/templates/spec/helpers/form_helper_spec.rb +66 -66
- data/lib/generators/dry_crud/templates/spec/helpers/format_helper_spec.rb +62 -61
- data/lib/generators/dry_crud/templates/spec/helpers/i18n_helper_spec.rb +13 -13
- data/lib/generators/dry_crud/templates/spec/helpers/table_helper_spec.rb +42 -38
- data/lib/generators/dry_crud/templates/spec/helpers/utility_helper_spec.rb +22 -22
- data/lib/generators/dry_crud/templates/spec/support/crud_controller_examples.rb +72 -72
- data/lib/generators/dry_crud/templates/spec/support/crud_controller_test_helper.rb +54 -45
- data/lib/generators/dry_crud/templates/test/controllers/crud_test_models_controller_test.rb +8 -11
- data/lib/generators/dry_crud/templates/test/helpers/dry_crud/form/builder_test.rb +1 -6
- data/lib/generators/dry_crud/templates/test/helpers/form_helper_test.rb +47 -46
- data/lib/generators/dry_crud/templates/test/helpers/format_helper_test.rb +1 -1
- data/lib/generators/dry_crud/templates/test/helpers/table_helper_test.rb +9 -3
- data/lib/generators/dry_crud/templates/test/support/crud_controller_test_helper.rb +2 -2
- data/lib/generators/dry_crud/templates/test/support/crud_test_helper.rb +1 -1
- data/lib/generators/dry_crud/templates/test/support/crud_test_model.rb +0 -4
- data/lib/generators/dry_crud/templates/test/support/crud_test_models_controller.rb +5 -10
- metadata +15 -18
- data/app/controllers/dry_crud/responder.rb +0 -34
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OTUzZWFjODA5NzRlZTVlMGQzYzZiOTMzNGRkNjIxNDM4OWM0OTZlMw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 664cf77c042838728de2d0abb74525808c496448
|
4
|
+
data.tar.gz: e12c82079d72d2f414cef3181d2fcd14e9f72552
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
OGQyNzI5OGJmMDgwYjU1N2Y3OTk5MjA2ZTgyNTU3OGI1NDhjODViNmJjZDVm
|
11
|
-
YWIyODY4YzIzODIxNDk2ZGQ4M2E2ODE4ZDQwOWQ2NmFjYTczYzE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODc3YTliNjQ5YzZhMGQwMjIxMTMwYzBlMDMzNDhjM2I5MDg0NzEwNGY0YTk0
|
14
|
-
NGRjN2Q2MWVkZjBhZjQzMmYzMTJhMDYyM2MwYzlkZGZmZTk0ZjY0NzVjMTE0
|
15
|
-
OTVmODcyNDNkNzUwNDJlNmIyN2E4NDFlZjhkZjIzZTY3NTRjYzM=
|
6
|
+
metadata.gz: fb4bd2d805c8bc9a0dfa4a3eb3cf25758d70abcde034b9380d6e181bb1a8918420be98c326d036926d30c92b56fe0a7d02d5232e30a0a72b704cc02d2c9fa660
|
7
|
+
data.tar.gz: 5851c097e6904e68f7abaec88d5c0bec6c651de07e482737f667dd7832f976a9bb5b390900669910e945e5fc33afae27359735f1ae3c2420f7f0309902135821
|
data/README.rdoc
CHANGED
@@ -33,7 +33,7 @@ To integrate dry_crud into your code, only a few additions are required:
|
|
33
33
|
* Optionally define a +list+ scope in your models to be used in the +index+ action.
|
34
34
|
* Optionally define a +options_list+ scope in your models to be used in select dropdowns.
|
35
35
|
|
36
|
-
Version 2.0 and higher are compatible with Rails 4 and Rails 3.2. dry_crud is tested with Ruby 1.9.3, 2.
|
36
|
+
From version 3.0, only the latest released Rails version will be supported, which currently is 4.2. Version 2.0 and higher are compatible with Rails 4 and Rails 3.2. dry_crud is tested with Ruby 1.9.3, 2.1.5 and JRuby. If you are using Ruby 1.8.7, please refer to version 1.7.0.
|
37
37
|
|
38
38
|
|
39
39
|
== Background
|
@@ -392,4 +392,3 @@ spec/support/crud_test_model.rb:: A dummy model to run CRUD tests against.
|
|
392
392
|
spec/controllers/crud_test_models_controller_spec.rb:: Controller specs to test the basic CrudController functionality.
|
393
393
|
|
394
394
|
spec/helpers/*_spec.rb:: The specs for all the helpers included in dry_crud and a great base to test your adaptions of the CRUD code.
|
395
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.0
|
@@ -11,11 +11,7 @@
|
|
11
11
|
# action procedures without overriding the entire method.
|
12
12
|
class CrudController < ListController
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
if Rails.version >= '4.0'
|
17
|
-
class_attribute :permitted_attrs
|
18
|
-
end
|
14
|
+
class_attribute :permitted_attrs
|
19
15
|
|
20
16
|
# Defines before and after callback hooks for create, update, save and
|
21
17
|
# destroy actions.
|
@@ -28,79 +24,114 @@ class CrudController < ListController
|
|
28
24
|
|
29
25
|
hide_action :run_callbacks
|
30
26
|
|
31
|
-
|
32
|
-
after_destroy :set_success_notice
|
27
|
+
before_action :entry, only: [:show, :new, :edit, :update, :destroy]
|
33
28
|
|
34
29
|
helper_method :entry, :full_entry_label
|
35
30
|
|
36
31
|
############## ACTIONS ############################################
|
37
32
|
|
38
|
-
# Show one entry of this model.
|
39
33
|
# GET /entries/1
|
40
34
|
# GET /entries/1.json
|
41
|
-
|
42
|
-
|
35
|
+
#
|
36
|
+
# Show one entry of this model.
|
37
|
+
def show
|
43
38
|
end
|
44
39
|
|
45
|
-
# Display a form to create a new entry of this model.
|
46
40
|
# GET /entries/new
|
47
41
|
# GET /entries/new.json
|
48
|
-
|
42
|
+
#
|
43
|
+
# Display a form to create a new entry of this model.
|
44
|
+
def new
|
49
45
|
assign_attributes if params[model_identifier]
|
50
|
-
respond_with(entry, &block)
|
51
46
|
end
|
52
47
|
|
48
|
+
# POST /entries
|
49
|
+
# POST /entries.json
|
50
|
+
#
|
53
51
|
# Create a new entry of this model from the passed params.
|
54
52
|
# There are before and after create callbacks to hook into the action.
|
55
|
-
#
|
56
|
-
#
|
53
|
+
#
|
54
|
+
# To customize the response for certain formats, you may overwrite
|
55
|
+
# this action and call super with a block that gets the format and
|
56
|
+
# success parameters. Calling a format action (e.g. format.html)
|
57
|
+
# in the given block will take precedence over the one defined here.
|
58
|
+
#
|
57
59
|
# Specify a :location option if you wish to do a custom redirect.
|
58
|
-
# POST /entries
|
59
|
-
# POST /entries.json
|
60
60
|
def create(options = {}, &block)
|
61
61
|
assign_attributes
|
62
62
|
created = with_callbacks(:create, :save) { entry.save }
|
63
|
-
|
64
|
-
|
63
|
+
|
64
|
+
respond_to do |format|
|
65
|
+
block.call(format, created) if block_given?
|
66
|
+
if created
|
67
|
+
format.html { redirect_on_success(options) }
|
68
|
+
format.json { render :show, status: :created, location: show_path }
|
69
|
+
else
|
70
|
+
format.html { render :new }
|
71
|
+
format.json { render json: entry.errors, status: :unprocessable_entity }
|
72
|
+
end
|
73
|
+
end
|
65
74
|
end
|
66
75
|
|
67
|
-
# Display a form to edit an exisiting entry of this model.
|
68
76
|
# GET /entries/1/edit
|
69
|
-
|
70
|
-
|
77
|
+
#
|
78
|
+
# Display a form to edit an exisiting entry of this model.
|
79
|
+
def edit
|
71
80
|
end
|
72
81
|
|
82
|
+
# PUT /entries/1
|
83
|
+
# PUT /entries/1.json
|
84
|
+
#
|
73
85
|
# Update an existing entry of this model from the passed params.
|
74
86
|
# There are before and after update callbacks to hook into the action.
|
75
|
-
#
|
76
|
-
#
|
87
|
+
#
|
88
|
+
# To customize the response for certain formats, you may overwrite
|
89
|
+
# this action and call super with a block that gets the format and
|
90
|
+
# success parameters. Calling a format action (e.g. format.html)
|
91
|
+
# in the given block will take precedence over the one defined here.
|
92
|
+
#
|
77
93
|
# Specify a :location option if you wish to do a custom redirect.
|
78
|
-
# PUT /entries/1
|
79
|
-
# PUT /entries/1.json
|
80
94
|
def update(options = {}, &block)
|
81
95
|
assign_attributes
|
82
96
|
updated = with_callbacks(:update, :save) { entry.save }
|
83
|
-
|
84
|
-
|
97
|
+
|
98
|
+
respond_to do |format|
|
99
|
+
block.call(format, updated) if block_given?
|
100
|
+
if updated
|
101
|
+
format.html { redirect_on_success(options) }
|
102
|
+
format.json { render :show, status: :ok, location: show_path }
|
103
|
+
else
|
104
|
+
format.html { render :edit }
|
105
|
+
format.json { render json: entry.errors, status: :unprocessable_entity }
|
106
|
+
end
|
107
|
+
end
|
85
108
|
end
|
86
109
|
|
110
|
+
# DELETE /entries/1
|
111
|
+
# DELETE /entries/1.json
|
112
|
+
#
|
87
113
|
# Destroy an existing entry of this model.
|
88
114
|
# There are before and after destroy callbacks to hook into the action.
|
89
|
-
#
|
90
|
-
#
|
115
|
+
#
|
116
|
+
# To customize the response for certain formats, you may overwrite
|
117
|
+
# this action and call super with a block that gets format and
|
118
|
+
# success parameters. Calling a format action (e.g. format.html)
|
119
|
+
# in the given block will take precedence over the one defined here.
|
120
|
+
#
|
91
121
|
# Specify a :location option if you wish to do a custom redirect.
|
92
|
-
# DELETE /entries/1
|
93
|
-
# DELETE /entries/1.json
|
94
122
|
def destroy(options = {}, &block)
|
95
123
|
destroyed = run_callbacks(:destroy) { entry.destroy }
|
96
|
-
|
97
|
-
|
98
|
-
|
124
|
+
|
125
|
+
respond_to do |format|
|
126
|
+
block.call(format, destroyed) if block_given?
|
127
|
+
if destroyed
|
128
|
+
format.html { redirect_on_success(options) }
|
129
|
+
format.json { head :no_content }
|
130
|
+
else
|
131
|
+
format.html { redirect_on_failure(options) }
|
132
|
+
format.json { render json: entry.errors, status: :unprocessable_entity }
|
133
|
+
end
|
99
134
|
end
|
100
|
-
location ||= index_url
|
101
|
-
respond_options = options.reverse_merge(success: destroyed,
|
102
|
-
location: location)
|
103
|
-
respond_with(entry, respond_options, &block)
|
104
135
|
end
|
105
136
|
|
106
137
|
private
|
@@ -129,35 +160,34 @@ class CrudController < ListController
|
|
129
160
|
|
130
161
|
# The form params for this model.
|
131
162
|
def model_params
|
132
|
-
|
133
|
-
params[model_identifier]
|
134
|
-
else
|
135
|
-
params.require(model_identifier).permit(permitted_attrs)
|
136
|
-
end
|
163
|
+
params.require(model_identifier).permit(permitted_attrs)
|
137
164
|
end
|
138
165
|
|
139
|
-
#
|
140
|
-
def
|
141
|
-
|
166
|
+
# Path of the index page to return to.
|
167
|
+
def index_path
|
168
|
+
polymorphic_path(path_args(model_class), returning: true)
|
142
169
|
end
|
143
170
|
|
144
|
-
#
|
145
|
-
def
|
146
|
-
|
171
|
+
# Path of the show page.
|
172
|
+
def show_path
|
173
|
+
path_args(entry)
|
147
174
|
end
|
148
175
|
|
149
|
-
#
|
150
|
-
def
|
151
|
-
|
152
|
-
|
153
|
-
|
176
|
+
# Perform a redirect after a successfull operation and set a flash notice.
|
177
|
+
def redirect_on_success(options = {})
|
178
|
+
location = options[:location] ||
|
179
|
+
(entry.destroyed? ? index_path : show_path)
|
180
|
+
flash[:notice] ||= flash_message(:success)
|
181
|
+
redirect_to location
|
154
182
|
end
|
155
183
|
|
156
|
-
#
|
157
|
-
def
|
158
|
-
|
159
|
-
|
160
|
-
|
184
|
+
# Perform a redirect after a failed operation and set a flash alert.
|
185
|
+
def redirect_on_failure(options = {})
|
186
|
+
location = options[:location] ||
|
187
|
+
request.env['HTTP_REFERER'].presence ||
|
188
|
+
index_path
|
189
|
+
flash[:alert] ||= error_messages.presence || flash_message(:failure)
|
190
|
+
redirect_to location
|
161
191
|
end
|
162
192
|
|
163
193
|
# Get an I18n flash message.
|
@@ -169,7 +199,12 @@ class CrudController < ListController
|
|
169
199
|
:"#{controller_name}.#{scope}",
|
170
200
|
:"crud.#{scope}_html",
|
171
201
|
:"crud.#{scope}"]
|
172
|
-
I18n.t(keys.shift, model: full_entry_label, default: keys)
|
202
|
+
I18n.t(keys.shift, model: full_entry_label, default: keys)
|
203
|
+
end
|
204
|
+
|
205
|
+
# A label for the current entry, including the model name.
|
206
|
+
def full_entry_label
|
207
|
+
"#{models_label(false)} <i>#{ERB::Util.h(entry)}</i>".html_safe
|
173
208
|
end
|
174
209
|
|
175
210
|
# Html safe error messages of the current entry.
|
@@ -24,11 +24,7 @@ module DryCrud
|
|
24
24
|
# This is mainly used for nested models to provide the
|
25
25
|
# required context.
|
26
26
|
def model_scope
|
27
|
-
|
28
|
-
model_class.scoped
|
29
|
-
else
|
30
|
-
model_class.all
|
31
|
-
end
|
27
|
+
model_class.all
|
32
28
|
end
|
33
29
|
|
34
30
|
# The path arguments to link to the given model entry.
|
@@ -37,10 +37,8 @@ module DryCrud
|
|
37
37
|
# Defines before callbacks for the render actions.
|
38
38
|
def define_render_callbacks(*actions)
|
39
39
|
args = actions.map { |a| :"render_#{a}" }
|
40
|
-
|
41
|
-
|
42
|
-
args << { only: :before,
|
43
|
-
terminator: 'result == false || performed?' }
|
40
|
+
terminator = ->(ctrl, result) { result == false || ctrl.performed? }
|
41
|
+
args << { only: :before, terminator: terminator }
|
44
42
|
define_model_callbacks(*args)
|
45
43
|
end
|
46
44
|
end
|
@@ -15,19 +15,18 @@ class ListController < ApplicationController
|
|
15
15
|
include DryCrud::Rememberable
|
16
16
|
include DryCrud::RenderCallbacks
|
17
17
|
|
18
|
-
respond_to :html, :json
|
19
|
-
|
20
18
|
define_render_callbacks :index
|
21
19
|
|
22
20
|
helper_method :entries
|
23
21
|
|
24
22
|
############## ACTIONS ############################################
|
25
23
|
|
26
|
-
# List all entries of this model.
|
27
24
|
# GET /entries
|
28
25
|
# GET /entries.json
|
29
|
-
|
30
|
-
|
26
|
+
#
|
27
|
+
# List all entries of this model.
|
28
|
+
def index
|
29
|
+
entries
|
31
30
|
end
|
32
31
|
|
33
32
|
private
|
@@ -83,7 +83,7 @@ module DryCrud
|
|
83
83
|
|
84
84
|
# Add form-control class to all input fields.
|
85
85
|
%w(text_field password_field email_field text_area
|
86
|
-
|
86
|
+
number_field date_field time_field datetime_field).each do |method|
|
87
87
|
define_method(method) do |attr, html_options = {}|
|
88
88
|
add_css_class(html_options, 'form-control')
|
89
89
|
super(attr, html_options)
|
@@ -101,27 +101,6 @@ module DryCrud
|
|
101
101
|
alias_method :float_field, :number_field
|
102
102
|
alias_method :decimal_field, :number_field
|
103
103
|
|
104
|
-
if Rails.version < '4.0'
|
105
|
-
# Render a field to select a date. You might want to customize this.
|
106
|
-
def date_field(attr, html_options = {})
|
107
|
-
html_options[:type] = 'date'
|
108
|
-
text_field(attr, html_options)
|
109
|
-
end
|
110
|
-
|
111
|
-
# Render a field to enter a time. You might want to customize this.
|
112
|
-
def time_field(attr, html_options = {})
|
113
|
-
html_options[:type] = 'time'
|
114
|
-
text_field(attr, html_options)
|
115
|
-
end
|
116
|
-
|
117
|
-
# Render a field to enter a date and time.
|
118
|
-
# You might want to customize this.
|
119
|
-
def datetime_field(attr, html_options = {})
|
120
|
-
html_options[:type] = 'datetime'
|
121
|
-
text_field(attr, html_options)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
104
|
# Render a select element for a :belongs_to association defined by attr.
|
126
105
|
# Use additional html_options for the select element.
|
127
106
|
# To pass a custom element list, specify the list with the :list key or
|
@@ -266,8 +245,8 @@ module DryCrud
|
|
266
245
|
end
|
267
246
|
|
268
247
|
# Overriden to fullfill contract with method_missing 'labeled_' methods.
|
269
|
-
def respond_to?(name)
|
270
|
-
labeled_field_method?(name).present? || super(name)
|
248
|
+
def respond_to?(name, include_private = false)
|
249
|
+
labeled_field_method?(name).present? || super(name, include_private)
|
271
250
|
end
|
272
251
|
|
273
252
|
private
|
@@ -309,12 +288,7 @@ module DryCrud
|
|
309
288
|
# Automatically load the entries for the given association.
|
310
289
|
def load_association_entries(assoc)
|
311
290
|
klass = assoc.klass
|
312
|
-
list =
|
313
|
-
klass.all.merge(assoc.scope)
|
314
|
-
else
|
315
|
-
klass.where(assoc.options[:conditions])
|
316
|
-
.order(assoc.options[:order])
|
317
|
-
end
|
291
|
+
list = klass.all.merge(assoc.scope)
|
318
292
|
# Use special scopes if they are defined
|
319
293
|
if klass.respond_to?(:options_list)
|
320
294
|
list.options_list
|
@@ -15,6 +15,8 @@ module FormatHelper
|
|
15
15
|
when Float, BigDecimal then
|
16
16
|
number_with_precision(value, precision: t('number.format.precision'),
|
17
17
|
delimiter: t('number.format.delimiter'))
|
18
|
+
when Fixnum then
|
19
|
+
number_with_delimiter(value, delimiter: t('number.format.delimiter'))
|
18
20
|
when Date then l(value)
|
19
21
|
when Time then "#{l(value.to_date)} #{l(value, format: :time)}"
|
20
22
|
when true then t('global.yes')
|
@@ -50,9 +50,8 @@ module UtilityHelper
|
|
50
50
|
|
51
51
|
# Returns an ActiveRecord column property for the passed attr or nil
|
52
52
|
def column_property(obj, attr, property)
|
53
|
-
if obj.respond_to?(:column_for_attribute)
|
54
|
-
|
55
|
-
column.try(property)
|
53
|
+
if obj.respond_to?(:column_for_attribute) && obj.has_attribute?(attr)
|
54
|
+
obj.column_for_attribute(attr).send(property)
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -0,0 +1 @@
|
|
1
|
+
json.extract! entry, :id, *default_crud_attrs
|
@@ -1,2 +1,2 @@
|
|
1
1
|
- if flash[level].present?
|
2
|
-
%div{class: "alert alert-#{flash_class(level)}"}= flash[level]
|
2
|
+
%div{class: "alert alert-#{flash_class(level)}"}= flash[level].html_safe
|
data/config/locales/crud.de.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require '
|
2
|
+
require 'rails_helper'
|
3
3
|
|
4
4
|
# Tests all actions of the CrudController based on a dummy model
|
5
5
|
# (CrudTestModel). This is useful to test the general behavior
|
@@ -43,16 +43,16 @@ describe CrudTestModelsController do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe 'setup' do
|
46
|
-
it 'model count
|
47
|
-
CrudTestModel.count.
|
46
|
+
it 'model count is correct' do
|
47
|
+
expect(CrudTestModel.count).to eq(6)
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'has models_label' do
|
51
|
-
controller.models_label.
|
51
|
+
expect(controller.models_label).to eq('Crud Test Models')
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'has models_label singular' do
|
55
|
-
controller.models_label(false).
|
55
|
+
expect(controller.models_label(false)).to eq('Crud Test Model')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -60,16 +60,16 @@ describe CrudTestModelsController do
|
|
60
60
|
context '.html', format: :html do
|
61
61
|
context 'plain', combine: 'ihp' do
|
62
62
|
it 'contains all entries' do
|
63
|
-
entries.size.
|
63
|
+
expect(entries.size).to eq(6)
|
64
64
|
end
|
65
65
|
|
66
|
-
it 'session
|
67
|
-
session[:list_params].
|
66
|
+
it 'session has empty list_params' do
|
67
|
+
expect(session[:list_params]).to eq(Hash.new)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'provides entries helper method' do
|
71
|
-
|
72
|
-
entries.
|
71
|
+
is_expected.to render_template('index')
|
72
|
+
expect(entries).to be(controller.send(:entries))
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -77,28 +77,28 @@ describe CrudTestModelsController do
|
|
77
77
|
let(:params) { { q: search_value } }
|
78
78
|
|
79
79
|
context 'regular', combine: 'ihse' do
|
80
|
-
it 'entries
|
81
|
-
entries.
|
80
|
+
it 'entries only contain test_entry' do
|
81
|
+
expect(entries).to eq([test_entry])
|
82
82
|
end
|
83
83
|
|
84
|
-
it 'session
|
85
|
-
session[:list_params]['/crud_test_models.html']
|
86
|
-
|
84
|
+
it 'session has query list param' do
|
85
|
+
expect(session[:list_params]['/crud_test_models.html'])
|
86
|
+
.to eq('q' => 'AAAA')
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
context 'with custom options', combine: 'ihsec' do
|
91
91
|
let(:params) { { q: 'DDD', filter: true } }
|
92
92
|
|
93
|
-
|
93
|
+
it_is_expected_to_respond
|
94
94
|
|
95
|
-
it 'entries
|
96
|
-
entries.
|
95
|
+
it 'entries have one item' do
|
96
|
+
expect(entries).to eq([CrudTestModel.find_by_name('BBBBB')])
|
97
97
|
end
|
98
98
|
|
99
|
-
it 'session
|
100
|
-
session[:list_params]['/crud_test_models.html']
|
101
|
-
|
99
|
+
it 'session has query list param' do
|
100
|
+
expect(session[:list_params]['/crud_test_models.html'])
|
101
|
+
.to eq('q' => 'DDD')
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
@@ -107,24 +107,24 @@ describe CrudTestModelsController do
|
|
107
107
|
context 'for given column', combine: 'ihsog' do
|
108
108
|
let(:params) { { sort: 'children', sort_dir: 'asc' } }
|
109
109
|
|
110
|
-
|
110
|
+
it_is_expected_to_respond
|
111
111
|
|
112
|
-
it 'entries
|
113
|
-
entries.
|
112
|
+
it 'entries are in correct order' do
|
113
|
+
expect(entries).to eq(CrudTestModel.all.sort_by(&:children))
|
114
114
|
end
|
115
115
|
|
116
|
-
it 'session
|
117
|
-
session[:list_params]['/crud_test_models.html'].
|
118
|
-
|
116
|
+
it 'session has sort list param' do
|
117
|
+
expect(session[:list_params]['/crud_test_models.html']).to eq(
|
118
|
+
'sort' => 'children', 'sort_dir' => 'asc')
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
122
|
context 'for virtual column', combine: 'ihsov' do
|
123
123
|
let(:params) { { sort: 'chatty', sort_dir: 'desc' } }
|
124
124
|
|
125
|
-
|
125
|
+
it_is_expected_to_respond
|
126
126
|
|
127
|
-
it 'entries
|
127
|
+
it 'entries are in correct order' do
|
128
128
|
names = entries.map(&:name)
|
129
129
|
assert names.index('BBBBB') < names.index('AAAAA')
|
130
130
|
assert names.index('BBBBB') < names.index('DDDDD')
|
@@ -134,9 +134,9 @@ describe CrudTestModelsController do
|
|
134
134
|
assert names.index('DDDDD') < names.index('CCCCC')
|
135
135
|
end
|
136
136
|
|
137
|
-
it 'session
|
138
|
-
session[:list_params]['/crud_test_models.html'].
|
139
|
-
|
137
|
+
it 'session has sort list param' do
|
138
|
+
expect(session[:list_params]['/crud_test_models.html']).to eq(
|
139
|
+
'sort' => 'chatty', 'sort_dir' => 'desc')
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
@@ -145,15 +145,15 @@ describe CrudTestModelsController do
|
|
145
145
|
{ q: 'DDD', sort: 'chatty', sort_dir: 'asc' }
|
146
146
|
end
|
147
147
|
|
148
|
-
|
148
|
+
it_is_expected_to_respond
|
149
149
|
|
150
|
-
it 'entries
|
151
|
-
entries.map(&:name).
|
150
|
+
it 'entries are in correct order' do
|
151
|
+
expect(entries.map(&:name)).to eq(%w(CCCCC DDDDD BBBBB))
|
152
152
|
end
|
153
153
|
|
154
|
-
it 'session
|
155
|
-
session[:list_params]['/crud_test_models.html'].
|
156
|
-
|
154
|
+
it 'session has sort list param' do
|
155
|
+
expect(session[:list_params]['/crud_test_models.html']).to eq(
|
156
|
+
'q' => 'DDD', 'sort' => 'chatty', 'sort_dir' => 'asc')
|
157
157
|
end
|
158
158
|
end
|
159
159
|
end
|
@@ -161,12 +161,12 @@ describe CrudTestModelsController do
|
|
161
161
|
context 'with custom options', combine: 'ihsoco' do
|
162
162
|
let(:params) { { filter: true } }
|
163
163
|
|
164
|
-
|
164
|
+
it_is_expected_to_respond
|
165
165
|
|
166
166
|
context 'entries' do
|
167
167
|
subject { entries }
|
168
|
-
it {
|
169
|
-
it {
|
168
|
+
it { expect(subject.size).to eq(2) }
|
169
|
+
it { is_expected.to eq(entries.sort_by(&:children).reverse) }
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
@@ -174,40 +174,40 @@ describe CrudTestModelsController do
|
|
174
174
|
before do
|
175
175
|
session[:list_params] = {}
|
176
176
|
session[:list_params]['/crud_test_models'] =
|
177
|
-
{ q
|
177
|
+
{ 'q' => 'DDD', 'sort' => 'chatty', 'sort_dir' => 'desc' }
|
178
178
|
get :index, returning: true
|
179
179
|
end
|
180
180
|
|
181
|
-
|
181
|
+
it_is_expected_to_respond
|
182
182
|
|
183
|
-
it 'entries
|
184
|
-
entries.map(&:name).
|
183
|
+
it 'entries are in correct order' do
|
184
|
+
expect(entries.map(&:name)).to eq(%w(BBBBB DDDDD CCCCC))
|
185
185
|
end
|
186
186
|
|
187
|
-
it 'params
|
188
|
-
controller.params[:q].
|
189
|
-
controller.params[:sort].
|
190
|
-
controller.params[:sort_dir].
|
187
|
+
it 'params are set' do
|
188
|
+
expect(controller.params[:q]).to eq('DDD')
|
189
|
+
expect(controller.params[:sort]).to eq('chatty')
|
190
|
+
expect(controller.params[:sort_dir]).to eq('desc')
|
191
191
|
end
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
195
195
|
context '.js', format: :js, combine: 'ijs' do
|
196
|
-
|
197
|
-
|
198
|
-
it { response.body.
|
196
|
+
it_is_expected_to_respond
|
197
|
+
it_is_expected_to_assign_entries
|
198
|
+
it { expect(response.body).to eq('index js') }
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
202
|
describe_action :get, :new do
|
203
203
|
context 'plain', combine: 'new' do
|
204
|
-
it '
|
205
|
-
assigns(:companions).
|
204
|
+
it 'assigns companions' do
|
205
|
+
expect(assigns(:companions)).to be_present
|
206
206
|
end
|
207
207
|
|
208
|
-
it '
|
209
|
-
controller.called_callbacks.
|
210
|
-
[:before_render_new, :before_render_form]
|
208
|
+
it 'calls two render callbacks' do
|
209
|
+
expect(controller.called_callbacks).to eq(
|
210
|
+
[:before_render_new, :before_render_form])
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -218,10 +218,10 @@ describe CrudTestModelsController do
|
|
218
218
|
get :new
|
219
219
|
end
|
220
220
|
|
221
|
-
it {
|
221
|
+
it { is_expected.to redirect_to(crud_test_models_path) }
|
222
222
|
|
223
|
-
it '
|
224
|
-
assigns(:companions).
|
223
|
+
it 'does not set companions' do
|
224
|
+
expect(assigns(:companions)).to be_nil
|
225
225
|
end
|
226
226
|
end
|
227
227
|
end
|
@@ -229,54 +229,54 @@ describe CrudTestModelsController do
|
|
229
229
|
describe_action :post, :create do
|
230
230
|
let(:params) { { model_identifier => new_entry_attrs } }
|
231
231
|
|
232
|
-
it '
|
233
|
-
controller.called_callbacks.
|
234
|
-
[:before_create, :before_save, :after_save, :after_create]
|
232
|
+
it 'calls the correct callbacks' do
|
233
|
+
expect(controller.called_callbacks).to eq(
|
234
|
+
[:before_create, :before_save, :after_save, :after_create])
|
235
235
|
end
|
236
236
|
|
237
237
|
context 'with before callback' do
|
238
238
|
let(:params) do
|
239
239
|
{ crud_test_model: { name: 'illegal', children: 2 } }
|
240
240
|
end
|
241
|
-
it '
|
241
|
+
it 'does not create entry', perform_request: false do
|
242
242
|
expect { perform_request }.to change { CrudTestModel.count }.by(0)
|
243
243
|
end
|
244
244
|
|
245
245
|
context 'plain', combine: 'chcp' do
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
246
|
+
it_is_expected_to_respond
|
247
|
+
it_is_expected_to_render('new')
|
248
|
+
it_is_expected_to_persist_entry(false)
|
249
|
+
it_is_expected_to_have_flash(:alert)
|
250
250
|
|
251
|
-
it '
|
252
|
-
entry.name.
|
251
|
+
it 'sets entry name' do
|
252
|
+
expect(entry.name).to eq('illegal')
|
253
253
|
end
|
254
254
|
|
255
|
-
it '
|
256
|
-
assigns(:companions).
|
255
|
+
it 'assigns companions' do
|
256
|
+
expect(assigns(:companions)).to be_present
|
257
257
|
end
|
258
258
|
|
259
|
-
it '
|
260
|
-
controller.called_callbacks.
|
261
|
-
[:before_render_new, :before_render_form]
|
259
|
+
it 'calls the correct callbacks' do
|
260
|
+
expect(controller.called_callbacks).to eq(
|
261
|
+
[:before_render_new, :before_render_form])
|
262
262
|
end
|
263
263
|
end
|
264
264
|
|
265
265
|
context 'redirect', perform_request: false do
|
266
266
|
before { controller.should_redirect = true }
|
267
267
|
|
268
|
-
it '
|
268
|
+
it 'does not create entry' do
|
269
269
|
expect { perform_request }.to change { CrudTestModel.count }.by(0)
|
270
270
|
end
|
271
271
|
|
272
272
|
it do
|
273
273
|
perform_request
|
274
|
-
|
274
|
+
is_expected.to redirect_to(crud_test_models_path)
|
275
275
|
end
|
276
276
|
|
277
|
-
it '
|
277
|
+
it 'calls no callbacks' do
|
278
278
|
perform_request
|
279
|
-
controller.called_callbacks.
|
279
|
+
expect(controller.called_callbacks).to be_nil
|
280
280
|
end
|
281
281
|
end
|
282
282
|
end
|
@@ -285,48 +285,48 @@ describe CrudTestModelsController do
|
|
285
285
|
let(:params) { { crud_test_model: { children: 2 } } }
|
286
286
|
|
287
287
|
context '.html' do
|
288
|
-
it '
|
288
|
+
it 'does not create entry', perform_request: false do
|
289
289
|
expect { perform_request }.to change { CrudTestModel.count }.by(0)
|
290
290
|
end
|
291
291
|
|
292
292
|
context 'plain', combine: 'chip' do
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
it '
|
300
|
-
assigns(:companions).
|
293
|
+
it_is_expected_to_respond
|
294
|
+
it_is_expected_to_render('new')
|
295
|
+
it_is_expected_to_persist_entry(false)
|
296
|
+
it_is_expected_to_not_have_flash(:notice)
|
297
|
+
it_is_expected_to_not_have_flash(:alert)
|
298
|
+
|
299
|
+
it 'assigns companions' do
|
300
|
+
expect(assigns(:companions)).to be_present
|
301
301
|
end
|
302
302
|
|
303
|
-
it '
|
304
|
-
controller.called_callbacks.
|
303
|
+
it 'calls the correct callbacks' do
|
304
|
+
expect(controller.called_callbacks).to eq(
|
305
305
|
[:before_create, :before_save,
|
306
|
-
:before_render_new, :before_render_form]
|
306
|
+
:before_render_new, :before_render_form])
|
307
307
|
end
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
311
|
context '.json', format: :json do
|
312
|
-
it '
|
312
|
+
it 'does not create entry', perform_request: false do
|
313
313
|
expect { perform_request }.to change { CrudTestModel.count }.by(0)
|
314
314
|
end
|
315
315
|
|
316
316
|
context 'plain', combine: 'cjcb' do
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
it '
|
324
|
-
assigns(:companions).
|
317
|
+
it_is_expected_to_respond(422)
|
318
|
+
it_is_expected_to_persist_entry(false)
|
319
|
+
it_is_expected_to_not_have_flash(:notice)
|
320
|
+
it_is_expected_to_not_have_flash(:alert)
|
321
|
+
it_is_expected_to_render_json
|
322
|
+
|
323
|
+
it 'does not assign companions' do
|
324
|
+
expect(assigns(:companions)).to be_nil
|
325
325
|
end
|
326
326
|
|
327
|
-
it '
|
328
|
-
controller.called_callbacks.
|
329
|
-
[:before_create, :before_save]
|
327
|
+
it 'calls the correct callbacks' do
|
328
|
+
expect(controller.called_callbacks).to eq(
|
329
|
+
[:before_create, :before_save])
|
330
330
|
end
|
331
331
|
end
|
332
332
|
end
|
@@ -335,50 +335,51 @@ describe CrudTestModelsController do
|
|
335
335
|
end
|
336
336
|
|
337
337
|
describe_action :get, :edit, id: true do
|
338
|
-
it '
|
339
|
-
controller.called_callbacks.
|
340
|
-
[:before_render_edit, :before_render_form]
|
338
|
+
it 'calls the correct callbacks' do
|
339
|
+
expect(controller.called_callbacks).to eq(
|
340
|
+
[:before_render_edit, :before_render_form])
|
341
341
|
end
|
342
342
|
end
|
343
343
|
|
344
344
|
describe_action :put, :update, id: true do
|
345
345
|
let(:params) { { model_identifier => edit_entry_attrs } }
|
346
346
|
|
347
|
-
it '
|
348
|
-
controller.called_callbacks.
|
349
|
-
[:before_update, :before_save, :after_save, :after_update]
|
347
|
+
it 'calls the correct callbacks' do
|
348
|
+
expect(controller.called_callbacks).to eq(
|
349
|
+
[:before_update, :before_save, :after_save, :after_update])
|
350
350
|
end
|
351
351
|
|
352
352
|
context 'with invalid params' do
|
353
353
|
let(:params) { { crud_test_model: { rating: 20 } } }
|
354
354
|
|
355
355
|
context '.html', combine: 'uhivp' do
|
356
|
-
|
357
|
-
|
358
|
-
|
356
|
+
it_is_expected_to_respond
|
357
|
+
it_is_expected_to_render('edit')
|
358
|
+
it_is_expected_to_not_have_flash(:notice)
|
359
359
|
|
360
|
-
it '
|
361
|
-
entry.
|
360
|
+
it 'changes entry' do
|
361
|
+
expect(entry).to be_changed
|
362
362
|
end
|
363
363
|
|
364
|
-
it '
|
365
|
-
entry.rating.
|
364
|
+
it 'sets entry rating' do
|
365
|
+
expect(entry.rating).to eq(20)
|
366
366
|
end
|
367
367
|
|
368
|
-
it '
|
369
|
-
controller.called_callbacks.
|
368
|
+
it 'calls the correct callbacks' do
|
369
|
+
expect(controller.called_callbacks).to eq(
|
370
370
|
[:before_update, :before_save,
|
371
|
-
:before_render_edit, :before_render_form]
|
371
|
+
:before_render_edit, :before_render_form])
|
372
372
|
end
|
373
373
|
end
|
374
374
|
|
375
375
|
context '.json', format: :json, combine: 'ujivp' do
|
376
|
-
|
377
|
-
|
378
|
-
|
376
|
+
it_is_expected_to_respond(422)
|
377
|
+
it_is_expected_to_not_have_flash(:notice)
|
378
|
+
it_is_expected_to_render_json
|
379
379
|
|
380
|
-
it '
|
381
|
-
controller.called_callbacks.
|
380
|
+
it 'calls the correct callbacks' do
|
381
|
+
expect(controller.called_callbacks).to eq(
|
382
|
+
[:before_update, :before_save])
|
382
383
|
end
|
383
384
|
end
|
384
385
|
end
|
@@ -386,33 +387,34 @@ describe CrudTestModelsController do
|
|
386
387
|
end
|
387
388
|
|
388
389
|
describe_action :delete, :destroy, id: true do
|
389
|
-
it '
|
390
|
-
controller.called_callbacks.
|
390
|
+
it 'calls the correct callbacks' do
|
391
|
+
expect(controller.called_callbacks).to eq(
|
392
|
+
[:before_destroy, :after_destroy])
|
391
393
|
end
|
392
394
|
|
393
395
|
context 'with failure' do
|
394
396
|
let(:test_entry) { crud_test_models(:BBBBB) }
|
395
397
|
context '.html' do
|
396
|
-
it '
|
398
|
+
it 'does not delete entry from database',
|
397
399
|
perform_request: false do
|
398
400
|
expect { perform_request }.not_to change { CrudTestModel.count }
|
399
401
|
end
|
400
402
|
|
401
|
-
it '
|
403
|
+
it 'redirects to referer',
|
402
404
|
perform_request: false do
|
403
405
|
ref = @request.env['HTTP_REFERER'] = crud_test_model_url(test_entry)
|
404
406
|
perform_request
|
405
|
-
|
407
|
+
is_expected.to redirect_to(ref)
|
406
408
|
end
|
407
409
|
|
408
|
-
|
409
|
-
|
410
|
+
it_is_expected_to_have_flash(:alert, /companion/)
|
411
|
+
it_is_expected_to_not_have_flash(:notice)
|
410
412
|
end
|
411
413
|
|
412
414
|
context '.json', format: :json, combine: 'djf' do
|
413
|
-
|
414
|
-
|
415
|
-
|
415
|
+
it_is_expected_to_respond(422)
|
416
|
+
it_is_expected_to_not_have_flash(:notice)
|
417
|
+
it_is_expected_to_render_json
|
416
418
|
end
|
417
419
|
|
418
420
|
context 'callback', perform_request: false do
|
@@ -420,18 +422,18 @@ describe CrudTestModelsController do
|
|
420
422
|
test_entry.update_attribute :name, 'illegal'
|
421
423
|
end
|
422
424
|
|
423
|
-
it '
|
425
|
+
it 'does not delete entry from database' do
|
424
426
|
expect { perform_request }.not_to change { CrudTestModel.count }
|
425
427
|
end
|
426
428
|
|
427
|
-
it '
|
429
|
+
it 'redirects to index' do
|
428
430
|
perform_request
|
429
|
-
|
431
|
+
is_expected.to redirect_to(crud_test_models_path(returning: true))
|
430
432
|
end
|
431
433
|
|
432
|
-
it '
|
434
|
+
it 'has flash alert' do
|
433
435
|
perform_request
|
434
|
-
flash[:alert].
|
436
|
+
expect(flash[:alert]).to match(/illegal name/)
|
435
437
|
end
|
436
438
|
end
|
437
439
|
end
|