json_api_toolbox 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7b62d7d56b4b556bfe364354f26ee11265e758e
4
- data.tar.gz: fd81a963afed0fd32034df88766dbc891d6e50e1
3
+ metadata.gz: 4044c6acd33567f9a618c59e603d30881e90806f
4
+ data.tar.gz: adf91b78f4c5fcf19f91653ecefd268f278d8d8d
5
5
  SHA512:
6
- metadata.gz: 5b449e51f50142b8b45d95cc17685a044cb99a82b1c619003a6aaab855ab8396badd5aa9fc40dc24a5e0ef51d65b2db6780e9f6c02d95c1a29cb23da3330536a
7
- data.tar.gz: 5ab43e8eb47ec7355c6f5ab42babc4124fa779024b1063d59d76a6ec9d0f206a1e795d0b2a92296f14083fed8614a3543d3a46f985bcade11b0275938f2f22c9
6
+ metadata.gz: b4f3e7ed1bb9b974bdc6489371b7e9a0a7b643a20d7db0e01d2ee0949f6ef36405c67c542ec034cb835360134cea67b73368cae54115f9ad2b7988c57b5ec4ab
7
+ data.tar.gz: 55d6c9ed248b0b8c57c1cefdb89e517a75c1d63275b55adcd1c3d2cfe1b84445f57baa2e7049e6b8824595f882685e526df8e109b744b922157a1acce58bb509
data/README.md CHANGED
@@ -33,3 +33,116 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
33
33
  ## Contributing
34
34
 
35
35
  Bug reports and pull requests are welcome on GitHub at https://github.com/abacha/json_api_toolbox.
36
+
37
+ ## Examples
38
+
39
+ ##ShareExamplesForControllers
40
+
41
+ it_behaves_like 'a http method'
42
+ validate if your response have http status 200
43
+
44
+ it_behaves_like 'a get method'
45
+ validate if your response have http status 200
46
+ validate if your response responde to body method
47
+
48
+ it_behaves_like 'a json api response with included node'
49
+ validate if yor response.body has included node
50
+
51
+ it_behaves_like 'a get with jsonapi with default value of', SomeModel
52
+ validate if all attributes are present on your data
53
+ obs:
54
+ 1 - for enums who have '_cd' in the end of attribute name, '_cd' is removed.
55
+ ex: enum_cd => enum
56
+ 2 - id attributes are removed from validation
57
+ 3 - for attributes who have _id in the end of attribute name, they are
58
+ removed from validation
59
+
60
+ it_behaves_like 'a json api response with all relations of', SomeModel
61
+ validate if all relations are included on your data
62
+
63
+ ## Example Tests
64
+
65
+
66
+ ```ruby
67
+ # frozen_string_literal: true
68
+
69
+ require 'rails_helper'
70
+
71
+ RSpec.describe ManagersController, type: :controller do
72
+ let(:body) { JSON.parse(response.body) }
73
+ let(:data) { body['data'] }
74
+
75
+ describe 'GET' do
76
+ let!(:manager) { create(:manager) }
77
+ let(:params) { {} }
78
+
79
+ describe '#index' do
80
+ let(:data) { body['data'].first }
81
+
82
+ before { get :index, params: params }
83
+
84
+ it_behaves_like 'a get method'
85
+ it_behaves_like 'a json api response with all relations of', Manager
86
+ it_behaves_like 'a get with jsonapi with default value of', Manager
87
+
88
+ context 'including contacts' do
89
+ let(:params) { { includes: :contacts } }
90
+ it { expect(data['relationships']['contacts']['data'].size).to eq(1) }
91
+ end
92
+ end
93
+
94
+ describe '#show' do
95
+ before { get :show, params: { id: manager.id } }
96
+
97
+ it_behaves_like 'a get method'
98
+ it_behaves_like 'a json api response with included node'
99
+ it_behaves_like 'a json api response with all relations of', Manager
100
+ it_behaves_like 'a get with jsonapi with default value of', Manager
101
+ end
102
+ end
103
+
104
+ describe 'POST' do
105
+ describe '#create' do
106
+ let(:params) do
107
+ attributes_for(:manager).merge(
108
+ contacts: attributes_for_list(:contact, 2)
109
+ )
110
+ end
111
+
112
+ before { post :create, params: params }
113
+
114
+ it_behaves_like 'a get method'
115
+ it_behaves_like 'a json api response with included node'
116
+ it_behaves_like 'a json api response with all relations of', Manager
117
+ it_behaves_like 'a get with jsonapi with default value of', Manager
118
+
119
+ it { expect(data['relationships']['contacts']['data'].count).to eq(2) }
120
+ end
121
+ end
122
+
123
+ describe 'PATCH' do
124
+ describe '#update' do
125
+ let(:manager) { create(:manager) }
126
+ let(:new_name) { 'Manager 100' }
127
+ let(:params) do
128
+ {
129
+ id: manager.id,
130
+ name: new_name,
131
+ short_name: manager.short_name
132
+ }
133
+ end
134
+
135
+ before { post :update, params: params }
136
+
137
+ it_behaves_like 'a get method'
138
+ it_behaves_like 'a json api response with included node'
139
+ it_behaves_like 'a json api response with all relations of', Manager
140
+ it_behaves_like 'a get with jsonapi with default value of', Manager
141
+
142
+ it 'validates if values were updated' do
143
+ expect(data['attributes']['name']).to eq(new_name)
144
+ end
145
+ end
146
+ end
147
+ end
148
+ ```
@@ -18,9 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
 
