alchemy_cms 2.3.2 → 2.4.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|