standardapi 5.0.0.4 → 5.0.0.5

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: 1ffafde0be5ac4af61ae465486cc2b425ee97274
4
- data.tar.gz: 90e2e0e35898cee9bb550c2378f8708166512f06
3
+ metadata.gz: 7ddf2593f95bb453a53bca52257c21509a8a4042
4
+ data.tar.gz: f589c7fb725ea99636d6a04112fe83cf0647dc26
5
5
  SHA512:
6
- metadata.gz: a080f851a213f0759fe8d9554e65588135169a5f99ca72ee52239917c8082f9420490b17d5cb2d3f5df41e0c50babb33c7ac56ac23a50fffe0cc99ce5b67ba7d
7
- data.tar.gz: 3bef590610082ecf5de5042b16e16dc4e5b558de7cfd65f0426e8a12b54119793497695acaa9819cde7bdf77303c625540a2c3f87da8c2521a3a5cfb4bcce410
6
+ metadata.gz: 1ec52191db1bfbc6bb3309f33b4870e26f964402a70e21a840e8f5e22847e9be76c7f9c86be6fd65131815e1a757c5b23e9e28e3f8ad1e8d789b28500bf932e0
7
+ data.tar.gz: 746e50e142dc29c8bea3ef2e9af5351b0f0887a850ed41804bbcdfeffb5a7eab59f71757392c8b3415be237f43b17aec703a7ebfc4f6b30611bfc29370081636
@@ -2,26 +2,14 @@ module StandardAPI
2
2
  module Controller
3
3
 
4
4
  def self.included(klass)
5
- klass.helper_method :includes, :orders, :model
5
+ klass.helper_method :includes, :orders, :model, :resource_limit
6
+ klass.before_action :set_standardapi_headers
6
7
  klass.append_view_path(File.join(File.dirname(__FILE__), 'views'))
7
8
  klass.extend(ClassMethods)
8
9
  end
9
-
10
- def ping
11
- render plain: 'pong'
12
- end
13
-
14
- def tables
15
- controllers = Dir[Rails.root.join('app/controllers/*_controller.rb')].map{ |path| path.match(/(\w+)_controller.rb/)[1].camelize+"Controller" }.map(&:safe_constantize)
16
- controllers.select! { |c| c.ancestors.include?(self.class) && c != self.class }
17
- controllers.map!(&:model).compact!
18
- controllers.map!(&:table_name)
19
-
20
- render json: controllers
21
- end
22
10
 
23
11
  def index
24
- instance_variable_set("@#{model.model_name.plural}", resources.limit(params[:limit]).offset(params[:offset]).sort(orders))
12
+ instance_variable_set("@#{model.model_name.plural}", resources.limit(limit).offset(params[:offset]).sort(orders))
25
13
  end
26
14
 
27
15
  def calculate
@@ -94,33 +82,45 @@ module StandardAPI
94
82
  @model = name.sub(/Controller\z/, '').singularize.camelize.safe_constantize
95
83
  end
96
84
 
85
+ def model_includes
86
+ if self.respond_to?("#{model.model_name.singular}_includes", true)
87
+ self.send "#{model.model_name.singular}_includes"
88
+ else
89
+ []
90
+ end
91
+ end
92
+
93
+ def model_orders
94
+ if self.respond_to?("#{model.model_name.singular}_orders", true)
95
+ self.send "#{model.model_name.singular}_orders"
96
+ else
97
+ []
98
+ end
99
+ end
100
+
97
101
  end
98
-
102
+
99
103
  private
100
104
 
101
- def model
102
- self.class.model
105
+ def set_standardapi_headers
106
+ headers['StandardAPI-Version'] = StandardAPI::VERSION
103
107
  end
104
108
 
105
- def model_params
106
- if self.respond_to?("#{model.model_name.singular}_params", true)
107
- params.require(model.model_name.singular).permit(self.send("#{model.model_name.singular}_params"))
108
- else
109
- []
110
- end
109
+ def model
110
+ self.class.model
111
111
  end
112
112
 
113
113
  def model_includes
114
- if self.respond_to?("#{model.model_name.singular}_includes", true)
115
- self.send "#{model.model_name.singular}_includes"
116
- else
117
- []
118
- end
114
+ self.class.model_includes
119
115
  end
120
116
 
121
117
  def model_orders
122
- if self.respond_to?("#{model.model_name.singular}_orders", true)
123
- self.send "#{model.model_name.singular}_orders"
118
+ self.class.model_orders
119
+ end
120
+
121
+ def model_params
122
+ if self.respond_to?("#{model.model_name.singular}_params", true)
123
+ params.require(model.model_name.singular).permit(self.send("#{model.model_name.singular}_params"))
124
124
  else
