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,69 @@
|
|
1
|
+
require 'spud_core'
|
2
|
+
require 'spud_permalinks'
|
3
|
+
require 'codemirror-rails'
|
4
|
+
require 'liquid'
|
5
|
+
|
6
|
+
module Spud
|
7
|
+
module Cms
|
8
|
+
class Engine < Rails::Engine
|
9
|
+
engine_name :spud_cms
|
10
|
+
|
11
|
+
config.generators do |g|
|
12
|
+
g.test_framework :rspec, :view_specs => false
|
13
|
+
end
|
14
|
+
|
15
|
+
initializer :admin do
|
16
|
+
Spud::Core.configure do |config|
|
17
|
+
config.admin_applications += [{:name => "Pages",:thumbnail => "spud/admin/pages_thumb.png",:url => "/spud/admin/pages",:order => 0}]
|
18
|
+
if Spud::Cms.menus_enabled
|
19
|
+
config.admin_applications += [{:name => "Menus",:thumbnail => "spud/admin/menus_thumb.png",:url => "/spud/admin/menus",:order => 2}]
|
20
|
+
end
|
21
|
+
|
22
|
+
if Spud::Cms.snippets_enabled
|
23
|
+
config.admin_applications += [{:name => "Snippets",:thumbnail => "spud/admin/snippets_thumb.png",:url => "/spud/admin/snippets",:order => 3}]
|
24
|
+
end
|
25
|
+
|
26
|
+
if Spud::Cms.enable_sitemap == true
|
27
|
+
config.sitemap_urls += [:spud_cms_sitemap_url]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
initializer :model_overrides_cms do |config|
|
33
|
+
ActiveRecord::Base.class_eval do
|
34
|
+
include Spud::Searchable
|
35
|
+
end
|
36
|
+
end
|
37
|
+
initializer :cms_sweepers do |config|
|
38
|
+
if ActiveRecord::Base.connection.tables.include?('spud_pages')
|
39
|
+
Spud::Admin::ApplicationController.instance_eval do
|
40
|
+
cache_sweeper :page_sweeper, :except => [:show,:index]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
initializer :spud_cms_routes do |config|
|
46
|
+
config.routes_reloader.paths << File.expand_path('../page_route.rb', __FILE__)
|
47
|
+
end
|
48
|
+
|
49
|
+
initializer :assets do |config|
|
50
|
+
Rails.application.config.assets.precompile += ["spud/admin/cms*"]
|
51
|
+
Spud::Core.append_admin_javascripts('spud/admin/cms/application')
|
52
|
+
Spud::Core.append_admin_stylesheets('spud/admin/cms/application')
|
53
|
+
end
|
54
|
+
|
55
|
+
initializer :liquid do |config|
|
56
|
+
Liquid::Template.register_tag('snippet', Spud::Cms::LiquidSnippet)
|
57
|
+
end
|
58
|
+
|
59
|
+
initializer :template_parser do |config|
|
60
|
+
@template_parser = Spud::Cms::TemplateParser.new()
|
61
|
+
end
|
62
|
+
|
63
|
+
def template_parser
|
64
|
+
return @template_parser
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'liquid'
|
2
|
+
module Spud
|
3
|
+
module Cms
|
4
|
+
class LiquidSnippet < Liquid::Tag
|
5
|
+
def initialize(tag_name, snippet_name, tokens)
|
6
|
+
@snippet_name = snippet_name
|
7
|
+
@snippet = SpudSnippet.where(:name => snippet_name).first
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def tag_name
|
12
|
+
return "snippet"
|
13
|
+
end
|
14
|
+
def tag_value
|
15
|
+
return @snippet_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def render(context)
|
19
|
+
|
20
|
+
if !@snippet.blank?
|
21
|
+
return @snippet.content_processed.html_safe
|
22
|
+
else
|
23
|
+
return ''
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Spud
|
2
|
+
module Cms
|
3
|
+
class TemplateParser
|
4
|
+
|
5
|
+
|
6
|
+
def layouts(site_short_name=nil)
|
7
|
+
if(site_short_name != nil)
|
8
|
+
filtered_layouts = {}
|
9
|
+
all_layouts.each do |key,value|
|
10
|
+
if value[:sites].include?(site_short_name.to_s.downcase)
|
11
|
+
filtered_layouts[key] = value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
return filtered_layouts
|
15
|
+
else
|
16
|
+
return all_layouts
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def all_layouts
|
21
|
+
if @layouts && Rails.env != 'development'
|
22
|
+
return @layouts
|
23
|
+
end
|
24
|
+
@layouts = {}
|
25
|
+
engines.each do |engine|
|
26
|
+
@layouts.merge! process_layouts(engine.root.join('app','views','layouts'))
|
27
|
+
end
|
28
|
+
@layouts.merge! process_layouts(Rails.application.root.join('app','views','layouts'))
|
29
|
+
|
30
|
+
check_for_defaults(@layouts)
|
31
|
+
|
32
|
+
return @layouts
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
private
|
37
|
+
def process_layouts(filepath)
|
38
|
+
layouts = {}
|
39
|
+
Dir.glob(filepath.join("**","*.html.*")) do |template|
|
40
|
+
|
41
|
+
layout = process_layout(template)
|
42
|
+
layouts[layout_path(template)] = layout if !layout.blank?
|
43
|
+
|
44
|
+
end
|
45
|
+
return layouts
|
46
|
+
end
|
47
|
+
|
48
|
+
def process_layout(template)
|
49
|
+
f = File.open(template)
|
50
|
+
header = []
|
51
|
+
f.each_line do |line|
|
52
|
+
header << line
|
53
|
+
break if line.blank?
|
54
|
+
end
|
55
|
+
f.close
|
56
|
+
# puts header
|
57
|
+
if header.blank? == false
|
58
|
+
layout = {:partials => []}
|
59
|
+
|
60
|
+
header.each do |header_line|
|
61
|
+
process_directive(header_line, layout)
|
62
|
+
end
|
63
|
+
layout[:partials] = ["Body"] if layout[:partials].blank?
|
64
|
+
layout[:sites] = [Spud::Core.config.short_name.downcase] if layout[:sites].blank?
|
65
|
+
if layout[:template_name].blank? == false
|
66
|
+
return layout
|
67
|
+
else
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
return nil
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_for_defaults(layouts)
|
75
|
+
default_layout_path = layout_path(Rails.application.root.join('app','views','layouts',Spud::Cms.default_page_layout))
|
76
|
+
puts(layouts)
|
77
|
+
if layouts[default_layout_path].blank?
|
78
|
+
layouts[default_layout_path] = {:template_name => "Default", :partials => ["Body"], :sites => [Spud::Core.short_name.downcase], :default => true}
|
79
|
+
else
|
80
|
+
layouts[default_layout_path][:default] = true
|
81
|
+
end
|
82
|
+
|
83
|
+
Spud::Core.multisite_config.each do |config|
|
84
|
+
cms_config = Spud::Cms.site_config_for_short_name(config[:short_name])
|
85
|
+
layout_path = cms_config.blank? == false && cms_config[:default_page_layout].blank? == false ? layout_path(Rails.application.root.join('app','views','layouts',cms_config[:default_page_layout])) : default_layout_path
|
86
|
+
|
87
|
+
layout = layouts[layout_path]
|
88
|
+
if layout.blank?
|
89
|
+
layouts[layout_path] = {:template_name => "Default", :partials => ["Body"], :sites => [config[:short_name].to_s.downcase], :default => true}
|
90
|
+
else
|
91
|
+
layouts[layout_path][:sites] << config[:short_name].to_s.downcase
|
92
|
+
layouts[layout_path][:default] = true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
def layout_path(template)
|
99
|
+
dir, base = File.split(template)
|
100
|
+
path_components = dir.split("/")
|
101
|
+
component = path_components.shift
|
102
|
+
while component != "layouts" do
|
103
|
+
component = path_components.shift
|
104
|
+
end
|
105
|
+
path_components << base.downcase.split(".")[0]
|
106
|
+
return "#{path_components.join("/")}"
|
107
|
+
end
|
108
|
+
|
109
|
+
def process_directive(line,layout)
|
110
|
+
if template_matcher = line.match(/\-?\#template\_name\:(.*)/)
|
111
|
+
layout[:template_name] = template_matcher[1].strip
|
112
|
+
end
|
113
|
+
if template_matcher = line.match(/\-?\#html\:(.*)/)
|
114
|
+
layout[:partials] << template_matcher[1].strip
|
115
|
+
end
|
116
|
+
if template_matcher = line.match(/\-?\#site_name\:(.*)/)
|
117
|
+
layout[:sites] = template_matcher[1].split(",").collect {|s| s.strip.downcase}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def engines
|
122
|
+
Rails::Application::Railties.engines
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Spud
|
2
|
+
module Cms
|
3
|
+
module TestFiles
|
4
|
+
class << self
|
5
|
+
def load_all
|
6
|
+
load_specs
|
7
|
+
load_factories
|
8
|
+
load_support
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_specs
|
12
|
+
Dir[File.join(File.expand_path('../../../', __FILE__), "spec/**/*_spec.rb")].each {|f| require f}
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_factories
|
16
|
+
Dir[File.join(File.expand_path('../../../', __FILE__), "factories/*")].each {|f| require f}
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_support
|
20
|
+
Dir[File.join(File.expand_path('../../../', __FILE__), "spec/support/**/*.rb")].each {|f| require f}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/spud_cms.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PagesController do
|
4
|
+
describe :show do
|
5
|
+
before(:each) do
|
6
|
+
Spud::Core.configure do |config|
|
7
|
+
config.site_name = "Test Site"
|
8
|
+
config.multisite_mode_enabled = false
|
9
|
+
config.multisite_config = []
|
10
|
+
end
|
11
|
+
Spud::Cms.configure do |config|
|
12
|
+
config.cache_mode = false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
it "should render a page" do
|
16
|
+
page = FactoryGirl.create(:spud_page)
|
17
|
+
get :show ,:id => page.url_name
|
18
|
+
assigns(:layout).should render_template(:layout => "layouts/#{Spud::Cms.default_page_layout}")
|
19
|
+
response.should be_success
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should render home page if id is blank" do
|
23
|
+
page = FactoryGirl.create(:spud_page,:name => "home")
|
24
|
+
get :show
|
25
|
+
assigns(:page).should == page
|
26
|
+
response.should be_success
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should redirect to new page url from old page url if it was changed" do
|
30
|
+
page = FactoryGirl.create(:spud_page,:name => "about")
|
31
|
+
page.name = "about us"
|
32
|
+
page.save
|
33
|
+
|
34
|
+
get :show, :id => "about"
|
35
|
+
|
36
|
+
response.should redirect_to page_url(:id => "about-us")
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
it "should not allow access to private pages when logged out" do
|
43
|
+
page = FactoryGirl.create(:spud_page,:name => "about",:visibility => 1)
|
44
|
+
|
45
|
+
get :show, :id => "about"
|
46
|
+
response.should redirect_to new_spud_user_session_url()
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "page caching" do
|
50
|
+
before(:each) do
|
51
|
+
Spud::Cms.configure do |config|
|
52
|
+
config.cache_mode = nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "authorized login" do
|
60
|
+
before(:each) do
|
61
|
+
activate_authlogic
|
62
|
+
u = SpudUser.new(:login => "testuser",:email => "test@testuser.com",:password => "test",:password_confirmation => "test")
|
63
|
+
u.super_admin = true
|
64
|
+
u.save
|
65
|
+
@user = SpudUserSession.create(u)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should allow access to private pages when logged in" do
|
69
|
+
page = FactoryGirl.create(:spud_page,:name => "about",:visibility => 1)
|
70
|
+
|
71
|
+
get :show, :id => "about"
|
72
|
+
response.should be_success
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "multisite enabled" do
|
77
|
+
before(:each) do
|
78
|
+
Spud::Core.configure do |config|
|
79
|
+
config.site_name = "Test Site"
|
80
|
+
config.multisite_mode_enabled = true
|
81
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should not show a page on a different site" do
|
86
|
+
page = FactoryGirl.create(:spud_page,:name => "about",:site_id => 0)
|
87
|
+
get :show,:id=>"about"
|
88
|
+
response.response_code.should == 404
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should show the right page" do
|
92
|
+
page = FactoryGirl.create(:spud_page,:name => "about",:site_id => 0)
|
93
|
+
page2 = FactoryGirl.create(:spud_page,:name => "about",:site_id => 1)
|
94
|
+
get :show,:id=>"about"
|
95
|
+
assigns(:page).should == page2
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return the homepage of the current site" do
|
99
|
+
page = FactoryGirl.create(:spud_page,:name => "home",:site_id => 0)
|
100
|
+
page_site1 = FactoryGirl.create(:spud_page,:name => "home",:site_id => 1)
|
101
|
+
|
102
|
+
get :show
|
103
|
+
assigns(:page).should == page_site1
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spud::Admin::CmsController do
|
4
|
+
it "should return site_config by short_name" do
|
5
|
+
Spud::Cms.configure do |config|
|
6
|
+
config.multisite_config = [{:short_name => "siteb",:site_name => "Test Site B",:site_id => 2}]
|
7
|
+
end
|
8
|
+
|
9
|
+
Spud::Cms.site_config_for_short_name(:siteb)[:site_id].should == 2
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spud::Admin::MenuItemsController do
|
4
|
+
before(:each) do
|
5
|
+
ActiveRecord::Base.observers.disable(:page_sweeper)
|
6
|
+
|
7
|
+
activate_authlogic
|
8
|
+
u = SpudUser.new(:login => "testuser",:email => "test@testuser.com",:password => "test",:password_confirmation => "test")
|
9
|
+
u.super_admin = true
|
10
|
+
u.save
|
11
|
+
@user = SpudUserSession.create(u)
|
12
|
+
Spud::Core.configure do |config|
|
13
|
+
config.site_name = "Test Site"
|
14
|
+
config.multisite_mode_enabled = false
|
15
|
+
config.multisite_config = []
|
16
|
+
end
|
17
|
+
|
18
|
+
@menu = FactoryGirl.create(:spud_menu)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
describe :index do
|
23
|
+
it "should return an array of menus" do
|
24
|
+
2.times {|x| s = FactoryGirl.create(:spud_menu_item,:spud_menu_id => @menu.id,:parent_id => @menu.id)}
|
25
|
+
get :index,:menu_id =>@menu.id
|
26
|
+
|
27
|
+
assigns(:menu_items).count.should be > 1
|
28
|
+
end
|
29
|
+
it "should redirect if the menu is not found" do
|
30
|
+
get :index,:menu_id => @menu.id + 1
|
31
|
+
response.should redirect_to spud_admin_menus_url
|
32
|
+
flash[:error].should_not be_blank
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe :new do
|
37
|
+
it "should assign a new menu" do
|
38
|
+
get :new,:menu_id =>@menu.id
|
39
|
+
assigns(:menu_item).should_not be_blank
|
40
|
+
response.should be_success
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe :create do
|
45
|
+
it "should create a new menu item with a valid form submission" do
|
46
|
+
lambda {
|
47
|
+
post :create,:menu_id => @menu.id, :spud_menu_item => FactoryGirl.attributes_for(:spud_menu_item,:parent_id => nil).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
48
|
+
}.should change(SpudMenuItem,:count).by(1)
|
49
|
+
response.should be_redirect
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not create a menu item with an invalid form entry" do
|
53
|
+
yamldata = FactoryGirl.attributes_for(:spud_menu_item,:name => nil).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
54
|
+
|
55
|
+
lambda {
|
56
|
+
post :create,:menu_id => @menu.id, :spud_menu_item => FactoryGirl.attributes_for(:spud_menu_item,:name => nil,:parent_id => nil).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
57
|
+
}.should_not change(SpudMenuItem,:count)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should autoset order if not specified" do
|
61
|
+
menuitem = FactoryGirl.create(:spud_menu_item,:parent_id => @menu.id)
|
62
|
+
|
63
|
+
post :create,:menu_id => @menu.id, :spud_menu_item => FactoryGirl.attributes_for(:spud_menu_item,:menu_order => nil,:parent_id => nil).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
64
|
+
assigns(:menu_item).menu_order.should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should assign the menu name based on page name if left blank" do
|
68
|
+
page = FactoryGirl.create(:spud_page)
|
69
|
+
post :create,:menu_id => @menu.id, :spud_menu_item => FactoryGirl.attributes_for(:spud_menu_item,:name => nil,:spud_page_id => page.id).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
70
|
+
assigns(:menu_item).name.should == page.name
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should set the parent to a submenu if specified" do
|
74
|
+
menuitem = FactoryGirl.create(:spud_menu_item,:parent_id => @menu.id)
|
75
|
+
post :create,:menu_id => @menu.id, :spud_menu_item => FactoryGirl.attributes_for(:spud_menu_item,:parent_id => menuitem.id).reject{|k,v| k == 'id' || k == :spud_menu_id}
|
76
|
+
assigns(:menu_item).parent.should == menuitem
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe :edit do
|
81
|
+
it "should respond with menu item by id" do
|
82
|
+
menu1 = FactoryGirl.create(:spud_menu_item)
|
83
|
+
menu2 = FactoryGirl.create(:spud_menu_item)
|
84
|
+
get :edit, :menu_id => @menu.id,:id => menu2.id
|
85
|
+
assigns(:menu_item).should == menu2
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should redirect_to index if menu item not found" do
|
89
|
+
get :edit,:menu_id => @menu.id,:id => "345"
|
90
|
+
response.should redirect_to spud_admin_menu_menu_items_url(:menu_id => @menu.id)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe :update do
|
95
|
+
it "should update the name when the name attribute is changed" do
|
96
|
+
menu_item = FactoryGirl.create(:spud_menu_item)
|
97
|
+
new_name = 'MyMenu'
|
98
|
+
lambda {
|
99
|
+
put :update,:menu_id => @menu.id,:id => menu_item.id, :spud_menu_item => menu_item.attributes.merge!(:name => new_name,:parent_id => nil).reject{|k,v| k.to_sym == :spud_menu_id || k == 'id' || k.to_sym == :updated_at || k.to_sym == :created_at}
|
100
|
+
menu_item.reload
|
101
|
+
}.should change(menu_item,:name).to(new_name)
|
102
|
+
end
|
103
|
+
it "should assign a menu to a submenu if parentid is defined" do
|
104
|
+
menu_item1 = FactoryGirl.create(:spud_menu_item)
|
105
|
+
menu_item = FactoryGirl.create(:spud_menu_item)
|
106
|
+
|
107
|
+
lambda {
|
108
|
+
put :update,:menu_id => @menu.id,:id => menu_item.id, :spud_menu_item => menu_item.attributes.merge!(:parent_id => menu_item1.id).reject{|k,v| k.to_sym == :spud_menu_id || k == 'id' || k.to_sym == :updated_at || k.to_sym == :created_at}
|
109
|
+
menu_item.reload
|
110
|
+
}.should change(menu_item,:parent).to(menu_item1)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
describe :destroy do
|
116
|
+
it "should destroy the menu item" do
|
117
|
+
menu_item = FactoryGirl.create(:spud_menu_item,:parent_id => @menu.id)
|
118
|
+
lambda {
|
119
|
+
delete :destroy,:menu_id => @menu.id,:id => menu_item.id
|
120
|
+
}.should change(SpudMenuItem,:count).by(-1)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe :multisite do
|
125
|
+
before(:each) do
|
126
|
+
Spud::Core.configure do |config|
|
127
|
+
config.site_name = "Test Site"
|
128
|
+
config.multisite_mode_enabled = true
|
129
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1,:short_name => "siteb"}]
|
130
|
+
end
|
131
|
+
Spud::Cms.configure do |config|
|
132
|
+
config.multisite_config = [{:short_name => "siteb",:default_page_parts => ["Body","Sidebar"]}]
|
133
|
+
end
|
134
|
+
session[:admin_site] = 1
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
describe :edit do
|
139
|
+
it "should not allow editing of a menu_item in a menu that is different from the current admin site" do
|
140
|
+
menu_item = FactoryGirl.create(:spud_menu_item)
|
141
|
+
get :edit,:id => menu_item.id,:menu_id => @menu.id
|
142
|
+
response.should redirect_to spud_admin_menus_url
|
143
|
+
flash[:warning].should_not be_blank
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spud::Admin::MenusController do
|
4
|
+
before(:each) do
|
5
|
+
activate_authlogic
|
6
|
+
u = SpudUser.new(:login => "testuser",:email => "test@testuser.com",:password => "test",:password_confirmation => "test")
|
7
|
+
u.super_admin = true
|
8
|
+
u.save
|
9
|
+
@user = SpudUserSession.create(u)
|
10
|
+
Spud::Core.configure do |config|
|
11
|
+
config.site_name = "Test Site"
|
12
|
+
config.multisite_mode_enabled = false
|
13
|
+
config.multisite_config = []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
describe :index do
|
19
|
+
it "should return an array of menus" do
|
20
|
+
2.times {|x| s = FactoryGirl.create(:spud_menu)}
|
21
|
+
get :index
|
22
|
+
|
23
|
+
assigns(:menus).count.should be > 1
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe :new do
|
29
|
+
it "should response with new menu" do
|
30
|
+
get :new
|
31
|
+
assigns(:menu).should_not be_blank
|
32
|
+
response.should be_success
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe :create do
|
37
|
+
it "should create a new menu with a valid form submission" do
|
38
|
+
lambda {
|
39
|
+
post :create, :spud_menu => FactoryGirl.attributes_for(:spud_menu).reject{|k,v| k == 'site_id' || k == 'id'}
|
40
|
+
}.should change(SpudMenu,:count).by(1)
|
41
|
+
response.should be_redirect
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not create a menu with an invalid form entry" do
|
45
|
+
lambda {
|
46
|
+
post :create, :spud_menu => FactoryGirl.attributes_for(:spud_menu,:name => nil).reject{|k,v| k == 'site_id' || k == 'id'}
|
47
|
+
}.should_not change(SpudMenu,:count)
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe :multisite do
|
54
|
+
before(:each) do
|
55
|
+
Spud::Core.configure do |config|
|
56
|
+
config.site_name = "Test Site"
|
57
|
+
config.multisite_mode_enabled = true
|
58
|
+
config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
it "should not allow editing of a menu on a different site id" do
|
63
|
+
menu2 = FactoryGirl.create(:spud_menu,:site_id => 1)
|
64
|
+
get :edit,:id => menu2.id
|
65
|
+
|
66
|
+
response.should redirect_to spud_admin_menus_url
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe :edit do
|
71
|
+
it "should response with menu by id" do
|
72
|
+
menu1 = FactoryGirl.create(:spud_menu)
|
73
|
+
menu2 = FactoryGirl.create(:spud_menu)
|
74
|
+
get :edit,:id => menu2.id
|
75
|
+
assigns(:menu).should == menu2
|
76
|
+
end
|
77
|
+
it "should redirect to index if menu not found" do
|
78
|
+
get :edit,:id => 3
|
79
|
+
response.should redirect_to spud_admin_menus_url
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
describe :update do
|
85
|
+
it "should update the name when the name attribute is changed" do
|
86
|
+
menu = FactoryGirl.create(:spud_menu)
|
87
|
+
new_name = 'MyMenu'
|
88
|
+
lambda {
|
89
|
+
put :update,:id => menu.id, :spud_menu => menu.attributes.merge!(:name => new_name).reject{|k,v| k == 'site_id' || k == 'id'}
|
90
|
+
menu.reload
|
91
|
+
}.should change(menu,:name).to(new_name)
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should redirect to the admin menus after a successful update" do
|
96
|
+
menu = FactoryGirl.create(:spud_menu)
|
97
|
+
put :update,:id => menu.id,:spud_menu => menu.attributes.merge!(:name => "MyMenu").reject{|k,v| k == 'site_id' || k == 'id'}
|
98
|
+
|
99
|
+
response.should redirect_to(spud_admin_menu_menu_items_url(:menu_id => menu.id))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe :destroy do
|
104
|
+
it "should destroy the menu" do
|
105
|
+
menu = FactoryGirl.create(:spud_menu)
|
106
|
+
lambda {
|
107
|
+
delete :destroy, :id => menu.id
|
108
|
+
}.should change(SpudMenu,:count).by(-1)
|
109
|
+
response.should be_redirect
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should not destroy the menu with a wrong id" do
|
113
|
+
menu = FactoryGirl.create(:spud_menu)
|
114
|
+
lambda {
|
115
|
+
delete :destroy,:id => "23532"
|
116
|
+
}.should_not change(SpudMenu,:count)
|
117
|
+
response.should be_redirect
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|