20
20
  spec.add_dependency "activesupport", ">= 4.0"
21
+ spec.add_dependency "jsonapi-rails", ">= 0.2"
21
22
 
22
23
  spec.add_development_dependency "bundler", "~> 1.15"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
25
  spec.add_development_dependency "rspec", "~> 3.0"
25
26
  spec.add_development_dependency "pry-byebug"
27
+ spec.add_development_dependency "json"
28
+ spec.add_development_dependency "pry"
26
29
  end
@@ -1,4 +1,6 @@
1
1
  require 'active_support/inflector'
2
+ require_relative 'json_api_toolbox/spec_support/shared_examples_for_controllers'
3
+ require 'renderizable'
2
4
 
3
5
  module JsonApiToolbox
4
6
  def self.build_enum(model, enum_attribute)
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonApiToolbox
4
+ module SpecSupport
5
+ module SharedExamplesForControllers
6
+ RSpec.shared_examples 'a http method' do
7
+ it 'returns http success' do
8
+ expect(response).to have_http_status(:success)
9
+ end
10
+ end
11
+
12
+ RSpec.shared_examples 'a get method' do
13
+ it_behaves_like 'a http method'
14
+
15
+ it 'response with JSON body' do
16
+ expect { response.body }.not_to raise_exception
17
+ end
18
+ end
19
+
20
+ RSpec.shared_examples 'a json api response with included node' do
21
+ it 'returns with included node' do
22
+ expect(JSON.parse(response.body)['included'].count).not_to eql(0)
23
+ end
24
+ end
25
+
26
+ RSpec.shared_examples 'a get with jsonapi with default value of' do |model|
27
+ let(:attributes) { data['attributes'].keys }
28
+ let(:model_keys) do
29
+ model.new.attributes.keys.map do |attr|
30
+ if attr.match?(/_cd$/)
31
+ attr.gsub(/_cd/, '')
32
+ elsif attr.match?(/_id$|^id$/)
33
+ nil
34
+ else
35
+ attr
36
+ end
37
+ end.compact
38
+ end
39
+
40
+ it 'returns response with default values' do
41
+ expect(attributes).to match_array(model_keys)
42
+ end
43
+ end
44
+
45
+ RSpec.shared_examples 'a json api response with all relations of' do |model|
46
+ let(:attributes) { data['relationships'].keys }
47
+ let(:relation_keys) { model.reflections.keys }
48
+
49
+ it 'returns response with default relationships' do
50
+ expect(attributes).to match_array(relation_keys)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,3 @@
1
1
  module JsonApiToolbox
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ require 'pry'
3
+
4
+ module JsonApiToolbox
5
+ module Renderizable
6
+ def render_with_errors(object_errors)
7
+ errors = object_errors.details.map do |field, error_details|
8
+ error_details.each_with_index.map do |item, error_i|
9
+ build_line(item[:error], field, object_errors.messages[field][error_i])
10
+ end
11
+ end
12
+
13
+ render json: { errors: errors }
14
+ end
15
+
16
+ def render_object(object)
17
+ if object.respond_to?(:valid?) && !object.valid?
18
+ render_with_errors(object.errors)
19
+ else
20
+ render jsonapi: object, include: includes_params
21
+ end
22
+ end
23
+
24
+ def includes_params
25
+ params.fetch(:includes, {})
26
+ end
27
+
28
+ def permitted_params
29
+ parsed_params = params.permit(permitted_attributes).to_h
30
+ JsonApiToolbox.normalize_post(parsed_params, model_name)
31
+ end
32
+
33
+ def default_includes_params
34
+ model_relationships =
35
+ model_name.reflect_on_all_associations(:has_one).map(&:name)
36
+ model_relationships +=
37
+ model_name.reflect_on_all_associations(:has_many).map(&:name)
38
+
39
+ params.merge!(includes: model_relationships)
40
+ end
41
+
42
+ def model_name
43
+ controller_name.singularize.camelize.constantize
44
+ end
45
+
46
+ private
47
+
48
+ def build_line(title, field, message)
49
+ {
50
+ title: title,
51
+ source: field,
52
+ detail: message
53
+ }
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_api_toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adriano Bacha
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-08 00:00:00.000000000 Z
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jsonapi-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,34 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: json
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description:
84
126
  email:
85
127
  - abacha@gmail.com
@@ -96,7 +138,9 @@ files:
96
138
  - Rakefile
97
139
  - json_api_toolbox.gemspec
98
140
  - lib/json_api_toolbox.rb
141
+ - lib/json_api_toolbox/spec_support/shared_examples_for_controllers.rb
99
142
  - lib/json_api_toolbox/version.rb
143
+ - lib/renderizable.rb
100
144
  homepage: http://bitbucket.org/guideinvestimentos/json_api_toolbox
101
145
  licenses: []
102
146
  metadata: {}