125
125
  []
126
126
  end
@@ -140,7 +140,15 @@ module StandardAPI
140
140
  end
141
141
 
142
142
  def resources
143
- model.filter(params[:where]).filter(current_mask[model.table_name])
143
+ query = model.filter(params[:where]).filter(current_mask[model.table_name])
144
+
145
+ if params[:distinct_on]
146
+ query.distinct_on(params[:distinct_on])
147
+ elsif params[:distinct]
148
+ query.distinct
149
+ else
150
+ query
151
+ end
144
152
  end
145
153
 
146
154
  def includes
@@ -185,6 +193,25 @@ module StandardAPI
185
193
  @excludes ||= model_excludes
186
194
  end
187
195
 
196
+ # The maximum number of results returned by #index
197
+ def resource_limit
198
+ 1000
199
+ end
200
+
201
+ def limit
202
+ if resource_limit
203
+ limit = params.require(:limit).to_i
204
+
205
+ if limit > resource_limit
206
+ raise ActionController::UnpermittedParameters.new([:limit, limit])
207
+ end
208
+
209
+ limit
210
+ else
211
+ params.permit(:limit)[:limit]
212
+ end
213
+ end
214
+
188
215
  # Used in #calculate
189
216
  # [{ count: :id }]
190
217
  # [{ count: '*' }]
@@ -7,9 +7,10 @@ module StandardAPI
7
7
  create_model
8
8
  selects = [{ count: :id}, { maximum: :id }, { minimum: :id }, { average: :id }]
9
9
 
10
- get :calculate, params: {select: selects}, format: :json
10
+ get resource_path(:calculate, select: selects, format: :json)
11
11
  assert_response :ok
12
- assert_equal [[model.count(:id), model.maximum(:id), model.minimum(:id), model.average(:id).to_f]], assigns(:calculations)
12
+ calculations = @controller.instance_variable_get('@calculations')
13
+ assert_equal [[model.count(:id), model.maximum(:id), model.minimum(:id), model.average(:id).to_f]], calculations
13
14
  end
14
15
 
15
16
  test '#calculate.json params[:where]' do
@@ -19,27 +20,32 @@ module StandardAPI
19
20
  selects = [{ count: :id}, { maximum: :id }, { minimum: :id }, { average: :id }]
20
21
  predicate = { id: { gt: m1.id } }
21
22
 
22
- get :calculate, params: {where: predicate, select: selects}, format: :json
23
+ get resource_path(:calculate, where: predicate, select: selects, format: :json)
24
+
23
25
  assert_response :ok
24
26
  assert_equal [[
25
27
  model.filter(predicate).count(:id),
26
28
  model.filter(predicate).maximum(:id),
27
29
  model.filter(predicate).minimum(:id),
28
30
  model.filter(predicate).average(:id).to_f
29
- ]], assigns(:calculations)
31
+ ]], @controller.instance_variable_get('@calculations')
30
32
  end
31
33
 
32
34
  test '#calculate.json mask' do
35
+ # This is just to instance @controller
36
+ get resource_path(:calculate)
37
+
33
38
  # If #current_mask isn't defined by StandardAPI we don't know how to
34
39
  # test other's implementation of #current_mask. Return and don't test.
35
40
  return if @controller.method(:current_mask).owner != StandardAPI
36
41
 
37
42
  m = create_model
43
+
38
44
  @controller.current_mask[plural_name] = { id: m.id + 100 }
39
45
  selects = [{ count: :id}, { maximum: :id }, { minimum: :id }, { average: :id }]
40
46
  get :calculate, select: selects, format: 'json'
41
47
  assert_response :ok
42
- assert_equal [[0, nil, nil, nil]], assigns(:calculations)
48
+ assert_equal [[0, nil, nil, nil]], @controller.instance_variable_get('@calculations')
43
49
  @controller.current_mask.delete(plural_name)
44
50
  end
45
51
 
@@ -3,24 +3,18 @@ module StandardAPI
3
3
  module CreateTests
4
4
  extend ActiveSupport::Testing::Declarative
5
5
 
6
- def setup
7
- @request.content_type="application/json"
8
- super
9
- end
10
-
11
6
  test '#create.json' do
12
7
  attrs = attributes_for(singular_name, :nested).select{|k,v| !model.readonly_attributes.include?(k.to_s) }
13
8
  create_webmocks(attrs)
14
9
 
15
10
  assert_difference("#{model.name}.count") do
16
- post :create, params: {singular_name => attrs}, format: :json
11
+ post resource_path(:create, singular_name => attrs, format: :json)
17
12
  assert_response :created
