radiant 0.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of radiant might be problematic. Click here for more details.

Files changed (205) hide show
  1. data/CHANGELOG +1 -0
  2. data/CONTRIBUTORS +12 -0
  3. data/LICENSE +9 -0
  4. data/README +91 -0
  5. data/Rakefile +10 -0
  6. data/app/behaviors/archive_behavior.rb +42 -0
  7. data/app/behaviors/archive_day_index_behavior.rb +30 -0
  8. data/app/behaviors/archive_month_index_behavior.rb +30 -0
  9. data/app/behaviors/archive_year_index_behavior.rb +30 -0
  10. data/app/behaviors/env_behavior.rb +18 -0
  11. data/app/behaviors/page_missing_behavior.rb +31 -0
  12. data/app/controllers/admin/export_controller.rb +8 -0
  13. data/app/controllers/admin/layout_controller.rb +23 -0
  14. data/app/controllers/admin/model_controller.rb +119 -0
  15. data/app/controllers/admin/page_controller.rb +119 -0
  16. data/app/controllers/admin/snippet_controller.rb +6 -0
  17. data/app/controllers/admin/user_controller.rb +45 -0
  18. data/app/controllers/admin/welcome_controller.rb +39 -0
  19. data/app/controllers/application.rb +32 -0
  20. data/app/controllers/site_controller.rb +54 -0
  21. data/app/filters/markdown_filter.rb +9 -0
  22. data/app/filters/textile_filter.rb +9 -0
  23. data/app/helpers/admin/export_helper.rb +2 -0
  24. data/app/helpers/admin/layout_helper.rb +2 -0
  25. data/app/helpers/admin/page_helper.rb +10 -0
  26. data/app/helpers/admin/snippet_helper.rb +2 -0
  27. data/app/helpers/admin/user_helper.rb +2 -0
  28. data/app/helpers/admin/welcome_helper.rb +2 -0
  29. data/app/helpers/application_helper.rb +141 -0
  30. data/app/helpers/site_helper.rb +2 -0
  31. data/app/models/archive_finder.rb +66 -0
  32. data/app/models/behavior.rb +194 -0
  33. data/app/models/layout.rb +13 -0
  34. data/app/models/page.rb +91 -0
  35. data/app/models/page_context.rb +526 -0
  36. data/app/models/page_part.rb +13 -0
  37. data/app/models/radiant/config.rb +53 -0
  38. data/app/models/radiant/exporter.rb +11 -0
  39. data/app/models/response_cache.rb +112 -0
  40. data/app/models/snippet.rb +16 -0
  41. data/app/models/status.rb +31 -0
  42. data/app/models/text_filter.rb +11 -0
  43. data/app/models/user.rb +70 -0
  44. data/app/models/user_action_observer.rb +13 -0
  45. data/app/views/admin/layout/index.rhtml +38 -0
  46. data/app/views/admin/layout/new.rhtml +37 -0
  47. data/app/views/admin/layout/remove.rhtml +17 -0
  48. data/app/views/admin/page/_node.rhtml +51 -0
  49. data/app/views/admin/page/_part.rhtml +17 -0
  50. data/app/views/admin/page/children.rhtml +4 -0
  51. data/app/views/admin/page/index.rhtml +172 -0
  52. data/app/views/admin/page/new.rhtml +164 -0
  53. data/app/views/admin/page/remove.rhtml +14 -0
  54. data/app/views/admin/snippet/index.rhtml +36 -0
  55. data/app/views/admin/snippet/new.rhtml +28 -0
  56. data/app/views/admin/snippet/remove.rhtml +16 -0
  57. data/app/views/admin/user/index.rhtml +43 -0
  58. data/app/views/admin/user/new.rhtml +48 -0
  59. data/app/views/admin/user/preferences.rhtml +29 -0
  60. data/app/views/admin/user/remove.rhtml +16 -0
  61. data/app/views/admin/welcome/login.rhtml +51 -0
  62. data/app/views/layouts/application.rhtml +75 -0
  63. data/app/views/site/not_found.rhtml +3 -0
  64. data/bin/radiant +305 -0
  65. data/config/boot.rb +80 -0
  66. data/config/database.mysql.yml +20 -0
  67. data/config/database.postgresql.yml +20 -0
  68. data/config/database.sqlite.yml +20 -0
  69. data/config/environment.rb +76 -0
  70. data/config/environments/development.rb +20 -0
  71. data/config/environments/production.rb +22 -0
  72. data/config/environments/test.rb +20 -0
  73. data/config/locomotive.yml +6 -0
  74. data/config/routes.rb +64 -0
  75. data/db/development_structure.sql +80 -0
  76. data/db/migrate/001_create_radiant_tables.rb +73 -0
  77. data/db/migrate/002_insert_initial_data.rb +45 -0
  78. data/db/migrate/003_rename_behavior_column.rb +9 -0
  79. data/db/migrate/004_rename_filter_column.rb +11 -0
  80. data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
  81. data/db/migrate/006_integer_columns_to_boolean.rb +11 -0
  82. data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
  83. data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
  84. data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
  85. data/db/schema.rb +74 -0
  86. data/db/templates/empty.yml +2 -0
  87. data/db/templates/simple-blog.yml +197 -0
  88. data/db/templates/styled-blog.yml +472 -0
  89. data/lib/advanced_delegation.rb +21 -0
  90. data/lib/archive_index_behavior_tags_and_methods.rb +48 -0
  91. data/lib/generators/behavior/USAGE +16 -0
  92. data/lib/generators/behavior/behavior_generator.rb +22 -0
  93. data/lib/generators/behavior/templates/model.rb.template +9 -0
  94. data/lib/generators/behavior/templates/unit_test.rb.template +16 -0
  95. data/lib/generators/filter/USAGE +16 -0
  96. data/lib/generators/filter/filter_generator.rb +22 -0
  97. data/lib/generators/filter/templates/model.rb.template +8 -0
  98. data/lib/generators/filter/templates/unit_test.rb.template +7 -0
  99. data/lib/inheritable_class_attributes.rb +65 -0
  100. data/lib/login_system.rb +80 -0
  101. data/lib/plugins/index_quoting_fix/init.rb +32 -0
  102. data/lib/plugins/string_io/init.rb +2 -0
  103. data/lib/radiant.rb +5 -0
  104. data/lib/registerable.rb +70 -0
  105. data/lib/tasks/release.rake +84 -0
  106. data/public/404.html +8 -0
  107. data/public/500.html +8 -0
  108. data/public/dispatch.cgi +10 -0
  109. data/public/dispatch.fcgi +24 -0
  110. data/public/dispatch.rb +10 -0
  111. data/public/favicon.ico +0 -0
  112. data/public/images/add-child.png +0 -0
  113. data/public/images/brown-bottom-line.gif +0 -0
  114. data/public/images/clear-page-cache.png +0 -0
  115. data/public/images/collapse.png +0 -0
  116. data/public/images/expand.png +0 -0
  117. data/public/images/minus.png +0 -0
  118. data/public/images/new-homepage.png +0 -0
  119. data/public/images/new-layout.png +0 -0
  120. data/public/images/new-snippet.png +0 -0
  121. data/public/images/new-user.png +0 -0
  122. data/public/images/page.png +0 -0
  123. data/public/images/plus.png +0 -0
  124. data/public/images/remove-disabled.png +0 -0
  125. data/public/images/remove.png +0 -0
  126. data/public/images/snippet.png +0 -0
  127. data/public/images/spinner.gif +0 -0
  128. data/public/images/view-site.gif +0 -0
  129. data/public/images/virtual-page.png +0 -0
  130. data/public/javascripts/application.js +2 -0
  131. data/public/javascripts/controls.js +815 -0
  132. data/public/javascripts/dragdrop.js +913 -0
  133. data/public/javascripts/effects.js +958 -0
  134. data/public/javascripts/pngfix.js +78 -0
  135. data/public/javascripts/prototype.js +2006 -0
  136. data/public/javascripts/ruledtable.js +28 -0
  137. data/public/javascripts/string.js +23 -0
  138. data/public/javascripts/tabcontrol.js +140 -0
  139. data/public/robots.txt +1 -0
  140. data/public/stylesheets/admin.css +464 -0
  141. data/script/about +3 -0
  142. data/script/breakpointer +3 -0
  143. data/script/console +3 -0
  144. data/script/destroy +3 -0
  145. data/script/generate +3 -0
  146. data/script/performance/benchmarker +3 -0
  147. data/script/performance/profiler +3 -0
  148. data/script/plugin +3 -0
  149. data/script/process/reaper +3 -0
  150. data/script/process/spawner +3 -0
  151. data/script/process/spinner +3 -0
  152. data/script/runner +3 -0
  153. data/script/server +3 -0
  154. data/script/setup_database +297 -0
  155. data/test/fixtures/layouts.yml +26 -0
  156. data/test/fixtures/page_parts.yml +99 -0
  157. data/test/fixtures/pages.yml +359 -0
  158. data/test/fixtures/pages.yml.rej +28 -0
  159. data/test/fixtures/snippets.yml +18 -0
  160. data/test/fixtures/users.yml +30 -0
  161. data/test/functional/admin/export_controller_test.rb +22 -0
  162. data/test/functional/admin/layout_controller_test.rb +40 -0
  163. data/test/functional/admin/model_controller_test.rb +152 -0
  164. data/test/functional/admin/page_controller_test.rb +179 -0
  165. data/test/functional/admin/snippet_controller_test.rb +11 -0
  166. data/test/functional/admin/user_controller_test.rb +71 -0
  167. data/test/functional/admin/welcome_controller_test.rb +48 -0
  168. data/test/functional/application_controller_test.rb +44 -0
  169. data/test/functional/login_system_test.rb +155 -0
  170. data/test/functional/site_controller_test.rb +172 -0
  171. data/test/helpers/archive_index_test_helper.rb +35 -0
  172. data/test/helpers/behavior_render_test_helper.rb +34 -0
  173. data/test/helpers/behavior_test_helper.rb +47 -0
  174. data/test/helpers/caching_test_helper.rb +41 -0
  175. data/test/helpers/layout_test_helper.rb +35 -0
  176. data/test/helpers/page_part_test_helper.rb +49 -0
  177. data/test/helpers/page_test_helper.rb +36 -0
  178. data/test/helpers/snippet_test_helper.rb +32 -0
  179. data/test/helpers/user_test_helper.rb +34 -0
  180. data/test/helpers/validation_test_helper.rb +42 -0
  181. data/test/test_helper.rb +54 -0
  182. data/test/unit/behavior_test.rb +196 -0
  183. data/test/unit/behaviors/archive_behavior_test.rb +33 -0
  184. data/test/unit/behaviors/archive_day_index_behavior_test.rb +21 -0
  185. data/test/unit/behaviors/archive_month_index_behavior_test.rb +21 -0
  186. data/test/unit/behaviors/archive_year_index_behavior_test.rb +21 -0
  187. data/test/unit/behaviors/page_missing_behavior_test.rb +27 -0
  188. data/test/unit/filters/markdown_filter_test.rb +14 -0
  189. data/test/unit/filters/textile_filter_test.rb +14 -0
  190. data/test/unit/inheritable_class_attributes_test.rb +47 -0
  191. data/test/unit/layout_test.rb +29 -0
  192. data/test/unit/page_context_test.rb +375 -0
  193. data/test/unit/page_context_test.rb.rej +26 -0
  194. data/test/unit/page_part_test.rb +44 -0
  195. data/test/unit/page_test.rb +224 -0
  196. data/test/unit/radiant/config_test.rb +46 -0
  197. data/test/unit/radiant/exporter_test.rb +26 -0
  198. data/test/unit/registerable_test.rb +68 -0
  199. data/test/unit/response_cache_test.rb +133 -0
  200. data/test/unit/snippet_test.rb +47 -0
  201. data/test/unit/status_test.rb +43 -0
  202. data/test/unit/text_filter_test.rb +14 -0
  203. data/test/unit/user_action_observer_test.rb +40 -0
  204. data/test/unit/user_test.rb +138 -0
  205. metadata +355 -0
