standardapi 6.1.0 → 7.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +80 -58
- data/lib/standard_api/access_control_list.rb +40 -6
- data/lib/standard_api/controller.rb +96 -28
- data/lib/standard_api/helpers.rb +13 -7
- data/lib/standard_api/middleware.rb +5 -0
- data/lib/standard_api/railtie.rb +17 -0
- data/lib/standard_api/route_helpers.rb +59 -9
- data/lib/standard_api/test_case/calculate_tests.rb +7 -6
- data/lib/standard_api/test_case/destroy_tests.rb +19 -7
- data/lib/standard_api/test_case/index_tests.rb +7 -13
- data/lib/standard_api/test_case/show_tests.rb +7 -7
- data/lib/standard_api/test_case/update_tests.rb +7 -6
- data/lib/standard_api/version.rb +1 -1
- data/lib/standard_api/views/application/_record.json.jbuilder +4 -3
- data/lib/standard_api/views/application/_record.streamer +4 -3
- data/lib/standard_api/views/application/_schema.json.jbuilder +20 -8
- data/lib/standard_api/views/application/_schema.streamer +22 -8
- data/lib/standard_api.rb +1 -0
- data/test/standard_api/caching_test.rb +2 -2
- data/test/standard_api/controller/include_test.rb +107 -0
- data/test/standard_api/controller/subresource_test.rb +157 -0
- data/test/standard_api/helpers_test.rb +9 -8
- data/test/standard_api/nested_attributes/belongs_to_test.rb +71 -0
- data/test/standard_api/nested_attributes/has_and_belongs_to_many_test.rb +70 -0
- data/test/standard_api/nested_attributes/has_many_test.rb +85 -0
- data/test/standard_api/nested_attributes/has_one_test.rb +71 -0
- data/test/standard_api/route_helpers_test.rb +56 -0
- data/test/standard_api/standard_api_test.rb +80 -50
- data/test/standard_api/test_app/app/controllers/acl/camera_acl.rb +7 -0
- data/test/standard_api/test_app/app/controllers/acl/photo_acl.rb +13 -0
- data/test/standard_api/test_app/app/controllers/acl/property_acl.rb +7 -1
- data/test/standard_api/test_app/controllers.rb +17 -0
- data/test/standard_api/test_app/models.rb +59 -2
- data/test/standard_api/test_app/test/factories.rb +3 -0
- data/test/standard_api/test_app/views/sessions/create.json.jbuilder +1 -0
- data/test/standard_api/test_app/views/sessions/create.streamer +3 -0
- data/test/standard_api/test_app.rb +12 -1
- data/test/standard_api/test_helper.rb +9 -0
- metadata +52 -13
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'standard_api/test_helper'
|
2
|
+
|
3
|
+
module NestedAttributes
|
4
|
+
class BelongsToTest < ActionDispatch::IntegrationTest
|
5
|
+
# include StandardAPI::TestCase
|
6
|
+
include StandardAPI::Helpers
|
7
|
+
|
8
|
+
|
9
|
+
# = Create Test
|
10
|
+
|
11
|
+
test 'create record and create nested record' do
|
12
|
+
@controller = PhotosController.new
|
13
|
+
post photos_path, params: { photo: { account: {name: 'Big Ben'}} }, as: :json
|
14
|
+
|
15
|
+
assert_response :created
|
16
|
+
photo = Photo.last
|
17
|
+
assert_equal 'Big Ben', photo.account.name
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'create record and update nested record' do
|
21
|
+
account = create(:account, name: 'Big Ben')
|
22
|
+
|
23
|
+
@controller = PhotosController.new
|
24
|
+
post photos_path, params: { photo: { account: {id: account.id, name: 'Little Jimmie'}} }, as: :json
|
25
|
+
|
26
|
+
|
27
|
+
assert_response :created
|
28
|
+
photo = Photo.last
|
29
|
+
assert_equal account.id, photo.account_id
|
30
|
+
assert_equal 'Little Jimmie', photo.account.name
|
31
|
+
end
|
32
|
+
|
33
|
+
# = Update Test
|
34
|
+
|
35
|
+
test 'update record and create nested record' do
|
36
|
+
photo = create(:photo)
|
37
|
+
|
38
|
+
@controller = PhotosController.new
|
39
|
+
put photo_path(photo), params: { photo: { account: {name: 'Big Ben'}} }, as: :json
|
40
|
+
|
41
|
+
assert_response :ok
|
42
|
+
photo.reload
|
43
|
+
assert_equal 'Big Ben', photo.account.name
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'update record and update nested record' do
|
47
|
+
account = create(:account, name: 'Big Ben')
|
48
|
+
photo = create(:photo, account: account)
|
49
|
+
|
50
|
+
@controller = PhotosController.new
|
51
|
+
put photo_path(photo), params: { photo: { account: {name: 'Little Jimmie'}} }, as: :json
|
52
|
+
|
53
|
+
assert_response :ok
|
54
|
+
photo.reload
|
55
|
+
assert_equal 'Little Jimmie', photo.account.name
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'update record and set relation to nil' do
|
59
|
+
account = create(:account, name: 'Big Ben')
|
60
|
+
photo = create(:photo, account: account)
|
61
|
+
|
62
|
+
@controller = PhotosController.new
|
63
|
+
put photo_path(photo), params: { photo: { account: nil} }, as: :json
|
64
|
+
|
65
|
+
assert_response :ok
|
66
|
+
photo.reload
|
67
|
+
assert_nil photo.account
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'standard_api/test_helper'
|
2
|
+
|
3
|
+
module NestedAttributes
|
4
|
+
class HasAndBelongsToManyTest < ActionDispatch::IntegrationTest
|
5
|
+
# include StandardAPI::TestCase
|
6
|
+
include StandardAPI::Helpers
|
7
|
+
|
8
|
+
|
9
|
+
# = Create Test
|
10
|
+
|
11
|
+
test 'create record and create nested record' do
|
12
|
+
@controller = PropertiesController.new
|
13
|
+
post properties_path, params: { property: { name: 'Beach House', photos: [{format: 'image/jpeg'}]} }, as: :json
|
14
|
+
|
15
|
+
assert_response :created
|
16
|
+
property = Property.last
|
17
|
+
assert_equal 'Beach House', property.name
|
18
|
+
assert_equal ['image/jpeg'], property.photos.map(&:format)
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'create record and update nested record' do
|
22
|
+
photo = create(:photo, format: 'image/png')
|
23
|
+
|
24
|
+
@controller = PropertiesController.new
|
25
|
+
post properties_path, params: { property: { name: 'Beach House', photos: [{id: photo.id, format: 'image/jpeg'}] } }, as: :json
|
26
|
+
|
27
|
+
assert_response :created
|
28
|
+
property = Property.last
|
29
|
+
assert_equal 'Beach House', property.name
|
30
|
+
assert_equal [photo.id], property.photos.map(&:id)
|
31
|
+
assert_equal ['image/jpeg'], property.photos.map(&:format)
|
32
|
+
assert_equal 'image/jpeg', photo.reload.format
|
33
|
+
end
|
34
|
+
|
35
|
+
# = Update Test
|
36
|
+
|
37
|
+
test 'update record and create nested record' do
|
38
|
+
property = create(:property)
|
39
|
+
|
40
|
+
@controller = PropertiesController.new
|
41
|
+
put property_path(property), params: { property: { photos: [{format: "image/tiff"}]} }, as: :json
|
42
|
+
|
43
|
+
assert_response :ok
|
44
|
+
assert_equal ["image/tiff"], property.reload.photos.map(&:format)
|
45
|
+
end
|
46
|
+
|
47
|
+
test 'update record and update nested record' do
|
48
|
+
photo = create(:photo, format: 'image/gif')
|
49
|
+
property = create(:property, photos: [photo])
|
50
|
+
|
51
|
+
@controller = PropertiesController.new
|
52
|
+
put property_path(property), params: { property: { photos: [{id: photo.id, format: "image/heic"}]} }, as: :json
|
53
|
+
|
54
|
+
assert_response :ok
|
55
|
+
assert_equal ['image/heic'], property.reload.photos.map(&:format)
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'update record and set relation to an empty array' do
|
59
|
+
photo = create(:photo, format: 'image/gif')
|
60
|
+
property = create(:property, photos: [photo])
|
61
|
+
|
62
|
+
@controller = PropertiesController.new
|
63
|
+
put property_path(property), params: { property: { photos: [] } }, as: :json
|
64
|
+
|
65
|
+
assert_response :ok
|
66
|
+
assert_equal [], property.reload.photos
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'standard_api/test_helper'
|
2
|
+
|
3
|
+
module NestedAttributes
|
4
|
+
class HasManyTest < ActionDispatch::IntegrationTest
|
5
|
+
# include StandardAPI::TestCase
|
6
|
+
include StandardAPI::Helpers
|
7
|
+
|
8
|
+
|
9
|
+
# = Create Test
|
10
|
+
|
11
|
+
test 'create record and create nested record' do
|
12
|
+
@controller = PropertiesController.new
|
13
|
+
post properties_path, params: { property: { name: 'Beach House', accounts: [{name: 'Billabong'}]} }, as: :json
|
14
|
+
|
15
|
+
assert_response :created
|
16
|
+
property = Property.last
|
17
|
+
assert_equal 'Beach House', property.name
|
18
|
+
assert_equal ['Billabong'], property.accounts.map(&:name)
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'create record and update nested record' do
|
22
|
+
account = create(:account, name: 'Coco Chanel')
|
23
|
+
|
24
|
+
@controller = PropertiesController.new
|
25
|
+
post properties_path, params: { property: { name: 'Beach House', accounts: [{id: account.id, name: 'Crazy Chanel'}]} }, as: :json
|
26
|
+
|
27
|
+
assert_response :created
|
28
|
+
property = Property.last
|
29
|
+
assert_equal [account.id], property.accounts.map(&:id)
|
30
|
+
assert_equal ['Crazy Chanel'], property.accounts.map(&:name)
|
31
|
+
assert_equal 'Crazy Chanel', account.reload.name
|
32
|
+
end
|
33
|
+
|
34
|
+
# = Update Test
|
35
|
+
|
36
|
+
test 'update record and create nested record' do
|
37
|
+
property = create(:property)
|
38
|
+
|
39
|
+
@controller = PropertiesController.new
|
40
|
+
put property_path(property), params: { property: { accounts: [{name: "Hersey's"}]} }, as: :json
|
41
|
+
|
42
|
+
assert_response :ok
|
43
|
+
assert_equal ["Hersey's"], property.accounts.map(&:name)
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'update record and update nested record' do
|
47
|
+
account = create(:account, name: 'A Co.')
|
48
|
+
property = create(:property, name: 'Empire State Building', accounts: [account])
|
49
|
+
|
50
|
+
@controller = PropertiesController.new
|
51
|
+
put property_path(property), params: { property: { name: 'John Hancock Center', accounts: [{id: account.id, name: "B Co."}]} }, as: :json
|
52
|
+
|
53
|
+
assert_response :ok
|
54
|
+
property.reload
|
55
|
+
assert_equal 'John Hancock Center', property.name
|
56
|
+
assert_equal ['B Co.'], property.accounts.map(&:name)
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'update record and set relation to an empty array' do
|
60
|
+
account = create(:account, name: 'A Co.')
|
61
|
+
property = create(:property, name: 'Empire State Building', accounts: [account])
|
62
|
+
|
63
|
+
@controller = PropertiesController.new
|
64
|
+
put property_path(property), params: { property: { accounts: [] } }, as: :json
|
65
|
+
|
66
|
+
assert_response :ok
|
67
|
+
property.reload
|
68
|
+
assert_equal [], property.accounts
|
69
|
+
end
|
70
|
+
|
71
|
+
test 'update record and include nested record in response' do
|
72
|
+
account = create(:account, name: 'A Co.')
|
73
|
+
property = create(:property, name: 'Empire State Building', accounts: [account])
|
74
|
+
|
75
|
+
@controller = PropertiesController.new
|
76
|
+
put property_path(property), params: { property: { name: 'John Hancock Center', accounts: [{id: account.id, name: "B Co."}]} }, as: :json
|
77
|
+
|
78
|
+
attributes = JSON.parse(response.body)
|
79
|
+
assert_response :ok
|
80
|
+
assert_equal account.id, attributes["accounts"][0]["id"]
|
81
|
+
assert_equal "B Co.", attributes["accounts"][0]["name"]
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'standard_api/test_helper'
|
2
|
+
|
3
|
+
module NestedAttributes
|
4
|
+
class HasOneTest < ActionDispatch::IntegrationTest
|
5
|
+
# include StandardAPI::TestCase
|
6
|
+
include StandardAPI::Helpers
|
7
|
+
|
8
|
+
|
9
|
+
# = Create Test
|
10
|
+
|
11
|
+
test 'create record and create nested record' do
|
12
|
+
@controller = PhotosController.new
|
13
|
+
|
14
|
+
post photos_path, params: { photo: { camera: {make: 'Sony'}} }, as: :json
|
15
|
+
|
16
|
+
photo = Photo.last
|
17
|
+
assert_equal photo.id, photo.camera.photo_id
|
18
|
+
assert_equal 'Sony', photo.camera.make
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'create record and update nested record' do
|
22
|
+
camera = create(:camera, make: 'Sony')
|
23
|
+
|
24
|
+
@controller = PhotosController.new
|
25
|
+
post photos_path, params: { photo: { camera: {id: camera.id, make: 'Nokia'} } }, as: :json
|
26
|
+
|
27
|
+
assert_response :created
|
28
|
+
photo = Photo.last
|
29
|
+
assert_equal photo.id, photo.camera.photo_id
|
30
|
+
assert_equal 'Nokia', photo.camera.make
|
31
|
+
end
|
32
|
+
|
33
|
+
# = Update Test
|
34
|
+
|
35
|
+
test 'update record and create nested record' do
|
36
|
+
photo = create(:photo)
|
37
|
+
|
38
|
+
@controller = PhotosController.new
|
39
|
+
put photo_path(photo), params: { photo: { camera: {make: 'Canon'}} }, as: :json
|
40
|
+
|
41
|
+
assert_response :ok
|
42
|
+
photo.reload
|
43
|
+
assert_equal 'Canon', photo.camera.make
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'update record and update nested record' do
|
47
|
+
camera = create(:camera, make: 'Leica')
|
48
|
+
photo = create(:photo, camera: camera)
|
49
|
+
|
50
|
+
@controller = PhotosController.new
|
51
|
+
put photo_path(photo), params: { photo: { camera: {make: 'Nokia'}} }, as: :json
|
52
|
+
|
53
|
+
assert_response :ok
|
54
|
+
photo.reload
|
55
|
+
assert_equal 'Nokia', photo.camera.make
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'update record and set relation to nil' do
|
59
|
+
camera = create(:camera, make: 'Leica')
|
60
|
+
photo = create(:photo, camera: camera)
|
61
|
+
|
62
|
+
@controller = PhotosController.new
|
63
|
+
put photo_path(photo), params: { photo: { camera: nil} }, as: :json
|
64
|
+
|
65
|
+
assert_response :ok
|
66
|
+
photo.reload
|
67
|
+
assert_nil photo.camera
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -30,4 +30,60 @@ class RouteHelpersTest < ActionDispatch::IntegrationTest
|
|
30
30
|
assert_routing({ path: '/photos/1/properties/1', method: :delete }, { controller: 'photos', action: 'remove_resource', id: '1', relationship: 'properties', resource_id: '1' })
|
31
31
|
end
|
32
32
|
|
33
|
+
test "standard_resources with only option" do
|
34
|
+
with_routing do |set|
|
35
|
+
set.draw do
|
36
|
+
standard_resources :photos, only: [ :index, :show ]
|
37
|
+
end
|
38
|
+
assert_routing({ path: '/photos', method: :get }, { controller: 'photos', action: 'index' })
|
39
|
+
assert_routing({ path: '/photos/1', method: :get }, { controller: 'photos', action: 'show', id: '1' })
|
40
|
+
assert_equal 2, set.routes.size
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
test "standard_resources with except option" do
|
45
|
+
with_routing do |set|
|
46
|
+
set.draw do
|
47
|
+
standard_resources :photos, except: [ :destroy ]
|
48
|
+
end
|
49
|
+
assert_routing({ path: '/photos', method: :get }, { controller: 'photos', action: 'index' })
|
50
|
+
assert_routing({ path: '/photos/1', method: :get }, { controller: 'photos', action: 'show', id: '1' })
|
51
|
+
assert_routing({ path: '/photos/new', method: :get }, { controller: 'photos', action: 'new' })
|
52
|
+
assert_routing({ path: '/photos', method: :post }, { controller: 'photos', action: 'create' })
|
53
|
+
assert_routing({ path: '/photos/1', method: :put }, { controller: 'photos', action: 'update', id: '1' })
|
54
|
+
assert_routing({ path: '/photos/1', method: :patch }, { controller: 'photos', action: 'update', id: '1' })
|
55
|
+
assert_routing({ path: '/photos/schema', method: :get }, { controller: 'photos', action: 'schema' })
|
56
|
+
assert_routing({ path: '/photos/calculate', method: :get }, { controller: 'photos', action: 'calculate' })
|
57
|
+
assert_routing({ path: '/photos/1/properties/1', method: :post }, { controller: 'photos', action: 'add_resource', id: '1', relationship: 'properties', resource_id: '1' })
|
58
|
+
assert_routing({ path: '/photos/1/properties/1', method: :delete }, { controller: 'photos', action: 'remove_resource', id: '1', relationship: 'properties', resource_id: '1' })
|
59
|
+
assert_routing({ path: '/photos/1/properties', method: :post }, { controller: 'photos', action: 'create_resource', id: '1', relationship: 'properties' })
|
60
|
+
assert_equal 12, set.routes.size
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
test "standard_resource with only option" do
|
65
|
+
with_routing do |set|
|
66
|
+
set.draw do
|
67
|
+
standard_resource :accounts, only: :show
|
68
|
+
end
|
69
|
+
assert_routing({ path: '/accounts', method: :get }, { controller: 'accounts', action: 'show' })
|
70
|
+
assert_equal 1, set.routes.size
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
test "standard_resource with except option" do
|
75
|
+
with_routing do |set|
|
76
|
+
set.draw do
|
77
|
+
standard_resource :accounts, except: [ :destroy ]
|
78
|
+
end
|
79
|
+
assert_routing({ path: '/accounts', method: :get }, { controller: 'accounts', action: 'show' })
|
80
|
+
assert_routing({ path: '/accounts/new', method: :get }, { controller: 'accounts', action: 'new' })
|
81
|
+
assert_routing({ path: '/accounts', method: :post }, { controller: 'accounts', action: 'create' })
|
82
|
+
assert_routing({ path: '/accounts', method: :put }, { controller: 'accounts', action: 'update' })
|
83
|
+
assert_routing({ path: '/accounts', method: :patch }, { controller: 'accounts', action: 'update' })
|
84
|
+
assert_routing({ path: '/accounts/schema', method: :get }, { controller: 'accounts', action: 'schema' })
|
85
|
+
assert_routing({ path: '/accounts/calculate', method: :get }, { controller: 'accounts', action: 'calculate' })
|
86
|
+
assert_equal 10, set.routes.size
|
87
|
+
end
|
88
|
+
end
|
33
89
|
end
|
@@ -92,18 +92,33 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
92
92
|
assert_equal @controller.send(:model_includes), []
|
93
93
|
end
|
94
94
|
|
95
|
-
test 'Controller#model_params defaults to
|
95
|
+
test 'Controller#model_params defaults to ActionController::Parameters' do
|
96
|
+
@controller = DocumentsController.new
|
97
|
+
@controller.params = ActionController::Parameters.new
|
98
|
+
assert_equal @controller.send(:model_params), ActionController::Parameters.new
|
99
|
+
end
|
100
|
+
|
101
|
+
test 'Controller#model_params defaults to ActionController::Parameters when no resource_attributes' do
|
96
102
|
@controller = ReferencesController.new
|
97
|
-
@controller.params =
|
103
|
+
@controller.params = ActionController::Parameters.new
|
98
104
|
assert_equal @controller.send(:model_params), ActionController::Parameters.new
|
99
105
|
end
|
100
106
|
|
101
|
-
test 'Controller#
|
107
|
+
test 'Controller#mask' do
|
102
108
|
@controller = ReferencesController.new
|
103
|
-
@controller.
|
109
|
+
@controller.define_singleton_method(:mask_for) do |table_name|
|
110
|
+
{subject_id: 1}
|
111
|
+
end
|
104
112
|
@controller.params = {}
|
105
113
|
assert_equal 'SELECT "references".* FROM "references" WHERE "references"."subject_id" = 1', @controller.send(:resources).to_sql
|
106
114
|
end
|
115
|
+
|
116
|
+
test "Auto includes on a controller without a model" do
|
117
|
+
@controller = SessionsController.new
|
118
|
+
assert_nil @controller.send(:model)
|
119
|
+
post sessions_path(format: :json), params: {session: {user: 'user', pass: 'pass'}}
|
120
|
+
assert_response :ok
|
121
|
+
end
|
107
122
|
|
108
123
|
test 'ApplicationController#schema.json' do
|
109
124
|
get schema_path(format: 'json')
|
@@ -112,7 +127,7 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
112
127
|
controllers = ApplicationController.descendants
|
113
128
|
controllers.select! { |c| c.ancestors.include?(StandardAPI::Controller) && c != StandardAPI::Controller }
|
114
129
|
|
115
|
-
@controller.send(:models).reject { |x| x.name
|
130
|
+
@controller.send(:models).reject { |x| %w(Photo Document).include?(x.name) }.each do |model|
|
116
131
|
assert_equal true, schema['models'].has_key?(model.name)
|
117
132
|
|
118
133
|
model_comment = model.connection.table_comment(model.table_name)
|
@@ -125,7 +140,7 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
125
140
|
model.columns.each do |column|
|
126
141
|
assert_equal json_column_type(column.sql_type), schema.dig('models', model.name, 'attributes', column.name, 'type')
|
127
142
|
default = column.default
|
128
|
-
if default
|
143
|
+
if default
|
129
144
|
default = model.connection.lookup_cast_type_from_column(column).deserialize(default)
|
130
145
|
assert_equal default, schema.dig('models', model.name, 'attributes', column.name, 'default')
|
131
146
|
else
|
@@ -134,11 +149,15 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
134
149
|
assert_equal column.name == model.primary_key, schema.dig('models', model.name, 'attributes', column.name, 'primary_key')
|
135
150
|
assert_equal column.null, schema.dig('models', model.name, 'attributes', column.name, 'null')
|
136
151
|
assert_equal column.array, schema.dig('models', model.name, 'attributes', column.name, 'array')
|
137
|
-
if column.comment
|
152
|
+
if column.comment
|
138
153
|
assert_equal column.comment, schema.dig('models', model.name, 'attributes', column.name, 'comment')
|
139
154
|
else
|
140
155
|
assert_nil schema.dig('models', model.name, 'attributes', column.name, 'comment')
|
141
156
|
end
|
157
|
+
|
158
|
+
if column.respond_to?(:auto_populated?)
|
159
|
+
assert_equal !!column.auto_populated?, schema.dig('models', model.name, 'attributes', column.name, 'auto_populated')
|
160
|
+
end
|
142
161
|
end
|
143
162
|
end
|
144
163
|
|
@@ -163,6 +182,26 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
163
182
|
assert_nil schema['limit']
|
164
183
|
end
|
165
184
|
|
185
|
+
test 'Controller#schema.json for an enum with default' do
|
186
|
+
get schema_documents_path(format: 'json')
|
187
|
+
|
188
|
+
schema = JSON(response.body)
|
189
|
+
|
190
|
+
assert_equal true, schema.has_key?('attributes')
|
191
|
+
assert_equal 'string', schema['attributes']['level']['type']
|
192
|
+
assert_equal 'public', schema['attributes']['level']['default']
|
193
|
+
end
|
194
|
+
|
195
|
+
test 'Controller#schema.json for an enum without default' do
|
196
|
+
get schema_documents_path(format: 'json')
|
197
|
+
|
198
|
+
schema = JSON(response.body)
|
199
|
+
|
200
|
+
assert_equal true, schema.has_key?('attributes')
|
201
|
+
assert_equal 'string', schema['attributes']['rating']['type']
|
202
|
+
assert_nil schema['attributes']['rating']['default']
|
203
|
+
end
|
204
|
+
|
166
205
|
test 'Controller#index w/o limit' do
|
167
206
|
account = create(:account)
|
168
207
|
get unlimited_index_path(format: 'json')
|
@@ -188,47 +227,6 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
188
227
|
assert_redirected_to document_path(pdf)
|
189
228
|
end
|
190
229
|
|
191
|
-
test 'Controller#add_resource' do
|
192
|
-
property = create(:property, photos: [])
|
193
|
-
photo = create(:photo)
|
194
|
-
|
195
|
-
post "/properties/#{property.id}/photos/#{photo.id}"
|
196
|
-
assert_equal property.photos.reload.map(&:id), [photo.id]
|
197
|
-
assert_response :created
|
198
|
-
|
199
|
-
post "/properties/#{property.id}/photos/9999999"
|
200
|
-
assert_response :not_found
|
201
|
-
end
|
202
|
-
|
203
|
-
test 'Controller#add_resource with has_one' do
|
204
|
-
photo = create(:document)
|
205
|
-
property = create(:property)
|
206
|
-
post "/properties/#{property.id}/document/#{photo.id}"
|
207
|
-
assert_equal property.reload.document, photo
|
208
|
-
assert_response :created
|
209
|
-
end
|
210
|
-
|
211
|
-
test 'Controller#remove_resource' do
|
212
|
-
photo = create(:photo)
|
213
|
-
property = create(:property, photos: [photo])
|
214
|
-
assert_equal property.photos.reload, [photo]
|
215
|
-
delete "/properties/#{property.id}/photos/#{photo.id}"
|
216
|
-
assert_equal property.photos.reload, []
|
217
|
-
assert_response :no_content
|
218
|
-
|
219
|
-
delete "/properties/#{property.id}/photos/9999999"
|
220
|
-
assert_response :not_found
|
221
|
-
end
|
222
|
-
|
223
|
-
test 'Controller#remove_resource with has_one' do
|
224
|
-
photo = create(:document)
|
225
|
-
property = create(:property, document: photo)
|
226
|
-
assert_equal property.document, photo
|
227
|
-
delete "/properties/#{property.id}/document/#{photo.id}"
|
228
|
-
assert_nil property.reload.document
|
229
|
-
assert_response :no_content
|
230
|
-
end
|
231
|
-
|
232
230
|
# = View Tests
|
233
231
|
|
234
232
|
test 'rendering tables' do
|
@@ -236,7 +234,7 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
236
234
|
assert_response :ok
|
237
235
|
# assert_equal ['properties', 'accounts', 'photos', 'references', 'sessions', 'unlimited'], response.parsed_body
|
238
236
|
# Multiple 'accounts' because multiple controllers with that model for testing.
|
239
|
-
assert_equal ["properties", "accounts", "documents", "photos", "references", "accounts", 'accounts'].sort, response.parsed_body.sort
|
237
|
+
assert_equal ["properties", "accounts", "documents", "photos", "references", "accounts", 'accounts', 'uuid_models'].sort, response.parsed_body.sort
|
240
238
|
end
|
241
239
|
|
242
240
|
test 'rendering null attribute' do
|
@@ -246,13 +244,45 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
246
244
|
assert_nil JSON(response.body)['landlord']
|
247
245
|
end
|
248
246
|
|
247
|
+
test 'rendering binary attribute' do
|
248
|
+
reference = create(:reference, sha: "Hello World")
|
249
|
+
get reference_path(reference, format: 'json'), params: { id: reference.id }
|
250
|
+
assert_equal "48656c6c6f20576f726c64", JSON(response.body)['sha']
|
251
|
+
end
|
252
|
+
|
253
|
+
test 'rendering a custom binary attribute' do
|
254
|
+
reference = create(:reference, custom_binary: 2)
|
255
|
+
get reference_path(reference, format: 'json'), params: { id: reference.id }
|
256
|
+
assert_equal 2, JSON(response.body)['custom_binary']
|
257
|
+
assert_equal "\\x00000002".b,reference.custom_binary_before_type_cast
|
258
|
+
end
|
259
|
+
|
249
260
|
test 'rendering null attribute for has_one through' do
|
250
261
|
property = create(:property)
|
251
262
|
get property_path(property, format: 'json'), params: { id: property.id, include: [:document] }
|
252
263
|
assert JSON(response.body).has_key?('document')
|
253
264
|
assert_nil JSON(response.body)['document']
|
254
265
|
end
|
266
|
+
|
267
|
+
test 'rendering serialize_attribute' do
|
268
|
+
property = create(:property, description: 'This text will magically change')
|
269
|
+
get property_path(property, format: 'json'), params: { id: property.id, magic: true }
|
255
270
|
|
271
|
+
body = JSON(response.body)
|
272
|
+
assert_equal body['description'], 'See it changed!'
|
273
|
+
end
|
274
|
+
|
275
|
+
test 'rendering an enum' do
|
276
|
+
public_document = create(:document, level: 'public')
|
277
|
+
|
278
|
+
get documents_path(format: 'json'), params: { limit: 1 }
|
279
|
+
assert_equal JSON(response.body)[0]['level'], 'public'
|
280
|
+
|
281
|
+
secret_document = create(:document, level: 'secret')
|
282
|
+
get document_path(secret_document, format: 'json')
|
283
|
+
assert_equal JSON(response.body)['level'], 'secret'
|
284
|
+
end
|
285
|
+
|
256
286
|
test '#index.json uses overridden partial' do
|
257
287
|
create(:property, photos: [create(:photo)])
|
258
288
|
get properties_path(format: 'json'), params: { limit: 100, include: [{:photos => { order: :id }}] }
|
@@ -444,7 +474,7 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|
444
474
|
},
|
445
475
|
format: 'json')
|
446
476
|
|
447
|
-
assert_equal [photos.first
|
477
|
+
assert_equal [photos.map(&:id).sort.first], JSON(response.body)['photos'].map { |x| x['id'] }
|
448
478
|
|
449
479
|
get property_path(property,
|
450
480
|
include: {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module PropertyACL
|
2
2
|
|
3
|
+
# Attributes allowed to be updated
|
3
4
|
def attributes
|
4
5
|
[ :name,
|
5
6
|
:aliases,
|
@@ -12,16 +13,21 @@ module PropertyACL
|
|
12
13
|
]
|
13
14
|
end
|
14
15
|
|
16
|
+
# Orderings allowed
|
15
17
|
def orders
|
16
18
|
["id", "name", "aliases", "description", "constructed", "size", "created_at", "active"]
|
17
19
|
end
|
18
20
|
|
21
|
+
# Sub resources allowed to be included in the response
|
19
22
|
def includes
|
20
23
|
[ :photos, :landlord, :english_name, :document ]
|
21
24
|
end
|
22
25
|
|
26
|
+
# Sub resourced allowed to be set during create / update / delete if a user is
|
27
|
+
# allowed to ....
|
28
|
+
# only add to and from the relation, can also create or update the subresource
|
23
29
|
def nested
|
24
|
-
[ :photos ]
|
30
|
+
[ :photos, :accounts ]
|
25
31
|
end
|
26
32
|
|
27
33
|
end
|
@@ -2,6 +2,18 @@ class ApplicationController < ActionController::Base
|
|
2
2
|
include StandardAPI::Controller
|
3
3
|
include StandardAPI::AccessControlList
|
4
4
|
prepend_view_path File.join(File.dirname(__FILE__), 'views')
|
5
|
+
|
6
|
+
helper_method :serialize_attribute
|
7
|
+
|
8
|
+
def serialize_attribute(json, record, attribute, type)
|
9
|
+
value = if attribute == 'description' && params["magic"] === "true"
|
10
|
+
'See it changed!'
|
11
|
+
else
|
12
|
+
record.send(attribute)
|
13
|
+
end
|
14
|
+
|
15
|
+
json.set! attribute, type == :binary ? value&.unpack1('H*') : value
|
16
|
+
end
|
5
17
|
|
6
18
|
end
|
7
19
|
|
@@ -48,6 +60,8 @@ class ReferencesController < ApplicationController
|
|
48
60
|
end
|
49
61
|
|
50
62
|
class SessionsController < ApplicationController
|
63
|
+
def create
|
64
|
+
end
|
51
65
|
end
|
52
66
|
|
53
67
|
class UnlimitedController < ApplicationController
|
@@ -73,3 +87,6 @@ class DefaultLimitController < ApplicationController
|
|
73
87
|
end
|
74
88
|
|
75
89
|
end
|
90
|
+
|
91
|
+
class UuidModelController < ApplicationController
|
92
|
+
end
|