18
- assert assigns(singular_name)
13
+ m = @controller.instance_variable_get("@#{singular_name}")
19
14
 
20
15
  json = JSON.parse(response.body)
21
16
  assert json.is_a?(Hash)
22
17
 
23
- m = assigns(singular_name)
24
18
  view_attributes(m.reload).select { |x| attrs.keys.map(&:to_s).include?(x) }.each do |key, value|
25
19
  message = "Model / Attribute: #{m.class.name}##{key}"
26
20
  if value.is_a?(BigDecimal)
@@ -37,13 +31,14 @@ module StandardAPI
37
31
  create_webmocks(attrs)
38
32
 
39
33
  assert_difference("#{model.name}.count") do
40
- post :create, params: {singular_name => attrs}, format: :json
34
+ post resource_path(:create, format: :json), params: {singular_name => attrs}
41
35
  assert_response :created
42
- assert assigns(singular_name)
36
+ m = @controller.instance_variable_get("@#{singular_name}")
37
+ assert m
43
38
 
44
39
  json = JSON.parse(response.body)
45
40
  assert json.is_a?(Hash)
46
- m = assigns(singular_name).reload
41
+ m.reload
47
42
  view_attributes(m).select { |x| attrs.keys.map(&:to_s).include?(x) }.each do |key, value|
48
43
  message = "Model / Attribute: #{m.class.name}##{key}"
49
44
  assert_equal normalize_attribute(m, key, attrs[key.to_sym]), value, message
@@ -64,14 +59,14 @@ module StandardAPI
64
59
  create_webmocks(attrs)
65
60
 
66
61
  assert_difference("#{model.name}.count", 0) do
67
- post :create, params: {singular_name => attrs}, format: :json
62
+ post resource_path(:create, singular_name => attrs, format: :json)
68
63
  assert_response :bad_request
69
64
  json = JSON.parse(response.body)
70
65
  assert json.is_a?(Hash)
71
66
  assert json['errors']
72
67
  end
73
68
  end
74
-
69
+
75
70
  test '#create.html with invalid attributes renders edit action' do
76
71
  return unless supports_format(:html)
77
72
 
@@ -87,7 +82,7 @@ module StandardAPI
87
82
  create_webmocks(attrs)
88
83
 
89
84
  assert_difference("#{model.name}.count", 0) do
90
- post :create, params: {singular_name => attrs}, format: :html
85
+ post resource_path(:create, singular_name => attrs, format: :html)
91
86
  assert_response :bad_request
92
87
  assert_equal response.body, 'properties#edit.html'
93
88
  end
@@ -99,24 +94,25 @@ module StandardAPI
99
94
  create_webmocks(attrs)
100
95
 
101
96
  assert_difference("#{model.name}.count") do
102
- post :create, params: {singular_name => attrs, :include => includes}, format: :json
97
+ post resource_path(:create, singular_name => attrs, include: includes, format: :json)
103
98
  assert_response :created
104
- assert assigns(singular_name)
99
+ m = @controller.instance_variable_get("@#{singular_name}")
100
+ assert m
105
101
 
106
102
  json = JSON.parse(response.body)
107
103
  assert json.is_a?(Hash)
108
104
  includes.each do |included|
109
105
  assert json.key?(included.to_s), "#{included.inspect} not included in response"
110
106
 
111
- association = assigns(singular_name).class.reflect_on_association(included)
107
+ association = m.class.reflect_on_association(included)
112
108
  next if !association
113
109
 
114
110
  if ['belongs_to', 'has_one'].include?(association.macro.to_s)
115
- view_attributes(assigns(singular_name).send(included)) do |key, value|
116
- assert_equal json[included.to_s][key.to_s], normalize_to_json(assigns(singular_name), key, value)
111
+ view_attributes(m.send(included)) do |key, value|
112
+ assert_equal json[included.to_s][key.to_s], normalize_to_json(m, key, value)
117
113
  end
118
114
  else
119
- m = assigns(singular_name).send(included).first.try(:reload)
115
+ m = m.send(included).first.try(:reload)
120
116
 
121
117
  m_json = if m && m.has_attribute?(:id)
122
118
  json[included.to_s].find { |x| x['id'] == normalize_to_json(m, :id, m.id) }
@@ -7,21 +7,25 @@ module StandardAPI
7
7
  m = create_model
8
8
 
9
9
  assert_difference("#{model.name}.count", -1) do
10
- delete :destroy, params: { id: m.id }, format: :json
10
+ delete resource_path(:destroy, id: m.id, format: :json)
11
11
  assert_response :no_content
12
12
  assert_equal '', response.body
13
13
  end
14
14
  end
