jsonapi_compliable 0.11.34 → 1.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -1
- data/.travis.yml +1 -2
- data/Rakefile +7 -3
- data/jsonapi_compliable.gemspec +7 -3
- data/lib/generators/jsonapi/resource_generator.rb +8 -79
- data/lib/generators/jsonapi/templates/application_resource.rb.erb +2 -1
- data/lib/generators/jsonapi/templates/controller.rb.erb +19 -64
- data/lib/generators/jsonapi/templates/resource.rb.erb +5 -47
- data/lib/generators/jsonapi/templates/resource_reads_spec.rb.erb +62 -0
- data/lib/generators/jsonapi/templates/resource_writes_spec.rb.erb +63 -0
- data/lib/jsonapi_compliable.rb +87 -18
- data/lib/jsonapi_compliable/adapters/abstract.rb +202 -45
- data/lib/jsonapi_compliable/adapters/active_record.rb +6 -130
- data/lib/jsonapi_compliable/adapters/active_record/base.rb +247 -0
- data/lib/jsonapi_compliable/adapters/active_record/belongs_to_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/has_many_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/has_one_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/inferrence.rb +12 -0
- data/lib/jsonapi_compliable/adapters/active_record/many_to_many_sideload.rb +30 -0
- data/lib/jsonapi_compliable/adapters/null.rb +177 -6
- data/lib/jsonapi_compliable/base.rb +33 -320
- data/lib/jsonapi_compliable/context.rb +16 -0
- data/lib/jsonapi_compliable/deserializer.rb +14 -39
- data/lib/jsonapi_compliable/errors.rb +227 -24
- data/lib/jsonapi_compliable/extensions/extra_attribute.rb +3 -1
- data/lib/jsonapi_compliable/filter_operators.rb +25 -0
- data/lib/jsonapi_compliable/hash_renderer.rb +57 -0
- data/lib/jsonapi_compliable/query.rb +190 -202
- data/lib/jsonapi_compliable/rails.rb +12 -6
- data/lib/jsonapi_compliable/railtie.rb +64 -0
- data/lib/jsonapi_compliable/renderer.rb +60 -0
- data/lib/jsonapi_compliable/resource.rb +35 -663
- data/lib/jsonapi_compliable/resource/configuration.rb +239 -0
- data/lib/jsonapi_compliable/resource/dsl.rb +138 -0
- data/lib/jsonapi_compliable/resource/interface.rb +32 -0
- data/lib/jsonapi_compliable/resource/polymorphism.rb +68 -0
- data/lib/jsonapi_compliable/resource/sideloading.rb +102 -0
- data/lib/jsonapi_compliable/resource_proxy.rb +127 -0
- data/lib/jsonapi_compliable/responders.rb +19 -0
- data/lib/jsonapi_compliable/runner.rb +25 -0
- data/lib/jsonapi_compliable/scope.rb +37 -79
- data/lib/jsonapi_compliable/scoping/extra_attributes.rb +29 -0
- data/lib/jsonapi_compliable/scoping/filter.rb +39 -58
- data/lib/jsonapi_compliable/scoping/filterable.rb +9 -14
- data/lib/jsonapi_compliable/scoping/paginate.rb +9 -3
- data/lib/jsonapi_compliable/scoping/sort.rb +16 -4
- data/lib/jsonapi_compliable/sideload.rb +221 -347
- data/lib/jsonapi_compliable/sideload/belongs_to.rb +34 -0
- data/lib/jsonapi_compliable/sideload/has_many.rb +16 -0
- data/lib/jsonapi_compliable/sideload/has_one.rb +9 -0
- data/lib/jsonapi_compliable/sideload/many_to_many.rb +24 -0
- data/lib/jsonapi_compliable/sideload/polymorphic_belongs_to.rb +108 -0
- data/lib/jsonapi_compliable/stats/payload.rb +4 -8
- data/lib/jsonapi_compliable/types.rb +172 -0
- data/lib/jsonapi_compliable/util/attribute_check.rb +88 -0
- data/lib/jsonapi_compliable/util/persistence.rb +29 -7
- data/lib/jsonapi_compliable/util/relationship_payload.rb +4 -4
- data/lib/jsonapi_compliable/util/render_options.rb +4 -32
- data/lib/jsonapi_compliable/util/serializer_attributes.rb +98 -0
- data/lib/jsonapi_compliable/util/validation_response.rb +15 -9
- data/lib/jsonapi_compliable/version.rb +1 -1
- metadata +105 -24
- data/lib/generators/jsonapi/field_generator.rb +0 -0
- data/lib/generators/jsonapi/templates/create_request_spec.rb.erb +0 -29
- data/lib/generators/jsonapi/templates/destroy_request_spec.rb.erb +0 -20
- data/lib/generators/jsonapi/templates/index_request_spec.rb.erb +0 -22
- data/lib/generators/jsonapi/templates/payload.rb.erb +0 -39
- data/lib/generators/jsonapi/templates/serializer.rb.erb +0 -25
- data/lib/generators/jsonapi/templates/show_request_spec.rb.erb +0 -19
- data/lib/generators/jsonapi/templates/update_request_spec.rb.erb +0 -33
- data/lib/jsonapi_compliable/adapters/active_record_sideloading.rb +0 -152
- data/lib/jsonapi_compliable/scoping/extra_fields.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b893a4986018fbc20f3accdf20fe6b3ad84b6574
|
4
|
+
data.tar.gz: 7dc27ab003bde762c655255dec3f4800f88c144d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbf873e797bdd2ff35e4ae5ceed8f8c42f03829c89992cca7a62468210e0f677584d4b0080da6a99e585e47c650d9ffe5386079959117753d96bf51c84e13bb7
|
7
|
+
data.tar.gz: dd59e9bb8e8d5c58d8308300647aeefd6c6bb3356fd37b7ddccff3fb98eddc700fc2b92932aede85d8a73f001cc59aa9255186d465ab664c0f28ef7b159039f1
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.3.0
|
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -2,10 +2,14 @@ require "bundler/gem_tasks"
|
|
2
2
|
require "rspec/core/rake_task"
|
3
3
|
require "appraisal"
|
4
4
|
|
5
|
-
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
6
|
+
if ENV["APPRAISAL_INITIALIZED"]
|
7
|
+
t.pattern = 'spec/integration/rails'
|
8
|
+
end
|
9
|
+
end
|
6
10
|
|
7
11
|
if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
|
8
|
-
task :default => :appraisal
|
12
|
+
task :default => [:spec, :appraisal]
|
9
13
|
else
|
10
|
-
task :default => :spec
|
14
|
+
task :default => [:spec]
|
11
15
|
end
|
data/jsonapi_compliable.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'jsonapi_compliable/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "jsonapi_compliable"
|
8
8
|
spec.version = JsonapiCompliable::VERSION
|
9
|
-
spec.authors = ["Lee Richmond"
|
10
|
-
spec.email = ["richmolj@gmail.com"
|
9
|
+
spec.authors = ["Lee Richmond"]
|
10
|
+
spec.email = ["richmolj@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{Easily build jsonapi.org-compatible APIs}
|
13
13
|
spec.license = "MIT"
|
@@ -19,11 +19,15 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
# Pinning this version until backwards-incompatibility is addressed
|
21
21
|
spec.add_dependency 'jsonapi-serializable', '~> 0.3.0'
|
22
|
+
spec.add_dependency 'dry-types', '~> 0.13'
|
23
|
+
spec.add_dependency 'jsonapi_errorable', '~> 0.9'
|
22
24
|
|
23
25
|
spec.add_development_dependency "activerecord", ['>= 4.1', '< 6']
|
24
26
|
spec.add_development_dependency "kaminari", '~> 0.17'
|
25
|
-
spec.add_development_dependency "bundler", "~>
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
26
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
29
|
spec.add_development_dependency "sqlite3"
|
28
30
|
spec.add_development_dependency "database_cleaner"
|
31
|
+
spec.add_development_dependency "activemodel", ['>= 4.1', '< 6']
|
32
|
+
spec.add_development_dependency "jsonapi_spec_helpers", '>= 1.0.alpha.1'
|
29
33
|
end
|
@@ -22,18 +22,10 @@ module Jsonapi
|
|
22
22
|
end
|
23
23
|
|
24
24
|
generate_controller
|
25
|
-
generate_serializer
|
26
25
|
generate_application_resource unless application_resource_defined?
|
27
|
-
generate_spec_payload
|
28
|
-
|
29
|
-
if actions?('create', 'update')
|
30
|
-
generate_strong_resource
|
31
|
-
end
|
32
|
-
|
33
26
|
generate_route
|
34
27
|
generate_tests
|
35
28
|
generate_resource
|
36
|
-
generate_swagger if docs_controller?
|
37
29
|
end
|
38
30
|
|
39
31
|
private
|
@@ -55,11 +47,6 @@ module Jsonapi
|
|
55
47
|
template('controller.rb.erb', to)
|
56
48
|
end
|
57
49
|
|
58
|
-
def generate_serializer
|
59
|
-
to = File.join('app/serializers', class_path, "serializable_#{file_name}.rb")
|
60
|
-
template('serializer.rb.erb', to)
|
61
|
-
end
|
62
|
-
|
63
50
|
def generate_application_resource
|
64
51
|
to = File.join('app/resources', class_path, "application_resource.rb")
|
65
52
|
template('application_resource.rb.erb', to)
|
@@ -69,39 +56,6 @@ module Jsonapi
|
|
69
56
|
'ApplicationResource'.safe_constantize.present?
|
70
57
|
end
|
71
58
|
|
72
|
-
def docs_controller?
|
73
|
-
File.exists?('app/controllers/docs_controller.rb')
|
74
|
-
end
|
75
|
-
|
76
|
-
def generate_swagger
|
77
|
-
code = " jsonapi_resource '/v1/#{type}'"
|
78
|
-
code << ", only: [#{actions.map { |a| ":#{a}" }.join(', ')}]" if actions.length < 5
|
79
|
-
code << "\n"
|
80
|
-
inject_into_file 'app/controllers/docs_controller.rb', before: /^end/ do
|
81
|
-
code
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def generate_spec_payload
|
86
|
-
to = File.join('spec/payloads', class_path, "#{file_name}.rb")
|
87
|
-
template('payload.rb.erb', to)
|
88
|
-
end
|
89
|
-
|
90
|
-
def generate_strong_resource
|
91
|
-
code = " strong_resource :#{file_name} do\n"
|
92
|
-
attributes.each do |a|
|
93
|
-
type = a.type
|
94
|
-
type = :string if type == :text
|
95
|
-
type = :number if [:float, :decimal].include?(type)
|
96
|
-
code << " attribute :#{a.name}, :#{type}\n"
|
97
|
-
end
|
98
|
-
code << " end\n"
|
99
|
-
|
100
|
-
inject_into_file 'config/initializers/strong_resources.rb', after: "StrongResources.configure do\n" do
|
101
|
-
code
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
59
|
def generate_route
|
106
60
|
code = " resources :#{type}"
|
107
61
|
code << ", only: [#{actions.map { |a| ":#{a}" }.join(', ')}]" if actions.length < 5
|
@@ -112,40 +66,11 @@ module Jsonapi
|
|
112
66
|
end
|
113
67
|
|
114
68
|
def generate_tests
|
115
|
-
|
116
|
-
|
117
|
-
class_path,
|
118
|
-
"index_spec.rb"
|
119
|
-
template('index_request_spec.rb.erb', to)
|
120
|
-
end
|
121
|
-
|
122
|
-
if actions?('show')
|
123
|
-
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
124
|
-
class_path,
|
125
|
-
"show_spec.rb"
|
126
|
-
template('show_request_spec.rb.erb', to)
|
127
|
-
end
|
69
|
+
to = File.join("spec/resources/#{file_name}", class_path, "reads_spec.rb")
|
70
|
+
template('resource_reads_spec.rb.erb', to)
|
128
71
|
|
129
|
-
|
130
|
-
|
131
|
-
class_path,
|
132
|
-
"create_spec.rb"
|
133
|
-
template('create_request_spec.rb.erb', to)
|
134
|
-
end
|
135
|
-
|
136
|
-
if actions?('update')
|
137
|
-
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
138
|
-
class_path,
|
139
|
-
"update_spec.rb"
|
140
|
-
template('update_request_spec.rb.erb', to)
|
141
|
-
end
|
142
|
-
|
143
|
-
if actions?('destroy')
|
144
|
-
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
145
|
-
class_path,
|
146
|
-
"destroy_spec.rb"
|
147
|
-
template('destroy_request_spec.rb.erb', to)
|
148
|
-
end
|
72
|
+
to = File.join("spec/resources/#{file_name}", class_path, "writes_spec.rb")
|
73
|
+
template('resource_writes_spec.rb.erb', to)
|
149
74
|
end
|
150
75
|
|
151
76
|
def generate_resource
|
@@ -191,6 +116,10 @@ module Jsonapi
|
|
191
116
|
class_name.safe_constantize
|
192
117
|
end
|
193
118
|
|
119
|
+
def resource_klass
|
120
|
+
"#{model_klass}Resource"
|
121
|
+
end
|
122
|
+
|
194
123
|
def type
|
195
124
|
model_klass.name.underscore.pluralize
|
196
125
|
end
|
@@ -10,5 +10,6 @@ class ApplicationResource < JsonapiCompliable::Resource
|
|
10
10
|
# Subclasses can still override this default.
|
11
11
|
# More on adapters: https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html
|
12
12
|
<%- end -%>
|
13
|
-
|
13
|
+
self.abstract_class = true
|
14
|
+
self.adapter = JsonapiCompliable::Adapters::ActiveRecord::Base.new
|
14
15
|
end
|
@@ -1,96 +1,51 @@
|
|
1
1
|
<% module_namespacing do -%>
|
2
2
|
class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
3
|
-
<%- unless omit_comments? -%>
|
4
|
-
# Mark this as a JSONAPI controller, associating with the given resource
|
5
|
-
<%- end -%>
|
6
|
-
jsonapi resource: <%= model_klass %>Resource
|
7
|
-
|
8
|
-
<%- if actions?('create', 'update') -%>
|
9
|
-
<%- unless omit_comments? -%>
|
10
|
-
# Reference a strong resource payload defined in
|
11
|
-
# config/initializers/strong_resources.rb
|
12
|
-
<%- end -%>
|
13
|
-
strong_resource :<%= file_name %>
|
14
|
-
<%- end -%>
|
15
|
-
<%- if actions?('create', 'update') -%>
|
16
|
-
<%- unless omit_comments? -%>
|
17
|
-
# Run strong parameter validation for these actions.
|
18
|
-
# Invalid keys will be dropped.
|
19
|
-
# Invalid value types will log or raise based on the configuration
|
20
|
-
# ActionController::Parameters.action_on_invalid_parameters
|
21
|
-
<%- end -%>
|
22
|
-
before_action :apply_strong_params, only: [:create, :update]
|
23
|
-
|
24
|
-
<%- end -%>
|
25
3
|
<%- if actions?('index') -%>
|
26
|
-
<%- unless omit_comments? -%>
|
27
|
-
# Start with a base scope and pass to render_jsonapi
|
28
|
-
<%- end -%>
|
29
4
|
def index
|
30
|
-
<%= file_name.pluralize %> = <%=
|
31
|
-
|
5
|
+
<%= file_name.pluralize %> = <%= resource_klass %>.all(params)
|
6
|
+
respond_with(<%= file_name.pluralize %>)
|
32
7
|
end
|
33
|
-
|
34
8
|
<%- end -%>
|
35
9
|
<%- if actions?('show') -%>
|
36
|
-
|
37
|
-
# Call jsonapi_scope directly here so we can get behavior like
|
38
|
-
# sparse fieldsets and statistics.
|
39
|
-
<%- end -%>
|
10
|
+
|
40
11
|
def show
|
41
|
-
|
42
|
-
|
43
|
-
raise JsonapiCompliable::Errors::RecordNotFound unless instance
|
44
|
-
render_jsonapi(instance, scope: false)
|
12
|
+
<%= file_name %> = <%= resource_klass %>.find(params)
|
13
|
+
respond_with(<%= file_name.pluralize %>)
|
45
14
|
end
|
46
|
-
|
47
15
|
<%- end -%>
|
48
16
|
<%- if actions?('create') -%>
|
49
|
-
|
50
|
-
# jsonapi_create will use the configured Resource (and adapter) to persist.
|
51
|
-
# This will handle nested relationships as well.
|
52
|
-
# On validation errors, render correct error JSON.
|
53
|
-
<%- end -%>
|
17
|
+
|
54
18
|
def create
|
55
|
-
<%= file_name
|
19
|
+
<%= file_name %> = <%= resource_klass %>.build(params)
|
56
20
|
|
57
|
-
if
|
58
|
-
|
21
|
+
if <%= file_name %>.save
|
22
|
+
respond_with(<%= file_name %>)
|
59
23
|
else
|
60
|
-
|
24
|
+
render jsonapi_errors: <%= file_name %>
|
61
25
|
end
|
62
26
|
end
|
63
|
-
|
64
27
|
<%- end -%>
|
65
28
|
<%- if actions?('update') -%>
|
66
|
-
|
67
|
-
# jsonapi_update will use the configured Resource (and adapter) to persist.
|
68
|
-
# This will handle nested relationships as well.
|
69
|
-
# On validation errors, render correct error JSON.
|
70
|
-
<%- end -%>
|
29
|
+
|
71
30
|
def update
|
72
|
-
<%= file_name
|
31
|
+
<%= file_name %> = <%= resource_klass %>.find(params)
|
73
32
|
|
74
|
-
if
|
75
|
-
|
33
|
+
if <%= file_name %>.update_attributes
|
34
|
+
respond_with(<%= file_name %>)
|
76
35
|
else
|
77
|
-
|
36
|
+
render jsonapi_errors: <%= file_name %>
|
78
37
|
end
|
79
38
|
end
|
80
|
-
|
81
39
|
<%- end -%>
|
82
40
|
<%- if actions?('destroy') -%>
|
83
|
-
|
84
|
-
# Renders 200 OK with empty meta
|
85
|
-
# http://jsonapi.org/format/#crud-deleting-responses-200
|
86
|
-
<%- end -%>
|
41
|
+
|
87
42
|
def destroy
|
88
|
-
<%= file_name
|
43
|
+
<%= file_name %> = <%= resource_klass %>.find(params)
|
89
44
|
|
90
|
-
if
|
45
|
+
if <%= file_name %>.destroy
|
91
46
|
render json: { meta: {} }
|
92
47
|
else
|
93
|
-
|
48
|
+
render jsonapi_errors: <%= file_name %>
|
94
49
|
end
|
95
50
|
end
|
96
51
|
<%- end -%>
|
@@ -1,53 +1,11 @@
|
|
1
|
-
<%- unless omit_comments? -%>
|
2
|
-
# Define how to query and persist a given model.
|
3
|
-
# Further Resource documentation: https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html
|
4
|
-
<%- end -%>
|
5
1
|
<% module_namespacing do -%>
|
6
2
|
class <%= class_name %>Resource < ApplicationResource
|
7
|
-
<%-
|
8
|
-
|
9
|
-
|
3
|
+
<%- attributes.each do |a| -%>
|
4
|
+
<%- if [:created_at, :updated_at].include?(a.name.to_sym) -%>
|
5
|
+
attribute :<%= a.name %>, :<%= a.type %>, writable: false
|
6
|
+
<%- else -%>
|
7
|
+
attribute :<%= a.name %>, :<%= a.type %>
|
10
8
|
<%- end -%>
|
11
|
-
type :<%= type %>
|
12
|
-
<%- unless omit_comments? -%>
|
13
|
-
# Associate to a Model object so we know how to persist.
|
14
|
-
<%- end -%>
|
15
|
-
model <%= model_klass %>
|
16
|
-
<%- unless omit_comments? -%>
|
17
|
-
# Customize your resource here. Some common examples:
|
18
|
-
#
|
19
|
-
# === Allow ?filter[name] query parameter ===
|
20
|
-
# allow_filter :name
|
21
|
-
#
|
22
|
-
# === Enable total count, when requested ===
|
23
|
-
# allow_stat total: [:count]
|
24
|
-
#
|
25
|
-
# === Allow sideloading/sideposting of relationships ===
|
26
|
-
# belongs_to :foo,
|
27
|
-
# foreign_key: :foo_id,
|
28
|
-
# resource: FooResource,
|
29
|
-
# scope: -> { Foo.all }
|
30
|
-
#
|
31
|
-
# === Custom sorting logic ===
|
32
|
-
# sort do |scope, att, dir|
|
33
|
-
# ... code ...
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# === Change default sort ===
|
37
|
-
# default_sort([{ title: :asc }])
|
38
|
-
#
|
39
|
-
# === Custom pagination logic ===
|
40
|
-
# paginate do |scope, current_page, per_page|
|
41
|
-
# ... code ...
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# === Change default page size ===
|
45
|
-
# default_page_size(10)
|
46
|
-
#
|
47
|
-
# === Change how we resolve the scope ===
|
48
|
-
# def resolve(scope)
|
49
|
-
# ... code ...
|
50
|
-
# end
|
51
9
|
<%- end -%>
|
52
10
|
end
|
53
11
|
<% end -%>
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe <%= resource_klass %>, type: :resource do
|
4
|
+
describe 'serialization' do
|
5
|
+
let!(:<%= file_name %>) { create(:<%= file_name %>) }
|
6
|
+
|
7
|
+
it 'works' do
|
8
|
+
render
|
9
|
+
data = jsonapi_data[0]
|
10
|
+
expect(data.id).to eq(<%= file_name %>.id)
|
11
|
+
expect(data.jsonapi_type).to eq('<%= file_name.pluralize %>')
|
12
|
+
<%- attributes.each do |a| -%>
|
13
|
+
<%- if [:created_at, :updated_at].include?(a.name.to_sym) -%>
|
14
|
+
expect(data.<%= a.name %>).to eq(datetime(<%= file_name %>.<%= a.name %>))
|
15
|
+
<%- else -%>
|
16
|
+
expect(data.<%= a.name %>).to eq(<%= file_name %>.<%= a.name %>)
|
17
|
+
<%- end -%>
|
18
|
+
<%- end -%>
|
19
|
+
end
|
20
|
+
end
|
21
|
+
<%- if actions?('index') -%>
|
22
|
+
|
23
|
+
describe 'filtering' do
|
24
|
+
let!(:<%= file_name %>1) { create(:<%= file_name %>) }
|
25
|
+
let!(:<%= file_name %>2) { create(:<%= file_name %>) }
|
26
|
+
|
27
|
+
context 'by id' do
|
28
|
+
before do
|
29
|
+
params[:filter] = { id: { eq: <%= file_name %>2.id } }
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'works' do
|
33
|
+
render
|
34
|
+
expect(d.map(&:id)).to eq([<%= file_name %>2.id])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'sorting' do
|
40
|
+
context 'by id descending' do
|
41
|
+
let!(:<%= file_name %>1) { create(:<%= file_name %>) }
|
42
|
+
let!(:<%= file_name %>2) { create(:<%= file_name %>) }
|
43
|
+
|
44
|
+
before do
|
45
|
+
params[:sort] = '-id'
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'works' do
|
49
|
+
render
|
50
|
+
expect(d.map(&:id)).to eq([
|
51
|
+
<%= file_name %>2.id,
|
52
|
+
<%= file_name %>1.id
|
53
|
+
])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
<%- end -%>
|
58
|
+
|
59
|
+
describe 'sideloading' do
|
60
|
+
# ... your tests ...
|
61
|
+
end
|
62
|
+
end
|