@@ -0,0 +1,26 @@
1
+ ***************
2
+ *** 262,267 ****
3
+ assert_parse_output_match "undefined tag `missing'", '<r:missing />'
4
+ end
5
+
6
+ protected
7
+
8
+ def setup_for_page(page)
9
+ --- 262,278 ----
10
+ assert_parse_output_match "undefined tag `missing'", '<r:missing />'
11
+ end
12
+
13
+ + def test_tag_tags_list
14
+ + setup_for_page(:homepage)
15
+ + expected = '<a href="/tags/lump">lump</a><a href="/tags/bar">bar</a><a href="/tags/test">test</a><a href="/tags/foo">foo</a>'
16
+ + tags = '<r:tags url="/tags/"><r:link /></r:tags>'
17
+ + assert_parse_output expected, tags
18
+ + end
19
+ +
20
+ + def test_tag_tags_without_url
21
+ + assert_parse_output_match "`tags' tag must include an 'url' attribute", %{<r:tags />}
22
+ + end
23
+ +
24
+ protected
25
+
26
+ def setup_for_page(page)
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class PagePartTest < Test::Unit::TestCase
4
+ fixtures :page_parts
5
+ test_helper :pages, :page_parts, :validations
6
+
7
+ def setup
8
+ @part = @model = PagePart.new(VALID_PAGE_PART_PARAMS)
9
+ end
10
+
11
+ def test_validates_length_of
12
+ {
13
+ :name => 100,
14
+ :filter_id => 25
15
+ }.each do |field, max|
16
+ assert_invalid field, ('%d-character limit' % max), 'x' * (max + 1)
17
+ assert_valid field, 'x' * max
18
+ end
19
+ end
20
+
21
+ def test_validates_presence_of
22
+ [:name].each do |field|
23
+ assert_invalid field, 'required', '', ' ', nil
24
+ end
25
+ end
26
+
27
+ def test_validates_numericality_of
28
+ [:id, :page_id].each do |field|
29
+ assert_valid field, '1', '2'
30
+ assert_invalid field, 'must be a number', 'abcd', '1,2', '1.3'
31
+ end
32
+ end
33
+
34
+ def test_filter
35
+ @part = page_parts(:textile_body)
36
+ original = @part.filter
37
+ assert_kind_of TextileFilter, original
38
+
39
+ assert_same original, @part.filter
40
+
41
+ @part.filter_id = 'Markdown'
42
+ assert_kind_of MarkdownFilter, @part.filter
43
+ end
44
+ end
@@ -0,0 +1,224 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class PageTest < Test::Unit::TestCase
4
+ fixtures :users, :pages, :page_parts, :layouts
5
+ test_helper :pages, :page_parts, :validations
6
+
7
+ def setup
8
+ @page_title = 'Page Title'
9
+ destroy_test_page
10
+
11
+ @part_name = 'test-part'
12
+ destroy_test_part
13
+
14
+ @page = @model = Page.new(VALID_PAGE_PARAMS)
15
+ end
16
+
17
+ def test_validates_length_of
18
+ {
19
+ :title => 255,
20
+ :slug => 100,
21
+ :breadcrumb => 160,
22
+ :behavior_id => 25
23
+ }.each do |field, max|
24
+ assert_invalid field, ('%d-character limit' % max), 'x' * (max + 1)
25
+ assert_valid field, 'x' * max
26
+ end
27
+ end
28
+
29
+ def test_validates_presence_of
30
+ [:title, :slug, :breadcrumb].each do |field|
31
+ assert_invalid field, 'required', '', ' ', nil
32
+ end
33
+ end
34
+
35
+ def test_validates_format_of
36
+ @page.parent = pages(:homepage)
37
+ assert_valid :slug, 'abc', 'abcd-efg', 'abcd_efg', 'abc.html', '/', '123'
38
+ assert_invalid :slug, 'invalid format', 'abcd efg', ' abcd', 'abcd/efg'
39
+ end
40
+
41
+ def test_validates_numericality_of
42
+ assert_invalid :status_id, 'required', '', nil
43
+ [:id, :status_id, :parent_id].each do |field|
44
+ assert_valid field, '1', '2'
45
+ assert_invalid field, 'must be a number', 'abcd', '1,2', '1.3'
46
+ end
47
+ end
48
+
49
+ def test_validates_uniqueness_of
50
+ @page.parent = pages(:radius)
51
+ assert_invalid :slug, 'slug already in use for child of parent', 'child-1', 'child-2', 'child-3'
52
+ assert_valid :slug, 'child-4'
53
+ end
54
+
55
+ def test_parts
56
+ @homepage = pages(:homepage)
57
+ assert_equal(4, @homepage.parts.count)
58
+
59
+ @documentation = pages(:documentation)
60
+ assert_equal(1, @documentation.parts.count)
61
+ end
62
+
63
+ def test_destroy__parts_dependant
64
+ @page = create_test_page
65
+ @page.parts.create(part_params(:name => @part_name, :page_id => nil))
66
+ assert_kind_of PagePart, @page.parts.find_by_name(@part_name)
67
+
68
+ id = @page.id
69
+ @page.destroy
70
+ assert_nil PagePart.find_by_page_id_and_name(id, @part_name)
71
+ end
72
+
73
+ def test_part
74
+ part = radius_page.part('body')
75
+ assert_equal 'body', part.name
76
+ end
77
+ def test_part__lookup_by_symbol
78
+ part = radius_page.part(:body)
79
+ assert_equal 'body', part.name
80
+ end
81
+
82
+ def test_child_url
83
+ @page = pages(:parent)
84
+ @child = pages(:child)
85
+ assert_equal '/parent/child/', @page.child_url(@child)
86
+ end
87
+
88
+ def test_url
89
+ page = pages(:parent)
90
+ assert_equal '/parent/', page.url
91
+ assert_equal '/parent/child/', page.children.first.url
92
+ end
93
+
94
+ def test_layout
95
+ page = pages(:page_with_layout)
96
+ assert_equal 1, page.layout_id
97
+ assert_kind_of Layout, page.layout
98
+ end
99
+
100
+ def test_published_at
101
+ @page = create_test_page(:status_id => '1')
102
+ assert_nil @page.published_at
103
+
104
+ @page.status_id = status(:published).id
105
+ @page.save
106
+ assert_not_nil @page.published_at
107
+ assert_equal Time.now.day, @page.published_at.day
108
+ end
109
+
110
+ def test_published_at__not_updated_on_save_because_already_published
111
+ @page = create_test_page(:status_id => status(:published).id)
112
+ assert_kind_of Time, @page.published_at
113
+
114
+ expected = @page.published_at
115
+ @page.save
116
+ assert_equal expected, @page.published_at
117
+ end
118
+
119
+ def test_published
120
+ @page.status = status(:published)
121
+ assert_equal true, @page.published?
122
+ end
123
+
124
+ def test_published__not_published
125
+ @page.status = status(:draft)
126
+ assert_equal false, @page.published?
127
+ end
128
+
129
+ def test_find_by_url
130
+ @page = pages(:homepage)
131
+ assert_equal pages(:article), @page.find_by_url('/archive/2000/05/01/article/')
132
+ end
133
+
134
+ def test_find_by_url__raises_exception_when_root_missing
135
+ pages(:homepage).destroy
136
+
137
+ # This shouldn't raise an error when there's no root...
138
+ assert_nil Page.find_by_parent_id(nil)
139
+
140
+ # ...but this should
141
+ e = assert_raises(Page::MissingRootPageError) { Page.find_by_url "/" }
142
+ assert_equal 'Database missing root page', e.message
143
+ end
144
+
145
+ def test_find_by_url_class_method
146
+ @root = pages(:homepage)
147
+ assert_equal @root, Page.find_by_url('/')
148
+
149
+ @page = pages(:books)
150
+ assert_equal @page, Page.find_by_url('/documentation/books/')
151
+
152
+ @root = pages(:homepage)
153
+ assert_equal 'File Not Found', Page.find_by_url('/gallery/gallery_draft/').title
154
+ assert_equal 'Gallery Draft', Page.find_by_url('/gallery/gallery_draft/', false).title
155
+ end
156
+
157
+ def test_render
158
+ @page = pages(:small_test)
159
+ assert_equal 'test', @page.render
160
+ end
161
+
162
+ def test_process
163
+ @page = create_test_page
164
+ @request = ActionController::TestRequest.new :url => '/page/'
165
+ @response = ActionController::TestResponse.new
166
+ @page.process(@request, @response)
167
+ assert_equal 'test', @response.body
168
+ end
169
+
170
+ def test_status
171
+ @page = pages(:homepage)
172
+ assert_equal Status[:published], @page.status
173
+ end
174
+
175
+ def test_set_status
176
+ @page = pages(:homepage)
177
+ draft = Status[:draft]
178
+ @page.status = draft
179
+ assert_equal draft, @page.status
180
+ assert_equal draft.id, @page.status_id
181
+ end
182
+
183
+ def test_cache
184
+ assert_equal true, @page.cache?
185
+ end
186
+
187
+ def test_layout__inherited
188
+ @page = pages(:child_of_page_with_layout)
189
+ assert_equal nil, @page.layout_id
190
+ assert_equal @page.parent.layout, @page.layout
191
+ end
192
+
193
+ def test_virtual?
194
+ assert_equal false, @page.virtual?
195
+ end
196
+
197
+ def test_before_save
198
+ @page = create_test_page(:behavior_id => 'Archive Month Index')
199
+ assert_equal true, @page.virtual?
200
+ assert_equal true, @page.virtual
201
+ end
202
+
203
+ def test_behavior
204
+ @page = pages(:homepage)
205
+ original = @page.behavior
206
+
207
+ assert_kind_of Behavior::Base, original
208
+
209
+ assert_same original, @page.behavior
210
+
211
+ @page.behavior_id = 'Archive'
212
+ assert_kind_of ArchiveBehavior, @page.behavior
213
+ end
214
+
215
+ private
216
+
217
+ def radius_page
218
+ pages(:radius)
219
+ end
220
+
221
+ def status(name)
222
+ Status[name]
223
+ end
224
+ end
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'radiant/config'
3
+
4
+ class Radiant::ConfigTest < Test::Unit::TestCase
5
+ def setup
6
+ @conf = Radiant::Config
7
+ set('test', 'cool')
8
+ set('foo', 'bar')
9
+ end
10
+
11
+ def test_brackets
12
+ assert_equal 'cool', @conf['test']
13
+ end
14
+
15
+ def test_brackets_with_non_existant_key
16
+ assert_equal nil, @conf['non-existant-key']
17
+ end
18
+
19
+ def test_assign_to_brackets
20
+ v = @conf['bar'] = 'baz'
21
+ assert_equal 'baz', @conf['bar']
22
+ assert_equal 'baz', v
23
+ end
24
+
25
+ def test_assign_to_brackets_existing_key
26
+ @conf['foo'] = 'normal'
27
+ v = @conf['foo'] = 'replaced'
28
+ assert_equal 'replaced', @conf['foo']
29
+ assert_equal 'replaced', v
30
+ end
31
+
32
+ def test_to_hash
33
+ h = @conf.to_hash
34
+ assert_instance_of Hash, h
35
+ assert_equal 'cool', h['test']
36
+ assert h.size > 1
37
+ end
38
+
39
+ private
40
+ def set(key, value)
41
+ setting = Radiant::Config.find_by_key(key)
42
+ setting.destroy if setting
43
+ Radiant::Config.new(:key => key, :value => value).save
44
+ end
45
+
46
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'radiant/exporter'
3
+
4
+ class Radiant::ExporterTest < Test::Unit::TestCase
5
+ fixtures :users, :pages, :page_parts, :snippets, :layouts
6
+
7
+ def setup
8
+ @exporter = Radiant::Exporter
9
+ @output = @exporter.export
10
+ @hash = YAML::load(@output)
11
+ @classes = ['Radiant::Configs', 'Users', 'Pages', 'PageParts', 'Snippets', 'Layouts']
12
+ end
13
+
14
+ def test_export_is_string
15
+ assert_kind_of String, @output
16
+ end
17
+ def test_export_classes
18
+ @classes.each do |expected|
19
+ assert @hash.keys.include?(expected), "expected hash to contain <#{expected.inspect}> but it did not"
20
+ end
21
+ end
22
+ def test_export_homepage
23
+ assert_equal 'Ruby Home Page', @hash['Pages'][1]['title']
24
+ assert_equal 'Admin User', @hash['Users'][3]['name']
25
+ end
26
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class RegisterableTest < Test::Unit::TestCase
4
+
5
+ module TestModule
6
+ include Registerable
7
+
8
+ class TestClass < Base
9
+ register 'test'
10
+ end
11
+
12
+ class Unregistered < Base
13
+ end
14
+ end
15
+
16
+ def test_registered
17
+ assert_kind_of Hash, TestModule.registered
18
+ end
19
+
20
+ def test_registered_id
21
+ assert_equal nil, TestModule::Unregistered.registered_id
22
+ assert_equal 'test', TestModule::TestClass.registered_id
23
+ assert_equal 'test', TestModule::TestClass.new.registered_id
24
+ end
25
+
26
+ def test_brackets
27
+ assert_equal TestModule::TestClass, TestModule['test']
28
+ end
29
+ def test_brackets__symbol
30
+ assert_equal TestModule::TestClass, TestModule[:test]
31
+ end
32
+ def test_brackets__with_padding
33
+ assert_equal TestModule::TestClass, TestModule[' test ']
34
+ end
35
+ def test_brackets__nil_value
36
+ assert_equal TestModule::Base, TestModule[nil]
37
+ end
38
+ def test_brackets__empty_value
39
+ assert_equal TestModule::Base, TestModule[' ']
40
+ end
41
+ def test_brackets__unknown_value
42
+ assert_equal TestModule::Base, TestModule['Unknown']
43
+ end
44
+ def test_brackets__return_same_instance_every_time
45
+ assert_same TestModule['test'], TestModule['test']
46
+ assert_same TestModule[nil], TestModule[nil]
47
+ assert_same TestModule[' '], TestModule[' ']
48
+ end
49
+
50
+ def test_create
51
+ assert_instance_of TestModule::TestClass, TestModule.create('test')
52
+ end
53
+
54
+ def test_register
55
+ assert_equal TestModule::TestClass, TestModule['test']
56
+ assert_equal 'test', TestModule::TestClass.registered_id
57
+ end
58
+
59
+ def test_register__already_registered
60
+ e = assert_raises(RuntimeError) { TestModule::Base.register 'test' }
61
+ assert_equal "ID `test' already registered. Choose another ID.", e.message
62
+ end
63
+
64
+ def test_find_all
65
+ expected = [TestModule::TestClass]
66
+ assert_equal expected, TestModule.find_all
67
+ end
68
+ end
@@ -0,0 +1,133 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ResponseCacheTest < Test::Unit::TestCase
4
+ class SilentLogger
5
+ def method_missing(*args); end
6
+ end
7
+
8
+ class TestResponse
9
+ attr_accessor :headers, :body
10
+ def initialize(body = '', headers = {})
11
+ @body, @headers = body, headers
12
+ end
13
+ end
14
+
15
+ def setup
16
+ @dir = "#{RAILS_ROOT}/test/cache"
17
+ @cache = ResponseCache.new(
18
+ :directory => @dir,
19
+ :perform_caching => true
20
+ )
21
+ @cache.clear
22
+ end
23
+
24
+ def teardown
25
+ FileUtils.rm_rf @dir if File.exists? @dir
26
+ end
27
+
28
+ def test_initialize__defaults
29
+ @cache = ResponseCache.new
30
+ assert_equal "#{RAILS_ROOT}/cache", @cache.directory
31
+ assert_equal 5.minutes, @cache.expire_time
32
+ assert_equal '.yml', @cache.default_extension
33
+ assert_equal false, @cache.perform_caching
34
+ assert_kind_of Logger, @cache.logger
35
+ end
36
+
37
+ def test_initialize__with_options
38
+ @cache = ResponseCache.new(
39
+ :directory => "test",
40
+ :expire_time => 5,
41
+ :default_extension => ".xhtml",
42
+ :perform_caching => false,
43
+ :logger => SilentLogger.new
44
+ )
45
+ assert_equal "test", @cache.directory
46
+ assert_equal 5, @cache.expire_time
47
+ assert_equal ".xhtml", @cache.default_extension
48
+ assert_equal false, @cache.perform_caching
49
+ assert_kind_of SilentLogger, @cache.logger
50
+ end
51
+
52
+ def test_cache_response
53
+ ['test/me', '/test/me', 'test/me/', '/test/me/', 'test//me'].each do |url|
54
+ @cache.clear
55
+ @cache.cache_response(url, response('content'))
56
+ name = "#{@dir}/test/me.html"
57
+ assert File.exists?(name), "url: #{url}"
58
+ assert_equal "--- \nbody: content\nheaders: {}", file(name), "url: #{url}"
59
+ end
60
+ end
61
+ def test_cache_response_without_caching
62
+ @cache.perform_caching = false
63
+ @cache.cache_response('test', response('content'))
64
+ assert !File.exists?("#{@dir}/test.yml")
65
+ end
66
+
67
+ def test_cache_response
68
+ @cache.cache_response('/test/me', response('content'))
69
+ ['test/me', '/test/me', 'test/me/', '/test/me/', 'test//me'].each do |url|
70
+ assert_equal 'content', @cache.update_response(url, response).body, "url: #{url}"
71
+ end
72
+ end
73
+ def test_update_response__nonexistant
74
+ assert_equal '', @cache.update_response('nothing/here', response).body
75
+ end
76
+ def test_update_response_without_caching
77
+ @cache.cache_response('/test/me', response('content'))
78
+ @cache.perform_caching = false
79
+ assert_equal '', @cache.update_response('/test/me', response).body
80
+ end
81
+
82
+ def test_cache
83
+ result = @cache.cache_response('test', response('content', 'Content-Type' => 'text/plain'))
84
+ cached = @cache.update_response('test', response)
85
+ assert_equal 'content', cached.body
86
+ assert_equal 'text/plain', cached.headers['Content-Type']
87
+ assert_kind_of TestResponse, result
88
+ end
89
+
90
+ def test_expire_response
91
+ @cache.cache_response('test', response('content'))
92
+ @cache.expire_response('test')
93
+ assert_equal '', @cache.update_response('test', response).body
94
+ end
95
+
96
+ def test_clear
97
+ @cache.cache_response('test1', response('content'))
98
+ @cache.cache_response('test2', response('content'))
99
+ assert_equal 2, Dir["#{@dir}/*"].size
100
+
101
+ @cache.clear
102
+ assert_equal 0, Dir["#{@dir}/*"].size
103
+ end
104
+
105
+ def test_response_cached
106
+ assert_equal false, @cache.response_cached?('test')
107
+ result = @cache.cache_response('test', response('content'))
108
+ assert_equal true, @cache.response_cached?('test')
109
+ end
110
+ def test_response_cached_timed_out
111
+ @cache.expire_time = 1
112
+ result = @cache.cache_response('test', response('content'))
113
+ sleep 1.5
114
+ assert_equal false, @cache.response_cached?('test')
115
+ end
116
+
117
+ # Class Methods
118
+
119
+ def test_instance
120
+ assert_same ResponseCache.instance, ResponseCache.instance
121
+ end
122
+
123
+ private
124
+
125
+ def file(filename)
126
+ open(filename) { |f| f.read } rescue ''
127
+ end
128
+
129
+ def response(*args)
130
+ TestResponse.new(*args)
131
+ end
132
+
133
+ end