15
15
 
16
16
  test '#destroy.json mask' do
17
+ m = create_model
18
+
19
+ # This is just to instance @controller
20
+ get resource_path(:show, id: m.id, format: 'json')
21
+
17
22
  # If #current_mask isn't defined by StandardAPI we don't know how to
18
23
  # test other's implementation of #current_mask. Return and don't test.
19
24
  return if @controller.method(:current_mask).owner != StandardAPI
20
25
 
21
- m = create_model
22
26
  @controller.current_mask[plural_name] = { id: m.id + 1 }
23
27
  assert_raises(ActiveRecord::RecordNotFound) do
24
- delete :destroy, params: { id: m.id }, format: :json
28
+ delete resource_path(:destroy, id: m.id, format: :json)
25
29
  end
26
30
  @controller.current_mask.delete(plural_name)
27
31
  end
@@ -4,58 +4,80 @@ module StandardAPI
4
4
  extend ActiveSupport::Testing::Declarative
5
5
 
6
6
  test '#index.json' do
7
- get :index, format: :json
7
+ get resource_path(:index, format: :json), params: { limit: 10 }
8
8
  assert_response :ok
9
- assert_equal model.all.map(&:id).sort, assigns(plural_name).map(&:id).sort
9
+ models = @controller.instance_variable_get("@#{plural_name}")
10
+ assert_equal model.all.map(&:id).sort, models.map(&:id).sort
10
11
  assert JSON.parse(response.body).is_a?(Array)
11
12
  end
12
13
 
14
+ test '#index.json requires limit' do
15
+ assert_raises ActionController::ParameterMissing do
16
+ get resource_path(:index, format: :json)
17
+ end
18
+ end
19
+
13
20
  test '#index.json params[:limit]' do
14
- get :index, params: { limit: 1 }, format: :json
15
- assert_equal model.limit(1).sort(required_orders).to_sql, assigns(plural_name).to_sql
21
+ get resource_path(:index, format: :json), params: { limit: 1 }
22
+ models = @controller.instance_variable_get("@#{plural_name}")
23
+ assert_equal model.limit(1).sort(required_orders).to_sql, models.to_sql
24
+ end
25
+
26
+ test '#index.json params[:limit] does not exceed maximum limit' do
27
+ assert_raises ActionController::UnpermittedParameters do
28
+ get resource_path(:index, format: :json), params: { limit: 1000000 }
29
+ end
16
30
  end
17
31
 
18
32
  test '#index.json params[:where]' do
19
33
  m = create_model
20
34
 
21
- get :index, params: { where: { id: m.id } }, format: :json
22
- assert_equal [m], assigns(plural_name)
35
+ get resource_path(:index, format: :json), params: { limit: 10, where: { id: m.id } }
36
+ models = @controller.instance_variable_get("@#{plural_name}")
37
+ assert_equal [m], models
23
38
  end
24
39
 
25
40
  test '#index.json params[:order]' do
41
+ # This is just to instance @controller
42
+ get resource_path(:index, format: :json), params: { limit: 1 }
43
+
26
44
  orders.each do |order|
27
45
  @controller.instance_variable_set('@orders', nil) # Hack for dealing with caching / multiple request per controller life
28
- get :index, params: { order: order }, format: :json
29
- assert_equal model.sort(order).sort(required_orders).to_sql, assigns(plural_name).to_sql
46
+ get resource_path(:index, format: :json), params: { limit: 10, order: order }
47
+ models = @controller.instance_variable_get("@#{plural_name}")
48
+ assert_equal model.sort(order).limit(10).sort(required_orders).to_sql, models.to_sql
30
49
  end
31
50
  end
32
51
 
33
52
  test '#index.json params[:offset]' do
34
- get :index, params: { offset: 13 }, format: :json
35
- assert_equal model.offset(13).sort(required_orders).to_sql, assigns(plural_name).to_sql
53
+ get resource_path(:index, format: :json), params: { limit: 10, offset: 13 }
54
+ models = @controller.instance_variable_get("@#{plural_name}")
55
+ assert_equal model.offset(13).limit(10).sort(required_orders).to_sql, models.to_sql
36
56
  end
37
57
 
38
58
  test '#index.json params[:include]' do
39
59
  travel_to Time.now do
40
60
  create_model
41
- get :index, params: { include: includes }, format: :json
61
+ get resource_path(:index, format: :json), params: { limit: 100, include: includes }
42
62
 
43
63
  json = JSON.parse(response.body)[0]
44
64
  assert json.is_a?(Hash)
45
65
  includes.each do |included|
46
66
  assert json.key?(included.to_s), "#{included.inspect} not included in response"
47
67
 
