waw 0.2.2

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.
Files changed (199) hide show
  1. data/LICENCE.rdoc +25 -0
  2. data/README.rdoc +32 -0
  3. data/bin/waw +32 -0
  4. data/bin/waw-profile +26 -0
  5. data/bin/waw-start +26 -0
  6. data/bin/wspec +33 -0
  7. data/layouts/empty/Rakefile +14 -0
  8. data/layouts/empty/config.ru +5 -0
  9. data/layouts/empty/config/commons.cfg +31 -0
  10. data/layouts/empty/config/devel.cfg +21 -0
  11. data/layouts/empty/ignore +7 -0
  12. data/layouts/empty/logs/dontforgetme +0 -0
  13. data/layouts/empty/resources/messages.rs +1 -0
  14. data/layouts/empty/test/wspec/site_respond.wspec +3 -0
  15. data/layouts/empty/test/wspec/test_all.rb +13 -0
  16. data/layouts/empty/waw.deploy +1 -0
  17. data/layouts/empty/waw.routing +6 -0
  18. data/layouts/static/dependencies +1 -0
  19. data/layouts/static/public/.wawaccess +18 -0
  20. data/layouts/static/public/css/style.css +0 -0
  21. data/layouts/static/public/images/dontforgetme +0 -0
  22. data/layouts/static/public/js/project.js +0 -0
  23. data/layouts/static/public/pages/.wawaccess +30 -0
  24. data/layouts/static/public/pages/404.wtpl +1 -0
  25. data/layouts/static/public/pages/index.wtpl +5 -0
  26. data/layouts/static/public/templates/.wawaccess +9 -0
  27. data/layouts/static/public/templates/layout.wtpl +17 -0
  28. data/layouts/static/test/wspec/static_pages_are_served.wspec +21 -0
  29. data/layouts/static/waw.routing +8 -0
  30. data/lib/waw.rb +99 -0
  31. data/lib/waw/commands/command.rb +115 -0
  32. data/lib/waw/commands/profile_command.rb +66 -0
  33. data/lib/waw/commands/start_command.rb +59 -0
  34. data/lib/waw/config.rb +110 -0
  35. data/lib/waw/controller.rb +25 -0
  36. data/lib/waw/controllers/action/action.rb +91 -0
  37. data/lib/waw/controllers/action/action_utils.rb +30 -0
  38. data/lib/waw/controllers/action/js_generation.rb +116 -0
  39. data/lib/waw/controllers/action_controller.rb +133 -0
  40. data/lib/waw/controllers/error/backtrace.rb +54 -0
  41. data/lib/waw/controllers/error_handler.rb +62 -0
  42. data/lib/waw/controllers/json_controller.rb +31 -0
  43. data/lib/waw/controllers/no_cache.rb +22 -0
  44. data/lib/waw/controllers/static/match.rb +80 -0
  45. data/lib/waw/controllers/static/waw_access.rb +235 -0
  46. data/lib/waw/controllers/static/waw_access_dsl.rb +48 -0
  47. data/lib/waw/controllers/static_controller.rb +37 -0
  48. data/lib/waw/default_config.cfg +14 -0
  49. data/lib/waw/environment_utils.rb +57 -0
  50. data/lib/waw/errors.rb +4 -0
  51. data/lib/waw/ext.rb +3 -0
  52. data/lib/waw/ext/core.rb +4 -0
  53. data/lib/waw/ext/core/hash.rb +47 -0
  54. data/lib/waw/ext/core/logger.rb +10 -0
  55. data/lib/waw/ext/core/module.rb +20 -0
  56. data/lib/waw/ext/core/object.rb +29 -0
  57. data/lib/waw/ext/rack.rb +19 -0
  58. data/lib/waw/ext/rack/builder.rb +43 -0
  59. data/lib/waw/ext/rack/delegator.rb +51 -0
  60. data/lib/waw/ext/rack/urlmap.rb +55 -0
  61. data/lib/waw/ext/wlang.rb +1 -0
  62. data/lib/waw/ext/wlang/hosted_language.rb +21 -0
  63. data/lib/waw/fullstate.rb +8 -0
  64. data/lib/waw/fullstate/on_class.rb +37 -0
  65. data/lib/waw/fullstate/on_instance.rb +27 -0
  66. data/lib/waw/fullstate/variable.rb +36 -0
  67. data/lib/waw/kern.rb +6 -0
  68. data/lib/waw/kern/app.rb +48 -0
  69. data/lib/waw/kern/empty/waw.deploy +0 -0
  70. data/lib/waw/kern/empty/waw.routing +1 -0
  71. data/lib/waw/kern/freezed_state.rb +32 -0
  72. data/lib/waw/kern/hooks.rb +53 -0
  73. data/lib/waw/kern/lifecycle.rb +248 -0
  74. data/lib/waw/kern/living_state.rb +87 -0
  75. data/lib/waw/kern/utils.rb +27 -0
  76. data/lib/waw/resource_collection.rb +100 -0
  77. data/lib/waw/restart.rb +32 -0
  78. data/lib/waw/routing.rb +43 -0
  79. data/lib/waw/routing/action_routing.rb +78 -0
  80. data/lib/waw/routing/dsl.rb +45 -0
  81. data/lib/waw/routing/feedback.rb +23 -0
  82. data/lib/waw/routing/form_validation_feedback.rb +36 -0
  83. data/lib/waw/routing/javascript.rb +17 -0
  84. data/lib/waw/routing/redirect.rb +26 -0
  85. data/lib/waw/routing/refresh.rb +17 -0
  86. data/lib/waw/routing/routing_rule.rb +16 -0
  87. data/lib/waw/scope_utils.rb +69 -0
  88. data/lib/waw/session.rb +51 -0
  89. data/lib/waw/testing.rb +1 -0
  90. data/lib/waw/tools/mail.rb +4 -0
  91. data/lib/waw/tools/mail/mail.rb +119 -0
  92. data/lib/waw/tools/mail/mail_agent.rb +123 -0
  93. data/lib/waw/tools/mail/mailbox.rb +62 -0
  94. data/lib/waw/tools/mail/template.rb +38 -0
  95. data/lib/waw/utils/dsl_helper.rb +116 -0
  96. data/lib/waw/validation.rb +175 -0
  97. data/lib/waw/validation/and_validator.rb +27 -0
  98. data/lib/waw/validation/array_validations.rb +38 -0
  99. data/lib/waw/validation/boolean_validator.rb +32 -0
  100. data/lib/waw/validation/comparison_validations.rb +45 -0
  101. data/lib/waw/validation/date_validator.rb +31 -0
  102. data/lib/waw/validation/default_validator.rb +30 -0
  103. data/lib/waw/validation/dsl_ruby_extensions.rb +11 -0
  104. data/lib/waw/validation/errors.rb +17 -0
  105. data/lib/waw/validation/ext.rb +3 -0
  106. data/lib/waw/validation/file_validator.rb +30 -0
  107. data/lib/waw/validation/float_validator.rb +19 -0
  108. data/lib/waw/validation/helpers.rb +67 -0
  109. data/lib/waw/validation/integer_validator.rb +16 -0
  110. data/lib/waw/validation/isin_validator.rb +24 -0
  111. data/lib/waw/validation/mandatory_validator.rb +17 -0
  112. data/lib/waw/validation/missing_validator.rb +17 -0
  113. data/lib/waw/validation/not_validator.rb +20 -0
  114. data/lib/waw/validation/or_validator.rb +34 -0
  115. data/lib/waw/validation/regexp_validator.rb +29 -0
  116. data/lib/waw/validation/same_validator.rb +16 -0
  117. data/lib/waw/validation/signature.rb +157 -0
  118. data/lib/waw/validation/size_validations.rb +44 -0
  119. data/lib/waw/validation/string_validator.rb +15 -0
  120. data/lib/waw/validation/validator.rb +48 -0
  121. data/lib/waw/wawgen.rb +2 -0
  122. data/lib/waw/wawgen/create.rb +166 -0
  123. data/lib/waw/wawgen/project.rb +25 -0
  124. data/lib/waw/wspec.rb +5 -0
  125. data/lib/waw/wspec/browser.rb +240 -0
  126. data/lib/waw/wspec/dsl.rb +201 -0
  127. data/lib/waw/wspec/html_analysis.rb +136 -0
  128. data/lib/waw/wspec/html_analysis/tag.rb +56 -0
  129. data/lib/waw/wspec/runner.rb +70 -0
  130. data/lib/waw/wspec/scenario.rb +35 -0
  131. data/lib/waw/wspec/suite.rb +54 -0
  132. data/test/bricks/error_handler/config/test.cfg +2 -0
  133. data/test/bricks/error_handler/logs/webapp.log +1411 -0
  134. data/test/bricks/error_handler/test/error_handler.wspec +16 -0
  135. data/test/bricks/error_handler/waw.deploy +1 -0
  136. data/test/bricks/error_handler/waw.routing +27 -0
  137. data/test/integration/waw_create_integration_test.rb +24 -0
  138. data/test/spec/assumptions_spec.rb +30 -0
  139. data/test/spec/controllers/action_controller_spec.rb +14 -0
  140. data/test/spec/controllers/static/waw_access_spec.rb +112 -0
  141. data/test/spec/environment_utils_spec.rb +15 -0
  142. data/test/spec/ext/core/hash_spec.rb +58 -0
  143. data/test/spec/fixtures.rb +41 -0
  144. data/test/spec/fixtures/action/config/default.cfg +2 -0
  145. data/test/spec/fixtures/action/lib/action_controller_test.rb +12 -0
  146. data/test/spec/fixtures/action/waw.deploy +1 -0
  147. data/test/spec/fixtures/action/waw.routing +6 -0
  148. data/test/spec/fixtures/empty/waw.deploy +0 -0
  149. data/test/spec/fixtures/empty/waw.routing +0 -0
  150. data/test/spec/fullstate/on_class_spec.rb +59 -0
  151. data/test/spec/fullstate/on_instance_spec.rb +59 -0
  152. data/test/spec/fullstate/session_spec.rb +43 -0
  153. data/test/spec/fullstate/variable_spec.rb +55 -0
  154. data/test/spec/resource_collection_spec.rb +50 -0
  155. data/test/spec/test_all.rb +9 -0
  156. data/test/spec/tools/mail/mail_agent_spec.rb +116 -0
  157. data/test/spec/tools/mail/mail_spec.rb +56 -0
  158. data/test/spec/tools/mail/mailbox_spec.rb +57 -0
  159. data/test/spec/tools/mail/template_spec.rb +47 -0
  160. data/test/spec/validation/array_validation_spec.rb +63 -0
  161. data/test/spec/validation/array_validator_spec.rb +17 -0
  162. data/test/spec/validation/date_validation_spec.rb +35 -0
  163. data/test/spec/validation/default_validation_spec.rb +37 -0
  164. data/test/spec/validation/disjuctive_validation_spec.rb +33 -0
  165. data/test/spec/validation/errors_spec.rb +37 -0
  166. data/test/spec/validation/file_validator_spec.rb +34 -0
  167. data/test/spec/validation/mail_validation_spec.rb +51 -0
  168. data/test/spec/validation/missing_validation_spec.rb +43 -0
  169. data/test/spec/validation/same_validation_spec.rb +24 -0
  170. data/test/spec/validation/signature_intuition_spec.rb +37 -0
  171. data/test/spec/validation/signature_spec.rb +164 -0
  172. data/test/spec/validation/validation_spec.rb +28 -0
  173. data/test/spec/wspec/html_analysis/tag_spec.rb +38 -0
  174. data/test/spec/wspec/html_analysis_spec.rb +170 -0
  175. data/test/unit/test_all.rb +8 -0
  176. data/test/unit/waw/app_test.rb +126 -0
  177. data/test/unit/waw/app_test/config/commons.cfg +2 -0
  178. data/test/unit/waw/app_test/config/devel.cfg +1 -0
  179. data/test/unit/waw/config_test.rb +54 -0
  180. data/test/unit/waw/controllers/action_controller_test.rb +76 -0
  181. data/test/unit/waw/controllers/action_test.rb +35 -0
  182. data/test/unit/waw/controllers/example_action_controller_test.rb +24 -0
  183. data/test/unit/waw/controllers/multiple_action_controller_test.rb +78 -0
  184. data/test/unit/waw/controllers/static/example/css/example.css +1 -0
  185. data/test/unit/waw/controllers/static/example/index.html +1 -0
  186. data/test/unit/waw/controllers/static/example/js/example.js +1 -0
  187. data/test/unit/waw/controllers/static/example/pages/hello.wtpl +1 -0
  188. data/test/unit/waw/controllers/static/waw_access_test.rb +76 -0
  189. data/test/unit/waw/ext/rack_test.rb +74 -0
  190. data/test/unit/waw/resource_collection_test.rb +49 -0
  191. data/test/unit/waw/resources.txt +4 -0
  192. data/test/unit/waw/routing/routing_test.rb +26 -0
  193. data/test/unit/waw/utils/dsl_helper_test.rb +79 -0
  194. data/test/unit/waw/utils/dsl_helper_test_extensions1.rb +4 -0
  195. data/test/unit/waw/validation/signature_test.rb +193 -0
  196. data/test/unit/waw/validation_test.rb +319 -0
  197. data/test/unit/waw/wspec/html_analysis_test.html +81 -0
  198. data/test/unit/waw/wspec/html_analysis_test.rb +26 -0
  199. metadata +272 -0
