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.
- data/CHANGELOG +1 -0
- data/CONTRIBUTORS +12 -0
- data/LICENSE +9 -0
- data/README +91 -0
- data/Rakefile +10 -0
- data/app/behaviors/archive_behavior.rb +42 -0
- data/app/behaviors/archive_day_index_behavior.rb +30 -0
- data/app/behaviors/archive_month_index_behavior.rb +30 -0
- data/app/behaviors/archive_year_index_behavior.rb +30 -0
- data/app/behaviors/env_behavior.rb +18 -0
- data/app/behaviors/page_missing_behavior.rb +31 -0
- data/app/controllers/admin/export_controller.rb +8 -0
- data/app/controllers/admin/layout_controller.rb +23 -0
- data/app/controllers/admin/model_controller.rb +119 -0
- data/app/controllers/admin/page_controller.rb +119 -0
- data/app/controllers/admin/snippet_controller.rb +6 -0
- data/app/controllers/admin/user_controller.rb +45 -0
- data/app/controllers/admin/welcome_controller.rb +39 -0
- data/app/controllers/application.rb +32 -0
- data/app/controllers/site_controller.rb +54 -0
- data/app/filters/markdown_filter.rb +9 -0
- data/app/filters/textile_filter.rb +9 -0
- data/app/helpers/admin/export_helper.rb +2 -0
- data/app/helpers/admin/layout_helper.rb +2 -0
- data/app/helpers/admin/page_helper.rb +10 -0
- data/app/helpers/admin/snippet_helper.rb +2 -0
- data/app/helpers/admin/user_helper.rb +2 -0
- data/app/helpers/admin/welcome_helper.rb +2 -0
- data/app/helpers/application_helper.rb +141 -0
- data/app/helpers/site_helper.rb +2 -0
- data/app/models/archive_finder.rb +66 -0
- data/app/models/behavior.rb +194 -0
- data/app/models/layout.rb +13 -0
- data/app/models/page.rb +91 -0
- data/app/models/page_context.rb +526 -0
- data/app/models/page_part.rb +13 -0
- data/app/models/radiant/config.rb +53 -0
- data/app/models/radiant/exporter.rb +11 -0
- data/app/models/response_cache.rb +112 -0
- data/app/models/snippet.rb +16 -0
- data/app/models/status.rb +31 -0
- data/app/models/text_filter.rb +11 -0
- data/app/models/user.rb +70 -0
- data/app/models/user_action_observer.rb +13 -0
- data/app/views/admin/layout/index.rhtml +38 -0
- data/app/views/admin/layout/new.rhtml +37 -0
- data/app/views/admin/layout/remove.rhtml +17 -0
- data/app/views/admin/page/_node.rhtml +51 -0
- data/app/views/admin/page/_part.rhtml +17 -0
- data/app/views/admin/page/children.rhtml +4 -0
- data/app/views/admin/page/index.rhtml +172 -0
- data/app/views/admin/page/new.rhtml +164 -0
- data/app/views/admin/page/remove.rhtml +14 -0
- data/app/views/admin/snippet/index.rhtml +36 -0
- data/app/views/admin/snippet/new.rhtml +28 -0
- data/app/views/admin/snippet/remove.rhtml +16 -0
- data/app/views/admin/user/index.rhtml +43 -0
- data/app/views/admin/user/new.rhtml +48 -0
- data/app/views/admin/user/preferences.rhtml +29 -0
- data/app/views/admin/user/remove.rhtml +16 -0
- data/app/views/admin/welcome/login.rhtml +51 -0
- data/app/views/layouts/application.rhtml +75 -0
- data/app/views/site/not_found.rhtml +3 -0
- data/bin/radiant +305 -0
- data/config/boot.rb +80 -0
- data/config/database.mysql.yml +20 -0
- data/config/database.postgresql.yml +20 -0
- data/config/database.sqlite.yml +20 -0
- data/config/environment.rb +76 -0
- data/config/environments/development.rb +20 -0
- data/config/environments/production.rb +22 -0
- data/config/environments/test.rb +20 -0
- data/config/locomotive.yml +6 -0
- data/config/routes.rb +64 -0
- data/db/development_structure.sql +80 -0
- data/db/migrate/001_create_radiant_tables.rb +73 -0
- data/db/migrate/002_insert_initial_data.rb +45 -0
- data/db/migrate/003_rename_behavior_column.rb +9 -0
- data/db/migrate/004_rename_filter_column.rb +11 -0
- data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
- data/db/migrate/006_integer_columns_to_boolean.rb +11 -0
- data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
- data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
- data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
- data/db/schema.rb +74 -0
- data/db/templates/empty.yml +2 -0
- data/db/templates/simple-blog.yml +197 -0
- data/db/templates/styled-blog.yml +472 -0
- data/lib/advanced_delegation.rb +21 -0
- data/lib/archive_index_behavior_tags_and_methods.rb +48 -0
- data/lib/generators/behavior/USAGE +16 -0
- data/lib/generators/behavior/behavior_generator.rb +22 -0
- data/lib/generators/behavior/templates/model.rb.template +9 -0
- data/lib/generators/behavior/templates/unit_test.rb.template +16 -0
- data/lib/generators/filter/USAGE +16 -0
- data/lib/generators/filter/filter_generator.rb +22 -0
- data/lib/generators/filter/templates/model.rb.template +8 -0
- data/lib/generators/filter/templates/unit_test.rb.template +7 -0
- data/lib/inheritable_class_attributes.rb +65 -0
- data/lib/login_system.rb +80 -0
- data/lib/plugins/index_quoting_fix/init.rb +32 -0
- data/lib/plugins/string_io/init.rb +2 -0
- data/lib/radiant.rb +5 -0
- data/lib/registerable.rb +70 -0
- data/lib/tasks/release.rake +84 -0
- data/public/404.html +8 -0
- data/public/500.html +8 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +24 -0
- data/public/dispatch.rb +10 -0
- data/public/favicon.ico +0 -0
- data/public/images/add-child.png +0 -0
- data/public/images/brown-bottom-line.gif +0 -0
- data/public/images/clear-page-cache.png +0 -0
- data/public/images/collapse.png +0 -0
- data/public/images/expand.png +0 -0
- data/public/images/minus.png +0 -0
- data/public/images/new-homepage.png +0 -0
- data/public/images/new-layout.png +0 -0
- data/public/images/new-snippet.png +0 -0
- data/public/images/new-user.png +0 -0
- data/public/images/page.png +0 -0
- data/public/images/plus.png +0 -0
- data/public/images/remove-disabled.png +0 -0
- data/public/images/remove.png +0 -0
- data/public/images/snippet.png +0 -0
- data/public/images/spinner.gif +0 -0
- data/public/images/view-site.gif +0 -0
- data/public/images/virtual-page.png +0 -0
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/controls.js +815 -0
- data/public/javascripts/dragdrop.js +913 -0
- data/public/javascripts/effects.js +958 -0
- data/public/javascripts/pngfix.js +78 -0
- data/public/javascripts/prototype.js +2006 -0
- data/public/javascripts/ruledtable.js +28 -0
- data/public/javascripts/string.js +23 -0
- data/public/javascripts/tabcontrol.js +140 -0
- data/public/robots.txt +1 -0
- data/public/stylesheets/admin.css +464 -0
- data/script/about +3 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/process/spinner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/setup_database +297 -0
- data/test/fixtures/layouts.yml +26 -0
- data/test/fixtures/page_parts.yml +99 -0
- data/test/fixtures/pages.yml +359 -0
- data/test/fixtures/pages.yml.rej +28 -0
- data/test/fixtures/snippets.yml +18 -0
- data/test/fixtures/users.yml +30 -0
- data/test/functional/admin/export_controller_test.rb +22 -0
- data/test/functional/admin/layout_controller_test.rb +40 -0
- data/test/functional/admin/model_controller_test.rb +152 -0
- data/test/functional/admin/page_controller_test.rb +179 -0
- data/test/functional/admin/snippet_controller_test.rb +11 -0
- data/test/functional/admin/user_controller_test.rb +71 -0
- data/test/functional/admin/welcome_controller_test.rb +48 -0
- data/test/functional/application_controller_test.rb +44 -0
- data/test/functional/login_system_test.rb +155 -0
- data/test/functional/site_controller_test.rb +172 -0
- data/test/helpers/archive_index_test_helper.rb +35 -0
- data/test/helpers/behavior_render_test_helper.rb +34 -0
- data/test/helpers/behavior_test_helper.rb +47 -0
- data/test/helpers/caching_test_helper.rb +41 -0
- data/test/helpers/layout_test_helper.rb +35 -0
- data/test/helpers/page_part_test_helper.rb +49 -0
- data/test/helpers/page_test_helper.rb +36 -0
- data/test/helpers/snippet_test_helper.rb +32 -0
- data/test/helpers/user_test_helper.rb +34 -0
- data/test/helpers/validation_test_helper.rb +42 -0
- data/test/test_helper.rb +54 -0
- data/test/unit/behavior_test.rb +196 -0
- data/test/unit/behaviors/archive_behavior_test.rb +33 -0
- data/test/unit/behaviors/archive_day_index_behavior_test.rb +21 -0
- data/test/unit/behaviors/archive_month_index_behavior_test.rb +21 -0
- data/test/unit/behaviors/archive_year_index_behavior_test.rb +21 -0
- data/test/unit/behaviors/page_missing_behavior_test.rb +27 -0
- data/test/unit/filters/markdown_filter_test.rb +14 -0
- data/test/unit/filters/textile_filter_test.rb +14 -0
- data/test/unit/inheritable_class_attributes_test.rb +47 -0
- data/test/unit/layout_test.rb +29 -0
- data/test/unit/page_context_test.rb +375 -0
- data/test/unit/page_context_test.rb.rej +26 -0
- data/test/unit/page_part_test.rb +44 -0
- data/test/unit/page_test.rb +224 -0
- data/test/unit/radiant/config_test.rb +46 -0
- data/test/unit/radiant/exporter_test.rb +26 -0
- data/test/unit/registerable_test.rb +68 -0
- data/test/unit/response_cache_test.rb +133 -0
- data/test/unit/snippet_test.rb +47 -0
- data/test/unit/status_test.rb +43 -0
- data/test/unit/text_filter_test.rb +14 -0
- data/test/unit/user_action_observer_test.rb +40 -0
- data/test/unit/user_test.rb +138 -0
- 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
|
data/test/test_helper.rb
ADDED
@@ -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
|