arrow 1.0.7

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 (198) hide show
  1. data/ChangeLog +1590 -0
  2. data/LICENSE +28 -0
  3. data/README +75 -0
  4. data/Rakefile +366 -0
  5. data/Rakefile.local +63 -0
  6. data/data/arrow/applets/TEMPLATE.rb.tpl +53 -0
  7. data/data/arrow/applets/args.rb +50 -0
  8. data/data/arrow/applets/config.rb +55 -0
  9. data/data/arrow/applets/error.rb +63 -0
  10. data/data/arrow/applets/files.rb +46 -0
  11. data/data/arrow/applets/inspect.rb +46 -0
  12. data/data/arrow/applets/nosuchapplet.rb +31 -0
  13. data/data/arrow/applets/status.rb +92 -0
  14. data/data/arrow/applets/test.rb +133 -0
  15. data/data/arrow/applets/tutorial/counter.rb +96 -0
  16. data/data/arrow/applets/tutorial/dingus.rb +67 -0
  17. data/data/arrow/applets/tutorial/hello.rb +34 -0
  18. data/data/arrow/applets/tutorial/hello2.rb +73 -0
  19. data/data/arrow/applets/tutorial/imgtext.rb +90 -0
  20. data/data/arrow/applets/tutorial/imgtext2.rb +286 -0
  21. data/data/arrow/applets/tutorial/index.rb +36 -0
  22. data/data/arrow/applets/tutorial/logo.rb +98 -0
  23. data/data/arrow/applets/tutorial/memcache.rb +61 -0
  24. data/data/arrow/applets/tutorial/missing.rb +37 -0
  25. data/data/arrow/applets/tutorial/protected.rb +100 -0
  26. data/data/arrow/applets/tutorial/redirector.rb +52 -0
  27. data/data/arrow/applets/tutorial/rndimages.rb +159 -0
  28. data/data/arrow/applets/tutorial/sharenotes.rb +83 -0
  29. data/data/arrow/applets/tutorial/subclassed-hello.rb +32 -0
  30. data/data/arrow/applets/tutorial/superhello.rb +72 -0
  31. data/data/arrow/applets/tutorial/timeclock.rb +78 -0
  32. data/data/arrow/applets/view-applet.rb +123 -0
  33. data/data/arrow/applets/view-template.rb +85 -0
  34. data/data/arrow/applets/wiki.rb +274 -0
  35. data/data/arrow/templates/TEMPLATE.tmpl.tpl +36 -0
  36. data/data/arrow/templates/applet-status.tmpl +153 -0
  37. data/data/arrow/templates/args-display.tmpl +120 -0
  38. data/data/arrow/templates/config/display-table.tmpl +36 -0
  39. data/data/arrow/templates/config/display.tmpl +36 -0
  40. data/data/arrow/templates/counter-deleted.tmpl +33 -0
  41. data/data/arrow/templates/counter.tmpl +59 -0
  42. data/data/arrow/templates/dingus.tmpl +55 -0
  43. data/data/arrow/templates/enumtable.tmpl +8 -0
  44. data/data/arrow/templates/error-display.tmpl +92 -0
  45. data/data/arrow/templates/filemap.tmpl +89 -0
  46. data/data/arrow/templates/hello-world-src.tmpl +34 -0
  47. data/data/arrow/templates/hello-world.tmpl +60 -0
  48. data/data/arrow/templates/imgtext/fontlist.tmpl +46 -0
  49. data/data/arrow/templates/imgtext/form.tmpl +70 -0
  50. data/data/arrow/templates/imgtext/reload-error.tmpl +40 -0
  51. data/data/arrow/templates/imgtext/reload.tmpl +55 -0
  52. data/data/arrow/templates/inspect/display.tmpl +80 -0
  53. data/data/arrow/templates/loginform.tmpl +64 -0
  54. data/data/arrow/templates/logout.tmpl +32 -0
  55. data/data/arrow/templates/memcache/display.tmpl +41 -0
  56. data/data/arrow/templates/navbar.incl +27 -0
  57. data/data/arrow/templates/nosuchapplet.tmpl +32 -0
  58. data/data/arrow/templates/printsource.tmpl +35 -0
  59. data/data/arrow/templates/protected.tmpl +36 -0
  60. data/data/arrow/templates/rndimages.tmpl +38 -0
  61. data/data/arrow/templates/service-response.tmpl +13 -0
  62. data/data/arrow/templates/sharenotes/display.tmpl +38 -0
  63. data/data/arrow/templates/status.tmpl +120 -0
  64. data/data/arrow/templates/templateviewer.tmpl +43 -0
  65. data/data/arrow/templates/test/harness.tmpl +57 -0
  66. data/data/arrow/templates/test/list.tmpl +48 -0
  67. data/data/arrow/templates/test/problem.tmpl +42 -0
  68. data/data/arrow/templates/tutorial/index.tmpl +37 -0
  69. data/data/arrow/templates/tutorial/missingapplet.tmpl +29 -0
  70. data/data/arrow/templates/view-applet-nosuch.tmpl +32 -0
  71. data/data/arrow/templates/view-applet.tmpl +40 -0
  72. data/data/arrow/templates/view-template.tmpl +83 -0
  73. data/data/arrow/templates/wiki/formerror.tmpl +47 -0
  74. data/data/arrow/templates/wiki/markup_help.incl +6 -0
  75. data/data/arrow/templates/wiki/new.tmpl +56 -0
  76. data/data/arrow/templates/wiki/new_system.tmpl +122 -0
  77. data/data/arrow/templates/wiki/sectionlist.tmpl +43 -0
  78. data/data/arrow/templates/wiki/show.tmpl +34 -0
  79. data/docs/manual/layouts/default.page +43 -0
  80. data/docs/manual/lib/api-filter.rb +81 -0
  81. data/docs/manual/lib/editorial-filter.rb +64 -0
  82. data/docs/manual/lib/examples-filter.rb +244 -0
  83. data/docs/manual/lib/links-filter.rb +117 -0
  84. data/lib/apache/fakerequest.rb +448 -0
  85. data/lib/apache/logger.rb +33 -0
  86. data/lib/arrow.rb +51 -0
  87. data/lib/arrow/acceptparam.rb +207 -0
  88. data/lib/arrow/applet.rb +725 -0
  89. data/lib/arrow/appletmixins.rb +218 -0
  90. data/lib/arrow/appletregistry.rb +590 -0
  91. data/lib/arrow/applettestcase.rb +503 -0
  92. data/lib/arrow/broker.rb +255 -0
  93. data/lib/arrow/cache.rb +176 -0
  94. data/lib/arrow/config-loaders/yaml.rb +75 -0
  95. data/lib/arrow/config.rb +615 -0
  96. data/lib/arrow/constants.rb +24 -0
  97. data/lib/arrow/cookie.rb +359 -0
  98. data/lib/arrow/cookieset.rb +108 -0
  99. data/lib/arrow/dispatcher.rb +368 -0
  100. data/lib/arrow/dispatcherloader.rb +50 -0
  101. data/lib/arrow/exceptions.rb +61 -0
  102. data/lib/arrow/fallbackhandler.rb +48 -0
  103. data/lib/arrow/formvalidator.rb +631 -0
  104. data/lib/arrow/htmltokenizer.rb +343 -0
  105. data/lib/arrow/logger.rb +488 -0
  106. data/lib/arrow/logger/apacheoutputter.rb +69 -0
  107. data/lib/arrow/logger/arrayoutputter.rb +63 -0
  108. data/lib/arrow/logger/coloroutputter.rb +111 -0
  109. data/lib/arrow/logger/fileoutputter.rb +96 -0
  110. data/lib/arrow/logger/htmloutputter.rb +54 -0
  111. data/lib/arrow/logger/outputter.rb +123 -0
  112. data/lib/arrow/mixins.rb +425 -0
  113. data/lib/arrow/monkeypatches.rb +94 -0
  114. data/lib/arrow/object.rb +117 -0
  115. data/lib/arrow/path.rb +196 -0
  116. data/lib/arrow/service.rb +447 -0
  117. data/lib/arrow/session.rb +289 -0
  118. data/lib/arrow/session/dbstore.rb +100 -0
  119. data/lib/arrow/session/filelock.rb +160 -0
  120. data/lib/arrow/session/filestore.rb +132 -0
  121. data/lib/arrow/session/id.rb +98 -0
  122. data/lib/arrow/session/lock.rb +253 -0
  123. data/lib/arrow/session/md5id.rb +42 -0
  124. data/lib/arrow/session/nulllock.rb +42 -0
  125. data/lib/arrow/session/posixlock.rb +166 -0
  126. data/lib/arrow/session/sha1id.rb +54 -0
  127. data/lib/arrow/session/store.rb +366 -0
  128. data/lib/arrow/session/usertrackid.rb +52 -0
  129. data/lib/arrow/spechelpers.rb +73 -0
  130. data/lib/arrow/template.rb +713 -0
  131. data/lib/arrow/template/attr.rb +31 -0
  132. data/lib/arrow/template/call.rb +31 -0
  133. data/lib/arrow/template/comment.rb +33 -0
  134. data/lib/arrow/template/container.rb +118 -0
  135. data/lib/arrow/template/else.rb +41 -0
  136. data/lib/arrow/template/elsif.rb +44 -0
  137. data/lib/arrow/template/escape.rb +53 -0
  138. data/lib/arrow/template/export.rb +87 -0
  139. data/lib/arrow/template/for.rb +145 -0
  140. data/lib/arrow/template/if.rb +78 -0
  141. data/lib/arrow/template/import.rb +119 -0
  142. data/lib/arrow/template/include.rb +206 -0
  143. data/lib/arrow/template/iterator.rb +208 -0
  144. data/lib/arrow/template/nodes.rb +734 -0
  145. data/lib/arrow/template/parser.rb +571 -0
  146. data/lib/arrow/template/prettyprint.rb +53 -0
  147. data/lib/arrow/template/render.rb +191 -0
  148. data/lib/arrow/template/selectlist.rb +94 -0
  149. data/lib/arrow/template/set.rb +87 -0
  150. data/lib/arrow/template/timedelta.rb +81 -0
  151. data/lib/arrow/template/unless.rb +78 -0
  152. data/lib/arrow/template/urlencode.rb +51 -0
  153. data/lib/arrow/template/yield.rb +139 -0
  154. data/lib/arrow/templatefactory.rb +125 -0
  155. data/lib/arrow/testcase.rb +567 -0
  156. data/lib/arrow/transaction.rb +608 -0
  157. data/rake/191_compat.rb +26 -0
  158. data/rake/dependencies.rb +76 -0
  159. data/rake/documentation.rb +114 -0
  160. data/rake/helpers.rb +502 -0
  161. data/rake/hg.rb +282 -0
  162. data/rake/manual.rb +787 -0
  163. data/rake/packaging.rb +129 -0
  164. data/rake/publishing.rb +278 -0
  165. data/rake/style.rb +62 -0
  166. data/rake/svn.rb +668 -0
  167. data/rake/testing.rb +187 -0
  168. data/rake/verifytask.rb +64 -0
  169. data/spec/arrow/acceptparam_spec.rb +157 -0
  170. data/spec/arrow/applet_spec.rb +575 -0
  171. data/spec/arrow/appletmixins_spec.rb +409 -0
  172. data/spec/arrow/appletregistry_spec.rb +294 -0
  173. data/spec/arrow/broker_spec.rb +153 -0
  174. data/spec/arrow/config_spec.rb +224 -0
  175. data/spec/arrow/cookieset_spec.rb +164 -0
  176. data/spec/arrow/dispatcher_spec.rb +137 -0
  177. data/spec/arrow/dispatcherloader_spec.rb +65 -0
  178. data/spec/arrow/formvalidator_spec.rb +781 -0
  179. data/spec/arrow/logger_spec.rb +346 -0
  180. data/spec/arrow/mixins_spec.rb +120 -0
  181. data/spec/arrow/service_spec.rb +645 -0
  182. data/spec/arrow/session_spec.rb +121 -0
  183. data/spec/arrow/template/iterator_spec.rb +222 -0
  184. data/spec/arrow/templatefactory_spec.rb +185 -0
  185. data/spec/arrow/transaction_spec.rb +319 -0
  186. data/spec/arrow_spec.rb +37 -0
  187. data/spec/lib/appletmatchers.rb +281 -0
  188. data/spec/lib/constants.rb +77 -0
  189. data/spec/lib/helpers.rb +41 -0
  190. data/spec/lib/matchers.rb +44 -0
  191. data/tests/cookie.tests.rb +310 -0
  192. data/tests/path.tests.rb +157 -0
  193. data/tests/session.tests.rb +111 -0
  194. data/tests/session_id.tests.rb +82 -0
  195. data/tests/session_lock.tests.rb +191 -0
  196. data/tests/session_store.tests.rb +53 -0
  197. data/tests/template.tests.rb +1360 -0
  198. metadata +339 -0
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
6
+
7
+ libdir = basedir + "lib"
8
+
9
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
10
+ }
11
+
12
+ begin
13
+ require 'spec'
14
+ require 'apache/fakerequest'
15
+ require 'arrow'
16
+ require 'spec/lib/helpers'
17
+ require 'arrow/broker'
18
+ rescue LoadError
19
+ unless Object.const_defined?( :Gem )
20
+ require 'rubygems'
21
+ retry
22
+ end
23
+ raise
24
+ end
25
+
26
+
27
+ #####################################################################
28
+ ### C O N T E X T S
29
+ #####################################################################
30
+
31
+ describe Arrow::Broker do
32
+ include Arrow::SpecHelpers
33
+
34
+ before( :all ) do
35
+ setup_logging( :crit )
36
+ end
37
+
38
+ after( :all ) do
39
+ reset_logging()
40
+ end
41
+
42
+
43
+ before( :each ) do
44
+ conf = Arrow::Config.new( TEST_CONFIG )
45
+ @broker = Arrow::Broker.new( conf )
46
+ end
47
+
48
+
49
+ #################################################################
50
+ ### H E L P E R F U N C T I O N S
51
+ #################################################################
52
+
53
+ def make_applet_chain( uri, *applets )
54
+ chain = []
55
+ uriparts = uri.split( %r{/} )
56
+
57
+ applets.each_with_index do |applet, i|
58
+ chain << Arrow::AppletRegistry::ChainLink.new(
59
+ applet,
60
+ uriparts[0..i+1].join('/'),
61
+ uriparts[i+2 .. -1] || []
62
+ )
63
+ end
64
+
65
+ return chain
66
+ end
67
+
68
+
69
+ #################################################################
70
+ ### E X A M P L E S
71
+ #################################################################
72
+
73
+ it "runs an applet when dispatching a uri that maps to it" do
74
+ applet = mock( "applet", :null_object => true )
75
+ appletchain = make_applet_chain( '/admin/create/job/1', applet )
76
+ @broker.registry = stub( "applet registry",
77
+ :check_for_updates => true,
78
+ :find_applet_chain => appletchain
79
+ )
80
+
81
+ txn = mock( "transaction", :null_object => true )
82
+ txn.should_receive( :path ).and_return( '/admin/create/job/1' )
83
+
84
+ applet.should_receive( :run ).
85
+ with( txn, "create", "job", "1" ).
86
+ and_return( :passed )
87
+
88
+ @broker.delegate( txn ).should == :passed
89
+ end
90
+
91
+
92
+ it "chains calls through multiple applets when a uri maps to more than one" do
93
+ applet1 = mock( "delegating applet 1" )
94
+ applet2 = mock( "delegating applet 2" )
95
+ applet3 = mock( "target applet" )
96
+
97
+ appletchain = make_applet_chain( '/admin/create/job/1', applet1, applet2, applet3 )
98
+ @broker.registry = stub( "applet registry",
99
+ :check_for_updates => true,
100
+ :find_applet_chain => appletchain
101
+ )
102
+
103
+ txn = mock( "transaction", :null_object => true )
104
+ txn.should_receive( :path ).and_return( '/admin/create/job/1' )
105
+ signature = stub( "applet signature", :name => 'mock applet' )
106
+
107
+ applet1.should_receive( :signature ).
108
+ at_least(:once).
109
+ and_return( signature )
110
+ applet1.should_receive( :delegate ).
111
+ with( txn, appletchain[1,2], "create", "job", "1" ).
112
+ and_yield( nil )
113
+ applet2.should_receive( :signature ).
114
+ at_least(:once).
115
+ and_return( signature )
116
+ applet2.should_receive( :delegate ).
117
+ with( txn, appletchain[2..2], "job", "1" ).
118
+ and_yield( nil )
119
+ applet3.should_receive( :signature ).
120
+ at_least(:once).
121
+ and_return( signature )
122
+ applet3.should_receive( :run ).
123
+ with( txn, "1" ).
124
+ and_return( :passed )
125
+
126
+ @broker.delegate( txn ) #.should == :passed # RSpec 1.0 broke this
127
+ end
128
+
129
+ describe " for a root-mounted dispatcher" do
130
+
131
+ it "runs the root applet for a request to an empty path" do
132
+ conf = Arrow::Config.new( TEST_CONFIG )
133
+ broker = Arrow::Broker.new( conf )
134
+
135
+ applet = mock( "applet", :null_object => true )
136
+ appletchain = make_applet_chain( '/', applet )
137
+ broker.registry = stub( "applet registry",
138
+ :check_for_updates => true,
139
+ :find_applet_chain => appletchain
140
+ )
141
+
142
+ txn = mock( "transaction", :null_object => true )
143
+ txn.should_receive( :path ).and_return( '' )
144
+
145
+ applet.should_receive( :run ).
146
+ with( txn ).
147
+ and_return( :passed )
148
+
149
+ broker.delegate( txn ).should == :passed
150
+ end
151
+ end
152
+
153
+ end
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Specification for the Arrow::Config class
4
+ # $Id$
5
+ #
6
+ # Copyright (c) 2004-2008 The FaerieMUD Consortium. Most rights reserved.
7
+ #
8
+
9
+ BEGIN {
10
+ require 'pathname'
11
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
12
+
13
+ libdir = basedir + "lib"
14
+
15
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
16
+ }
17
+
18
+ begin
19
+ require 'spec'
20
+ require 'apache/fakerequest'
21
+ require 'arrow'
22
+ require 'arrow/config'
23
+
24
+ require 'spec/lib/helpers'
25
+ require 'spec/lib/constants'
26
+ rescue LoadError
27
+ unless Object.const_defined?( :Gem )
28
+ require 'rubygems'
29
+ retry
30
+ end
31
+ raise
32
+ end
33
+
34
+
35
+ include Arrow::TestConstants
36
+
37
+
38
+ #####################################################################
39
+ ### C O N T E X T S
40
+ #####################################################################
41
+
42
+ describe Arrow::Config do
43
+ include Arrow::SpecHelpers
44
+
45
+ before( :all ) do
46
+ setup_logging( :crit )
47
+ end
48
+
49
+ after( :all ) do
50
+ reset_logging()
51
+ end
52
+
53
+
54
+
55
+ #################################################################
56
+ ### E X A M P L E S
57
+ #################################################################
58
+
59
+ describe Arrow::Config::ConfigStruct do
60
+
61
+ it "can be constructed from a Hash" do
62
+ struct = Arrow::Config::ConfigStruct.new( TEST_CONFIG_HASH )
63
+ struct.should have(5).members
64
+ end
65
+
66
+ describe "instance" do
67
+ before( :each ) do
68
+ @struct = Arrow::Config::ConfigStruct.new( TEST_CONFIG_HASH )
69
+ end
70
+
71
+ it "knows what its keys are" do
72
+ @struct.keys.should have( TEST_CONFIG_HASH.length ).members
73
+ @struct.keys.should include( *TEST_CONFIG_HASH.keys )
74
+ end
75
+
76
+ it "knows if it has a particular key" do
77
+ @struct.should have_key( :templates )
78
+ end
79
+
80
+ it "can look up its values via the Hash index interface" do
81
+ @struct[:applets][:path].should == TEST_CONFIG_HASH[:applets][:path]
82
+ end
83
+
84
+ it "can turn itself back into a Hash" do
85
+ @struct.to_hash.should == TEST_CONFIG_HASH
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+
92
+
93
+ it "has reasonable defaults when instantiated without arguments" do
94
+ config = Arrow::Config.new
95
+ config.to_hash.should == Arrow::Config::DEFAULTS
96
+ end
97
+
98
+
99
+ it "can be initialized with a Hash" do
100
+ config = Arrow::Config.new( TEST_CONFIG_HASH.dup )
101
+ config.to_hash.should == TEST_CONFIG_HASH
102
+ end
103
+
104
+
105
+ ### Test instantiation of the Config class with configuration values.
106
+ def test_11_InstantiationWithArgs
107
+ printTestHeader "Arrow::Config: Instantiation with arguments"
108
+ rval = config = nil
109
+
110
+ assert_nothing_raised {
111
+ config = Arrow::Config.new( TestConfig )
112
+ }
113
+ assert_instance_of Arrow::Config, config
114
+
115
+ # The configuration values should be the test config merged with the
116
+ # defaults for the config class.
117
+ (TestConfig.keys|Arrow::Config::DEFAULTS.keys).each {|key|
118
+ val = TestConfig[key] || Arrow::Config::DEFAULTS[key]
119
+ assert_nothing_raised { rval = config.send(key) }
120
+ assert_config_equal val, rval, key
121
+ }
122
+ end
123
+
124
+
125
+ ### Test the abstract Config::Loader class.
126
+ def test_30_Loader
127
+ printTestHeader "Arrow::Config: Loader base class"
128
+ rval = loader = nil
129
+ createTime = Time.now
130
+
131
+ assert_nothing_raised { loader = Arrow::Config::Loader.create('test') }
132
+ assert_kind_of Arrow::Config::Loader, loader
133
+
134
+ # The #load method
135
+ assert_respond_to loader, :load
136
+ assert_nothing_raised { rval = loader.load("foo") }
137
+ assert_instance_of Hash, rval
138
+ assert rval.key?( :applets ), "Loaded hash has an :applets key"
139
+ assert rval.key?( :templates ), "Loaded hash has a :templates key"
140
+
141
+ # The #save method
142
+ assert_respond_to loader, :save
143
+ assert_nothing_raised { loader.save(rval, "foo") }
144
+ end
145
+
146
+
147
+ ### Test the .create method of Loader with the YAML Loader class.
148
+ def test_31_CreateYamlLoader
149
+ printTestHeader "Arrow::Config: YAML loader"
150
+ loader = rval = nil
151
+
152
+ assert_nothing_raised {
153
+ loader = Arrow::Config::Loader.create( 'yaml' )
154
+ }
155
+ assert_kind_of Arrow::Config::Loader, loader
156
+
157
+ assert_nothing_raised {
158
+ loader = Arrow::Config::Loader.create( 'YAML' )
159
+ }
160
+ assert_kind_of Arrow::Config::Loader, loader
161
+
162
+ assert_nothing_raised {
163
+ loader = Arrow::Config::Loader.create( 'Yaml' )
164
+ }
165
+ assert_kind_of Arrow::Config::Loader, loader
166
+ end
167
+
168
+
169
+ ### Write config
170
+ def test_40_ConfigWriteRead
171
+ printTestHeader "Arrow::Config: #write and #read"
172
+
173
+ config = Arrow::Config.new( TestConfig )
174
+ assert_nothing_raised {
175
+ config.write( TestConfigFilename )
176
+ }
177
+
178
+ otherConfig = Arrow::Config.load( TestConfigFilename )
179
+
180
+ assert_config_equal config.struct, otherConfig.struct
181
+ end
182
+
183
+
184
+ ### Changed predicate knows something has changed after regular set
185
+ def test_50_changed_after_set
186
+ printTestHeader "Arrow::Config: #changed? after .member="
187
+ rval = nil
188
+ config = Arrow::Config.new( TestConfig )
189
+
190
+ # Make sure the brand-new config struct knows it's unchanged
191
+ assert_nothing_raised do
192
+ rval = config.changed?
193
+ end
194
+ assert_equal false, rval
195
+
196
+ # Change something via the regular accessors
197
+ config.templates.cache = false
198
+
199
+ # Make sure it knows something changed
200
+ assert_nothing_raised do
201
+ rval = config.changed?
202
+ end
203
+ assert_equal true, rval
204
+ end
205
+
206
+
207
+ ### "Changed" predicate knows something has changed after merge-in-place
208
+ def test_55_changed_after_merge
209
+ printTestHeader "Arrow::Config: #changed? after #merge!"
210
+ rval = nil
211
+ config = Arrow::Config.new( TestConfig )
212
+ config2 = Arrow::Config.new()
213
+
214
+ # Now merge the defaults back into the test config
215
+ config.merge!( config2 )
216
+
217
+ # Make sure it knows something changed
218
+ assert_nothing_raised do
219
+ rval = config.changed?
220
+ end
221
+ assert_equal true, rval
222
+ end
223
+
224
+ end
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
6
+
7
+ libdir = basedir + "lib"
8
+
9
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
10
+ }
11
+
12
+ begin
13
+ require 'digest/md5'
14
+ require 'spec'
15
+ require 'apache/fakerequest'
16
+ require 'arrow'
17
+ require 'arrow/cookieset'
18
+ rescue LoadError
19
+ unless Object.const_defined?( :Gem )
20
+ require 'rubygems'
21
+ retry
22
+ end
23
+ raise
24
+ end
25
+
26
+
27
+ #####################################################################
28
+ ### C O N T E X T S
29
+ #####################################################################
30
+
31
+ describe Arrow::CookieSet do
32
+ before(:each) do
33
+ @cookieset = Arrow::CookieSet.new
34
+ end
35
+
36
+
37
+ it "is able to enummerate over each cookie in the set" do
38
+ pants_cookie = Arrow::Cookie.new( 'pants', 'baggy' )
39
+ shirt_cookie = Arrow::Cookie.new( 'shirt', 'pirate' )
40
+ @cookieset << shirt_cookie << pants_cookie
41
+
42
+ cookies = []
43
+ @cookieset.each do |cookie|
44
+ cookies << cookie
45
+ end
46
+
47
+ cookies.length.should == 2
48
+ cookies.should include( pants_cookie )
49
+ cookies.should include( shirt_cookie )
50
+ end
51
+
52
+ it "is able to add a cookie referenced symbolically" do
53
+ pants_cookie = Arrow::Cookie.new( 'pants', 'denim' )
54
+ @cookieset[:pants] = pants_cookie
55
+ @cookieset['pants'].should == pants_cookie
56
+ end
57
+
58
+
59
+ it "autos-create a cookie for a non-cookie passed to the index setter" do
60
+ lambda { @cookieset['bar'] = 'badgerbadgerbadgerbadger' }.should_not raise_error()
61
+
62
+ @cookieset['bar'].should be_an_instance_of( Arrow::Cookie )
63
+ @cookieset['bar'].value.should == 'badgerbadgerbadgerbadger'
64
+ end
65
+
66
+ it "raises an exception if the name of a cookie being set doesn't agree with the key it being set with" do
67
+ pants_cookie = Arrow::Cookie.new( 'pants', 'corduroy' )
68
+ lambda { @cookieset['shirt'] = pants_cookie }.should raise_error( ArgumentError )
69
+ end
70
+
71
+ it "implements Enumerable" do
72
+ Enumerable.instance_methods( false ).each do |meth|
73
+ @cookieset.should respond_to( meth )
74
+ end
75
+ end
76
+
77
+ it "is able to set a cookie's value symbolically to something other than a String" do
78
+ @cookieset[:wof] = Digest::MD5.hexdigest( Time.now.to_s )
79
+ end
80
+
81
+ it "is able to set a cookie with a Symbol key" do
82
+ @cookieset[:wof] = Arrow::Cookie.new( :wof, "something" )
83
+ end
84
+
85
+ end
86
+
87
+ describe Arrow::CookieSet, " created with an Array of cookies" do
88
+ it "should flatten the array" do
89
+ cookie_array = []
90
+ cookie_array << Arrow::Cookie.new( 'foo', 'bar' )
91
+ cookie_array << [Arrow::Cookie.new( 'shmoop', 'torgo!' )]
92
+
93
+ cookieset = nil
94
+ lambda {cookieset = Arrow::CookieSet.new(cookie_array)}.should_not raise_error()
95
+ cookieset.length.should == 2
96
+ end
97
+ end
98
+
99
+ describe Arrow::CookieSet, " with a 'foo' cookie" do
100
+ before(:each) do
101
+ @cookie = Arrow::Cookie.new( 'foo', 'bar' )
102
+ @cookieset = Arrow::CookieSet.new( @cookie )
103
+ end
104
+
105
+ it "contains only one cookie" do
106
+ @cookieset.length.should == 1
107
+ end
108
+
109
+ it "is able to return the 'foo' Arrow::Cookie via its index operator" do
110
+ @cookieset[ 'foo' ].should == @cookie
111
+ end
112
+
113
+
114
+ it "is able to return the 'foo' Arrow::Cookie via its symbolic name" do
115
+ @cookieset[ :foo ].should == @cookie
116
+ end
117
+
118
+ it "knows if it includes a cookie named 'foo'" do
119
+ @cookieset.should include( 'foo' )
120
+ end
121
+
122
+ it "knows if it includes a cookie referenced by :foo" do
123
+ @cookieset.should include( :foo )
124
+ end
125
+
126
+ it "knows that it doesn't contain a cookie named 'lollypop'" do
127
+ @cookieset.should_not include( 'lollypop' )
128
+ end
129
+
130
+ it "knows that it includes the 'foo' cookie object" do
131
+ @cookieset.should include( @cookie )
132
+ end
133
+
134
+
135
+ it "adds a cookie to the set if it has a different name" do
136
+ new_cookie = Arrow::Cookie.new( 'bar', 'foo' )
137
+ @cookieset << new_cookie
138
+
139
+ @cookieset.length.should == 2
140
+ @cookieset.should include( new_cookie )
141
+ end
142
+
143
+
144
+ it "replaces any existing same-named cookie added via appending" do
145
+ new_cookie = Arrow::Cookie.new( 'foo', 'giant scallops of doom' )
146
+ @cookieset << new_cookie
147
+
148
+ @cookieset.length.should == 1
149
+ @cookieset.should include( new_cookie )
150
+ @cookieset['foo'].should equal( new_cookie )
151
+ end
152
+
153
+ it "replaces any existing same-named cookie set via the index operator" do
154
+ new_cookie = Arrow::Cookie.new( 'foo', 'giant scallops of doom' )
155
+ @cookieset[:foo] = new_cookie
156
+
157
+ @cookieset.length.should == 1
158
+ @cookieset.should include( new_cookie )
159
+ @cookieset['foo'].should equal( new_cookie )
160
+ end
161
+
162
+ end
163
+
164
+ # vim: set nosta noet ts=4 sw=4: