ixtlan-remote 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/README.md +64 -0
- data/agpl-3.0.txt +661 -0
- data/lib/ixtlan-remote.rb +23 -0
- data/lib/ixtlan/passwords.rb +52 -0
- data/lib/ixtlan/passwords.rb~ +47 -0
- data/lib/ixtlan/railtie.rb~ +17 -0
- data/lib/ixtlan/remote.rb +23 -0
- data/lib/ixtlan/remote/access_controller.rb +62 -0
- data/lib/ixtlan/remote/access_controller.rb~ +25 -0
- data/lib/ixtlan/remote/constant_time_compare.rb +39 -0
- data/lib/ixtlan/remote/constant_time_compare.rb~ +19 -0
- data/lib/ixtlan/remote/heartbeat.rb~ +80 -0
- data/lib/ixtlan/remote/model_conversion.rb~ +245 -0
- data/lib/ixtlan/remote/model_helpers.rb +73 -0
- data/lib/ixtlan/remote/model_helpers.rb~ +53 -0
- data/lib/ixtlan/remote/permission.rb +40 -0
- data/lib/ixtlan/remote/permission.rb~ +19 -0
- data/lib/ixtlan/remote/railtie.rb +30 -0
- data/lib/ixtlan/remote/railtie.rb~ +9 -0
- data/lib/ixtlan/remote/remote_access_controller.rb~ +25 -0
- data/lib/ixtlan/remote/remote_permisson.rb~ +9 -0
- data/lib/ixtlan/remote/resource.rb +145 -0
- data/lib/ixtlan/remote/resource.rb-~ +165 -0
- data/lib/ixtlan/remote/resource.rb~ +152 -0
- data/lib/ixtlan/remote/rest.rb +108 -0
- data/lib/ixtlan/remote/rest.rb~ +83 -0
- data/lib/ixtlan/remote/rest_resource.rb~ +140 -0
- data/lib/ixtlan/remote/rest_resource_config.rb~ +63 -0
- data/lib/ixtlan/remote/rest_resource_factory.rb~ +259 -0
- data/lib/ixtlan/remote/rest_resource_old.rb-~ +259 -0
- data/lib/ixtlan/remote/server.rb +119 -0
- data/lib/ixtlan/remote/server.rb~ +82 -0
- data/lib/ixtlan/remote/summary.rb +46 -0
- data/lib/ixtlan/remote/summary.rb~ +23 -0
- data/lib/ixtlan/remote/sync.rb +104 -0
- data/lib/ixtlan/remote/sync.rb~ +78 -0
- data/lib/ixtlan/remote/sync_summary.rb~ +23 -0
- data/lib/ixtlan/remote/tranlation_key.rb~ +7 -0
- data/lib/ixtlan/remote/translation.rake~ +194 -0
- data/lib/ixtlan/remote/translation_models.rb~ +11 -0
- data/lib/ixtlan/remote/updater.rb~ +71 -0
- data/lib/ixtlan/user_management/application_model.rb +30 -0
- data/lib/ixtlan/user_management/application_model.rb~ +21 -0
- data/lib/ixtlan/user_management/application_resource.rb +48 -0
- data/lib/ixtlan/user_management/application_resource.rb~ +21 -0
- data/lib/ixtlan/user_management/authentcator.rb~ +31 -0
- data/lib/ixtlan/user_management/authentication_model.rb +31 -0
- data/lib/ixtlan/user_management/authentication_model.rb~ +21 -0
- data/lib/ixtlan/user_management/authenticator.rb +55 -0
- data/lib/ixtlan/user_management/authenticator.rb~ +20 -0
- data/lib/ixtlan/user_management/domain_resource.rb +48 -0
- data/lib/ixtlan/user_management/domain_resource.rb~ +21 -0
- data/lib/ixtlan/user_management/dummy_authentication.rb +50 -0
- data/lib/ixtlan/user_management/dummy_authentication.rb~ +49 -0
- data/lib/ixtlan/user_management/group.rb~ +39 -0
- data/lib/ixtlan/user_management/group_model.rb +31 -0
- data/lib/ixtlan/user_management/group_model.rb~ +21 -0
- data/lib/ixtlan/user_management/models.rb~ +39 -0
- data/lib/ixtlan/user_management/session-serializer.rb~ +18 -0
- data/lib/ixtlan/user_management/session_cuba.rb +47 -0
- data/lib/ixtlan/user_management/session_cuba.rb~ +44 -0
- data/lib/ixtlan/user_management/session_manager.rb +38 -0
- data/lib/ixtlan/user_management/session_model.rb +36 -0
- data/lib/ixtlan/user_management/session_model.rb~ +10 -0
- data/lib/ixtlan/user_management/session_plugin.rb +32 -0
- data/lib/ixtlan/user_management/session_serializer.rb +21 -0
- data/lib/ixtlan/user_management/session_serializer.rb~ +21 -0
- data/lib/ixtlan/user_management/user.rb~ +16 -0
- data/lib/ixtlan/user_management/user_model.rb +36 -0
- data/lib/ixtlan/user_management/user_model.rb~ +33 -0
- data/lib/ixtlan/user_management/user_resource.rb +55 -0
- data/lib/ixtlan/user_management/user_resource.rb~ +24 -0
- data/lib/ixtlan/user_management/user_serializer.rb +15 -0
- data/lib/ixtlan/user_management/user_serializer.rb~ +23 -0
- data/spec/access_controller_spec.rb +65 -0
- data/spec/access_controller_spec.rb~ +65 -0
- data/spec/model_helpers_spec.rb +40 -0
- data/spec/model_helpers_spec.rb~ +36 -0
- data/spec/remote_access_controller_spec.rb~ +36 -0
- data/spec/resource_spec.rb +181 -0
- data/spec/resource_spec.rb~ +173 -0
- data/spec/rest_resource_spec.rb~ +173 -0
- data/spec/rest_spec.rb +94 -0
- data/spec/rest_spec.rb~ +99 -0
- data/spec/rest_with_attribute_name_like_model_name_spec.rb +82 -0
- data/spec/sync_spec.rb +83 -0
- data/spec/sync_spec.rb~ +81 -0
- metadata +313 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'ixtlan/remote/resource'
|
2
|
+
require 'ixtlan/remote/server'
|
3
|
+
require 'json'
|
4
|
+
class RestClientMock
|
5
|
+
|
6
|
+
def [](path)
|
7
|
+
@path = path
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :path
|
12
|
+
attr_accessor :response_payload
|
13
|
+
|
14
|
+
def response_payload( *args )
|
15
|
+
@response_payload
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :post :response_payload
|
19
|
+
alias :put :response_payload
|
20
|
+
alias :delete :response_payload
|
21
|
+
|
22
|
+
end
|
23
|
+
class User
|
24
|
+
|
25
|
+
def initialize( args = {} )
|
26
|
+
@id = (args || {})['id'].to_i
|
27
|
+
@name = (args || {})['name']
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :id, :name
|
31
|
+
|
32
|
+
def attributes
|
33
|
+
{'id' => @id, 'name' => @name }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
ClientUser = User
|
37
|
+
|
38
|
+
describe Ixtlan::Remote::RestResource do
|
39
|
+
|
40
|
+
subject do
|
41
|
+
Ixtlan::Remote::RestResource.new( rest_client,
|
42
|
+
{ User => Ixtlan::Remote::Server::Meta.new( nil, User.method(:new) ),
|
43
|
+
ClientUser => Ixtlan::Remote::Server::Meta.new( :users, ClientUser.method(:new) ) } )
|
44
|
+
end
|
45
|
+
|
46
|
+
let( :rest_client ) { ::RestClientMock.new }
|
47
|
+
|
48
|
+
describe 'create' do
|
49
|
+
[ User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
50
|
+
it 'user without root' do
|
51
|
+
|
52
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
53
|
+
|
54
|
+
u = subject.create( *user, :name => 'bla' ).send_it
|
55
|
+
u.id.must_equal 1
|
56
|
+
u.name.must_equal 'bla'
|
57
|
+
|
58
|
+
subject.model.must_equal User
|
59
|
+
rest_client.path.must_match /(.*\/)?users$/
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'user with root' do
|
63
|
+
|
64
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
65
|
+
|
66
|
+
u = subject.create( *user, :name => 'bla' ).send_it
|
67
|
+
u.id.must_equal 1
|
68
|
+
u.name.must_equal 'bla'
|
69
|
+
|
70
|
+
subject.model.must_equal User
|
71
|
+
rest_client.path.must_match /(.*\/)?users$/
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'retrieve' do
|
77
|
+
[ User.new('id' => 1), User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
78
|
+
it 'user without root' do
|
79
|
+
|
80
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
81
|
+
|
82
|
+
u = subject.create( *user, 1 ).send_it
|
83
|
+
u.id.must_equal 1
|
84
|
+
u.name.must_equal 'bla'
|
85
|
+
|
86
|
+
subject.model.must_equal User
|
87
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'users without root' do
|
91
|
+
|
92
|
+
rest_client.response_payload = '[ { "id": 1, "name": "bla" }, { "id": 2, "name": "blabla" } ]'
|
93
|
+
|
94
|
+
u = subject.create( *user ).send_it
|
95
|
+
u.size.must_equal 2
|
96
|
+
u[0].id.must_equal 1
|
97
|
+
u[0].name.must_equal 'bla'
|
98
|
+
u[1].id.must_equal 2
|
99
|
+
u[1].name.must_equal 'blabla'
|
100
|
+
|
101
|
+
subject.model.must_equal User
|
102
|
+
rest_client.path.must_match /(.*\/)?users$/
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'user with root' do
|
106
|
+
|
107
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
108
|
+
|
109
|
+
u = subject.create( *user, 1 ).send_it
|
110
|
+
u.id.must_equal 1
|
111
|
+
u.name.must_equal 'bla'
|
112
|
+
|
113
|
+
subject.model.must_equal User
|
114
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'users with root' do
|
118
|
+
|
119
|
+
rest_client.response_payload = '[ { "user": { "id": 1, "name": "bla" } }, { "user": { "id": 2, "name": "blabla" } } ]'
|
120
|
+
|
121
|
+
u = subject.create( *user ).send_it
|
122
|
+
u.size.must_equal 2
|
123
|
+
u[0].id.must_equal 1
|
124
|
+
u[0].name.must_equal 'bla'
|
125
|
+
u[1].id.must_equal 2
|
126
|
+
u[1].name.must_equal 'blabla'
|
127
|
+
|
128
|
+
subject.model.must_equal User
|
129
|
+
rest_client.path.must_match /(.*\/)?users$/
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe 'update' do
|
135
|
+
[ User.new('id' => 1), User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
136
|
+
it 'user without root' do
|
137
|
+
|
138
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
139
|
+
|
140
|
+
u = subject.update( *user, 1, :name => 'buh' ).send_it
|
141
|
+
u.id.must_equal 1
|
142
|
+
u.name.must_equal 'bla'
|
143
|
+
|
144
|
+
subject.model.must_equal User
|
145
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'user with root' do
|
149
|
+
|
150
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
151
|
+
|
152
|
+
u = subject.create( *user, 1, :name => 'buh' ).send_it
|
153
|
+
u.id.must_equal 1
|
154
|
+
u.name.must_equal 'bla'
|
155
|
+
|
156
|
+
subject.model.must_equal User
|
157
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe 'delete' do
|
163
|
+
[ User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
164
|
+
it 'user' do
|
165
|
+
|
166
|
+
subject.delete( *user, 1 ).send_it.must_be_nil
|
167
|
+
|
168
|
+
subject.model.must_equal User
|
169
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'ixtlan/remote/rest_resource'
|
2
|
+
require 'ixtlan/remote/server'
|
3
|
+
require 'json'
|
4
|
+
class RestClientMock
|
5
|
+
|
6
|
+
def [](path)
|
7
|
+
@path = path
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :path
|
12
|
+
attr_accessor :response_payload
|
13
|
+
|
14
|
+
def response_payload( *args )
|
15
|
+
@response_payload
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :post :response_payload
|
19
|
+
alias :put :response_payload
|
20
|
+
alias :delete :response_payload
|
21
|
+
|
22
|
+
end
|
23
|
+
class User
|
24
|
+
|
25
|
+
def initialize( args = {} )
|
26
|
+
@id = (args || {})['id'].to_i
|
27
|
+
@name = (args || {})['name']
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :id, :name
|
31
|
+
|
32
|
+
def attributes
|
33
|
+
{'id' => @id, 'name' => @name }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
ClientUser = User
|
37
|
+
|
38
|
+
describe Ixtlan::Remote::RestResource do
|
39
|
+
|
40
|
+
subject do
|
41
|
+
Ixtlan::Remote::RestResource.new( rest_client,
|
42
|
+
{ User => Ixtlan::Remote::Server::Meta.new( nil, User.method(:new) ),
|
43
|
+
ClientUser => Ixtlan::Remote::Server::Meta.new( :users, ClientUser.method(:new) ) } )
|
44
|
+
end
|
45
|
+
|
46
|
+
let( :rest_client ) { ::RestClientMock.new }
|
47
|
+
|
48
|
+
describe 'create' do
|
49
|
+
[ User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
50
|
+
it 'user without root' do
|
51
|
+
|
52
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
53
|
+
|
54
|
+
u = subject.create( *user, :name => 'bla' ).send_it
|
55
|
+
u.id.must_equal 1
|
56
|
+
u.name.must_equal 'bla'
|
57
|
+
|
58
|
+
subject.model.must_equal User
|
59
|
+
rest_client.path.must_match /(.*\/)?users$/
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'user with root' do
|
63
|
+
|
64
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
65
|
+
|
66
|
+
u = subject.create( *user, :name => 'bla' ).send_it
|
67
|
+
u.id.must_equal 1
|
68
|
+
u.name.must_equal 'bla'
|
69
|
+
|
70
|
+
subject.model.must_equal User
|
71
|
+
rest_client.path.must_match /(.*\/)?users$/
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'retrieve' do
|
77
|
+
[ User.new('id' => 1), User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
78
|
+
it 'user without root' do
|
79
|
+
|
80
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
81
|
+
|
82
|
+
u = subject.create( *user, 1 ).send_it
|
83
|
+
u.id.must_equal 1
|
84
|
+
u.name.must_equal 'bla'
|
85
|
+
|
86
|
+
subject.model.must_equal User
|
87
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'users without root' do
|
91
|
+
|
92
|
+
rest_client.response_payload = '[ { "id": 1, "name": "bla" }, { "id": 2, "name": "blabla" } ]'
|
93
|
+
|
94
|
+
u = subject.create( *user ).send_it
|
95
|
+
u.size.must_equal 2
|
96
|
+
u[0].id.must_equal 1
|
97
|
+
u[0].name.must_equal 'bla'
|
98
|
+
u[1].id.must_equal 2
|
99
|
+
u[1].name.must_equal 'blabla'
|
100
|
+
|
101
|
+
subject.model.must_equal User
|
102
|
+
rest_client.path.must_match /(.*\/)?users$/
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'user with root' do
|
106
|
+
|
107
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
108
|
+
|
109
|
+
u = subject.create( *user, 1 ).send_it
|
110
|
+
u.id.must_equal 1
|
111
|
+
u.name.must_equal 'bla'
|
112
|
+
|
113
|
+
subject.model.must_equal User
|
114
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'users with root' do
|
118
|
+
|
119
|
+
rest_client.response_payload = '[ { "user": { "id": 1, "name": "bla" } }, { "user": { "id": 2, "name": "blabla" } } ]'
|
120
|
+
|
121
|
+
u = subject.create( *user ).send_it
|
122
|
+
u.size.must_equal 2
|
123
|
+
u[0].id.must_equal 1
|
124
|
+
u[0].name.must_equal 'bla'
|
125
|
+
u[1].id.must_equal 2
|
126
|
+
u[1].name.must_equal 'blabla'
|
127
|
+
|
128
|
+
subject.model.must_equal User
|
129
|
+
rest_client.path.must_match /(.*\/)?users$/
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe 'update' do
|
135
|
+
[ User.new('id' => 1), User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
136
|
+
it 'user without root' do
|
137
|
+
|
138
|
+
rest_client.response_payload = '{ "id": 1, "name": "bla" }'
|
139
|
+
|
140
|
+
u = subject.update( *user, 1, :name => 'buh' ).send_it
|
141
|
+
u.id.must_equal 1
|
142
|
+
u.name.must_equal 'bla'
|
143
|
+
|
144
|
+
subject.model.must_equal User
|
145
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'user with root' do
|
149
|
+
|
150
|
+
rest_client.response_payload = '{ "user": { "id": 1, "name": "bla" } }'
|
151
|
+
|
152
|
+
u = subject.create( *user, 1, :name => 'buh' ).send_it
|
153
|
+
u.id.must_equal 1
|
154
|
+
u.name.must_equal 'bla'
|
155
|
+
|
156
|
+
subject.model.must_equal User
|
157
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe 'delete' do
|
163
|
+
[ User, :users, "users", ["admins", 1, User], ["admins/1", User], ClientUser ].each do |user|
|
164
|
+
it 'user' do
|
165
|
+
|
166
|
+
subject.delete( *user, 1 ).send_it.must_be_nil
|
167
|
+
|
168
|
+
subject.model.must_equal User
|
169
|
+
rest_client.path.must_match /(.*\/)?users\/1$/
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
data/spec/rest_spec.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'ixtlan/remote/sync'
|
2
|
+
require 'ixtlan/remote/rest'
|
3
|
+
require 'dm-migrations'
|
4
|
+
require 'dm-sqlite-adapter'
|
5
|
+
require 'webmock/minitest'
|
6
|
+
|
7
|
+
class Admin
|
8
|
+
include DataMapper::Resource
|
9
|
+
|
10
|
+
property :id, Serial
|
11
|
+
property :name, String
|
12
|
+
end
|
13
|
+
DataMapper.setup(:default, "sqlite::memory:")
|
14
|
+
Admin.auto_migrate!
|
15
|
+
|
16
|
+
describe Ixtlan::Remote::Rest do
|
17
|
+
subject do
|
18
|
+
factory = Ixtlan::Remote::Rest.new
|
19
|
+
factory.server( :users ) do |s|
|
20
|
+
s.url = baseurl
|
21
|
+
s.add_model( Admin )
|
22
|
+
end
|
23
|
+
factory
|
24
|
+
end
|
25
|
+
|
26
|
+
let( :baseurl ) { 'http://www.example.com' }
|
27
|
+
let( :headers ) { { 'Accept'=>'application/json', 'Accept-Encoding'=>'gzip, deflate', 'Content-Type'=>'application/json' }}#, 'User-Agent'=>'Ruby' } }
|
28
|
+
let( :url ) { baseurl + "/admins/" }
|
29
|
+
let( :stub_get ) { stub_request(:get, url ).with(:headers => headers ) }
|
30
|
+
let( :stub_get432 ) { stub_request(:get, url + "432" ).with(:headers => headers ) }
|
31
|
+
let( :stub_post ) { stub_request(:post, url ) }
|
32
|
+
let( :stub_put ) { stub_request(:put, url + "1" ) }
|
33
|
+
let( :stub_delete ) { stub_request(:delete, url + "1" ) }
|
34
|
+
|
35
|
+
[ Admin, :admins, 'admins' ].each do |admin|
|
36
|
+
it 'retrieve collection' do
|
37
|
+
stub_get.to_return(:status => 200, :body => '[ {"id": 123, "name": "bla" } ]', :headers => {})
|
38
|
+
|
39
|
+
a = subject.retrieve( admin ).first
|
40
|
+
|
41
|
+
a.new?.must_equal true
|
42
|
+
a.id.must_equal 123
|
43
|
+
a.name.must_equal 'bla'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
[ [ Admin, 432 ], [ :admins, 432 ], [ 'admins', 432 ] ].each do |admin|
|
48
|
+
it 'retrieve entity' do
|
49
|
+
stub_get432.to_return(:status => 200, :body => '[ {"id": 123, "name": "bla" } ]', :headers => {})
|
50
|
+
|
51
|
+
a = subject.retrieve( *admin ).first
|
52
|
+
|
53
|
+
a.new?.must_equal true
|
54
|
+
a.id.must_equal 123
|
55
|
+
a.name.must_equal 'bla'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
[ Admin.new( :name => 'something' ), [ Admin, { :name => 'something' } ], [ :admins, { :name => 'something' } ], [ 'admins', { :name => 'something' } ] ].each do |admin|
|
60
|
+
it 'create' do
|
61
|
+
stub_post.with( :body => "{\"name\":\"something\"}", :headers => headers ).to_return( :status => 200, :body => '{"id": 111, "name": "bla" }' )
|
62
|
+
|
63
|
+
a = subject.create( *admin )
|
64
|
+
|
65
|
+
a.new?.must_equal true
|
66
|
+
a.id.must_equal 111
|
67
|
+
a.name.must_equal 'bla'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
DATA = { :id => 1, :name => 'something' }
|
72
|
+
[ Admin.new( :id => 1, :name => 'something' ), [ Admin, 1, DATA ], [ :admins, 1, DATA], [ 'admins', 1, DATA ] ].each do |admin|
|
73
|
+
it 'update' do
|
74
|
+
stub_put.with( :body => DATA.to_json, :headers => headers.merge({'Content-Length'=>'27'}) ).to_return( :status => 200, :body => '{"id": 111, "name": "bla" }' )
|
75
|
+
|
76
|
+
a = subject.update( *admin )
|
77
|
+
|
78
|
+
a.new?.must_equal true
|
79
|
+
a.id.must_equal 111
|
80
|
+
a.name.must_equal 'bla'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
[ Admin.new( :id => 1, :name => 'something' ), [ Admin, 1, { :id => 1, :name => 'something' } ], [ :admins, 1, { :id => 1, :name => 'something' } ], [ 'admins', 1, { :id => 1, :name => 'something' } ] ].each do |admin|
|
85
|
+
it 'delete' do
|
86
|
+
stub_delete.with( :headers => headers ).to_return( :status => 200 )
|
87
|
+
|
88
|
+
a = subject.delete( *admin )
|
89
|
+
|
90
|
+
a.must_be_nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/spec/rest_spec.rb~
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'ixtlan/remote/sync'
|
2
|
+
require 'ixtlan/remote/rest'
|
3
|
+
require 'dm-migrations'
|
4
|
+
require 'dm-sqlite-adapter'
|
5
|
+
require 'webmock/minitest'
|
6
|
+
|
7
|
+
class Admin
|
8
|
+
include DataMapper::Resource
|
9
|
+
|
10
|
+
property :id, Serial
|
11
|
+
property :name, String
|
12
|
+
end
|
13
|
+
DataMapper.setup(:default, "sqlite::memory:")
|
14
|
+
Admin.auto_migrate!
|
15
|
+
|
16
|
+
describe Ixtlan::Remote::Rest do
|
17
|
+
subject do
|
18
|
+
factory = Ixtlan::Remote::Rest.new
|
19
|
+
factory.server( :users ) do |s|
|
20
|
+
s.url = baseurl
|
21
|
+
s.add_model( Admin )
|
22
|
+
end
|
23
|
+
factory
|
24
|
+
end
|
25
|
+
|
26
|
+
let( :baseurl ) { 'http://www.example.com' }
|
27
|
+
let( :headers ) { { 'Accept'=>'application/json', 'Accept-Encoding'=>'gzip, deflate', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby' } }
|
28
|
+
let( :url ) { p baseurl; baseurl + "/admins" }
|
29
|
+
let( :stub_get ) { stub_request(:get, url ).with(:headers => headers ) }
|
30
|
+
let( :stub_get432 ) { stub_request(:get, url + "/432" ).with(:headers => headers ) }
|
31
|
+
let( :stub_post ) { stub_request(:post, url ) }
|
32
|
+
let( :stub_put ) { stub_request(:put, url + "/1" ) }
|
33
|
+
let( :stub_delete ) { stub_request(:put, url + "/1" ) }
|
34
|
+
|
35
|
+
[ Admin, :admins, 'admins' ].each do |admin|
|
36
|
+
it 'retrieve collection' do
|
37
|
+
stub_get.to_return(:status => 200, :body => '[ {"id": 123, "name": "bla" } ]', :headers => {})
|
38
|
+
|
39
|
+
a = subject.retrieve( admin ).first
|
40
|
+
|
41
|
+
a.new?.must_equal true
|
42
|
+
a.id.must_equal 123
|
43
|
+
a.name.must_equal 'bla'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
[ [ Admin, 432 ], [ :admins, 432 ], [ 'admins', 432 ] ].each do |admin|
|
48
|
+
it 'retrieve entity' do
|
49
|
+
stub_get432.to_return(:status => 200, :body => '[ {"id": 123, "name": "bla" } ]', :headers => {})
|
50
|
+
|
51
|
+
a = subject.retrieve( *admin ).first
|
52
|
+
|
53
|
+
a.new?.must_equal true
|
54
|
+
a.id.must_equal 123
|
55
|
+
a.name.must_equal 'bla'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
[ Admin.new( :name => 'something' ), [ Admin, { :name => 'something' } ], [ :admins, { :name => 'something' } ], [ 'admins', { :name => 'something' } ] ].each do |admin|
|
60
|
+
it 'create' do
|
61
|
+
stub_post
|
62
|
+
.with( :body => "{\"name\":\"something\"}", :headers => headers )
|
63
|
+
.to_return( :status => 200, :body => '{"id": 111, "name": "bla" }' )
|
64
|
+
|
65
|
+
a = subject.create( *admin )
|
66
|
+
|
67
|
+
a.new?.must_equal true
|
68
|
+
a.id.must_equal 111
|
69
|
+
a.name.must_equal 'bla'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
[ Admin.new( :id => 1, :name => 'something' ), [ Admin, 1, { :id => 1, :name => 'something' } ], [ :admins, 1, { :id => 1, :name => 'something' } ], [ 'admins', 1, { :id => 1, :name => 'something' } ] ].each do |admin|
|
74
|
+
it 'update' do
|
75
|
+
stub_put
|
76
|
+
.with( :body => "{\"id\":1,\"name\":\"something\"}", :headers => headers )
|
77
|
+
.to_return( :status => 200, :body => '{"id": 111, "name": "bla" }' )
|
78
|
+
|
79
|
+
a = subject.update( *admin )
|
80
|
+
|
81
|
+
a.new?.must_equal true
|
82
|
+
a.id.must_equal 111
|
83
|
+
a.name.must_equal 'bla'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
[ Admin.new( :id => 1, :name => 'something' ), [ Admin, 1, { :id => 1, :name => 'something' } ], [ :admins, 1, { :id => 1, :name => 'something' } ], [ 'admins', 1, { :id => 1, :name => 'something' } ] ].each do |admin|
|
88
|
+
it 'delete' do
|
89
|
+
stub_delete
|
90
|
+
.with( :body => "{\"id\":1,\"name\":\"something\"}", :headers => headers )
|
91
|
+
.to_return( :status => 200 )
|
92
|
+
|
93
|
+
a = subject.update( *admin )
|
94
|
+
|
95
|
+
a.must_be_nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|