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,34 @@
1
+ module BehaviorRenderTestHelper
2
+ def assert_renders(expected, input, url = nil)
3
+ output = get_render_output(input, url)
4
+ message = "<#{expected.inspect}> expected but was <#{output.inspect}>"
5
+ assert_block(message) { expected == output }
6
+ end
7
+
8
+ def assert_render_match(regexp, input, url = nil)
9
+ output = get_render_output(input, url)
10
+ message = "<#{output.inspect}> expected to be =~ <#{regexp.inspect}>"
11
+ assert_block(message) { output =~ regexp }
12
+ end
13
+
14
+ def assert_headers(expected_headers, url = nil)
15
+ setup_behavior(url)
16
+ headers = @behavior.page_headers
17
+ message = "<#{expected_headers.inspect}> expected but was <#{headers.inspect}>"
18
+ assert_block(message) { expected_headers == headers }
19
+ end
20
+
21
+ private
22
+
23
+ def get_render_output(input, url)
24
+ setup_behavior(url)
25
+ @behavior.render_text(input)
26
+ end
27
+
28
+ def setup_behavior(url)
29
+ @behavior = @page.behavior
30
+ @behavior.request = ActionController::TestRequest.new
31
+ @behavior.request.request_uri = 'http://testhost.tld' + (url || @page.url)
32
+ @behavior.response = ActionController::TestResponse.new
33
+ end
34
+ end
@@ -0,0 +1,47 @@
1
+ module BehaviorTestHelper
2
+
3
+ class NoCacheBehavior < Behavior::Base
4
+ register 'No Cache'
5
+ description 'Turns caching off for testing.'
6
+
7
+ def cache_page?
8
+ false
9
+ end
10
+ end
11
+
12
+ class TestBehavior < Behavior::Base
13
+ register 'Test Behavior'
14
+ description 'this is just a test behavior'
15
+
16
+ define_tags do
17
+ tag 'test1' do
18
+ 'Hello world!'
19
+ end
20
+ end
21
+
22
+ define_tags do
23
+ tag 'test2' do
24
+ 'Another test.'
25
+ end
26
+ end
27
+
28
+ define_child_tags do
29
+ tag 'test' do
30
+ page.slug
31
+ end
32
+ end
33
+
34
+ def page_headers
35
+ {
36
+ 'cool' => 'beans',
37
+ 'request' => @request.inspect[20..30],
38
+ 'response' => @response.inspect[20..31]
39
+ }
40
+ end
41
+
42
+ def cache_page?
43
+ false
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,41 @@
1
+ module CachingTestHelper
2
+ class FakeResponseCache
3
+ attr_accessor :expired_path, :expired_paths
4
+
5
+ def initialize
6
+ @expired_paths = []
7
+ @cached_responses = {}
8
+ end
9
+
10
+ def clear
11
+ @cached_responses.clear
12
+ @cleared = true
13
+ end
14
+
15
+ def cache_response(path, response)
16
+ @cached_responses[path] = response
17
+ response
18
+ end
19
+
20
+ def update_response(path, response)
21
+ if r = @cached_response[path]
22
+ response.headers.merge!(r.headers)
23
+ response.body = r.body
24
+ end
25
+ response
26
+ end
27
+
28
+ def expire_response(path)
29
+ @expired_paths << path
30
+ @expired_path = path
31
+ end
32
+
33
+ def response_cached?(path)
34
+ @cached_responses.keys.include?(path)
35
+ end
36
+
37
+ def cleared?
38
+ !!@cleared
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ module LayoutTestHelper
2
+
3
+ VALID_LAYOUT_PARAMS = {
4
+ :name => 'Test Layout',
5
+ :content => 'Just a test.'
6
+ }
7
+
8
+ def layout_params(options = {})
9
+ params = VALID_LAYOUT_PARAMS.dup
10
+ params.merge!(:name => @layout_name) if @layout_name
11
+ params.merge!(options)
12
+ end
13
+
14
+ def destroy_test_layout(name = @layout_name)
15
+ while layout = get_test_layout(name) do
16
+ layout.destroy
17
+ end
18
+ end
19
+
20
+ def get_test_layout(name = @layout_name)
21
+ Layout.find_by_name(name)
22
+ end
23
+
24
+ def create_test_layout(name = @layout_name)
25
+ params = layout_params
26
+ params.merge!(:name => name) if name
27
+ layout = Layout.new(params)
28
+ if layout.save
29
+ layout
30
+ else
31
+ raise "layout <#{layout.inspect}> could not be saved"
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,49 @@
1
+ module PagePartTestHelper
2
+ VALID_PAGE_PART_PARAMS = {
3
+ :name => 'custom',
4
+ :content => 'Some simple content.',
5
+ :page_id => '1'
6
+ }
7
+
8
+ def part_params(options = {})
9
+ params = VALID_PAGE_PART_PARAMS.dup
10
+ params.delete(:page_id)
11
+ params.merge!(:name => @part_name) if @part_name
12
+ params.merge!(options)
13
+ params
14
+ end
15
+
16
+ def destroy_test_part(title = @part_name)
17
+ while part = get_test_part(title) do
18
+ part.destroy
19
+ end
20
+ end
21
+
22
+ def get_test_part(name = @part_name)
23
+ PagePart.find_by_name(name)
24
+ end
25
+
26
+ def create_test_part(name = @part_name)
27
+ params = part_params
28
+ params.merge!(:name => name)
29
+ part = PagePart.new(params)
30
+ if part.save
31
+ part
32
+ else
33
+ raise "part <#{part.inspect}> could not be saved"
34
+ end
35
+ end
36
+
37
+ # must be included after PageTestHelper to work
38
+ def create_test_page(options = {})
39
+ no_part = options.delete(:no_part)
40
+ page = super(options)
41
+ unless no_part
42
+ part = PagePart.new part_params(:name => 'body', :content => 'test')
43
+ page.parts << part
44
+ page.save
45
+ part.save
46
+ end
47
+ page
48
+ end
49
+ end
@@ -0,0 +1,36 @@
1
+ module PageTestHelper
2
+ VALID_PAGE_PARAMS = {
3
+ :title => 'New Page',
4
+ :slug => 'page',
5
+ :breadcrumb => 'New Page',
6
+ :status_id => '1',
7
+ :parent_id => nil
8
+ }
9
+
10
+ def page_params(options = {})
11
+ params = VALID_PAGE_PARAMS.dup
12
+ params.merge!(:title => @page_title) if @page_title
13
+ params.merge!(:status_id => '5')
14
+ params.merge!(options)
15
+ end
16
+
17
+ def destroy_test_page(title = @page_title)
18
+ while page = get_test_page(title) do
19
+ page.destroy
20
+ end
21
+ end
22
+
23
+ def get_test_page(title = @page_title)
24
+ Page.find_by_title(title)
25
+ end
26
+
27
+ def create_test_page(options = {})
28
+ options[:title] ||= @page_title
29
+ page = Page.new page_params(options)
30
+ if page.save
31
+ page
32
+ else
33
+ raise "page <#{page.inspect}> could not be saved"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ module SnippetTestHelper
2
+ VALID_SNIPPET_PARAMS = {
3
+ :name => 'test-snippet',
4
+ :content => 'Funness'
5
+ }
6
+
7
+ def snippet_params(options = {})
8
+ params = VALID_SNIPPET_PARAMS.dup
9
+ params.merge!(:name => @snippet_name) if @snippet_name
10
+ params.merge!(options)
11
+ end
12
+
13
+ def destroy_test_snippet(name = @snippet_name)
14
+ while snippet = get_test_snippet(name) do
15
+ snippet.destroy
16
+ end
17
+ end
18
+
19
+ def get_test_snippet(name = @snippet_name)
20
+ Snippet.find_by_name(name)
21
+ end
22
+
23
+ def create_test_snippet(options = {})
24
+ options[:name] ||= @snippet_name if @snippet_name
25
+ snippet = Snippet.new snippet_params(options)
26
+ if snippet.save
27
+ snippet
28
+ else
29
+ raise "snippet <#{snippet.inspect}> could not be saved"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ module UserTestHelper
2
+ VALID_USER_PARAMS = {
3
+ :name => 'John Doe',
4
+ :login => 'jdoe',
5
+ :password => 'coolness',
6
+ :password_confirmation => 'coolness'
7
+ }
8
+
9
+ def user_params(options = {})
10
+ params = VALID_USER_PARAMS.dup
11
+ params.merge!(:login => @user_login) if @user_login
12
+ params.merge!(options)
13
+ end
14
+
15
+ def destroy_test_user(login = @user_login)
16
+ while user = get_test_user(login) do
17
+ user.destroy
18
+ end
19
+ end
20
+
21
+ def get_test_user(login = @user_login)
22
+ User.find_by_login(login)
23
+ end
24
+
25
+ def create_test_user(options = {})
26
+ options[:login] ||= @user_login if @user_login
27
+ user = User.new user_params(options)
28
+ if user.save
29
+ user
30
+ else
31
+ raise "user <#{user.inspect}> could not be saved"
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ module ValidationTestHelper
2
+ def assert_valid(field, *values)
3
+ __model_check__
4
+ values.flatten.each do |value|
5
+ o = __setup_model__(field, value)
6
+ if o.valid?
7
+ assert_block { true }
8
+ else
9
+ messages = [o.errors[field]].flatten
10
+ assert_block("unexpected invalid field <#{o.class}##{field}>, value: <#{value.inspect}>, errors: <#{o.errors[field].inspect}>.") { false }
11
+ end
12
+ end
13
+ end
14
+
15
+ def assert_invalid(field, message, *values)
16
+ __model_check__
17
+ values.flatten.each do |value|
18
+ o = __setup_model__(field, value)
19
+ if o.valid?
20
+ assert_block("field <#{o.class}##{field}> should be invalid for value <#{value.inspect}> with message <#{message.inspect}>") { false }
21
+ else
22
+ messages = [o.errors[field]].flatten
23
+ assert_block("field <#{o.class}##{field}> with value <#{value.inspect}> expected validation error <#{message.inspect}>, but got errors <#{messages.inspect}>") { messages.include?(message) }
24
+ end
25
+ end
26
+ end
27
+
28
+ def __model_check__
29
+ raise "@model must be assigned in order to use validation assertions" if @model.nil?
30
+
31
+ o = @model.dup
32
+ raise "@model must be valid before calling a validation assertion, instead @model contained the following errors #{o.errors.instance_variable_get('@errors').inspect}" unless o.valid?
33
+ end
34
+
35
+ def __setup_model__(field, value)
36
+ o = @model.dup
37
+ attributes = o.instance_variable_get('@attributes')
38
+ o.instance_variable_set('@attributes', attributes.dup)
39
+ o.send("#{field}=", value)
40
+ o
41
+ end
42
+ end
@@ -0,0 +1,54 @@
1
+ unless defined? TEST_ROOT
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require 'pathname'
5
+ TEST_ROOT = Pathname.new(File.expand_path(File.dirname(__FILE__))).cleanpath(true).to_s
6
+
7
+ require TEST_ROOT + "/../config/environment"
8
+ require 'test_help'
9
+
10
+ class Test::Unit::TestCase
11
+ # Transactional fixtures accelerate your tests by wrapping each test method
12
+ # in a transaction that's rolled back on completion. This ensures that the
13
+ # test database remains unchanged so your fixtures don't have to be reloaded
14
+ # between every test method. Fewer database queries means faster tests.
15
+ #
16
+ # Read Mike Clark's excellent walkthrough at
17
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
18
+ #
19
+ # Every Active Record database supports transactions except MyISAM tables
20
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
21
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
22
+ # is recommended.
23
+ self.use_transactional_fixtures = true
24
+
25
+ # Instantiated fixtures are slow, but give you @david where otherwise you
26
+ # would need people(:david). If you don't want to migrate your existing
27
+ # test cases which use the @david style and don't mind the speed hit (each
28
+ # instantiated fixtures translates to a database query per test method),
29
+ # then set this back to true.
30
+ self.use_instantiated_fixtures = false
31
+
32
+ class << self
33
+ # Class method for test helpers
34
+ def test_helper(*names)
35
+ names.each do |name|
36
+ name = name.to_s
37
+ name = $1 if name =~ /^(.*?)_test_helper$/i
38
+ name = name.singularize
39
+ first_time = true
40
+ begin
41
+ constant = (name.camelize + 'TestHelper').constantize
42
+ self.class_eval { include constant }
43
+ rescue NameError
44
+ filename = File.expand_path(TEST_ROOT + '/helpers/' + name + '_test_helper.rb')
45
+ require filename if first_time
46
+ first_time = false
47
+ retry
48
+ end
49
+ end
50
+ end
51
+ alias :test_helpers :test_helper
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,196 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class BehaviorTest < Test::Unit::TestCase
4
+ fixtures :pages, :page_parts, :snippets, :layouts
5
+ test_helper :behavior, :behavior_render
6
+
7
+ def setup
8
+ setup_for_page(:textile)
9
+ end
10
+
11
+ def test_registered_correctly
12
+ klass = Behavior['Test Behavior']
13
+ assert_equal TestBehavior, klass
14
+ assert_equal 'Test Behavior', klass.registered_id
15
+ end
16
+
17
+ def test_description_class_method
18
+ klass = Behavior['Test Behavior']
19
+ assert_equal 'this is just a test behavior', klass.description
20
+ assert_not_equal 'this is just a test behavior', Behavior['Archive Behavior'].description
21
+ end
22
+
23
+ def test_description
24
+ @behavior = Behavior['Test Behavior'].new(@page)
25
+ assert_equal 'this is just a test behavior', @behavior.description
26
+ end
27
+
28
+ def test_process
29
+ @behavior.process(@request, @response)
30
+ assert_match %r{Some <strong>Textile</strong> content.}, @response.body
31
+ end
32
+ def test_process_with_headers
33
+ @behavior = Behavior['Test Behavior'].new(@page)
34
+ @behavior.process(@request, @response)
35
+ assert_equal 'beans', @response.headers['cool']
36
+ assert_equal 'TestRequest', @response.headers['request']
37
+ assert_equal 'TestResponse', @response.headers['response']
38
+ end
39
+ def test_process__page_with_content_type_set_on_layot
40
+ @behavior = pages(:page_with_content_type_set_on_layout).behavior
41
+ @behavior.process(@request, @response)
42
+ assert_response :success
43
+ assert_equal 'text/html;charset=utf8', @response.headers['Content-Type']
44
+ end
45
+
46
+ def test_child_url
47
+ setup_for_page(:parent)
48
+ @child = pages(:child)
49
+ assert_equal '/parent/child/', @behavior.child_url(@child)
50
+ end
51
+
52
+ def test_page_url
53
+ setup_for_page(:grandchild)
54
+ assert_equal '/parent/child/grandchild/', @behavior.page_url
55
+ end
56
+
57
+ def test_page_headers
58
+ expected = { 'Status' => ActionController::Base::DEFAULT_RENDER_STATUS_CODE }
59
+ assert_equal expected, @behavior.page_headers
60
+ end
61
+
62
+ def test_page_virtual
63
+ assert_equal false, @behavior.page_virtual?
64
+ end
65
+
66
+ def test_render_page
67
+ expected = 'This is the body portion of the Ruby home page.'
68
+ assert_render_with_base_behavior :homepage, expected
69
+ end
70
+ def test_render_page__page_with_filter
71
+ expected = '<p>Some <strong>Textile</strong> content.</p>'
72
+ assert_render_with_base_behavior :textile, expected
73
+ end
74
+ def test_render_page__page_with_tags
75
+ expected = "<h1>Radius Test Page</h1>\n\n\n\t<ul>\n\t<li>Radius Test Child 1</li>\n\t\t<li>Radius Test Child 2</li>\n\t\t<li>Radius Test Child 3</li>\n\t</ul>"
76
+ assert_render_with_base_behavior :radius, expected
77
+ end
78
+ def test_render_page__page_with_layout
79
+ expected = "<html>\n <head>\n <title>Page With Layout</title>\n </head>\n <body>\n Page With Layout\n </body>\n</html>\n"
80
+ assert_render_with_base_behavior :page_with_layout, expected
81
+ end
82
+
83
+ def test_render_snippet
84
+ setup_for_page(:homepage)
85
+ @snippet = snippets(:first)
86
+ assert_equal 'test', @behavior.render_snippet(@snippet)
87
+ end
88
+ def test_render_snippet_with_filter
89
+ setup_for_page(:homepage)
90
+ @snippet = snippets(:markdown)
91
+ assert_equal '<p><strong>markdown</strong></p>', @behavior.render_snippet(@snippet)
92
+ end
93
+ def test_render_snippet_with_tag
94
+ setup_for_page(:homepage)
95
+ @snippet = snippets(:snippet_with_tag)
96
+ assert_equal 'Ruby Home Page', @behavior.render_snippet(@snippet)
97
+ end
98
+
99
+ def test_define_tags
100
+ setup_for_page(:custom_tags)
101
+ assert_equal 'Hello world! Another test.', @page.behavior.render_page
102
+ end
103
+
104
+ def test_define_tags_is_unique_for_each_behavior
105
+ @page = pages(:homepage)
106
+ assert_render_match %r{undefined tag `test1'}, '<r:test1 />'
107
+ end
108
+
109
+ def test_define_child_tags
110
+ setup_for_page(:custom_tags_child)
111
+ assert_equal 'child', @page.behavior.render_page
112
+ end
113
+
114
+ def test_cache_page
115
+ assert_equal true, @behavior.cache_page?
116
+ end
117
+
118
+ def test_find_page_by_url_1
119
+ setup_for_page(:homepage)
120
+ assert_equal pages(:homepage), @behavior.find_page_by_url('/')
121
+ end
122
+ def test_find_page_by_url_2
123
+ setup_for_page(:homepage)
124
+ expected = pages(:great_grandchild)
125
+ found = @behavior.find_page_by_url('/parent/child/grandchild/great-grandchild/')
126
+ assert_equal expected, found
127
+ end
128
+ def test_find_page_by_url__when_virtual
129
+ setup_for_page(:homepage)
130
+ found = @behavior.find_page_by_url('/archive/2006/02/05/month/')
131
+ assert_equal nil, found
132
+ end
133
+ def test_find_page_by_url__when_not_found_and_missing_page_defined
134
+ setup_for_page(:homepage)
135
+ found = @behavior.find_page_by_url('/gallery/asdf/')
136
+ assert_not_nil found
137
+ assert_equal 'Page Missing', found.behavior_id
138
+ end
139
+ def test_find_page_by_url__when_not_found_on_live
140
+ setup_for_page(:homepage)
141
+ found = @behavior.find_page_by_url('/gallery/gallery_draft/')
142
+ assert_not_nil found
143
+ assert_equal 'Page Missing', found.behavior_id
144
+ end
145
+ def test_find_page_by_url__when_not_found_on_dev
146
+ setup_for_page(:homepage)
147
+ found = @behavior.find_page_by_url('/gallery/gallery_draft/', false)
148
+ assert_not_nil found
149
+ assert_equal nil, found.behavior_id
150
+ end
151
+
152
+ def test_page_config
153
+ setup_for_page(:page_with_yaml_config)
154
+ config = @behavior.page_config
155
+ assert_equal true, config['test']
156
+ assert_equal 'beans', config['cool']
157
+ end
158
+ def test_page_config__nil_part
159
+ setup_for_page(:homepage)
160
+ config = @behavior.page_config
161
+ assert_equal Hash.new, @behavior.page_config
162
+ end
163
+
164
+ def test_child_page_defaults
165
+ # TODO: allow behaviors to define child page defaults
166
+ end
167
+
168
+ def test_render_page_part
169
+ # TODO: test #render_page_part
170
+ end
171
+
172
+ def test_render_text
173
+ # TODO: test #render_text
174
+ end
175
+
176
+ def test_add_tags_to_child_context
177
+ # TODO: test #add_tags_to_child_context
178
+ end
179
+
180
+ private
181
+
182
+ def setup_for_page(name)
183
+ @page = pages(name)
184
+ @behavior = Behavior::Base.new(@page)
185
+ @request = ActionController::TestRequest.new :url => '/page/'
186
+ @response = ActionController::TestResponse.new
187
+ end
188
+
189
+ def assert_render_with_base_behavior(page_name, expected, message = nil)
190
+ setup_for_page(page_name)
191
+ output = @behavior.render_page
192
+ message = "<#{expected.inspect}> expected, but was <#{output.inspect}>"
193
+ assert_block(message) { expected == output }
194
+ end
195
+
196
+ end