@@ -0,0 +1,16 @@
1
+ requirement("Friendly error handlers should be provided by waw") {
2
+ browser.location = index_page + "argument"
3
+ i_see "ArgumentError error handler"
4
+
5
+ browser.location = index_page + "nomethod"
6
+ i_see "NoMethodError error handler"
7
+
8
+ browser.location = index_page + "fatal"
9
+ i_see "Internal Server Error"
10
+
11
+ browser.location = index_page + "anyother"
12
+ i_see "500.html error page"
13
+
14
+ browser.location = index_page + "backtrace"
15
+ i_see "Mail should not be nil"
16
+ }
@@ -0,0 +1,27 @@
1
+ Waw.rack do
2
+ error_handler(ArgumentError) {|k, ex| [500, {'Content-Type' => 'text/plain'}, ["ArgumentError error handler"]] }
3
+ error_handler(NoMethodError) {|k, ex| [500, {'Content-Type' => 'text/plain'}, ["NoMethodError error handler"]] }
4
+ error_handler(RuntimeError) {|k, ex| raise }
5
+ error_handler {|k, ex| [301, {'Location' => k.config.web_base + '500.html'}, ['']] }
6
+ map '/argument' do
7
+ run Kernel.lambda{|env| raise ArgumentError}
8
+ end
9
+ map '/nomethod' do
10
+ run Kernel.lambda{|env| raise NoMethodError}
11
+ end
12
+ map '/fatal' do
13
+ run Kernel.lambda{|env| raise}
14
+ end
15
+ map '/anyother' do
16
+ run Kernel.lambda{|env| raise Exception}
17
+ end
18
+ map '/500.html' do
19
+ run Kernel.lambda{|env|
20
+ [200, {'Content-Type' => 'text/plain'}, ['500.html error page']]
21
+ }
22
+ end
23
+ map '/backtrace' do
24
+ error_handler ::Waw::ErrorHandler::Backtrace.new
25
+ run Kernel.lambda{|env| raise ArgumentError, "Mail should not be nil"}
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ top = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
2
+ $LOAD_PATH.unshift(top, 'lib')
3
+ require 'fileutils'
4
+ require 'waw'
5
+
6
+ at_exit {
7
+ temp = File.join(top, 'temp')
8
+ FileUtils.mkdir temp unless File.exists?(temp)
9
+ FileUtils.cd temp do |trg_dir|
10
+ Dir[File.join(top, 'layouts', '*')].each do |layout_folder|
11
+ layout = File.basename(layout_folder)
12
+ puts "Testing layout #{layout} with top being #{top}"
13
+
14
+ FileUtils.rm_rf layout
15
+ `ruby -I#{File.join(top, 'lib')} #{File.join(top, 'bin', 'waw')} create --force --layout #{layout} #{layout}`
16
+
17
+ FileUtils.cd layout do |dir|
18
+ puts `ruby -I#{File.join(top, 'lib')} test/unit/test_all.rb` if File.directory?('test/unit')
19
+ puts `ruby -I#{File.join(top, 'lib')} test/wspec/test_all.rb` if File.directory?('test/wspec')
20
+ end
21
+ end
22
+ end
23
+ FileUtils.rm_rf temp
24
+ }
@@ -0,0 +1,30 @@
1
+ describe "Our understanding of ruby" do
2
+
3
+ def sandbox_file_with_spaces
4
+ File.join(File.dirname(__FILE__), 'issue 360.txt')
5
+ end
6
+
7
+ def sandbox_file_with_spaces_2
8
+ File.join(File.dirname(__FILE__), 'ext', 'issue 360.txt')
9
+ end
10
+
11
+ before(:all) do
12
+ File.open(sandbox_file_with_spaces, 'w'){|io| io << "hello world!"}
13
+ File.open(sandbox_file_with_spaces_2, 'w'){|io| io << "hello world!"}
14
+ File.read(sandbox_file_with_spaces).should == "hello world!"
15
+ File.read(sandbox_file_with_spaces_2).should == "hello world!"
16
+ end
17
+
18
+ after(:all) do
19
+ FileUtils.rm sandbox_file_with_spaces
20
+ FileUtils.rm sandbox_file_with_spaces_2
21
+ end
22
+
23
+ it "should be correct about File.exists? in presence of spaces" do
24
+ File.exists?(__FILE__).should be_true
25
+ File.exists?("something that does not exists").should be_false
26
+ File.exists?(sandbox_file_with_spaces).should be_true
27
+ File.exists?(sandbox_file_with_spaces_2).should be_true
28
+ end
29
+
30
+ end
@@ -0,0 +1,14 @@
1
+ require 'waw'
2
+ describe ::Waw::ActionController do
3
+ include ::Waw::Fixtures
4
+ before(:each) { load_action_app }
5
+ after(:each) { unload_action_app }
6
+
7
+ it "should find its url" do
8
+ controller = Waw::Fixtures::ActionControllerTest
9
+ controller.url.should == "/services"
10
+ controller.instance.url.should == "/services"
11
+ controller.say_hello.url.should == "/services/say_hello"
12
+ end
13
+
14
+ end
@@ -0,0 +1,112 @@
1
+ require 'waw'
2
+
3
+ describe "::Waw::StaticController::WawAccess.matching_file" do
4
+
5
+ def folder
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ def join(folder, path)
10
+ File.join(folder, path)
11
+ end
12
+
13
+ def wawaccess
14
+ ::Waw::StaticController::WawAccess.new(nil, folder)
15
+ end
16
+
17
+ def sandbox_file_with_spaces
18
+ File.join(File.dirname(__FILE__), 'issue 360.txt')
19
+ end
20
+
21
+ before(:all) do
22
+ File.open(sandbox_file_with_spaces, 'w'){|io| io << "hello world!"}
23
+ File.read(sandbox_file_with_spaces).should == "hello world!"
24
+ end
25
+
26
+ after(:all) do
27
+ FileUtils.rm sandbox_file_with_spaces
28
+ end
29
+
30
+ it 'should correctly resolve file names' do
31
+ wawaccess.matching_file('waw_access_spec.rb').should == join(folder, 'waw_access_spec.rb')
32
+ File.exists?(wawaccess.matching_file('waw_access_spec.rb')).should be_true
33
+ end
34
+
35
+ it 'should correctly resolve file names with spaces' do
36
+ file = wawaccess.matching_file('issue 360.txt')
37
+ file.should == join(folder, 'issue 360.txt')
38
+ File.exists?(file).should be_true
39
+ end
40
+
41
+ end
42
+
43
+ describe ::Waw::StaticController::WawAccess do
44
+
45
+ def parse(text = "")
46
+ wa = ::Waw::StaticController::WawAccess.new(nil, File.dirname(__FILE__))
47
+ wa.dsl_merge(text)
48
+ wa
49
+ end
50
+
51
+ def sandbox_file_with_spaces
52
+ File.join(File.dirname(__FILE__), 'issue 360.txt')
53
+ end
54
+
55
+ before(:all) do
56
+ File.open(sandbox_file_with_spaces, 'w'){|io| io << "hello world!"}
57
+ File.read(sandbox_file_with_spaces).should == "hello world!"
58
+ end
59
+
60
+ after(:all) do
61
+ FileUtils.rm sandbox_file_with_spaces
62
+ end
63
+
64
+ it "should propose all ::Waw::Validation as basic matchers" do
65
+ wa = parse <<-EOF
66
+ wawaccess do
67
+ match(file) { :file }
68
+ match(directory) { :directory }
69
+ match(true) { :is404 }
70
+ end
71
+ EOF
72
+ wa.apply_rules('waw_access_spec.rb').should == :file
73
+ wa.apply_rules('').should == :directory
74
+ wa.apply_rules('nothing/at/all').should == :is404
75
+ end
76
+
77
+ it "should not provide block conflict between validators and matching rules" do
78
+ wa = parse <<-EOF
79
+ wawaccess do
80
+ match file do
81
+ :file
82
+ end
83
+ end
84
+ EOF
85
+ wa.do_path_serve('waw_access_spec.rb').should == :file
86
+ end
87
+
88
+ it "should support files with spaces (on file, see #360)" do
89
+ wa = parse <<-EOF
90
+ wawaccess do
91
+ match file do
92
+ static
93
+ end
94
+ end
95
+ EOF
96
+ code, headers, body = wa.do_path_serve('issue 360.txt')
97
+ code.should == 200
98
+ end
99
+
100
+ it "should support files with %20 spaces (on file, see #360)" do
101
+ wa = parse <<-EOF
102
+ wawaccess do
103
+ match file do
104
+ static
105
+ end
106
+ end
107
+ EOF
108
+ code, headers, body = wa.do_path_serve('issue%20360.txt')
109
+ code.should == 200
110
+ end
111
+
112
+ end
@@ -0,0 +1,15 @@
1
+ require "waw"
2
+ describe Waw::EnvironmentUtils do
3
+ include Waw::EnvironmentUtils
4
+
5
+ it "should support non rack assumptions, for testing purposes" do
6
+ session[:name] = 12
7
+ session[:name].should == 12
8
+ end
9
+
10
+ it "should support session.get and session.set correctly" do
11
+ session.set(:name, 12)
12
+ session.get(:name).should == 12
13
+ end
14
+
15
+ end
@@ -0,0 +1,58 @@
1
+ describe ::Hash do
2
+
3
+ it "should provide a non-intrusive keep method" do
4
+ hash = {:name => "blambeau", :age => 20}
5
+ hash.keep(:name).should == {:name => "blambeau"}
6
+ hash.keep([:name]).should == {:name => "blambeau"}
7
+ hash.keep(:name, :age).should == hash
8
+ hash.keep([:name, :age]).should == hash
9
+ hash.keep(:name, :age).object_id.should_not == hash.object_id
10
+ hash.keep(:name, :age, :occupation).should == hash
11
+ end
12
+
13
+ it "should provide an intrusive keep! method" do
14
+ hash = {:name => "blambeau", :age => 20}
15
+ hash.keep!(:name).should == {:name => "blambeau"}
16
+ hash.keep!([:name]).should == {:name => "blambeau"}
17
+ hash.keep!(:name, :age).should == hash
18
+ hash.keep!([:name, :age]).should == hash
19
+ hash.keep!(:name, :age).object_id.should == hash.object_id
20
+ hash.keep!(:name, :age, :occupation).should == hash
21
+ end
22
+
23
+ it "should provide a non-intrusive forget method" do
24
+ hash = {:name => "blambeau", :age => 20}
25
+ hash.forget(:name).should == {:age => 20}
26
+ hash.forget([:name]).should == {:age => 20}
27
+ hash.forget(:name, :age).should == {}
28
+ hash.forget([:name, :age]).should == {}
29
+ hash.forget(:name, :age).object_id.should_not == hash.object_id
30
+ hash.forget(:name, :age, :occupation).should == {}
31
+ end
32
+
33
+ it "should provide an intrusive forget! method" do
34
+ hash = {:name => "blambeau", :age => 20}
35
+ hash.forget!(:name).should == {:age => 20}
36
+ hash.forget!([:name]).should == {:age => 20}
37
+ hash.forget!(:name, :age).should == {}
38
+ hash.forget!([:name, :age]).should == {}
39
+ hash.forget!(:name, :age).object_id.should == hash.object_id
40
+ hash.forget!(:name, :age, :occupation).should == {}
41
+ end
42
+
43
+ it "should provide an helper for building url queries" do
44
+ {}.to_url_query.should == ""
45
+ {:name => "blambeau"}.to_url_query.should == "name=blambeau"
46
+
47
+ possible = ["name=blambeau&age=12", "age=12&name=blambeau"]
48
+ possible.include?({:name => "blambeau", :age => 12}.to_url_query).should be_true
49
+
50
+ {:name => "bla&beau"}.to_url_query.should == "name=bla%26beau"
51
+ end
52
+
53
+ it "should provide a methodize helper" do
54
+ hash = {'hello' => 'world'}
55
+ hash.methodize.hello.should == 'world'
56
+ end
57
+
58
+ end
@@ -0,0 +1,41 @@
1
+ module Waw
2
+ module Fixtures
3
+
4
+ # Returns the empty app folder
5
+ def empty_folder
6
+ File.join(File.dirname(__FILE__), 'fixtures', 'empty')
7
+ end
8
+
9
+ # Loads and returns the empty application
10
+ def load_empty_app
11
+ @empty_app = Waw.autoload(empty_folder)
12
+ @empty_app.install_living_state({})
13
+ end
14
+
15
+ # Loads and returns the empty application
16
+ def unload_empty_app
17
+ @empty_app.clean_living_state
18
+ @empty_app.unload
19
+ @empty_app = nil
20
+ end
21
+
22
+ # Returns the action app folder
23
+ def action_folder
24
+ File.join(File.dirname(__FILE__), 'fixtures', 'action')
25
+ end
26
+
27
+ # Loads and returns the empty application
28
+ def load_action_app
29
+ @action_app = Waw.autoload(action_folder)
30
+ @action_app.install_living_state({})
31
+ end
32
+
33
+ # Loads and returns the empty application
34
+ def unload_action_app
35
+ @action_app.clean_living_state
36
+ @action_app.unload
37
+ @action_app = nil
38
+ end
39
+
40
+ end # module Fixtures
41
+ end # module Waw
@@ -0,0 +1,2 @@
1
+ load_path 'lib'
2
+ requires 'action_controller_test'
@@ -0,0 +1,12 @@
1
+ module Waw
2
+ module Fixtures
3
+ class ActionControllerTest < ::Waw::ActionController
4
+
5
+ signature {}
6
+ def say_hello
7
+ :hello
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ default
@@ -0,0 +1,6 @@
1
+ Waw.rack do
2
+ use ::Waw::JSONController
3
+ map "/services" do
4
+ run ::Waw::Fixtures::ActionControllerTest.instance
5
+ end
6
+ end
File without changes
File without changes
@@ -0,0 +1,59 @@
1
+ require "waw"
2
+ describe ::Waw::FullState::OnClass do
3
+ include ::Waw::Fixtures
4
+ before(:each) { load_empty_app }
5
+ after(:each) { unload_empty_app }
6
+
7
+ it "should allow session variables on classes" do
8
+ class A
9
+ extend Waw::FullState::OnClass
10
+ session_var :myvar
11
+ end
12
+ A.respond_to?(:myvar).should be_true
13
+ A.respond_to?(:myvar=).should be_true
14
+ end
15
+
16
+ it "should allow a default value" do
17
+ class A
18
+ extend Waw::FullState::OnClass
19
+ session_var :myvar, 12
20
+ end
21
+ A.respond_to?(:myvar).should be_true
22
+ A.respond_to?(:myvar=).should be_true
23
+ end
24
+
25
+ it "should allow a default value given by a block" do
26
+ class A
27
+ extend Waw::FullState::OnClass
28
+ session_var :myvar do 12 end
29
+ end
30
+ A.respond_to?(:myvar).should be_true
31
+ A.respond_to?(:myvar=).should be_true
32
+ end
33
+
34
+ it "should respect the default value when the session is empty" do
35
+ class A
36
+ extend Waw::FullState::OnClass
37
+ session_var :myvar, "hello"
38
+ end
39
+ A.myvar.should == "hello"
40
+
41
+ class B
42
+ extend Waw::FullState::OnClass
43
+ session_var :myvar do 12 end
44
+ end
45
+ B.myvar.should == 12
46
+ end
47
+
48
+ it "should allow affecting the session variable" do
49
+ class A
50
+ extend Waw::FullState::OnClass
51
+ session_var :myvar, "hello"
52
+ end
53
+ a = A
54
+ a.myvar = "world"
55
+ @empty_app.session[:myvar].should == "world"
56
+ a.myvar.should == "world"
57
+ end
58
+
59
+ end
@@ -0,0 +1,59 @@
1
+ require "waw"
2
+ describe ::Waw::FullState::OnInstance do
3
+ include ::Waw::Fixtures
4
+ before(:each) { load_empty_app }
5
+ after(:each) { unload_empty_app }
6
+
7
+ it "should allow session variable creation on classes" do
8
+ class A
9
+ extend Waw::FullState::OnInstance
10
+ session_var :myvar
11
+ end
12
+ A.new.respond_to?(:myvar).should be_true
13
+ A.new.respond_to?(:myvar=).should be_true
14
+ end
15
+
16
+ it "should allow a default value" do
17
+ class A
18
+ extend Waw::FullState::OnInstance
19
+ session_var :myvar, 12
20
+ end
21
+ A.new.respond_to?(:myvar).should be_true
22
+ A.new.respond_to?(:myvar=).should be_true
23
+ end
24
+
25
+ it "should allow a default value given by a block" do
26
+ class A
27
+ extend Waw::FullState::OnInstance
28
+ session_var :myvar do 12 end
29
+ end
30
+ A.new.respond_to?(:myvar).should be_true
31
+ A.new.respond_to?(:myvar=).should be_true
32
+ end
33
+
34
+ it "should respect the default value when the session is empty" do
35
+ class A
36
+ extend Waw::FullState::OnInstance
37
+ session_var :myvar, "hello"
38
+ end
39
+ A.new.myvar.should == "hello"
40
+
41
+ class A
42
+ extend Waw::FullState::OnInstance
43
+ session_var :myvar do 12 end
44
+ end
45
+ A.new.myvar.should == 12
46
+ end
47
+
48
+ it "should allow affecting the session variable" do
49
+ class A
50
+ extend Waw::FullState::OnInstance
51
+ session_var :myvar, "hello"
52
+ end
53
+ a = A.new
54
+ a.myvar = "world"
55
+ @empty_app.session[:myvar].should == "world"
56
+ a.myvar.should == "world"
57
+ end
58
+
59
+ end