tb_cms 0.9.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +110 -0
- data/Rakefile +28 -0
- data/app/assets/images/spud/admin/menus_thumb.png +0 -0
- data/app/assets/images/spud/admin/menus_thumb@2x.png +0 -0
- data/app/assets/images/spud/admin/pages_thumb.png +0 -0
- data/app/assets/images/spud/admin/snippets_thumb.png +0 -0
- data/app/assets/images/spud/admin/snippets_thumb@2x.png +0 -0
- data/app/assets/javascripts/spud/admin/cms/application.js +25 -0
- data/app/assets/javascripts/spud/admin/cms/menu_items.js +35 -0
- data/app/assets/javascripts/spud/admin/cms/pages.js +29 -0
- data/app/assets/javascripts/spud/admin/snippets.js +2 -0
- data/app/assets/stylesheets/spud/admin/cms/application.css +28 -0
- data/app/assets/stylesheets/spud/admin/cms.css +4 -0
- data/app/assets/stylesheets/spud/admin/snippets.css +4 -0
- data/app/controllers/pages_controller.rb +90 -0
- data/app/controllers/spud/admin/cms_controller.rb +3 -0
- data/app/controllers/spud/admin/menu_items_controller.rb +115 -0
- data/app/controllers/spud/admin/menus_controller.rb +55 -0
- data/app/controllers/spud/admin/pages_controller.rb +182 -0
- data/app/controllers/spud/admin/snippets_controller.rb +61 -0
- data/app/controllers/spud/cms/sitemaps_controller.rb +13 -0
- data/app/helpers/spud/cms/application_helper.rb +283 -0
- data/app/models/spud_menu.rb +9 -0
- data/app/models/spud_menu_item.rb +72 -0
- data/app/models/spud_page.rb +131 -0
- data/app/models/spud_page_liquid_tag.rb +4 -0
- data/app/models/spud_page_partial.rb +67 -0
- data/app/models/spud_page_partial_revision.rb +5 -0
- data/app/models/spud_snippet.rb +42 -0
- data/app/observers/page_sweeper.rb +48 -0
- data/app/observers/snippet_sweeper.rb +41 -0
- data/app/views/pages/not_found.html.erb +2 -0
- data/app/views/pages/show.html.erb +24 -0
- data/app/views/spud/admin/menu_items/_form.html.erb +51 -0
- data/app/views/spud/admin/menu_items/_menu_item_row.html.erb +22 -0
- data/app/views/spud/admin/menu_items/edit.html.erb +10 -0
- data/app/views/spud/admin/menu_items/index.html.erb +17 -0
- data/app/views/spud/admin/menu_items/new.html.erb +12 -0
- data/app/views/spud/admin/menus/_form.html.erb +11 -0
- data/app/views/spud/admin/menus/edit.html.erb +13 -0
- data/app/views/spud/admin/menus/index.html.erb +24 -0
- data/app/views/spud/admin/menus/new.html.erb +7 -0
- data/app/views/spud/admin/pages/_form.html.erb +95 -0
- data/app/views/spud/admin/pages/_page_partials_form.html.erb +18 -0
- data/app/views/spud/admin/pages/_page_row.html.erb +18 -0
- data/app/views/spud/admin/pages/edit.html.erb +32 -0
- data/app/views/spud/admin/pages/index.html.erb +13 -0
- data/app/views/spud/admin/pages/new.html.erb +34 -0
- data/app/views/spud/admin/pages/show.html.erb +20 -0
- data/app/views/spud/admin/snippets/_form.html.erb +8 -0
- data/app/views/spud/admin/snippets/edit.html.erb +7 -0
- data/app/views/spud/admin/snippets/index.html.erb +24 -0
- data/app/views/spud/admin/snippets/new.html.erb +7 -0
- data/app/views/spud/admin/templates/_form.html.erb +43 -0
- data/app/views/spud/admin/templates/edit.html.erb +9 -0
- data/app/views/spud/admin/templates/index.html.erb +17 -0
- data/app/views/spud/admin/templates/new.html.erb +11 -0
- data/app/views/spud/cms/sitemaps/show.xml.builder +16 -0
- data/config/boot.rb +6 -0
- data/config/routes.rb +29 -0
- data/db/migrate/20120101192412_create_spud_pages.rb +19 -0
- data/db/migrate/20120101193138_create_spud_menus.rb +10 -0
- data/db/migrate/20120101193255_create_spud_menu_items.rb +17 -0
- data/db/migrate/20120101194124_create_spud_templates.rb +11 -0
- data/db/migrate/20120103034659_create_spud_page_partials.rb +13 -0
- data/db/migrate/20120104194032_add_visibility_to_spud_pages.rb +6 -0
- data/db/migrate/20120107181337_add_menu_name_to_spud_menu_items.rb +5 -0
- data/db/migrate/20120111134754_add_use_custom_url_name_to_spud_pages.rb +5 -0
- data/db/migrate/20120118141852_add_notes_to_spud_pages.rb +5 -0
- data/db/migrate/20120126232428_add_menu_id_to_spud_menu_items.rb +7 -0
- data/db/migrate/20120128163601_add_classes_to_spud_menu_items.rb +6 -0
- data/db/migrate/20120329132314_add_site_id_to_spud_pages.rb +6 -0
- data/db/migrate/20120329132322_add_site_id_to_spud_templates.rb +6 -0
- data/db/migrate/20120329132330_add_site_id_to_spud_menus.rb +6 -0
- data/db/migrate/20120510195151_create_spud_page_partial_revisions.rb +13 -0
- data/db/migrate/20120911190030_add_symbol_name_to_spud_page_partials.rb +5 -0
- data/db/migrate/20120912121313_modify_site_id_for_spud_pages.rb +15 -0
- data/db/migrate/20121016233715_add_content_processed_to_spud_page_partials.rb +5 -0
- data/db/migrate/20121112151110_add_layout_to_spud_pages.rb +8 -0
- data/db/migrate/20121112212113_create_spud_page_liquid_tags.rb +11 -0
- data/db/migrate/20121119025608_create_spud_snippets.rb +17 -0
- data/db/migrate/20121119030136_change_liquid_tags_to_polymorphic.rb +17 -0
- data/lib/generators/spud/cms/template_generator.rb +17 -0
- data/lib/generators/spud/cms/templates/template.html.erb +28 -0
- data/lib/spud_cms/configuration.rb +27 -0
- data/lib/spud_cms/engine.rb +69 -0
- data/lib/spud_cms/liquid_snippet.rb +29 -0
- data/lib/spud_cms/page_route.rb +5 -0
- data/lib/spud_cms/template_parser.rb +126 -0
- data/lib/spud_cms/test_files.rb +25 -0
- data/lib/spud_cms/version.rb +5 -0
- data/lib/spud_cms.rb +10 -0
- data/lib/tasks/spud_cms_tasks.rake +4 -0
- data/spec/controllers/pages_controller_spec.rb +108 -0
- data/spec/controllers/spud/admin/cms_controller_spec.rb +11 -0
- data/spec/controllers/spud/admin/menu_items_controller_spec.rb +148 -0
- data/spec/controllers/spud/admin/menus_controller_spec.rb +121 -0
- data/spec/controllers/spud/admin/pages_controller_spec.rb +111 -0
- data/spec/controllers/spud/admin/snippets_controller_spec.rb +5 -0
- data/spec/controllers/spud/cms/sitemaps_controller_spec.rb +48 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/content_left.html.erb +0 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20120307002859_create_spud_admin_permissions.spud_core.rb +12 -0
- data/spec/dummy/db/migrate/20120307002860_create_spud_users.spud_core.rb +30 -0
- data/spec/dummy/db/migrate/20120307003559_create_spud_permalinks.spud_permalinks.rb +12 -0
- data/spec/dummy/db/migrate/20120610123555_add_time_zone_to_spud_user.spud_core.rb +7 -0
- data/spec/dummy/db/migrate/20120610123556_add_scope_to_spud_admin_permissions.spud_core.rb +7 -0
- data/spec/dummy/db/migrate/20120610123557_create_spud_user_settings.spud_core.rb +12 -0
- data/spec/dummy/db/migrate/20120610123615_add_site_id_to_spud_permalinks.spud_permalinks.rb +7 -0
- data/spec/dummy/db/schema.rb +171 -0
- data/spec/dummy/log/test.log +1874 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/helpers/spud/cms/application_helper_spec.rb +160 -0
- data/spec/models/spud_menu_item_spec.rb +31 -0
- data/spec/models/spud_page_liquid_tag_spec.rb +5 -0
- data/spec/models/spud_page_partial_revision_spec.rb +5 -0
- data/spec/models/spud_page_partial_spec.rb +44 -0
- data/spec/models/spud_page_spec.rb +163 -0
- data/spec/models/spud_snippet_spec.rb +5 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/authlogic_helper.rb +2 -0
- metadata +427 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/404.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/422.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/500.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
</html>
|
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spud::Cms::ApplicationHelper do
|
4
|
+
before(:each) do
|
5
|
+
ActiveRecord::Base.observers.disable(:page_sweeper)
|
6
|
+
|
7
|
+
|
8
|
+
Spud::Core.configure do |config|
|
9
|
+
config.site_name = "Test Site"
|
10
|
+
config.multisite_mode_enabled = false
|
11
|
+
config.multisite_config = []
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe :sp_list_menu do
|
16
|
+
it "should be able to find a menu by its name" do
|
17
|
+
menu = FactoryGirl.create(:spud_menu,:name => "Main")
|
18
|
+
2.times {|x| s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")}
|
19
|
+
|
20
|
+
helper.sp_list_menu(:name => "Main",:active_class => "active").should match /\<li/
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should assign id to ul block" do
|
24
|
+
menu = FactoryGirl.create(:spud_menu)
|
25
|
+
2.times {|x| s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")}
|
26
|
+
|
27
|
+
helper.sp_list_menu(:name => menu.name,:id => "nav").should match /id=\'nav\'/
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should render nested menu items" do
|
31
|
+
menu = FactoryGirl.create(:spud_menu,:name => "Main2")
|
32
|
+
s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
33
|
+
s2 = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
34
|
+
s3 = FactoryGirl.create(:spud_menu_item,:parent_type => "SpudMenuItem",:parent_id => s.id,:spud_menu_id => menu.id,:url => "/",:name => "SubItem")
|
35
|
+
|
36
|
+
helper.sp_list_menu(:name => "Main2").should match /SubItem/
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should respect max depth" do
|
40
|
+
menu = FactoryGirl.create(:spud_menu,:name => "Main4")
|
41
|
+
s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
42
|
+
s2 = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
43
|
+
s3 = FactoryGirl.create(:spud_menu_item,:parent_type => "SpudMenuItem",:parent_id => s.id,:spud_menu_id => menu.id,:url => "/",:name => "SubItem")
|
44
|
+
|
45
|
+
helper.sp_list_menu(:name => "Main4",:max_depth => 1).should_not match /SubItem/
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not load menu from different site_id" do
|
49
|
+
Spud::Core.configure do |config|
|
50
|
+
config.site_name = "Test Site"
|
51
|
+
config.multisite_mode_enabled = true
|
52
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
|
53
|
+
end
|
54
|
+
menu = FactoryGirl.create(:spud_menu,:site_id => 0)
|
55
|
+
s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
56
|
+
|
57
|
+
helper.sp_list_menu(:name => menu.name).should be_blank
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe :sp_menu_with_seperator do
|
63
|
+
it "should render a flattened list of links" do
|
64
|
+
menu = FactoryGirl.create(:spud_menu,:name => "Main3")
|
65
|
+
s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
66
|
+
s2 = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
67
|
+
s3 = FactoryGirl.create(:spud_menu_item,:parent_type => "SpudMenuItem",:parent_id => s.id,:spud_menu_id => menu.id,:url => "/",:name => "SubItem")
|
68
|
+
|
69
|
+
content = helper.sp_menu_with_seperator(:name => "Main3")
|
70
|
+
content.should match /SubItem/
|
71
|
+
content.should_not match /\<li/
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should not load menu from different site_id" do
|
75
|
+
|
76
|
+
Spud::Core.configure do |config|
|
77
|
+
config.site_name = "Test Site"
|
78
|
+
config.multisite_mode_enabled = true
|
79
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
|
80
|
+
end
|
81
|
+
menu = FactoryGirl.create(:spud_menu,:site_id => 0)
|
82
|
+
s = FactoryGirl.create(:spud_menu_item,:parent_id => menu.id,:spud_menu_id => menu.id,:url => "/")
|
83
|
+
helper.sp_menu_with_seperator(:name => menu.name).should be_blank
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe :sp_list_pages do
|
91
|
+
it "should be able to list created pages" do
|
92
|
+
page = FactoryGirl.create(:spud_page)
|
93
|
+
page2 = FactoryGirl.create(:spud_page)
|
94
|
+
page3 = FactoryGirl.create(:spud_page,:spud_page_id => page.id)
|
95
|
+
|
96
|
+
|
97
|
+
content = helper.sp_list_pages(:active_class => "active")
|
98
|
+
content.should match /#{page.name}/
|
99
|
+
content.should match /#{page2.name}/
|
100
|
+
content.should match /#{page3.name}/
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should assign id" do
|
104
|
+
page = FactoryGirl.create(:spud_page)
|
105
|
+
page2 = FactoryGirl.create(:spud_page)
|
106
|
+
|
107
|
+
content = helper.sp_list_pages(:id => "page_nav")
|
108
|
+
content.should match /id=\'page_nav\'/
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should be able to exclude certain pages" do
|
113
|
+
page = FactoryGirl.create(:spud_page)
|
114
|
+
page2 = FactoryGirl.create(:spud_page)
|
115
|
+
|
116
|
+
content = helper.sp_list_pages(:exclude => [page2.name])
|
117
|
+
content.should match /#{page.name}/
|
118
|
+
content.should_not match /#{page2.name}/
|
119
|
+
end
|
120
|
+
it "should respect max depth" do
|
121
|
+
page = FactoryGirl.create(:spud_page)
|
122
|
+
page2 = FactoryGirl.create(:spud_page)
|
123
|
+
page3 = FactoryGirl.create(:spud_page,:spud_page_id => page.id)
|
124
|
+
|
125
|
+
|
126
|
+
content = helper.sp_list_pages(:max_depth => 1)
|
127
|
+
content.should match /#{page.name}/
|
128
|
+
content.should match /#{page2.name}/
|
129
|
+
content.should_not match /#{page3.name}/
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
it "should be able to list sub pages of a particular page" do
|
134
|
+
page = FactoryGirl.create(:spud_page)
|
135
|
+
page2 = FactoryGirl.create(:spud_page)
|
136
|
+
page3 = FactoryGirl.create(:spud_page,:spud_page_id => page.id)
|
137
|
+
content = helper.sp_list_pages(:start_page_id => page.id)
|
138
|
+
content.should_not match /#{page.name}/
|
139
|
+
content.should_not match /#{page2.name}/
|
140
|
+
content.should match /#{page3.name}/
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should not load pages from different site_id" do
|
144
|
+
Spud::Core.configure do |config|
|
145
|
+
config.site_name = "Test Site"
|
146
|
+
config.multisite_mode_enabled = true
|
147
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
|
148
|
+
end
|
149
|
+
page = FactoryGirl.create(:spud_page,:site_id => 0)
|
150
|
+
page2 = FactoryGirl.create(:spud_page,:site_id => 1)
|
151
|
+
|
152
|
+
content = helper.sp_list_pages()
|
153
|
+
content.should_not match /#{page.name}/
|
154
|
+
content.should match /#{page2.name}/
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SpudMenuItem do
|
4
|
+
|
5
|
+
it {should have_many(:spud_menu_items)}
|
6
|
+
it {should belong_to(:spud_page)}
|
7
|
+
it {should belong_to(:spud_menu)}
|
8
|
+
it {should belong_to(:parent)}
|
9
|
+
|
10
|
+
describe :validations do
|
11
|
+
it "should require a name" do
|
12
|
+
p = FactoryGirl.build(:spud_menu_item,:name => nil)
|
13
|
+
p.should_not be_valid
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should require a menu_id" do
|
17
|
+
p = FactoryGirl.build(:spud_menu_item,:spud_menu_id => nil)
|
18
|
+
p.should_not be_valid
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should require a parent_type" do
|
22
|
+
p = FactoryGirl.build(:spud_menu_item,:parent_type => nil)
|
23
|
+
p.should_not be_valid
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should require a parent_id" do
|
27
|
+
p = FactoryGirl.build(:spud_menu_item,:parent_id => nil)
|
28
|
+
p.should_not be_valid
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SpudPagePartial do
|
4
|
+
describe "validations" do
|
5
|
+
|
6
|
+
it "should require a name" do
|
7
|
+
p = FactoryGirl.build(:spud_page_partial,:name => nil)
|
8
|
+
p.should_not be_valid
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should respond with a symbol_name based on name" do
|
12
|
+
p = FactoryGirl.build(:spud_page_partial,:name => "Test Page")
|
13
|
+
p.symbol_name.should == "test_page"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "save hooks" do
|
18
|
+
it "should save the symbol name" do
|
19
|
+
p = Factory.create(:spud_page_partial,:name => "Test Page")
|
20
|
+
p.attributes["symbol_name"].should == "test_page"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should create a new revision if content is changed" do
|
24
|
+
p = Factory.create(:spud_page_partial,:name => "Test Page",:content =>"Home Sweet Home",:spud_page_id => 1)
|
25
|
+
SpudPagePartialRevision.where(:spud_page_id => 1,:name => "Test Page").count.should == 1
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should delete old revisions beyond max_revision count" do
|
29
|
+
Spud::Cms.configure do |config|
|
30
|
+
config.max_revisions = 2
|
31
|
+
end
|
32
|
+
p = Factory.create(:spud_page_partial,:name => "Test Page",:content =>"Home Sweet Home",:spud_page_id => 1)
|
33
|
+
p.content = "Nah"
|
34
|
+
p.save
|
35
|
+
|
36
|
+
p.content = "Another change"
|
37
|
+
p.save
|
38
|
+
SpudPagePartialRevision.where(:spud_page_id => 1,:name => "Test Page").count.should == 2
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SpudPage do
|
4
|
+
|
5
|
+
it {should have_many(:spud_page_partials)}
|
6
|
+
it {should have_many(:spud_pages)}
|
7
|
+
it {should belong_to(:spud_page)}
|
8
|
+
it {should belong_to(:created_by_user)}
|
9
|
+
it {should belong_to(:updated_by_user)}
|
10
|
+
|
11
|
+
describe "validations" do
|
12
|
+
|
13
|
+
it "should require a name" do
|
14
|
+
p = FactoryGirl.build(:spud_page,:name => nil)
|
15
|
+
p.should_not be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should require a unique url_name" do
|
19
|
+
Factory(:spud_page, :url_name => "test", :use_custom_url_name => true)
|
20
|
+
t = FactoryGirl.build(:spud_page, :url_name => "test", :use_custom_url_name => true)
|
21
|
+
t.should_not be_valid
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should generate a url_name if taken" do
|
25
|
+
Factory(:spud_page, :name => "test")
|
26
|
+
t = FactoryGirl.build(:spud_page, :name => "test")
|
27
|
+
lambda {
|
28
|
+
t.valid?
|
29
|
+
}.should change(t, :url_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should dependantly destroy page_partials" do
|
33
|
+
t = Factory(:spud_page, :spud_page_partials => [SpudPagePartial.new(:name => "body")])
|
34
|
+
lambda {
|
35
|
+
t.destroy
|
36
|
+
}.should change(SpudPagePartial, :count).from(1).to(0)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "scopes" do
|
43
|
+
|
44
|
+
it "should only show published pages" do
|
45
|
+
SpudPage.published_pages.to_sql.should == SpudPage.where(:published => true).to_sql
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should only show parent pages" do
|
49
|
+
SpudPage.parent_pages.to_sql.should == SpudPage.where(:spud_page_id => nil).to_sql
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should only show public pages" do
|
53
|
+
SpudPage.public.to_sql.should == SpudPage.where(:visibility => 0).to_sql
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should group pages by parent" do
|
57
|
+
parent_page = FactoryGirl.build(:spud_page,:name => "parent")
|
58
|
+
parent_page.save
|
59
|
+
|
60
|
+
page = FactoryGirl.build(:spud_page,:name => "Page 1")
|
61
|
+
page.spud_page = parent_page
|
62
|
+
page.save
|
63
|
+
page2 = FactoryGirl.build(:spud_page,:name => "Page 2")
|
64
|
+
page2.spud_page = parent_page
|
65
|
+
page2.save
|
66
|
+
|
67
|
+
SpudPage.grouped()[parent_page.id].count.should == 2
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should return private if visibility is == 1" do
|
73
|
+
parent_page = FactoryGirl.build(:spud_page,:name => "parent",:visibility => 1)
|
74
|
+
|
75
|
+
parent_page.is_private?.should == true
|
76
|
+
|
77
|
+
parent_page.visibility = 0
|
78
|
+
parent_page.is_private?.should == false
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "generate_url_name" do
|
85
|
+
it "should add the parent url name if a page has a parent" do
|
86
|
+
# Factory(:spud_page, :name => "test")
|
87
|
+
parent_page = FactoryGirl.build(:spud_page,:name => "about")
|
88
|
+
parent_page.save
|
89
|
+
t = FactoryGirl.build(:spud_page, :name => "test")
|
90
|
+
t.spud_page = parent_page
|
91
|
+
t.valid?
|
92
|
+
|
93
|
+
t.url_name.should == 'about/test'
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should add a counter to url_name if the url_name is already in use" do
|
98
|
+
page = FactoryGirl.build(:spud_page,:name => "testimonials")
|
99
|
+
page.save
|
100
|
+
|
101
|
+
page2 = FactoryGirl.build(:spud_page,:name => "testimonials")
|
102
|
+
page2.valid?
|
103
|
+
|
104
|
+
page2.url_name.should == 'testimonials-1'
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should add a counter to url_name if the url_name was once in use by another page that was renamed" do
|
108
|
+
page = FactoryGirl.build(:spud_page,:name => "another")
|
109
|
+
page.save
|
110
|
+
page.name = "again"
|
111
|
+
page.save
|
112
|
+
|
113
|
+
page2 = FactoryGirl.build(:spud_page,:name => "another")
|
114
|
+
page2.valid?
|
115
|
+
|
116
|
+
page2.url_name.should == 'another-1'
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should destroy historical permalink if a page is renamed back to its previous name" do
|
120
|
+
page = FactoryGirl.build(:spud_page,:name => "permapage")
|
121
|
+
page.save
|
122
|
+
|
123
|
+
page.name = 'permapage new'
|
124
|
+
page.save
|
125
|
+
|
126
|
+
page.name = 'permapage'
|
127
|
+
|
128
|
+
basecount = SpudPermalink.count
|
129
|
+
|
130
|
+
lambda {
|
131
|
+
page.valid?
|
132
|
+
}.should change(page.spud_permalinks.where(:url_name => 'permapage'), :count).from(1).to(0)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should not allow a custom url to be reused by another page" do
|
136
|
+
page = FactoryGirl.build(:spud_page,:name => "original")
|
137
|
+
page.save
|
138
|
+
|
139
|
+
page = FactoryGirl.build(:spud_page,:name => "new",:use_custom_url_name => true,:url_name => "original")
|
140
|
+
|
141
|
+
page.valid?.should == false
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should not allow a custom url to be reused by another page even if it is a historical permalink" do
|
145
|
+
page = FactoryGirl.build(:spud_page,:name => "original")
|
146
|
+
page.save
|
147
|
+
page.name = "original2"
|
148
|
+
page.save
|
149
|
+
|
150
|
+
page = FactoryGirl.build(:spud_page,:name => "new")
|
151
|
+
page.save
|
152
|
+
page.use_custom_url_name = true
|
153
|
+
page.url_name = 'original'
|
154
|
+
page.valid?.should == false
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Track code coverage
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start 'rails' do
|
4
|
+
# root "dummy/"
|
5
|
+
add_filter "/factories/"
|
6
|
+
end
|
7
|
+
|
8
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
9
|
+
ENV["RAILS_ENV"] = 'test'
|
10
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
11
|
+
require 'rspec/rails'
|
12
|
+
require 'rspec/autorun'
|
13
|
+
require 'database_cleaner'
|
14
|
+
require 'shoulda'
|
15
|
+
require 'factory_girl'
|
16
|
+
require 'mocha'
|
17
|
+
|
18
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
19
|
+
# in spec/support/ and its subdirectories.
|
20
|
+
ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
21
|
+
Dir[File.join(ENGINE_RAILS_ROOT,"spec/support/**/*.rb"), File.join(ENGINE_RAILS_ROOT,"factories/*")].each {|f| require f}
|
22
|
+
|
23
|
+
RSpec.configure do |config|
|
24
|
+
config.mock_with :mocha
|
25
|
+
config.use_transactional_fixtures = true
|
26
|
+
config.infer_base_class_for_anonymous_controllers = false
|
27
|
+
|
28
|
+
config.before(:suite) do
|
29
|
+
DatabaseCleaner.strategy = :transaction
|
30
|
+
DatabaseCleaner.clean_with(:truncation)
|
31
|
+
end
|
32
|
+
|
33
|
+
config.before(:each) do
|
34
|
+
DatabaseCleaner.start
|
35
|
+
end
|
36
|
+
|
37
|
+
config.after(:each) do
|
38
|
+
DatabaseCleaner.clean
|
39
|
+
end
|
40
|
+
end
|