48
- association = assigns(plural_name).first.class.reflect_on_association(included)
68
+ models = @controller.instance_variable_get("@#{plural_name}")
69
+ association = models.first.class.reflect_on_association(included)
49
70
  next if !association
50
71
 
51
72
  if ['belongs_to', 'has_one'].include?(association.macro.to_s)
52
- m = assigns(plural_name).first.send(included)
73
+ models = @controller.instance_variable_get("@#{plural_name}")
74
+ m = models.first.send(included)
53
75
  view_attributes(m) do |key, value|
54
76
  message = "Model / Attribute: #{m.class.name}##{key}"
55
77
  assert_equal json[included.to_s][key.to_s], normalize_to_json(m, key, value), message
56
78
  end
57
79
  else
58
- m = assigns(plural_name).first.send(included).first.try(:reload)
80
+ m = models.first.send(included).first.try(:reload)
59
81
 
60
82
  m_json = if m && m.has_attribute?(:id)
61
83
  json[included.to_s].find { |x| x['id'] == normalize_to_json(m, :id, m.id) }
@@ -76,6 +98,9 @@ module StandardAPI
76
98
  end
77
99
 
78
100
  test '#index.json mask' do
101
+ # This is just to instance @controller
102
+ get resource_path(:index, format: :json), params: { limit: 1 }
103
+
79
104
  # If #current_mask isn't defined by StandardAPI we don't know how to
80
105
  # test other's implementation of #current_mask. Return and don't test.
81
106
  return if @controller.method(:current_mask).owner != StandardAPI
@@ -83,7 +108,8 @@ module StandardAPI
83
108
  m = create_model
84
109
  @controller.current_mask[plural_name] = { id: m.id }
85
110
  get :index, format: :json
86
- assert_equal model.where(id: m.id).sort(required_orders).to_sql, assigns(plural_name).to_sql
111
+ models = @controller.instance_variable_get("@#{plural_name}")
112
+ assert_equal model.where(id: m.id).sort(required_orders).to_sql, models.to_sql
87
113
  @controller.current_mask.delete(plural_name)
88
114
  end
89
115
  end
@@ -4,9 +4,9 @@ module StandardAPI
4
4
  extend ActiveSupport::Testing::Declarative
5
5
 
6
6
  test '#new.json' do
7
- get :new, format: 'json'
7
+ get resource_path(:new, format: 'json')
8
8
  assert_response :ok
9
- assert assigns(singular_name)
9
+ assert @controller.instance_variable_get("@#{singular_name}")
10
10
  end
11
11
 
12
12
  end
@@ -0,0 +1,21 @@
1
+ module StandardAPI
2
+ module TestCase
3
+ module IndexTests
4
+ extend ActiveSupport::Testing::Declarative
5
+
6
+ test '#schema.json' do
7
+ create_model
8
+
9
+ get resource_path(:schema, format: :json)
10
+ assert_response :ok
11
+ json = JSON(@response.body)
12
+ assert json['columns']
13
+ model.columns.map do |column|
14
+ assert json['columns'][column.name]['type']
15
+ end
16
+ assert json['limit']
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -6,29 +6,29 @@ module StandardAPI
6
6
  test '#show.json' do
7
7
  m = create_model
8
8
 
9
- get :show, params: {id: m.id}, format: :json
9
+ get resource_path(:show, id: m.id, format: :json)
10
10
  assert_response :ok
11
- assert_equal m, assigns(singular_name)
11
+ assert_equal m, @controller.instance_variable_get("@#{singular_name}")
12
12
  assert JSON.parse(response.body).is_a?(Hash)
13
13
  end
14
14
 
15
15
  test '#show.json params[:include]' do
16
16
  m = create_model
17
- get :show, params: {id: m.id, include: includes}, format: :json
17
+ get resource_path(:show, id: m.id, include: includes, format: :json)
18
18
 
19
19
  json = JSON.parse(response.body)
20
20
  includes.each do |included|
21
21
  assert json.key?(included.to_s), "#{included.inspect} not included in response"
22
22
 
23
- association = assigns(singular_name).class.reflect_on_association(included)
23
+ association = @controller.instance_variable_get("@#{singular_name}").class.reflect_on_association(included)
24
24
  next if !association
25
25
 
26
26
  if ['belongs_to', 'has_one'].include?(association.macro.to_s)
27
- view_attributes(assigns(singular_name).send(included)) do |key, value|
27
+ view_attributes(@controller.instance_variable_get("@#{singular_name}").send(included)) do |key, value|
28
28
  assert_equal json[included.to_s][key.to_s], value
29
29
  end
30
30
  else
