weasel_diesel 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ describe_service "preferences.xml" do |service|
2
+
3
+ service.params do |p|
4
+ p.namespace :preference do |pr|
5
+ pr.string :language_code, :options => ['en', 'fr']
6
+ pr.string :region_code, :options => ['europe']
7
+ end
8
+ end
9
+
10
+ end
@@ -0,0 +1,20 @@
1
+ if RUBY_VERSION =~ /1.8/
2
+ require 'rubygems'
3
+ require 'backports'
4
+ require 'json'
5
+ end
6
+
7
+ require 'rspec'
8
+ require 'rack/test'
9
+ require 'sinatra'
10
+
11
+ require_relative "../lib/weasel_diesel"
12
+ require_relative 'test_services'
13
+ require_relative 'preferences_service'
14
+ require_relative "../lib/framework_ext/sinatra_controller"
15
+
16
+ ENV["RACK_ENV"] = 'test'
17
+
18
+ RSpec.configure do |conf|
19
+ conf.include Rack::Test::Methods
20
+ end
@@ -0,0 +1,102 @@
1
+ WeaselDieselSpecOptions = ['RSpec', 'Bacon'] # usually pulled from a model
2
+
3
+ describe_service "services/test.xml" do |service|
4
+ service.formats :xml, :json
5
+ service.http_verb :get
6
+
7
+ service.params do |p|
8
+ p.string :framework, :in => WeaselDieselSpecOptions, :null => false, :required => true
9
+
10
+ p.datetime :timestamp, :default => Time.now
11
+ p.string :alpha, :in => ['a', 'b', 'c']
12
+ p.string :version, :null => false
13
+ p.integer :num, :minvalue => 42
14
+
15
+ end
16
+
17
+ # service.param :delta, :optional => true, :type => 'float'
18
+ # # if the optional flag isn't passed, the param is considered required.
19
+ # service.param :epsilon, :type => 'string'
20
+
21
+ service.params.namespace :user do |user|
22
+ user.integer :id, :required => :true
23
+ user.string :sex, :in => %Q{female, male}
24
+ user.boolean :mailing_list, :default => true
25
+ end
26
+
27
+ # the response contains a list of player creation ratings each object in the list
28
+
29
+ =begin
30
+ #Format not supported by Ruby 1.8 due to hash insertion order not being maintained.
31
+ service.response do |response|
32
+ response.element(:name => "player_creation_ratings") do |e|
33
+ e.attribute :id => :integer, :doc => "id doc"
34
+ e.attribute :is_accepted => :boolean, :doc => "is accepted doc"
35
+ e.attribute :name => :string, :doc => "name doc"
36
+
37
+ e.array :player_creation_rating, 'PlayerCreationRating' do |a|
38
+ a.attribute :comments => :string, :doc => "comments doc"
39
+ a.attribute :player_id => :integer, :doc => "player_id doc"
40
+ a.attribute :rating => :integer, :doc => "rating doc"
41
+ a.attribute :username => :string, :doc => "username doc"
42
+ end
43
+ end
44
+ end
45
+ =end
46
+
47
+ service.response do |response|
48
+ response.element(:name => "player_creation_ratings") do |e|
49
+ e.integer :id, :doc => "id doc"
50
+ e.boolean :is_accepted, :doc => "is accepted doc"
51
+ e.string :name, :doc => "name doc"
52
+
53
+ e.array :player_creation_rating, 'PlayerCreationRating' do |a|
54
+ a.string :comments, :doc => "comments doc"
55
+ a.integer :player_id, :doc => "player_id doc"
56
+ a.integer :rating, :doc => "rating doc"
57
+ a.string :username, :doc => "username doc"
58
+ end
59
+ end
60
+ end
61
+
62
+
63
+ service.documentation do |doc|
64
+ # doc.overall <markdown description text>
65
+ doc.overall <<-DOC
66
+ This is a test service used to test the framework.
67
+ DOC
68
+
69
+ # doc.params <name>, <definition>
70
+ doc.param :framework, "The test framework used, could be one of the two following: #{WeaselDieselSpecOptions.join(", ")}."
71
+ doc.param :version, "The version of the framework to use."
72
+
73
+ # doc.example <markdown text>
74
+ doc.example <<-DOC
75
+ The most common way to use this service looks like that:
76
+ http://example.com/services/test.xml?framework=rspec&version=2.0.0
77
+ DOC
78
+ end
79
+ end
80
+
81
+
82
+ describe_service "services/test_no_params.xml" do |service|
83
+ service.formats :xml
84
+ service.http_verb :get
85
+ service.accept_no_params!
86
+ end
87
+
88
+ describe_service "services.xml" do |service|
89
+ service.formats :xml
90
+ service.http_verb :put
91
+
92
+ end
93
+
94
+ describe_service "services/array_param.xml" do |s|
95
+ s.formats :xml
96
+ s.http_verb :post
97
+
98
+ s.params do |p|
99
+ p.array :seq, :required => true
100
+ end
101
+
102
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path("spec_helper", File.dirname(__FILE__))
2
+ require 'sinatra'
3
+ require File.expand_path("./../lib/framework_ext/sinatra.rb", File.dirname(__FILE__))
4
+ WeaselDiesel.send(:include, WeaselDieselSinatraExtension)
5
+
6
+ describe "Hello World example" do
7
+ require_relative "hello_world_service"
8
+ require_relative "hello_world_controller"
9
+
10
+ def app
11
+ Sinatra::Application
12
+ end
13
+
14
+ before(:all) do
15
+ service = WSList.all.find{|s| s.url == 'hello_world.xml'}
16
+ service.should_not be_nil
17
+ service.load_sinatra_route
18
+ end
19
+
20
+ it "should dispatch the hello world service properly" do
21
+ get "/hello_world.xml"
22
+ last_response.body.should include("Hello World")
23
+ end
24
+
25
+ end
26
+
@@ -0,0 +1,314 @@
1
+ require File.expand_path("spec_helper", File.dirname(__FILE__))
2
+
3
+ describe WeaselDiesel do
4
+
5
+ before :all do
6
+ @service = WSList.all.find{|s| s.url == 'services/test.xml'}
7
+ @service.should_not be_nil
8
+ end
9
+
10
+ it "should have an url" do
11
+ # dummy test since that's how we found the service, but oh well
12
+ @service.url.should == 'services/test.xml'
13
+ end
14
+
15
+ it "should have some http verbs defined" do
16
+ @service.verb.should == :get
17
+ end
18
+
19
+ it "should have supported formats defined" do
20
+ @service.formats.should == [:xml, :json]
21
+ end
22
+
23
+ it "should have params info" do
24
+ @service.params.should be_an_instance_of(WeaselDiesel::Params)
25
+ end
26
+
27
+ it "should have direct access to the required params" do
28
+ @service.required_rules.should == @service.params.list_required
29
+ end
30
+
31
+ it "should have direct access to the optional params" do
32
+ @service.optional_rules.should == @service.params.list_optional
33
+ end
34
+
35
+ it "should have direct access to the nested params" do
36
+ @service.nested_params.should == @service.params.namespaced_params
37
+ end
38
+
39
+ describe "#controller_dispatch" do
40
+
41
+ class ProjectsController
42
+ def initialize(app, service)
43
+ @app = app
44
+ @service = service.name
45
+ end
46
+
47
+ def send(action)
48
+ [@app, @service, action]
49
+ end
50
+ end
51
+
52
+ module Projects
53
+ class TasksController < ProjectsController
54
+ end
55
+ end
56
+
57
+ module Projects
58
+ module Tasks
59
+ class ItemsController < ProjectsController
60
+ end
61
+ end
62
+ end
63
+
64
+ before :all do
65
+ @original_use_controller_dispatch = WeaselDiesel.use_controller_dispatch
66
+ WeaselDiesel.use_controller_dispatch = true
67
+ @original_services = WSList.all.dup
68
+ WSList.all.clear
69
+ end
70
+
71
+ after :all do
72
+ WeaselDiesel.use_controller_dispatch = @original_use_controller_dispatch
73
+ WSList.all.replace @original_services
74
+ end
75
+
76
+ it "should be able to dispatch controller" do
77
+ describe_service("projects.xml") { |s| }
78
+ service = WSList["projects.xml"]
79
+ service.controller_dispatch("application").
80
+ should == ["application", "projects", "list"]
81
+ end
82
+
83
+ it "should be able to dispatch namespaced controller" do
84
+ describe_service("project/:project_id/tasks.xml") do |service|
85
+ service.controller_name = "Projects::TasksController"
86
+ service.action = "list"
87
+ end
88
+
89
+ describe_service("project/:project_id/task/:task_id/items.xml") do |service|
90
+ service.controller_name = "Projects::Tasks::ItemsController"
91
+ service.action = "list"
92
+ end
93
+
94
+ service = WSList["project/:project_id/tasks.xml"]
95
+ service.controller_dispatch("application").should == ["application", "project", "list"]
96
+
97
+ service = WSList["project/:project_id/task/:task_id/items.xml"]
98
+ service.controller_dispatch("application").should == ["application", "project", "list"]
99
+ end
100
+
101
+ it "should raise exception when controller class is not found" do
102
+ describe_service("unknown.xml") do |service|
103
+ service.controller_name = "UnknownController"
104
+ service.action = "list"
105
+ end
106
+ service = WSList["unknown.xml"]
107
+ lambda { service.controller_dispatch("application") }.
108
+ should raise_error("The UnknownController class was not found")
109
+ end
110
+
111
+ end
112
+
113
+ describe "With controller dispatch on" do
114
+ before :all do
115
+ @original_services = WSList.all.dup
116
+ WSList.all.clear
117
+ WeaselDiesel.use_controller_dispatch = true
118
+ load File.expand_path('test_services.rb', File.dirname(__FILE__))
119
+ @c_service = WSList.all.find{|s| s.url == 'services/test.xml'}
120
+ @c_service.should_not be_nil
121
+ end
122
+ after :all do
123
+ WeaselDiesel.use_controller_dispatch = false
124
+ WSList.all.replace @original_services
125
+ end
126
+
127
+ it "should set the controller accordingly" do
128
+ @c_service.controller_name.should_not be_nil
129
+ @c_service.controller_name.should == 'ServicesController'
130
+ service = WeaselDiesel.new("preferences.xml")
131
+ service.name.should == 'preferences'
132
+ ExtlibCopy.classify('preferences').should == 'Preferences'
133
+ service.controller_name.should == 'PreferencesController'
134
+ end
135
+
136
+ it "should set the action accordingly" do
137
+ @c_service.action.should_not be_nil
138
+ @c_service.action.should == 'test'
139
+ end
140
+
141
+ it "should support restful routes based on the HTTP verb" do
142
+ service = WSList.all.find{|s| s.url == "services.xml"}
143
+ service.should_not be_nil
144
+ service.http_verb.should == :put
145
+ service.action.should_not be_nil
146
+ service.controller_name.should == 'ServicesController'
147
+ service.action.should == 'update'
148
+ end
149
+
150
+ it "should have a default action" do
151
+ service = WeaselDiesel.new('spec_test.xml')
152
+ service.action.should == 'list'
153
+ end
154
+
155
+ it "should route to show when an id is the last passed param" do
156
+ service = WeaselDiesel.new("players/:id.xml")
157
+ service.action.should == 'show'
158
+ end
159
+
160
+ it "should support some extra attributes" do
161
+ service = WeaselDiesel.new("players/:id.xml")
162
+ service.extra[:custom_name] = 'fooBar'
163
+ service.extra[:custom_name].should == 'fooBar'
164
+ end
165
+
166
+ it "should respect the global controller pluralization flag" do
167
+ WeaselDiesel.use_pluralized_controllers = true
168
+ service = WeaselDiesel.new("player/:id.xml")
169
+ service.controller_name.should == "PlayersController"
170
+ service = WeaselDiesel.new("players/:id.xml")
171
+ service.controller_name.should == "PlayersController"
172
+ WeaselDiesel.use_pluralized_controllers = false
173
+ service = WeaselDiesel.new("player/:id.xml")
174
+ service.controller_name.should == "PlayerController"
175
+ end
176
+
177
+
178
+ it "should let overwrite the controller name and action after initialization" do
179
+ describe_service "players/:id.xml" do |service|
180
+ service.controller_name = "CustomController"
181
+ service.action = "foo"
182
+ end
183
+ service = WSList.all.find{|s| s.url == "players/:id.xml"}
184
+ service.controller_name.should == "CustomController"
185
+ service.action.should == "foo"
186
+ end
187
+
188
+ end
189
+
190
+
191
+ describe WeaselDiesel::Params do
192
+
193
+ before(:all) do
194
+ @sparams = @service.params
195
+ end
196
+
197
+ it "should have the possibility to have a space name" do
198
+ @sparams.should respond_to(:space_name)
199
+ service_params = WeaselDiesel::Params.new(:space_name => 'spec_test')
200
+ service_params.space_name.should == 'spec_test'
201
+ end
202
+
203
+ it "should have a list of required param rules" do
204
+ @sparams.list_required.should be_an_instance_of(Array)
205
+ @sparams.list_required.length.should == 1
206
+ end
207
+
208
+ it "should have a list of optional param rules" do
209
+ @sparams.list_optional.should be_an_instance_of(Array)
210
+ @sparams.list_optional.length.should == 4
211
+ end
212
+
213
+ it "should have a list of namespaced param rules" do
214
+ @sparams.namespaced_params.should be_an_instance_of(Array)
215
+ @sparams.namespaced_params.length.should == 1
216
+ @sparams.namespaced_params.first.space_name.should == :user
217
+ end
218
+
219
+ describe WeaselDiesel::Params::Rule do
220
+ before :all do
221
+ @rule = @sparams.list_required.first
222
+ @rule.should_not be_nil
223
+ end
224
+
225
+ it "should have a name" do
226
+ @rule.name.should == :framework
227
+ end
228
+
229
+ it "should have options" do
230
+ @rule.options[:type].should == :string
231
+ @rule.options[:in].should == WeaselDieselSpecOptions
232
+ @rule.options[:null].should be_false
233
+ end
234
+ end
235
+
236
+ end
237
+
238
+ it "should have some documentation" do
239
+ @service.doc.should be_an_instance_of(WeaselDiesel::Documentation)
240
+ end
241
+
242
+ describe WeaselDiesel::Documentation do
243
+ before(:all) do
244
+ @doc = @service.doc
245
+ @doc.should_not be_nil
246
+ end
247
+
248
+ it "should have an overall description" do
249
+ @doc.desc.strip.should == "This is a test service used to test the framework."
250
+ end
251
+
252
+ it "should have a list of params doc" do
253
+ @doc.params_doc.should be_an_instance_of(Hash)
254
+ @doc.params_doc.keys.sort.should == [:framework, :version]
255
+ @doc.params_doc[:framework].should == "The test framework used, could be one of the two following: #{WeaselDieselSpecOptions.join(", ")}."
256
+ end
257
+
258
+ it "should allow to define namespaced params doc" do
259
+ service = WSList.all.find{|s| s.url == "services.xml"}
260
+ service.documentation do |doc|
261
+ doc.namespace :preference do |ns|
262
+ ns.param :id, "Ze id."
263
+ end
264
+ end
265
+ service.doc.namespaced_params.should_not be_empty
266
+ ns = service.doc.namespaced_params.find{|ns| ns.name == :preference}
267
+ ns.should_not be_nil
268
+ ns.params[:id].should == "Ze id."
269
+ end
270
+
271
+ it "should have an optional list of examples" do
272
+ @doc.examples.should be_an_instance_of(Array)
273
+ @doc.examples.first.should == <<-DOC
274
+ The most common way to use this service looks like that:
275
+ http://example.com/services/test.xml?framework=rspec&version=2.0.0
276
+ DOC
277
+ end
278
+
279
+ it "should have the service response documented" do
280
+ @doc.response.should_not be_nil
281
+ end
282
+
283
+ it "should have documentation for the response elements via the response itself" do
284
+ @service.response.elements.first.should_not be_nil
285
+ @service.response.elements.first.doc.should_not be_nil
286
+ @service.response.elements.first.doc.name.should == "player_creation_ratings"
287
+ end
288
+
289
+ it "should have documentation for a response element attribute" do
290
+ p @service.response.elements.first.doc.inspect
291
+ @service.response.elements.first.doc.attributes.should_not be_empty
292
+ @service.response.elements.first.doc.attributes[:id].should == "id doc"
293
+ end
294
+
295
+ it "should have documentation for a response element array" do
296
+ element = @service.response.elements.first
297
+ element.arrays.should_not be_empty
298
+ element.arrays.first.name.should == :player_creation_rating
299
+ element.arrays.first.type.should == "PlayerCreationRating"
300
+ element.arrays.first.attributes.should_not be_empty
301
+ end
302
+
303
+ it "should have documentation for the attributes of an response element array" do
304
+ element = @service.response.elements.first
305
+ array = element.arrays.first
306
+ attribute = array.attributes.find{|att| att.name == :comments }
307
+ attribute.should_not be_nil
308
+ attribute.name.should == :comments # just in case we change the way to find the attribute
309
+ attribute.doc.should == "comments doc"
310
+ end
311
+
312
+ end
313
+
314
+ end