alchemy_cms 2.3.2 → 2.4.beta2
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 +1 -2
- data/.travis.yml +1 -5
- data/Gemfile +4 -4
- data/README.md +22 -15
- data/alchemy_cms.gemspec +38 -38
- data/app/assets/javascripts/alchemy/alchemy.base.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +31 -0
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +24 -15
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +9 -3
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.js +1 -0
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -12
- data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +32 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +4 -4
- data/app/assets/stylesheets/alchemy/_defaults.scss +0 -1
- data/app/assets/stylesheets/alchemy/alchemy.css +2 -1
- data/app/assets/stylesheets/alchemy/base.css.scss +2 -54
- data/app/assets/stylesheets/alchemy/elements.css.scss +8 -5
- data/app/assets/stylesheets/alchemy/errors.css.scss +51 -0
- data/app/assets/stylesheets/alchemy/flash.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/form_elements.css.scss +31 -75
- data/app/assets/stylesheets/alchemy/icons.css.scss +5 -5
- data/app/assets/stylesheets/alchemy/menubar.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/sitemap.css.scss +0 -1
- data/app/assets/stylesheets/alchemy/tables.css.scss +3 -1
- data/app/controllers/alchemy/admin/base_controller.rb +19 -12
- data/app/controllers/alchemy/admin/elements_controller.rb +52 -24
- data/app/controllers/alchemy/admin/pages_controller.rb +11 -5
- data/app/controllers/alchemy/admin/resources_controller.rb +3 -4
- data/app/controllers/alchemy/admin/users_controller.rb +1 -0
- data/app/controllers/alchemy/base_controller.rb +34 -8
- data/app/controllers/alchemy/pictures_controller.rb +16 -1
- data/app/controllers/alchemy/user_sessions_controller.rb +6 -1
- data/app/helpers/alchemy/base_helper.rb +14 -0
- data/app/helpers/alchemy/elements_helper.rb +10 -5
- data/app/helpers/alchemy/pages_helper.rb +1 -2
- data/app/helpers/alchemy/url_helper.rb +43 -24
- data/app/models/alchemy/element.rb +23 -16
- data/app/models/alchemy/page.rb +25 -14
- data/app/models/alchemy/picture.rb +24 -0
- data/app/views/alchemy/admin/contents/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +11 -3
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/new.html.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure.html.erb +10 -6
- data/app/views/alchemy/admin/pages/configure_external.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -2
- data/app/views/alchemy/admin/pages/new.html.erb +2 -2
- data/app/views/alchemy/admin/pages/update.js.erb +10 -2
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +5 -5
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +3 -2
- data/app/views/alchemy/admin/resources/_form.html.erb +1 -1
- data/app/views/alchemy/admin/users/_table.html.erb +4 -4
- data/app/views/alchemy/admin/users/edit.html.erb +1 -1
- data/app/views/alchemy/admin/users/new.html.erb +1 -1
- data/app/views/alchemy/base/error_notice.js.erb +1 -1
- data/app/views/alchemy/base/remote_errors.js.erb +2 -3
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +24 -21
- data/app/views/layouts/alchemy/admin.html.erb +9 -31
- data/bin/alchemy +20 -24
- data/config/alchemy/config.yml +6 -0
- data/config/alchemy/page_layouts.yml +2 -0
- data/config/authorization_rules.rb +1 -1
- data/config/locales/alchemy.de.yml +3 -0
- data/config/locales/alchemy.en.yml +4 -1
- data/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/lib/alchemy/mount_point.rb +9 -3
- data/lib/alchemy/page_layout.rb +89 -73
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +45 -12
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -1
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +51 -0
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +18 -0
- data/lib/rails/generators/alchemy/essence/templates/view.html.erb +2 -0
- data/lib/rails/templates/alchemy.rb +1 -1
- data/lib/tasks/install.rake +57 -2
- data/spec/controllers/admin/elements_controller_spec.rb +170 -22
- data/spec/controllers/admin/trash_controller_spec.rb +1 -1
- data/spec/controllers/admin/users_controller_spec.rb +36 -0
- data/spec/controllers/base_controller_spec.rb +12 -1
- data/spec/controllers/elements_controller_spec.rb +17 -13
- data/spec/controllers/pictures_controller_spec.rb +4 -4
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/spec/dummy/db/migrate/20121026104128_create_events.rb +19 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/factories.rb +0 -1
- data/spec/helpers/base_helper_spec.rb +48 -0
- data/spec/helpers/elements_helper_spec.rb +14 -3
- data/spec/helpers/url_helper_spec.rb +8 -3
- data/spec/integration/picture_security_spec.rb +35 -0
- data/spec/integration/translation_integration_spec.rb +6 -5
- data/spec/models/element_spec.rb +5 -5
- data/spec/models/page_layout_spec.rb +10 -16
- data/spec/models/page_spec.rb +25 -2
- data/spec/models/picture_spec.rb +24 -2
- data/spec/routing_spec.rb +115 -115
- data/spec/support/alchemy/specs_helpers.rb +4 -4
- data/{app/assets/images/alchemy → vendor/assets/images}/Jcrop.gif +0 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +19 -243
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectboxit.min.js +1 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +6 -6
- data/vendor/assets/stylesheets/jquery.Jcrop.min.css +28 -0
- metadata +48 -82
- data/app/assets/javascripts/alchemy/alchemy.buttons.js +0 -50
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +0 -54
- data/app/helpers/alchemy/pictures_helper.rb +0 -19
- data/db/migrate/20100607143125_create_pages.rb +0 -34
- data/db/migrate/20100607144254_create_elements.rb +0 -20
- data/db/migrate/20100607145256_create_contents.rb +0 -18
- data/db/migrate/20100607145719_create_users.rb +0 -32
- data/db/migrate/20100607150611_create_pictures.rb +0 -16
- data/db/migrate/20100607150812_create_attachments.rb +0 -16
- data/db/migrate/20100607153647_create_folded_pages.rb +0 -13
- data/db/migrate/20100607161345_create_essence_texts.rb +0 -19
- data/db/migrate/20100607162339_create_elements_pages.rb +0 -12
- data/db/migrate/20100607193638_create_essence_pictures.rb +0 -23
- data/db/migrate/20100607193646_create_essence_richtexts.rb +0 -16
- data/db/migrate/20100607193653_create_essence_htmls.rb +0 -13
- data/db/migrate/20100609111653_create_essence_dates.rb +0 -13
- data/db/migrate/20100609111809_create_essence_files.rb +0 -15
- data/db/migrate/20100609111821_create_essence_flashes.rb +0 -16
- data/db/migrate/20100609111837_create_essence_videos.rb +0 -18
- data/db/migrate/20100616150753_create_essence_audios.rb +0 -17
- data/db/migrate/20100812085225_add_crop_from_and_crop_size_to_essence_pictures.rb +0 -11
- data/db/migrate/20100909140701_change_essence_htmls_source_column_type.rb +0 -9
- data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +0 -9
- data/db/migrate/20101109151812_create_languages.rb +0 -19
- data/db/migrate/20101216151419_add_language_id_to_pages.rb +0 -27
- data/db/migrate/20101216155216_add_index_to_languages.rb +0 -9
- data/db/migrate/20101216173323_add_default_to_languages.rb +0 -9
- data/db/migrate/20101218130049_add_urlname_index_to_pages.rb +0 -9
- data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +0 -11
- data/db/migrate/20110224105120_change_pages_visible_default.rb +0 -11
- data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +0 -11
- data/db/migrate/20110414163140_remove_display_name_from_elements.rb +0 -11
- data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +0 -9
- data/db/migrate/20110529130429_create_cells.rb +0 -14
- data/db/migrate/20110529130500_add_cell_id_to_elements.rb +0 -11
- data/db/migrate/20110530102804_change_pages_page_layout_column.rb +0 -11
- data/db/migrate/20110707190728_add_render_size_to_essence_pictures.rb +0 -9
- data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +0 -19
- data/db/migrate/20110919110451_add_default_role_to_users.rb +0 -9
- data/db/migrate/20111116125112_namespace_alchemy_models.rb +0 -23
- data/db/migrate/20120216135355_add_country_code_to_languages.rb +0 -9
- data/db/migrate/20120608085509_create_alchemy_essence_selects.rb +0 -11
- data/db/migrate/20120611221734_create_alchemy_essence_booleans.rb +0 -11
- data/db/migrate/20120704181529_add_upload_hash_to_alchemy_picture.rb +0 -5
- data/db/migrate/20120705214247_acts_as_taggable_on_migration.rb +0 -28
- data/db/migrate/20120728185830_add_cached_tag_list_to_alchemy_pictures.rb +0 -5
- data/db/migrate/20120831135441_set_alchemy_languages_country_code_default_to_empty_string.rb +0 -9
- data/spec/helpers/pictures_helper_spec.rb +0 -14
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectBoxIt.js +0 -1909
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class CreateEvents < ActiveRecord::Migration
|
|
2
|
+
|
|
3
|
+
def change
|
|
4
|
+
create_table "events" do |t|
|
|
5
|
+
t.string "name"
|
|
6
|
+
t.string "hidden_name"
|
|
7
|
+
t.datetime "starts_at"
|
|
8
|
+
t.datetime "ends_at"
|
|
9
|
+
t.text "description"
|
|
10
|
+
t.decimal "entrance_fee", :precision => 6, :scale => 2
|
|
11
|
+
t.boolean "published"
|
|
12
|
+
t.integer "location_id"
|
|
13
|
+
t.integer "organizer_id"
|
|
14
|
+
t.datetime "created_at", :null => false
|
|
15
|
+
t.datetime "updated_at", :null => false
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
data/spec/dummy/db/schema.rb
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#
|
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
|
13
13
|
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
|
14
|
+
ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
15
15
|
|
|
16
16
|
create_table "alchemy_attachments", :force => true do |t|
|
|
17
17
|
t.string "name"
|
data/spec/factories.rb
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
describe BaseHelper do
|
|
5
|
+
|
|
6
|
+
describe "#render_message" do
|
|
7
|
+
|
|
8
|
+
context "if no argument is passed" do
|
|
9
|
+
it "should render a div with an info icon and the given content" do
|
|
10
|
+
helper.render_message{ content_tag(:p, "my notice") }.should match(/<div class="info message"><span class="icon info"><\/span><p>my notice/)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context "if an argument is passed" do
|
|
15
|
+
it "should render the passed argument as the css classname for the icon container" do
|
|
16
|
+
helper.render_message(:error){ content_tag(:p, "my notice") }.should match(/<div class="error message"><span class="icon error">/)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "#configuration" do
|
|
23
|
+
it "should return certain configuration options" do
|
|
24
|
+
Config.stub!(:show).and_return({"some_option" => true})
|
|
25
|
+
helper.configuration(:some_option).should == true
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "#multi_language?" do
|
|
30
|
+
|
|
31
|
+
context "if more than one published language exists" do
|
|
32
|
+
it "should return true" do
|
|
33
|
+
Alchemy::Language.stub_chain(:published, :count).and_return(2)
|
|
34
|
+
helper.multi_language?.should == true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "if less than two published languages exists" do
|
|
39
|
+
it "should return false" do
|
|
40
|
+
Alchemy::Language.stub_chain(:published, :count).and_return(1)
|
|
41
|
+
helper.multi_language?.should == false
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -128,10 +128,21 @@ describe Alchemy::ElementsHelper do
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
context "with option fallback" do
|
|
131
|
+
before do
|
|
132
|
+
@another_page = FactoryGirl.create(:public_page, :name => 'Another Page', :page_layout => 'news')
|
|
133
|
+
@another_element_1 = FactoryGirl.create(:element, :page => @another_page, :name => 'news')
|
|
134
|
+
end
|
|
135
|
+
|
|
131
136
|
it "should render the fallback element, when no element with the given name is found" do
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
137
|
+
helper.render_elements(
|
|
138
|
+
:fallback => {:for => 'higgs', :with => 'news', :from => 'news'}
|
|
139
|
+
).should match(/id="news_#{@another_element_1.id}"/)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "should also take a page object as fallback from" do
|
|
143
|
+
helper.render_elements(
|
|
144
|
+
:fallback => {:for => 'higgs', :with => 'news', :from => @another_page}
|
|
145
|
+
).should match(/id="news_#{@another_element_1.id}"/)
|
|
135
146
|
end
|
|
136
147
|
end
|
|
137
148
|
|
|
@@ -123,12 +123,12 @@ module Alchemy
|
|
|
123
123
|
|
|
124
124
|
describe 'picture path helpers' do
|
|
125
125
|
|
|
126
|
-
let(:picture) {
|
|
126
|
+
let(:picture) { stub_model(Picture, :urlname => 'cute_kitten', :id => 42) }
|
|
127
127
|
|
|
128
128
|
describe '#show_alchemy_picture_path' do
|
|
129
129
|
|
|
130
130
|
it "should return the correct relative path string" do
|
|
131
|
-
helper.show_alchemy_picture_path(picture).should
|
|
131
|
+
helper.show_alchemy_picture_path(picture).should =~ Regexp.new("/alchemy/pictures/42/show/cute_kitten.jpg")
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
end
|
|
@@ -136,7 +136,7 @@ module Alchemy
|
|
|
136
136
|
describe '#show_alchemy_picture_url' do
|
|
137
137
|
|
|
138
138
|
it "should return the correct url string" do
|
|
139
|
-
helper.show_alchemy_picture_url(picture).should
|
|
139
|
+
helper.show_alchemy_picture_url(picture).should =~ Regexp.new("http://#{helper.request.host}/alchemy/pictures/42/show/cute_kitten.jpg")
|
|
140
140
|
end
|
|
141
141
|
|
|
142
142
|
end
|
|
@@ -147,6 +147,11 @@ module Alchemy
|
|
|
147
147
|
helper.show_picture_path_params(picture).should include(:name => 'cute_kitten', :format => 'jpg')
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
+
it "should include the secure hash parameter" do
|
|
151
|
+
helper.show_picture_path_params(picture).keys.should include(:sh)
|
|
152
|
+
helper.show_picture_path_params(picture)[:sh].should_not be_empty
|
|
153
|
+
end
|
|
154
|
+
|
|
150
155
|
context "with additional params" do
|
|
151
156
|
|
|
152
157
|
it "should include these params" do
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Picture renderung security', :js => true do
|
|
4
|
+
|
|
5
|
+
let(:picture) { Alchemy::Picture.create(:image_file => File.new(File.expand_path('../../support/image.png', __FILE__))) }
|
|
6
|
+
|
|
7
|
+
# Prevent the signup view from being rendered.
|
|
8
|
+
before { Alchemy::User.stub!(:count).and_return 1 }
|
|
9
|
+
|
|
10
|
+
context "passing no security token" do
|
|
11
|
+
|
|
12
|
+
it 'should return a bad request (400)' do
|
|
13
|
+
visit "/alchemy/pictures/#{picture.id}/show/image.png"
|
|
14
|
+
page.status_code.should == 400
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "passing correct security token" do
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
visit "/alchemy/pictures/#{picture.id}/show/image.png?sh=#{picture.security_token}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should return image' do
|
|
26
|
+
page.body.should match(/img/)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should return status ok (200)' do
|
|
30
|
+
page.status_code.should == 200
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -4,34 +4,33 @@ describe "Translation integration" do
|
|
|
4
4
|
|
|
5
5
|
context "in admin backend" do
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
before do
|
|
8
8
|
authorize_as_admin
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should be possible to set the locale of the admin backend via params" do
|
|
9
12
|
visit admin_dashboard_path(:locale => :de)
|
|
10
13
|
page.should have_content('Willkommen')
|
|
11
14
|
end
|
|
12
15
|
|
|
13
16
|
it "should store the current locale in the session" do
|
|
14
|
-
authorize_as_admin
|
|
15
17
|
visit admin_dashboard_path(:locale => :de)
|
|
16
18
|
visit admin_dashboard_path
|
|
17
19
|
page.should have_content('Willkommen')
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
it "should be possible to change the current locale in the session" do
|
|
21
|
-
authorize_as_admin
|
|
22
23
|
visit admin_dashboard_path(:locale => :de)
|
|
23
24
|
visit admin_dashboard_path(:locale => :en)
|
|
24
25
|
page.should have_content('Welcome')
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
it "should not be possible to switch the locale of the admin backend to an unknown locale" do
|
|
28
|
-
authorize_as_admin
|
|
29
29
|
visit admin_dashboard_path(:locale => :ko)
|
|
30
30
|
page.should have_content('Welcome')
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it "should use the current users language setting if no other parameter is given" do
|
|
34
|
-
authorize_as_admin(locale = nil)
|
|
35
34
|
Alchemy::User.first.update_attributes(:language => :de)
|
|
36
35
|
visit admin_dashboard_path
|
|
37
36
|
page.should have_content('Willkommen')
|
|
@@ -42,6 +41,8 @@ describe "Translation integration" do
|
|
|
42
41
|
context "with translated header" do
|
|
43
42
|
|
|
44
43
|
before do
|
|
44
|
+
# Hack my hack.... OMG
|
|
45
|
+
Rails.stub(:env).and_return('foo')
|
|
45
46
|
Capybara.current_driver = :rack_test_translated_header
|
|
46
47
|
end
|
|
47
48
|
|
data/spec/models/element_spec.rb
CHANGED
|
@@ -6,26 +6,26 @@ module Alchemy
|
|
|
6
6
|
describe '#new_from_scratch' do
|
|
7
7
|
|
|
8
8
|
it "should initialize an element by name from scratch" do
|
|
9
|
-
el = Element.new_from_scratch({
|
|
9
|
+
el = Element.new_from_scratch({:name => 'article'})
|
|
10
10
|
el.should be_valid
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
it "should raise an error if the given name is not defined in the elements.yml" do
|
|
14
|
-
expect { Element.new_from_scratch({
|
|
14
|
+
expect { Element.new_from_scratch({:name => 'foobar'}) }.to raise_error
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
it "should take the first part of an given name containing a hash (#)" do
|
|
18
|
-
el = Element.new_from_scratch({
|
|
18
|
+
el = Element.new_from_scratch({:name => 'article#header'})
|
|
19
19
|
el.name.should == "article"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
it "should merge given attributes into defined ones" do
|
|
23
|
-
el = Element.new_from_scratch({
|
|
23
|
+
el = Element.new_from_scratch({:name => 'article', :page_id => 1})
|
|
24
24
|
el.page_id.should == 1
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
it "should not have forbidden attributes from definition" do
|
|
28
|
-
el = Element.new_from_scratch({
|
|
28
|
+
el = Element.new_from_scratch({:name => 'article'})
|
|
29
29
|
el.contents.should == []
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -3,28 +3,22 @@ require 'spec_helper'
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
describe PageLayout do
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
describe ".all" do
|
|
7
7
|
|
|
8
|
-
it "should
|
|
9
|
-
PageLayout.
|
|
8
|
+
it "should return all page_layouts" do
|
|
9
|
+
layouts = PageLayout.all
|
|
10
|
+
layouts.should be_instance_of(Array)
|
|
11
|
+
layouts.collect { |l| l['name'] }.should include('standard')
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
describe '.layouts_with_own_for_select' do
|
|
15
17
|
|
|
16
|
-
it "should
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
File.open(layouts_file, 'w') do |page_layouts|
|
|
21
|
-
page_layouts.puts "- name: testlayout\n elements:"
|
|
22
|
-
end
|
|
23
|
-
PageLayout.read_layouts_file.first.values.should include("testlayout")
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
after(:each) do
|
|
27
|
-
FileUtils.mv(File.join(@config_path, 'page_layouts.bak'), File.join(@config_path, 'page_layouts.yml'))
|
|
18
|
+
it "should not hold a layout twice" do
|
|
19
|
+
layouts = PageLayout.layouts_with_own_for_select('standard', 1, false)
|
|
20
|
+
layouts = layouts.collect(&:last)
|
|
21
|
+
layouts.select { |l| l == "standard" }.length.should == 1
|
|
28
22
|
end
|
|
29
23
|
|
|
30
24
|
end
|
data/spec/models/page_spec.rb
CHANGED
|
@@ -252,10 +252,10 @@ module Alchemy
|
|
|
252
252
|
end
|
|
253
253
|
end
|
|
254
254
|
|
|
255
|
-
context ".
|
|
255
|
+
context ".not_restricted" do
|
|
256
256
|
it "should return 2 accessible pages" do
|
|
257
257
|
FactoryGirl.create(:public_page, :name => 'First Public Child', :restricted => true, :parent_id => language_root.id, :language => language)
|
|
258
|
-
Page.
|
|
258
|
+
Page.not_restricted.should have(2).pages
|
|
259
259
|
end
|
|
260
260
|
end
|
|
261
261
|
|
|
@@ -445,6 +445,12 @@ module Alchemy
|
|
|
445
445
|
@page.elements.should_not be_empty
|
|
446
446
|
end
|
|
447
447
|
|
|
448
|
+
it "should not autogenerate elements that are already on the page" do
|
|
449
|
+
@page.elements << FactoryGirl.create(:element, :name => 'header')
|
|
450
|
+
@page.save
|
|
451
|
+
@page.elements.select { |e| e.name == 'header' }.length.should == 1
|
|
452
|
+
end
|
|
453
|
+
|
|
448
454
|
context "with cells" do
|
|
449
455
|
|
|
450
456
|
before do
|
|
@@ -531,6 +537,23 @@ module Alchemy
|
|
|
531
537
|
|
|
532
538
|
end
|
|
533
539
|
|
|
540
|
+
context "after changing the page layout" do
|
|
541
|
+
|
|
542
|
+
let(:news_element) { FactoryGirl.create(:element, :name => 'news') }
|
|
543
|
+
|
|
544
|
+
it "all elements not allowed on this page should be trashed" do
|
|
545
|
+
news_page.elements << news_element
|
|
546
|
+
news_page.update_attributes :page_layout => 'standard'
|
|
547
|
+
news_page.elements.trashed.should include(news_element)
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
it "should autogenerate elements" do
|
|
551
|
+
news_page.update_attributes :page_layout => 'standard'
|
|
552
|
+
news_page.elements.available.collect(&:name).should include('header')
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
end
|
|
556
|
+
|
|
534
557
|
end
|
|
535
558
|
|
|
536
559
|
describe '#fold' do
|
data/spec/models/picture_spec.rb
CHANGED
|
@@ -61,7 +61,29 @@ module Alchemy
|
|
|
61
61
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
-
describe '#
|
|
64
|
+
describe '#security_token' do
|
|
65
|
+
|
|
66
|
+
before do
|
|
67
|
+
@pic = stub_model(Picture, :id => 1)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should return a sha1 hash" do
|
|
71
|
+
@pic.security_token.should match(/\b([a-f0-9]{16})\b/)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should return a 16 chars long hash" do
|
|
75
|
+
@pic.security_token.length == 16
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should convert crop true value into string" do
|
|
79
|
+
p = [@pic.id, nil, 'crop', nil, nil, Rails.configuration.secret_token].join('-')
|
|
80
|
+
digest = Digest::SHA1.hexdigest(p)[0..15]
|
|
81
|
+
@pic.security_token(:crop => true).should == digest
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe '.last_upload' do
|
|
65
87
|
|
|
66
88
|
it "should return all pictures that have the same upload-hash as the most recent picture" do
|
|
67
89
|
other_upload = Picture.create!(:image_file => image_file, :upload_hash => '456')
|
|
@@ -77,7 +99,7 @@ module Alchemy
|
|
|
77
99
|
|
|
78
100
|
end
|
|
79
101
|
|
|
80
|
-
describe '
|
|
102
|
+
describe '.recent' do
|
|
81
103
|
|
|
82
104
|
before(:all) do
|
|
83
105
|
now = Time.now
|
data/spec/routing_spec.rb
CHANGED
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe "The Routing", :type => :routing do
|
|
4
4
|
|
|
5
|
-
before { @routes = Alchemy::Engine.routes }
|
|
5
|
+
before(:each) { @routes = Alchemy::Engine.routes }
|
|
6
6
|
|
|
7
7
|
context "for downloads" do
|
|
8
8
|
|
|
@@ -10,44 +10,44 @@ describe "The Routing", :type => :routing do
|
|
|
10
10
|
{
|
|
11
11
|
:get => "/attachment/32/download/Presseveranstaltung.pdf"
|
|
12
12
|
}.should route_to(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
:controller => "alchemy/attachments",
|
|
14
|
+
:action => "download",
|
|
15
|
+
:id => "32",
|
|
16
|
+
:name => "Presseveranstaltung",
|
|
17
|
+
:format => "pdf"
|
|
18
|
+
)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
it "should have a route for legacy Alchemy 1.x downloads" do
|
|
22
22
|
{
|
|
23
23
|
:get => "/attachment/32/download?name=Presseveranstaltung.pdf"
|
|
24
24
|
}.should route_to(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
:controller => "alchemy/attachments",
|
|
26
|
+
:action => "download",
|
|
27
|
+
:id => "32"
|
|
28
|
+
)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
it "should have a route for legacy washAPP downloads" do
|
|
32
32
|
{
|
|
33
33
|
:get => "/wa_files/download/11"
|
|
34
34
|
}.should route_to(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
:controller => "alchemy/attachments",
|
|
36
|
+
:action => "download",
|
|
37
|
+
:id => "11"
|
|
38
|
+
)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "should have a route for legacy WebMate downloads" do
|
|
42
42
|
{
|
|
43
43
|
:get => "/uploads/files/0000/0028/Pressetext.pdf"
|
|
44
44
|
}.should route_to(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
:controller => "alchemy/attachments",
|
|
46
|
+
:action => "download",
|
|
47
|
+
:id => "0028",
|
|
48
|
+
:name => "Pressetext",
|
|
49
|
+
:suffix => "pdf"
|
|
50
|
+
)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
end
|
|
@@ -60,11 +60,11 @@ describe "The Routing", :type => :routing do
|
|
|
60
60
|
{
|
|
61
61
|
:get => "/products/my-product"
|
|
62
62
|
}.should route_to(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
:controller => "alchemy/pages",
|
|
64
|
+
:action => "show",
|
|
65
|
+
:level1 => "products",
|
|
66
|
+
:urlname => "my-product"
|
|
67
|
+
)
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
context "and language" do
|
|
@@ -73,12 +73,12 @@ describe "The Routing", :type => :routing do
|
|
|
73
73
|
{
|
|
74
74
|
:get => "/de/products/my-product"
|
|
75
75
|
}.should route_to(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
:controller => "alchemy/pages",
|
|
77
|
+
:action => "show",
|
|
78
|
+
:level1 => "products",
|
|
79
|
+
:urlname => "my-product",
|
|
80
|
+
:lang => "de"
|
|
81
|
+
)
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
end
|
|
@@ -91,12 +91,12 @@ describe "The Routing", :type => :routing do
|
|
|
91
91
|
{
|
|
92
92
|
:get => "/catalog/products/my-product"
|
|
93
93
|
}.should route_to(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
:controller => "alchemy/pages",
|
|
95
|
+
:action => "show",
|
|
96
|
+
:level1 => "catalog",
|
|
97
|
+
:level2 => "products",
|
|
98
|
+
:urlname => "my-product"
|
|
99
|
+
)
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
context "and language" do
|
|
@@ -105,13 +105,13 @@ describe "The Routing", :type => :routing do
|
|
|
105
105
|
{
|
|
106
106
|
:get => "/de/catalog/products/my-product"
|
|
107
107
|
}.should route_to(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
:controller => "alchemy/pages",
|
|
109
|
+
:action => "show",
|
|
110
|
+
:level1 => "catalog",
|
|
111
|
+
:level2 => "products",
|
|
112
|
+
:urlname => "my-product",
|
|
113
|
+
:lang => "de"
|
|
114
|
+
)
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
end
|
|
@@ -124,13 +124,13 @@ describe "The Routing", :type => :routing do
|
|
|
124
124
|
{
|
|
125
125
|
:get => "/2011/12/08/my-post"
|
|
126
126
|
}.should route_to(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
127
|
+
:controller => "alchemy/pages",
|
|
128
|
+
:action => "show",
|
|
129
|
+
:level1 => "2011",
|
|
130
|
+
:level2 => "12",
|
|
131
|
+
:level3 => "08",
|
|
132
|
+
:urlname => "my-post"
|
|
133
|
+
)
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
context "and language" do
|
|
@@ -139,14 +139,14 @@ describe "The Routing", :type => :routing do
|
|
|
139
139
|
{
|
|
140
140
|
:get => "/de/2011/12/08/my-post"
|
|
141
141
|
}.should route_to(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
142
|
+
:controller => "alchemy/pages",
|
|
143
|
+
:action => "show",
|
|
144
|
+
:level1 => "2011",
|
|
145
|
+
:level2 => "12",
|
|
146
|
+
:level3 => "08",
|
|
147
|
+
:urlname => "my-post",
|
|
148
|
+
:lang => "de"
|
|
149
|
+
)
|
|
150
150
|
end
|
|
151
151
|
|
|
152
152
|
end
|
|
@@ -161,97 +161,97 @@ describe "The Routing", :type => :routing do
|
|
|
161
161
|
{
|
|
162
162
|
:get => "/pictures/3/show/900x300/kitten.jpg"
|
|
163
163
|
}.should route_to(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
:controller => "alchemy/pictures",
|
|
165
|
+
:action => "show",
|
|
166
|
+
:id => "3",
|
|
167
|
+
:size => "900x300",
|
|
168
|
+
:name => "kitten",
|
|
169
|
+
:format => "jpg"
|
|
170
|
+
)
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
it "should route to cropped show action" do
|
|
174
174
|
{
|
|
175
175
|
:get => "/pictures/3/show/900x300/crop/kitten.jpg"
|
|
176
176
|
}.should route_to(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
177
|
+
:controller => "alchemy/pictures",
|
|
178
|
+
:action => "show",
|
|
179
|
+
:id => "3",
|
|
180
|
+
:size => "900x300",
|
|
181
|
+
:crop => "crop",
|
|
182
|
+
:name => "kitten",
|
|
183
|
+
:format => "jpg"
|
|
184
|
+
)
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
it "should route to cropped mask show action" do
|
|
188
188
|
get(
|
|
189
189
|
"/pictures/3/show/300x300/crop/200x50/100x100/kitten.jpg"
|
|
190
190
|
).should route_to(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
191
|
+
:controller => "alchemy/pictures",
|
|
192
|
+
:action => "show",
|
|
193
|
+
:id => "3",
|
|
194
|
+
:size => "300x300",
|
|
195
|
+
:crop => "crop",
|
|
196
|
+
:crop_from => "200x50",
|
|
197
|
+
:crop_size => "100x100",
|
|
198
|
+
:name => "kitten",
|
|
199
|
+
:format => "jpg"
|
|
200
|
+
)
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
it "should route to thumbnail action" do
|
|
204
204
|
get(
|
|
205
205
|
"/pictures/3/thumbnails/small/kitten.jpg"
|
|
206
206
|
).should route_to(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
207
|
+
:controller => "alchemy/pictures",
|
|
208
|
+
:action => "thumbnail",
|
|
209
|
+
:id => "3",
|
|
210
|
+
:size => "small",
|
|
211
|
+
:name => "kitten",
|
|
212
|
+
:format => "jpg"
|
|
213
|
+
)
|
|
214
214
|
end
|
|
215
215
|
|
|
216
216
|
it "should route to cropped thumbnail action" do
|
|
217
217
|
get(
|
|
218
218
|
"/pictures/3/thumbnails/small/crop/kitten.jpg"
|
|
219
219
|
).should route_to(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
220
|
+
:controller => "alchemy/pictures",
|
|
221
|
+
:action => "thumbnail",
|
|
222
|
+
:id => "3",
|
|
223
|
+
:crop => "crop",
|
|
224
|
+
:size => "small",
|
|
225
|
+
:name => "kitten",
|
|
226
|
+
:format => "jpg"
|
|
227
|
+
)
|
|
228
228
|
end
|
|
229
229
|
|
|
230
230
|
it "should route to cropped and masked thumbnail" do
|
|
231
231
|
get(
|
|
232
232
|
"/pictures/3/thumbnails/small/0x0/200x200/kitten.jpg"
|
|
233
233
|
).should route_to(
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
234
|
+
:controller => "alchemy/pictures",
|
|
235
|
+
:action => "thumbnail",
|
|
236
|
+
:id => "3",
|
|
237
|
+
:crop_from => "0x0",
|
|
238
|
+
:crop_size => "200x200",
|
|
239
|
+
:size => "small",
|
|
240
|
+
:name => "kitten",
|
|
241
|
+
:format => "jpg"
|
|
242
|
+
)
|
|
243
243
|
end
|
|
244
244
|
|
|
245
245
|
it "should route to zoomed picture" do
|
|
246
246
|
get(
|
|
247
247
|
"/pictures/3/zoom/kitten.jpg"
|
|
248
248
|
).should route_to(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
249
|
+
:controller => "alchemy/pictures",
|
|
250
|
+
:action => "zoom",
|
|
251
|
+
:id => "3",
|
|
252
|
+
:name => "kitten",
|
|
253
|
+
:format => "jpg"
|
|
254
|
+
)
|
|
255
255
|
end
|
|
256
256
|
|
|
257
257
|
end
|