31
- m = assigns(singular_name).send(included).first.try(:reload)
31
+ m = @controller.instance_variable_get("@#{singular_name}").send(included).first.try(:reload)
32
32
 
33
33
  m_json = if m && m.has_attribute?(:id)
34
34
  json[included.to_s].find { |x| x['id'] == normalize_to_json(m, :id, m.id) }
@@ -48,14 +48,19 @@ module StandardAPI
48
48
  end
49
49
 
50
50
  test '#show.json mask' do
51
+ m = create_model
52
+
53
+ # This is just to instance @controller
54
+ get resource_path(:show, id: m.id, format: :json)
55
+
51
56
  # If #current_mask isn't defined by StandardAPI we don't know how to
52
57
  # test other's implementation of #current_mask. Return and don't test.
53
58
  return if @controller.method(:current_mask).owner != StandardAPI
54
59
 
55
- m = create_model
60
+
56
61
  @controller.current_mask[plural_name] = { id: m.id + 1 }
57
62
  assert_raises(ActiveRecord::RecordNotFound) do
58
- get :show, params: {id: m.id}, format: :json
63
+ get resource_path(:show, id: m.id, format: :json)
59
64
  end
60
65
  @controller.current_mask.delete(plural_name)
61
66
  end
@@ -3,17 +3,12 @@ module StandardAPI
3
3
  module UpdateTests
4
4
  extend ActiveSupport::Testing::Declarative
5
5
 
6
- def setup
7
- @request.content_type="application/json"
8
- super
9
- end
10
-
11
6
  test '#update.json' do
12
7
  m = create_model
13
8
  attrs = attributes_for(singular_name).select{|k,v| !model.readonly_attributes.include?(k.to_s) }
14
9
  create_webmocks(attrs)
15
10
 
16
- put :update, params: {:id => m.id, singular_name => attrs}, format: :json
11
+ put resource_path(:update, :id => m.id, :format => 'json'), params: { singular_name => attrs }
17
12
  assert_response :ok, "Updating #{m.class.name} with #{attrs.inspect}"
18
13
 
19
14
  view_attributes(m.reload).select { |x| attrs.keys.map(&:to_s).include?(x) }.each do |key, value|
@@ -28,13 +23,18 @@ module StandardAPI
28
23
  end
29
24
 
30
25
  test '#update.html redirects to #show.html' do
26
+ m = create_model
27
+
28
+ # This is just to instance @controller
29
+ get resource_path(:show, id: m.id, format: :json)
30
+
31
31
  return if @controller.method(:update).owner != StandardAPI
32
32
 
33
- m = create_model
34
33
  attrs = attributes_for(singular_name).select{|k,v| !model.readonly_attributes.include?(k.to_s) }
35
34
  create_webmocks(attrs)
36
35
 
37
- put :update, params: {:id => m.id, singular_name => attrs}, format: :html
36
+ put resource_path(:update, :id => m.id, :format => 'html'), params: { singular_name => attrs }
37
+
38
38
  assert_redirected_to m
39
39
  end
40
40
 
@@ -42,7 +42,8 @@ module StandardAPI
42
42
  m = create_model
43
43
  attrs = attributes_for(singular_name, :nested).select{|k,v| !model.readonly_attributes.include?(k.to_s) }
44
44
  create_webmocks(attrs)
45
- put :update, params: {:id => m.id, singular_name => attrs}, format: :json
45
+
46
+ put resource_path(:update, :id => m.id, :format => 'json'), params: { singular_name => attrs }
46
47
  assert_response :ok, "Updating #{m.class.name} with #{attrs.inspect}"
47
48
 
48
49
  # (m.attribute_names & attrs.keys.map(&:to_s)).each do |test_key|
@@ -66,7 +67,7 @@ module StandardAPI
66
67
  attrs = attributes_for(singular_name, :invalid).select{|k,v| !model.readonly_attributes.include?(k.to_s) }
67
68
  create_webmocks(attrs)
68
69
 
69
- put :update, params: {:id => m.id, singular_name => attrs}, format: :json
70
+ put resource_path(:update, :id => m.id, :format => 'json'), params: { singular_name => attrs }
70
71
  assert_response :bad_request, "Updating #{m.class.name} with invalid attributes #{attrs.inspect}"
71
72
  assert JSON.parse(@response.body)['errors']
72
73
  end
@@ -77,23 +78,24 @@ module StandardAPI
77
78
  attrs = attributes_for(singular_name, :nested).select{|k,v| !model.readonly_attributes.include?(k) }
78
79
  create_webmocks(attrs)
79
80
 
