alchemy_cms 2.1.beta6 → 2.1.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -1
- data/Gemfile +10 -2
- data/Guardfile +16 -0
- data/README.md +3 -3
- data/Rakefile +0 -5
- data/alchemy_cms.gemspec +1 -9
- data/app/assets/javascripts/alchemy/alchemy.base.js +5 -4
- data/app/assets/javascripts/alchemy/{alchemy.dragndrop.js.erb → alchemy.dragndrop.js} +0 -0
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +96 -0
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +48 -50
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +41 -0
- data/app/assets/javascripts/alchemy/alchemy.js +2 -0
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +55 -0
- data/app/assets/javascripts/alchemy/alchemy.preview.js +94 -139
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js +98 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +1 -174
- data/app/assets/javascripts/alchemy/menubar.js +2 -0
- data/app/assets/javascripts/alchemy/preview.js +2 -1
- data/app/assets/stylesheets/alchemy/_defaults.scss +7 -8
- data/app/assets/stylesheets/alchemy/base.css.scss +29 -33
- data/app/assets/stylesheets/alchemy/elements.css.scss +4 -4
- data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +19 -4
- data/app/assets/stylesheets/alchemy/menubar.css.scss +85 -0
- data/app/assets/stylesheets/alchemy/standard_set.css +3 -5
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +1 -1
- data/app/controllers/alchemy/admin/attachments_controller.rb +2 -18
- data/app/controllers/alchemy/admin/base_controller.rb +1 -1
- data/app/controllers/alchemy/admin/elements_controller.rb +2 -2
- data/app/controllers/alchemy/admin/essence_files_controller.rb +4 -2
- data/app/controllers/alchemy/admin/pictures_controller.rb +6 -20
- data/app/controllers/alchemy/admin/resources_controller.rb +7 -5
- data/app/controllers/alchemy/base_controller.rb +14 -4
- data/app/controllers/alchemy/messages_controller.rb +4 -4
- data/app/controllers/alchemy/pages_controller.rb +51 -32
- data/app/controllers/alchemy/pictures_controller.rb +0 -3
- data/app/controllers/alchemy/user_sessions_controller.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +6 -4
- data/app/helpers/alchemy/base_helper.rb +26 -0
- data/app/helpers/alchemy/pages_helper.rb +42 -22
- data/app/models/alchemy/attachment.rb +10 -2
- data/app/models/alchemy/cell.rb +1 -0
- data/app/models/alchemy/content.rb +8 -6
- data/app/models/alchemy/element.rb +1 -1
- data/app/models/alchemy/essence_audio.rb +1 -8
- data/app/models/alchemy/essence_date.rb +2 -9
- data/app/models/alchemy/essence_file.rb +1 -8
- data/app/models/alchemy/essence_flash.rb +0 -7
- data/app/models/alchemy/essence_html.rb +1 -8
- data/app/models/alchemy/essence_picture.rb +0 -11
- data/app/models/alchemy/essence_richtext.rb +4 -12
- data/app/models/alchemy/essence_text.rb +1 -13
- data/app/models/alchemy/essence_video.rb +1 -8
- data/app/models/alchemy/page.rb +28 -22
- data/app/models/alchemy/picture.rb +19 -0
- data/app/sweepers/alchemy/pages_sweeper.rb +17 -6
- data/app/sweepers/alchemy/pictures_sweeper.rb +1 -3
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +2 -2
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +1 -1
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +2 -2
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +13 -11
- data/app/views/alchemy/admin/attachments/create.js.erb +1 -1
- data/app/views/alchemy/admin/attachments/edit.html.erb +2 -2
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -2
- data/app/views/alchemy/admin/elements/new.html.erb +1 -1
- data/app/views/alchemy/admin/essence_files/edit.html.erb +32 -32
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +29 -29
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +13 -12
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +4 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +8 -8
- data/app/views/alchemy/admin/pages/index.html.erb +1 -1
- data/app/views/alchemy/admin/pages/new.html.erb +1 -1
- data/app/views/alchemy/admin/pages/update.js.erb +19 -12
- data/app/views/alchemy/admin/pictures/_picture.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +8 -6
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +6 -1
- data/app/views/alchemy/admin/resources/_table.html.erb +1 -1
- data/app/views/alchemy/admin/users/_table.html.erb +13 -13
- data/app/views/alchemy/admin/users/_user.html.erb +1 -1
- data/app/views/alchemy/admin/users/index.html.erb +2 -2
- data/app/views/alchemy/elements/_contactform_view.html.erb +78 -78
- data/app/views/alchemy/elements/_download_editor.html.erb +1 -0
- data/app/views/alchemy/elements/_download_view.html.erb +3 -0
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_file_view.html.erb +6 -2
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +3 -2
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -1
- data/app/views/alchemy/navigation/_link.html.erb +1 -2
- data/app/views/alchemy/notifications/admin_user_created.text.erb +7 -7
- data/app/views/alchemy/notifications/registered_user_created.text.erb +5 -5
- data/app/views/alchemy/user_sessions/login.html.erb +34 -35
- data/app/views/layouts/alchemy/login.html.erb +3 -8
- data/app/views/layouts/alchemy/pages.html.erb +1 -0
- data/bin/alchemy +43 -75
- data/config/alchemy/config.yml +10 -0
- data/config/alchemy/elements.yml +5 -0
- data/config/alchemy/page_layouts.yml +1 -1
- data/config/locales/alchemy.de.yml +21 -8
- data/config/locales/alchemy.en.yml +20 -4
- data/config/routes.rb +25 -20
- data/db/migrate/{20111116125112_namespace_models.rb → 20111116125112_namespace_alchemy_models.rb} +1 -1
- data/lib/alchemy/capistrano.rb +4 -17
- data/lib/alchemy/engine.rb +2 -0
- data/lib/alchemy/essence.rb +29 -41
- data/lib/alchemy/i18n.rb +1 -1
- data/lib/alchemy/mount_point.rb +10 -0
- data/lib/alchemy/page_layout.rb +7 -7
- data/lib/alchemy/seeder.rb +85 -47
- data/lib/alchemy/upgrader.rb +115 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +4 -3
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +6 -2
- data/lib/tasks/ferret.rake +12 -0
- data/lib/tasks/install.rake +16 -105
- data/lib/tasks/routes.rake +29 -0
- data/lib/tasks/upgrade.rake +5 -67
- data/spec/controllers/admin/pages_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +31 -0
- data/spec/factories.rb +24 -15
- data/spec/helpers/admin/base_helper_spec.rb +0 -7
- data/spec/helpers/pages_helper_spec.rb +54 -29
- data/spec/helpers/url_helpers_spec.rb +40 -0
- data/spec/integration/admin/pages_controller_spec.rb +3 -3
- data/spec/integration/pages_controller_spec.rb +80 -6
- data/spec/integration/security_spec.rb +2 -2
- data/spec/models/content_spec.rb +24 -0
- data/spec/models/page_spec.rb +174 -47
- data/spec/models/picture_spec.rb +54 -0
- data/spec/page_layout_spec.rb +2 -2
- data/spec/routing_spec.rb +205 -1
- data/spec/spec_helper.rb +53 -32
- metadata +51 -46
- data/lib/alchemy/file_utilz.rb +0 -73
|
@@ -4,7 +4,7 @@ describe Alchemy::PagesController do
|
|
|
4
4
|
|
|
5
5
|
before(:each) do
|
|
6
6
|
@default_language = Alchemy::Language.get_default
|
|
7
|
-
@default_language_root = Factory(:language_root_page, :language => @default_language, :name => 'Home'
|
|
7
|
+
@default_language_root = Factory(:language_root_page, :language => @default_language, :name => 'Home')
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
describe "#show" do
|
|
@@ -28,7 +28,7 @@ describe Alchemy::PagesController do
|
|
|
28
28
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
describe "fulltext search" do
|
|
32
32
|
|
|
33
33
|
before(:each) do
|
|
34
34
|
@page = Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 1', :parent_id => @default_language_root.id)
|
|
@@ -55,16 +55,38 @@ describe Alchemy::PagesController do
|
|
|
55
55
|
within('div#content .search_result') { page.should have_content('Petshop') }
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
+
it "should not find contents placed on global-pages (layoutpage => true)" do
|
|
59
|
+
@page.update_attributes(:layoutpage => true)
|
|
60
|
+
@element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
|
|
61
|
+
visit('/alchemy/suche?query=Petshop')
|
|
62
|
+
within('div#content') { page.should have_css('h2.no_search_results') }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not find contents placed on unpublished pages (public => false)" do
|
|
66
|
+
@page.update_attributes(:public => false)
|
|
67
|
+
@element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
|
|
68
|
+
visit('/alchemy/suche?query=Petshop')
|
|
69
|
+
within('div#content') { page.should have_css('h2.no_search_results') }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should not find contents placed on restricted pages (restricted => true)" do
|
|
73
|
+
@page.update_attributes(:restricted => true)
|
|
74
|
+
@element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
|
|
75
|
+
visit('/alchemy/suche?query=Petshop')
|
|
76
|
+
within('div#content') { page.should have_css('h2.no_search_results') }
|
|
77
|
+
end
|
|
78
|
+
|
|
58
79
|
end
|
|
59
80
|
|
|
60
81
|
end
|
|
61
82
|
|
|
62
|
-
|
|
83
|
+
describe "redirecting" do
|
|
63
84
|
|
|
64
|
-
context "in multi language mode" do
|
|
85
|
+
context "in multi language mode", :focus => true do
|
|
65
86
|
|
|
66
87
|
before(:each) do
|
|
67
88
|
@page = Factory(:public_page)
|
|
89
|
+
Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
|
|
68
90
|
end
|
|
69
91
|
|
|
70
92
|
it "should redirect to url with nested language code" do
|
|
@@ -77,9 +99,10 @@ describe Alchemy::PagesController do
|
|
|
77
99
|
before(:each) do
|
|
78
100
|
@page.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
|
|
79
101
|
@child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id)
|
|
102
|
+
Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
|
|
80
103
|
end
|
|
81
104
|
|
|
82
|
-
it "
|
|
105
|
+
it "if requested page is unpublished" do
|
|
83
106
|
visit '/alchemy/kl/not-public'
|
|
84
107
|
page.current_path.should == '/alchemy/kl/public-child'
|
|
85
108
|
end
|
|
@@ -106,12 +129,63 @@ describe Alchemy::PagesController do
|
|
|
106
129
|
page.current_url.should match(/\?query=Peter/)
|
|
107
130
|
end
|
|
108
131
|
|
|
132
|
+
context "url nesting" do
|
|
133
|
+
|
|
134
|
+
before(:each) do
|
|
135
|
+
@level1 = Factory(:public_page, :parent_id => @default_language_root.id, :name => 'catalog', :language => @default_language)
|
|
136
|
+
@level2 = Factory(:public_page, :parent_id => @level1.id, :name => 'products', :language => @default_language)
|
|
137
|
+
@level3 = Factory(:public_page, :parent_id => @level2.id, :name => 'screwdriver', :language => @default_language)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context "enabled" do
|
|
141
|
+
|
|
142
|
+
before(:each) do
|
|
143
|
+
Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
context "requesting a non nested url" do
|
|
147
|
+
|
|
148
|
+
it "should redirect to nested url" do
|
|
149
|
+
visit "/alchemy/de/screwdriver"
|
|
150
|
+
page.current_path.should == '/alchemy/de/catalog/products/screwdriver'
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "should only redirect to nested url if page is nested" do
|
|
154
|
+
visit "/alchemy/de/catalog"
|
|
155
|
+
page.status_code.should == 200
|
|
156
|
+
page.current_path.should == "/alchemy/de/catalog"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
context "disabled" do
|
|
164
|
+
|
|
165
|
+
before(:each) do
|
|
166
|
+
Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context "requesting a nested url" do
|
|
170
|
+
|
|
171
|
+
it "should redirect to not nested url" do
|
|
172
|
+
visit "/alchemy/de/catalog/products/screwdriver"
|
|
173
|
+
page.current_path.should == "/alchemy/de/screwdriver"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
|
|
109
182
|
end
|
|
110
183
|
|
|
111
184
|
context "not in multi language mode" do
|
|
112
185
|
|
|
113
186
|
before(:each) do
|
|
114
187
|
@page = Factory(:public_page, :language => @default_language, :parent_id => @default_language_root.id)
|
|
188
|
+
Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
|
|
115
189
|
end
|
|
116
190
|
|
|
117
191
|
it "should redirect from nested language code url to normal url" do
|
|
@@ -140,7 +214,7 @@ describe Alchemy::PagesController do
|
|
|
140
214
|
@child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id, :language => @default_language)
|
|
141
215
|
end
|
|
142
216
|
|
|
143
|
-
it "
|
|
217
|
+
it "if requested page is unpublished" do
|
|
144
218
|
visit '/alchemy/not-public'
|
|
145
219
|
page.current_path.should == '/alchemy/public-child'
|
|
146
220
|
end
|
|
@@ -12,7 +12,7 @@ describe "Security: " do
|
|
|
12
12
|
|
|
13
13
|
it "render the signup view" do
|
|
14
14
|
visit '/alchemy/'
|
|
15
|
-
within('#alchemy_greeting') { page.should have_content('
|
|
15
|
+
within('#alchemy_greeting') { page.should have_content('Signup') }
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -39,7 +39,7 @@ describe "Security: " do
|
|
|
39
39
|
visit '/alchemy/admin/login'
|
|
40
40
|
fill_in('alchemy_user_session_login', :with => 'jdoe')
|
|
41
41
|
fill_in('alchemy_user_session_password', :with => 's3cr3t')
|
|
42
|
-
click_on('
|
|
42
|
+
click_on('login')
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
it "should be redirected to dashboard" do
|
data/spec/models/content_spec.rb
CHANGED
|
@@ -48,4 +48,28 @@ describe Alchemy::Content do
|
|
|
48
48
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
+
describe '#update_essence' do
|
|
52
|
+
|
|
53
|
+
it "should update the attributes of related essence and return true" do
|
|
54
|
+
@element = Factory(:element, :name => 'text')
|
|
55
|
+
@content = @element.contents.first
|
|
56
|
+
@content.update_essence(:body => 'Mikes Petshop')
|
|
57
|
+
@content.ingredient.should == "Mikes Petshop"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should add error messages if save fails and return false" do
|
|
61
|
+
@element = Factory(:element, :name => 'contactform')
|
|
62
|
+
@content = @element.contents.first
|
|
63
|
+
@content.update_essence
|
|
64
|
+
@content.errors[:essence].should have(1).item
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should raise error if essence is missing" do
|
|
68
|
+
@element = Factory(:element, :name => 'text')
|
|
69
|
+
@content = @element.contents.first
|
|
70
|
+
@content.update_essence
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
51
75
|
end
|
data/spec/models/page_spec.rb
CHANGED
|
@@ -5,9 +5,9 @@ require 'spec_helper'
|
|
|
5
5
|
describe Alchemy::Page do
|
|
6
6
|
|
|
7
7
|
before(:each) do
|
|
8
|
-
@rootpage = Alchemy::Page.
|
|
8
|
+
@rootpage = Alchemy::Page.root
|
|
9
9
|
@language = Alchemy::Language.get_default
|
|
10
|
-
@language_root = Factory(:
|
|
10
|
+
@language_root = Factory(:language_root_page, :name => 'Default Language Root', :language => @language)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
describe ".layout_description" do
|
|
@@ -104,46 +104,37 @@ describe Alchemy::Page do
|
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
end
|
|
107
|
-
|
|
108
|
-
context "create" do
|
|
109
|
-
it "the rootpage with page_layout rootpage does not need a parent_id" do
|
|
110
|
-
@rootpage.rootpage?.should be_true
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "all pages except the rootpage must have a parent_id" do
|
|
114
|
-
page = Factory.build(:page, :page_layout => "anypage", :parent_id => nil, :language => @language)
|
|
115
|
-
page.valid?
|
|
116
|
-
page.should have(1).error_on(:parent_id)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "must not be created if the page_layout is set to 'rootpage' and a page already exists with this page_layout and parent_id = nil" do
|
|
120
|
-
page = Factory.build(:page, :name => "anypage", :page_layout => "rootpage", :parent_id => @language_root.id, :language => @language)
|
|
121
|
-
page.valid?
|
|
122
|
-
page.should have(1).error_on(:page_layout)
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "should get a webfriendly urlname on create" do
|
|
126
|
-
page = Factory(:page, :name => 'klingon$&stößel ', :language => @language, :parent_id => @language_root.id)
|
|
127
|
-
page.urlname.should == 'klingon-stoessel'
|
|
128
|
-
end
|
|
129
107
|
|
|
130
|
-
|
|
131
|
-
page = Factory(:page, :name => 'Au', :language => @language, :parent_id => @language_root.id)
|
|
132
|
-
page.urlname.should == '-au'
|
|
133
|
-
end
|
|
108
|
+
describe '#create' do
|
|
134
109
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
110
|
+
context "generate urlnames" do
|
|
111
|
+
|
|
112
|
+
it "should get a webfriendly urlname" do
|
|
113
|
+
page = Factory(:page, :name => 'klingon$&stößel ', :language => @language, :parent_id => @language_root.id)
|
|
114
|
+
page.urlname.should == 'klingon-stoessel'
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should generate a three letter urlname from two letter name" do
|
|
118
|
+
page = Factory(:page, :name => 'Au', :language => @language, :parent_id => @language_root.id)
|
|
119
|
+
page.urlname.should == '-au'
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should generate a three letter urlname from two letter name with umlaut" do
|
|
123
|
+
page = Factory(:page, :name => 'Aü', :language => @language, :parent_id => @language_root.id)
|
|
124
|
+
page.urlname.should == 'aue'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should generate a three letter urlname from one letter name" do
|
|
128
|
+
page = Factory(:page, :name => 'A', :language => @language, :parent_id => @language_root.id)
|
|
129
|
+
page.urlname.should == '--a'
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
139
133
|
|
|
140
|
-
it "should generate a three letter urlname from one letter name" do
|
|
141
|
-
page = Factory(:page, :name => 'A', :language => @language, :parent_id => @language_root.id)
|
|
142
|
-
page.urlname.should == '--a'
|
|
143
|
-
end
|
|
144
134
|
end
|
|
145
|
-
|
|
135
|
+
|
|
146
136
|
context "with children" do
|
|
137
|
+
|
|
147
138
|
before(:each) do
|
|
148
139
|
@first_child = Factory(:page, :name => "First child", :language => @language, :public => false, :parent_id => @language_root.id)
|
|
149
140
|
@first_child.move_to_child_of(@language_root)
|
|
@@ -151,7 +142,7 @@ describe Alchemy::Page do
|
|
|
151
142
|
@first_public_child = Factory(:page, :name => "First public child", :language => @language, :parent_id => @language_root.id, :public => true)
|
|
152
143
|
@first_public_child.move_to_child_of(@language_root)
|
|
153
144
|
end
|
|
154
|
-
|
|
145
|
+
|
|
155
146
|
it "should return a page object (or nil if no public child exists) for first_public_child" do
|
|
156
147
|
if @language_root.children.any?
|
|
157
148
|
@language_root.first_public_child.should == @first_public_child
|
|
@@ -159,23 +150,28 @@ describe Alchemy::Page do
|
|
|
159
150
|
@language_root.first_public_child.should == nil
|
|
160
151
|
end
|
|
161
152
|
end
|
|
153
|
+
|
|
162
154
|
end
|
|
163
|
-
|
|
155
|
+
|
|
164
156
|
context ".public" do
|
|
165
|
-
|
|
157
|
+
|
|
158
|
+
it "should return pages that are public" do
|
|
166
159
|
Factory(:public_page, :name => 'First Public Child', :parent_id => @language_root.id, :language => @language)
|
|
167
160
|
Factory(:public_page, :name => 'Second Public Child', :parent_id => @language_root.id, :language => @language)
|
|
168
|
-
|
|
169
|
-
|
|
161
|
+
Alchemy::Page.published.should have(3).pages
|
|
162
|
+
end
|
|
163
|
+
|
|
170
164
|
end
|
|
171
|
-
|
|
165
|
+
|
|
172
166
|
context ".not_locked" do
|
|
173
|
-
|
|
174
|
-
|
|
167
|
+
|
|
168
|
+
it "should return pages that are not blocked by a user at the moment" do
|
|
169
|
+
Factory(:public_page, :locked => true, :name => 'First Public Child', :parent_id => @language_root.id, :language => @language)
|
|
175
170
|
Factory(:public_page, :name => 'Second Public Child', :parent_id => @language_root.id, :language => @language)
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
Alchemy::Page.not_locked.should have(3).pages
|
|
172
|
+
end
|
|
178
173
|
end
|
|
174
|
+
|
|
179
175
|
context ".all_locked" do
|
|
180
176
|
it "should return 1 page that is blocked by a user at the moment" do
|
|
181
177
|
Factory(:public_page, :locked => true, :name => 'First Public Child', :parent_id => @language_root.id, :language => @language)
|
|
@@ -307,4 +303,135 @@ describe Alchemy::Page do
|
|
|
307
303
|
|
|
308
304
|
end
|
|
309
305
|
|
|
306
|
+
describe "validations" do
|
|
307
|
+
|
|
308
|
+
context "creating a normal content page" do
|
|
309
|
+
|
|
310
|
+
before(:each) do
|
|
311
|
+
@contentpage = Factory.build(:page, :parent_id => nil, :page_layout => nil)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
it "should validate the page_layout" do
|
|
315
|
+
@contentpage.save
|
|
316
|
+
@contentpage.should have(1).error_on(:page_layout)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it "should validate the parent_id" do
|
|
320
|
+
@contentpage.save
|
|
321
|
+
@contentpage.should have(1).error_on(:parent_id)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
context "creating the rootpage without parent_id and page_layout" do
|
|
327
|
+
|
|
328
|
+
before(:each) do
|
|
329
|
+
Alchemy::Page.delete_all
|
|
330
|
+
@rootpage = Factory.build(:page, :parent_id => nil, :page_layout => nil, :name => 'Rootpage')
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
it "should be valid" do
|
|
334
|
+
@rootpage.save
|
|
335
|
+
@rootpage.should be_valid
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
context "saving a systempage" do
|
|
341
|
+
|
|
342
|
+
before(:each) do
|
|
343
|
+
@systempage = Factory.build(:systempage)
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it "should not validate the page_layout" do
|
|
347
|
+
@systempage.save
|
|
348
|
+
@systempage.should be_valid
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
describe 'before and after filters' do
|
|
356
|
+
|
|
357
|
+
context "a normal page" do
|
|
358
|
+
|
|
359
|
+
before(:each) do
|
|
360
|
+
@page = Factory.build(:page, :language_code => nil, :language => Factory(:language))
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
it "should get the language code for language" do
|
|
364
|
+
@page.save
|
|
365
|
+
@page.language_code.should == "kl"
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
it "should autogenerate the elements" do
|
|
369
|
+
@page.save
|
|
370
|
+
@page.elements.should_not be_empty
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
context "with children getting restricted set to true" do
|
|
374
|
+
|
|
375
|
+
before(:each) do
|
|
376
|
+
@page.save
|
|
377
|
+
@child1 = Factory(:page, :name => 'Child 1', :parent_id => @page.id)
|
|
378
|
+
@page.reload
|
|
379
|
+
@page.restricted = true
|
|
380
|
+
@page.save
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
it "should restrict all its children" do
|
|
384
|
+
@child1.reload
|
|
385
|
+
@child1.restricted?.should be_true
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
context "with restricted parent gets created" do
|
|
391
|
+
|
|
392
|
+
before(:each) do
|
|
393
|
+
@page.save
|
|
394
|
+
@page.parent.update_attributes(:restricted => true)
|
|
395
|
+
@new_page = Factory(:page, :name => 'New Page', :parent_id => @page.id)
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
it "should also be restricted" do
|
|
399
|
+
@new_page.restricted?.should be_true
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
context "with do_not_autogenerate set to true" do
|
|
405
|
+
|
|
406
|
+
before(:each) do
|
|
407
|
+
@page.do_not_autogenerate = true
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
it "should not autogenerate the elements" do
|
|
411
|
+
@page.save
|
|
412
|
+
@page.elements.should be_empty
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
context "a systempage" do
|
|
420
|
+
|
|
421
|
+
before(:each) do
|
|
422
|
+
@page = Factory(:systempage)
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
it "should not get the language code for language" do
|
|
426
|
+
@page.language_code.should be_nil
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
it "should not autogenerate the elements" do
|
|
430
|
+
@page.elements.should be_empty
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
end
|
|
436
|
+
|
|
310
437
|
end
|