80
- put :update, params: {:id => m.id, :include => includes, singular_name => attrs}, format: :json
81
+ put resource_path(:update, :id => m.id, :format => 'json'), params: { include: includes, singular_name => attrs }
81
82
  assert_response :ok, "Updating #{m.class.name} with #{attrs.inspect}"
82
83
 
84
+ controller_model = @controller.instance_variable_get("@#{singular_name}")
83
85
  json = JSON.parse(response.body)
84
86
  includes.each do |included|
85
87
  assert json.key?(included.to_s), "#{included.inspect} not included in response"
86
88
 
87
- association = assigns(singular_name).class.reflect_on_association(included)
89
+ association = controller_model.class.reflect_on_association(included)
88
90
  next if !association
89
91
 
90
92
  if ['belongs_to', 'has_one'].include?(association.macro.to_s)
91
- view_attributes(assigns(singular_name).send(included)) do |key, value|
92
- message = "Model / Attribute: #{assigns(singular_name).send(included).class.name}##{key}"
93
+ view_attributes(controller_model.send(included)) do |key, value|
94
+ message = "Model / Attribute: #{controller_model.send(included).class.name}##{key}"
93
95
  assert_equal json[included.to_s][key.to_s], value, message
94
96
  end
95
97
  else
96
- m = assigns(singular_name).send(included).first.try(:reload)
98
+ m = controller_model.send(included).first.try(:reload)
97
99
  m_json = if m && m.has_attribute?(:id)
98
100
  json[included.to_s].find { |x| x['id'] == normalize_to_json(m, :id, m.id) }
99
101
  elsif m
@@ -113,14 +115,18 @@ module StandardAPI
113
115
  end
114
116
 
115
117
  test '#update.json mask' do
118
+ m = create_model
119
+
120
+ # This is just to instance @controller
121
+ get resource_path(:index, format: :json), params: { limit: 1 }
122
+
116
123
  # If #current_mask isn't defined by StandardAPI we don't know how to
117
124
  # test other's implementation of #current_mask. Return and don't test.
118
125
  return if @controller.method(:current_mask).owner != StandardAPI
119
126
 
120
- m = create_model
121
127
  @controller.current_mask[plural_name] = { id: m.id + 1 }
122
128
  assert_raises(ActiveRecord::RecordNotFound) do
123
- put :update, params: {id: m.id}, format: 'json'
129
+ put resource_path(:update, :id => m.id, :format => 'json')
124
130
  end
125
131
  @controller.current_mask.delete(plural_name)
126
132
  end
@@ -1,23 +1,17 @@
1
1
  require 'active_support/test_case'
2
2
 
3
3
  require File.expand_path(File.join(__FILE__, '../test_case/calculate_tests'))
4
- require File.expand_path(File.join(__FILE__, '../test_case/new_tests'))
5
4
  require File.expand_path(File.join(__FILE__, '../test_case/create_tests'))
6
5
  require File.expand_path(File.join(__FILE__, '../test_case/destroy_tests'))
7
6
  require File.expand_path(File.join(__FILE__, '../test_case/index_tests'))
7
+ require File.expand_path(File.join(__FILE__, '../test_case/new_tests'))
8
+ require File.expand_path(File.join(__FILE__, '../test_case/schema_tests'))
8
9
  require File.expand_path(File.join(__FILE__, '../test_case/show_tests'))
9
10
  require File.expand_path(File.join(__FILE__, '../test_case/update_tests'))
10
11
 
11
12
  module StandardAPI::TestCase
12
13
 
13
14
  def self.included(klass)
14
- begin
15
- controller_class_name = klass.name.gsub(/Test$/, '')
16
- controller_class_name.constantize
17
- rescue NameError => e
18
- raise e if e.message != "uninitialized constant #{controller_class_name}"
19
- end
20
-
21
15
  [:filters, :orders, :includes].each do |attribute|
22
16
  klass.send(:class_attribute, attribute)
23
17
  end
@@ -41,14 +35,13 @@ module StandardAPI::TestCase
41
35
  acc
42
36
  end
43
37
 
44
-
45
38
  klass.controller_class.action_methods.each do |action|
46
39
  if const_defined?("StandardAPI::TestCase::#{action.capitalize}Tests") && routes[klass.controller_class.controller_path][action]
47
40
  klass.include("StandardAPI::TestCase::#{action.capitalize}Tests".constantize)
48
41
  end
49
42
  end
50
43
  end
51
-
44
+
52
45
  def supports_format(format)
53
46
  count = controller_class.view_paths.count do |path|
54
47
  !Dir.glob("#{path.instance_variable_get(:@path)}/{#{model.name.underscore},application}/**/*.#{format}*").empty?
@@ -60,18 +53,33 @@ module StandardAPI::TestCase
60
53
  def required_orders
61
54
  controller_class.new.send(:required_orders)
62
55
  end
63
-
64
- def controller_class
65
- controller_class_name = self.class.name.gsub(/Test$/, '')
66
- controller_class_name.constantize
67
- rescue NameError => e
68
- raise e if e.message != "uninitialized constant #{controller_class_name}"
69
- end
70
56
 
71
57
  def model
72
58
  self.class.model
73
59
  end
74
60
 
61
+ def resource_path(action, options={})
62
+ url_for({
63
+ controller: model.model_name.plural, action: action
64
+ }.merge(options))
65
+ # case action
66
+ # when :index, :create
67
+ # send "#{model.model_name.plural.underscore}_path", *args
68
+ # when :schema, :calculate
69
+ # send "#{model.model_name.plural.underscore}_#{action}_path", *args
70
+ # else
71
+ # send "#{action}_#{model.model_name.underscore}_path", *args
72
+ # end
73
+ end
74
+
75
+ # def resoruces_path(action, *args)
76
+ # send "#{model.model_name.plural.underscore}_path", *args
77
+ # end
78
+
79
+ def controller_class
80
+ self.class.controller_class
81
+ end
82
+
75
83
  def create_model(*args)
76
84
  create(model.name.underscore, *args)
77
85
  end
@@ -128,6 +136,13 @@ module StandardAPI::TestCase
128
136
  klass.instance_variable_set('@normalizers', {})
129
137
  end
130
138
 
139
+ def controller_class
140
+ controller_class_name = self.name.gsub(/Test$/, '')
141
+ controller_class_name.constantize
142
+ rescue NameError => e
143
+ raise e if e.message != "uninitialized constant #{controller_class_name}"
144
+ end
145
+
131
146
  def include_filter_tests
132
147
  model.instance_variable_get('@filters').each do |filter|
133
148
  next if filter[1].is_a?(Proc) # Custom filter
@@ -0,0 +1,3 @@
1
+ module StandardAPI
2
+ VERSION = '5.0.0.5'
3
+ end
@@ -20,11 +20,15 @@ mapping = {
20
20
  'geometry' => 'ewkb'
21
21
  }
22
22
 
23
- model.columns.each do |column|
24
- json.set! column.name, {
25
- type: mapping[column.sql_type],
26
- primary_key: column.name == model.primary_key,
27
- null: column.null,
28
- array: column.array
29
- }
30
- end
23
+ json.set! 'columns' do
24
+ model.columns.each do |column|
25
+ json.set! column.name, {
26
+ type: mapping[column.sql_type],
27
+ primary_key: column.name == model.primary_key,
28
+ null: column.null,
29
+ array: column.array
30
+ }
31
+ end
32
+ end
33
+
34
+ json.set! 'limit', resource_limit
data/lib/standard_api.rb CHANGED
@@ -8,9 +8,7 @@ require 'active_record/filter'
8
8
  require 'active_record/sort'
9
9
  require 'active_support/core_ext/hash/indifferent_access'
10
10
 
11
- module StandardAPI
12
- end
13
-
11
+ require 'standard_api/version'
14
12
  require 'standard_api/orders'
15
13
  require 'standard_api/includes'
16
14
  require 'standard_api/controller'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standardapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.4
4
+ version: 5.0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-25 00:00:00.000000000 Z
11
+ date: 2016-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -294,13 +294,15 @@ files:
294
294
  - lib/standard_api/test_case/destroy_tests.rb
295
295
  - lib/standard_api/test_case/index_tests.rb
296
296
  - lib/standard_api/test_case/new_tests.rb
297
- - lib/standard_api/test_case/schema_test.rb
297
+ - lib/standard_api/test_case/schema_tests.rb
298
298
  - lib/standard_api/test_case/show_tests.rb
299
299
  - lib/standard_api/test_case/update_tests.rb
300
+ - lib/standard_api/version.rb
300
301
  - lib/standard_api/views/application/_record.json.jbuilder
301
302
  - lib/standard_api/views/application/index.json.jbuilder
302
303
  - lib/standard_api/views/application/new.json.jbuilder
303
304
  - lib/standard_api/views/application/schema.json.jbuilder
305
+ - lib/standard_api/views/application/settings.json.jbuilder
304
306
  - lib/standard_api/views/application/show.json.jbuilder
305
307
  homepage: https://github.com/waratuman/standardapi
306
308
  licenses:
@@ -1,8 +0,0 @@
1
- module StandardAPI
2
- module TestCase
3
- module IndexTests
4
- extend ActiveSupport::Testing::Declarative
5
-
6
- end
7
- end
8
- end