alchemy_cms 2.8.3 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/README.md +108 -25
  4. data/alchemy_cms.gemspec +0 -1
  5. data/app/assets/stylesheets/alchemy/archive.scss +2 -2
  6. data/app/assets/stylesheets/alchemy/base.scss +0 -37
  7. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  8. data/app/assets/stylesheets/alchemy/flash.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/form_elements.scss +1 -1
  10. data/app/assets/stylesheets/alchemy/icon-font.css.scss +40 -40
  11. data/app/assets/stylesheets/alchemy/icons.scss +4 -32
  12. data/app/assets/stylesheets/alchemy/jquery-ui.scss +4 -4
  13. data/app/assets/stylesheets/alchemy/menubar.css.scss +20 -12
  14. data/app/assets/stylesheets/alchemy/modules.scss +0 -4
  15. data/app/assets/stylesheets/alchemy/search.scss +1 -1
  16. data/app/assets/stylesheets/alchemy/sitemap.scss +1 -1
  17. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy-tinymce-dialog/window.css.scss +3 -3
  18. data/app/controllers/alchemy/admin/base_controller.rb +12 -8
  19. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -5
  20. data/app/controllers/alchemy/admin/elements_controller.rb +1 -1
  21. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -1
  22. data/app/controllers/alchemy/admin/layoutpages_controller.rb +1 -1
  23. data/app/controllers/alchemy/admin/pages_controller.rb +11 -6
  24. data/app/controllers/alchemy/admin/resources_controller.rb +2 -2
  25. data/app/controllers/alchemy/admin/users_controller.rb +1 -1
  26. data/app/controllers/alchemy/base_controller.rb +71 -37
  27. data/app/controllers/alchemy/elements_controller.rb +1 -1
  28. data/app/controllers/alchemy/pages_controller.rb +9 -3
  29. data/app/controllers/alchemy/pictures_controller.rb +1 -0
  30. data/app/helpers/alchemy/admin/base_helper.rb +2 -10
  31. data/app/helpers/alchemy/admin/pages_helper.rb +1 -1
  32. data/app/helpers/alchemy/base_helper.rb +1 -1
  33. data/app/helpers/alchemy/pages_helper.rb +1 -1
  34. data/app/models/alchemy/attachment.rb +3 -4
  35. data/app/models/alchemy/cell.rb +1 -1
  36. data/app/models/alchemy/content.rb +3 -4
  37. data/app/models/alchemy/element.rb +5 -6
  38. data/app/models/alchemy/folded_page.rb +1 -1
  39. data/app/models/alchemy/language.rb +1 -1
  40. data/app/models/alchemy/message.rb +1 -7
  41. data/app/models/alchemy/page.rb +12 -10
  42. data/app/models/alchemy/page/{cells.rb → page_cells.rb} +2 -2
  43. data/app/models/alchemy/page/{elements.rb → page_elements.rb} +2 -2
  44. data/app/models/alchemy/page/{naming.rb → page_naming.rb} +1 -1
  45. data/app/models/alchemy/page/{natures.rb → page_natures.rb} +3 -3
  46. data/app/models/alchemy/page/{scopes.rb → page_scopes.rb} +3 -3
  47. data/app/models/alchemy/page/page_users.rb +33 -0
  48. data/app/models/alchemy/picture.rb +3 -3
  49. data/app/models/alchemy/site.rb +2 -2
  50. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  51. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +1 -1
  52. data/app/views/alchemy/admin/dashboard/_sites.html.erb +1 -1
  53. data/app/views/alchemy/admin/dashboard/index.html.erb +10 -4
  54. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  55. data/app/views/alchemy/admin/pages/update.js.erb +1 -1
  56. data/app/views/alchemy/{user_sessions → base}/leave.html.erb +2 -2
  57. data/app/views/alchemy/base/permission_denied.js.erb +3 -2
  58. data/app/views/layouts/alchemy/admin.html.erb +6 -3
  59. data/config/alchemy/config.yml +1 -11
  60. data/config/alchemy/modules.yml +0 -12
  61. data/config/locales/alchemy.de.yml +3 -40
  62. data/config/locales/alchemy.en.yml +2 -22
  63. data/config/routes.rb +2 -27
  64. data/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -31
  65. data/lib/alchemy/auth_accessors.rb +54 -0
  66. data/lib/alchemy/capistrano.rb +5 -17
  67. data/lib/alchemy/engine.rb +7 -7
  68. data/lib/alchemy/errors.rb +6 -0
  69. data/lib/alchemy/essence.rb +2 -2
  70. data/lib/alchemy/seeder.rb +1 -1
  71. data/lib/alchemy/tasks/helpers.rb +83 -0
  72. data/lib/alchemy/test_support/auth_helpers.rb +35 -0
  73. data/lib/alchemy/test_support/controller_requests.rb +37 -0
  74. data/{spec/support → lib/alchemy/test_support}/factories.rb +7 -28
  75. data/{spec/support/alchemy → lib/alchemy/test_support}/integration_helpers.rb +9 -36
  76. data/lib/alchemy/upgrader.rb +8 -7
  77. data/lib/alchemy/upgrader/two_point_nine.rb +33 -0
  78. data/lib/alchemy/userstamp.rb +10 -0
  79. data/lib/alchemy/version.rb +1 -3
  80. data/lib/rails/templates/alchemy.rb +1 -0
  81. data/lib/tasks/alchemy/db.rake +5 -5
  82. data/spec/controllers/admin/attachments_controller_spec.rb +3 -3
  83. data/spec/controllers/admin/dashboard_controller_spec.rb +55 -34
  84. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  85. data/spec/controllers/admin/essence_pictures_controller_spec.rb +22 -6
  86. data/spec/controllers/admin/pages_controller_spec.rb +41 -58
  87. data/spec/controllers/admin/resources_controller_spec.rb +30 -5
  88. data/spec/controllers/admin/trash_controller_spec.rb +1 -1
  89. data/spec/controllers/attachments_controller_spec.rb +26 -44
  90. data/spec/controllers/base_controller_spec.rb +8 -33
  91. data/spec/controllers/elements_controller_spec.rb +1 -1
  92. data/spec/controllers/pages_controller_spec.rb +7 -15
  93. data/spec/controllers/pictures_controller_spec.rb +44 -5
  94. data/spec/dummy/app/controllers/application_controller.rb +9 -1
  95. data/spec/dummy/app/models/user.rb +14 -0
  96. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -31
  97. data/spec/dummy/db/schema.rb +0 -31
  98. data/spec/features/admin/language_tree_feature_spec.rb +34 -0
  99. data/spec/features/admin/pages_controller_spec.rb +1 -1
  100. data/spec/features/pages_controller_spec.rb +5 -12
  101. data/spec/features/picture_security_spec.rb +2 -2
  102. data/spec/features/security_spec.rb +6 -45
  103. data/spec/features/translation_integration_spec.rb +11 -20
  104. data/spec/{support → fixtures}/80x60.png +0 -0
  105. data/spec/support/image with spaces.png b/data/spec/fixtures/image with → spaces.png +0 -0
  106. data/spec/{support → fixtures}/image.png +0 -0
  107. data/spec/{support → fixtures}/image2.PNG +0 -0
  108. data/spec/{support → fixtures}/image3.jpeg +0 -0
  109. data/spec/helpers/admin/base_helper_spec.rb +31 -43
  110. data/spec/helpers/admin/pages_helper_spec.rb +4 -2
  111. data/spec/helpers/base_helper_spec.rb +10 -3
  112. data/spec/helpers/pages_helper_spec.rb +32 -22
  113. data/spec/models/attachment_spec.rb +1 -1
  114. data/spec/models/element_spec.rb +33 -57
  115. data/spec/models/message_spec.rb +0 -16
  116. data/spec/models/page_spec.rb +62 -26
  117. data/spec/models/picture_spec.rb +5 -5
  118. data/spec/spec_helper.rb +13 -4
  119. data/spec/tasks/helpers_spec.rb +213 -0
  120. metadata +33 -75
  121. data/app/controllers/alchemy/passwords_controller.rb +0 -35
  122. data/app/controllers/alchemy/user_sessions_controller.rb +0 -67
  123. data/app/controllers/alchemy/users_controller.rb +0 -46
  124. data/app/mailers/alchemy/notifications.rb +0 -33
  125. data/app/models/alchemy/page/users.rb +0 -25
  126. data/app/models/alchemy/user.rb +0 -183
  127. data/app/views/alchemy/admin/users/_table.html.erb +0 -69
  128. data/app/views/alchemy/admin/users/_user.html.erb +0 -39
  129. data/app/views/alchemy/admin/users/edit.html.erb +0 -6
  130. data/app/views/alchemy/admin/users/index.html.erb +0 -58
  131. data/app/views/alchemy/admin/users/new.html.erb +0 -6
  132. data/app/views/alchemy/notifications/admin_user_created.de.text.erb +0 -15
  133. data/app/views/alchemy/notifications/admin_user_created.en.text.erb +0 -15
  134. data/app/views/alchemy/notifications/registered_user_created.de.text.erb +0 -13
  135. data/app/views/alchemy/notifications/registered_user_created.en.text.erb +0 -13
  136. data/app/views/alchemy/notifications/reset_password_instructions.de.text.erb +0 -8
  137. data/app/views/alchemy/notifications/reset_password_instructions.en.text.erb +0 -8
  138. data/app/views/alchemy/passwords/edit.html.erb +0 -35
  139. data/app/views/alchemy/passwords/new.html.erb +0 -30
  140. data/app/views/alchemy/user_sessions/new.html.erb +0 -48
  141. data/app/views/alchemy/users/new.html.erb +0 -14
  142. data/config/initializers/devise.rb +0 -242
  143. data/config/locales/devise.de.yml +0 -58
  144. data/config/locales/devise.en.yml +0 -60
  145. data/lib/rails/generators/alchemy/devise/devise_generator.rb +0 -29
  146. data/spec/controllers/admin/users_controller_spec.rb +0 -132
  147. data/spec/controllers/passwords_controller_spec.rb +0 -16
  148. data/spec/controllers/user_sessions_controller_spec.rb +0 -22
  149. data/spec/controllers/users_controller_spec.rb +0 -66
  150. data/spec/mailers/notifications_spec.rb +0 -67
  151. data/spec/models/user_spec.rb +0 -252
  152. data/spec/support/alchemy/controller_helpers.rb +0 -35
@@ -1,9 +1,34 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Alchemy::Admin::ResourcesController do
4
- describe "index" do
5
- it "should include ResourcesHelper" do
6
- Alchemy::Admin::ResourcesController.new.respond_to?(:resource_window_size).should be_true
3
+ describe Admin::EventsController do
4
+ it "should include ResourcesHelper" do
5
+ controller.respond_to?(:resource_window_size).should be_true
6
+ end
7
+
8
+ describe '#index' do
9
+ let(:params) { Hash.new }
10
+ let(:peter) { Event.create(name: 'Peter') }
11
+ let(:lustig) { Event.create(name: 'Lustig') }
12
+
13
+ before do
14
+ sign_in(admin_user)
15
+ peter; lustig
16
+ end
17
+
18
+ it "returns all records" do
19
+ get :index, params
20
+ assigns(:events).should include(peter)
21
+ assigns(:events).should include(lustig)
22
+ end
23
+
24
+ context 'with search query given' do
25
+ let(:params) { {query: 'PeTer'} }
26
+
27
+ it "returns only matching records" do
28
+ get :index, params
29
+ assigns(:events).should include(peter)
30
+ assigns(:events).should_not include(lustig)
31
+ end
7
32
  end
8
33
  end
9
- end
34
+ end
@@ -10,7 +10,7 @@ module Alchemy
10
10
 
11
11
  before {
12
12
  sign_in(admin_user)
13
- element.trash
13
+ element.trash!
14
14
  }
15
15
 
16
16
  it "should hold trashed elements" do
@@ -1,64 +1,46 @@
1
1
  require 'spec_helper'
2
2
 
3
- # Fixes missing method tempfile error
4
- class Rack::Test::UploadedFile
5
- attr_reader :tempfile
6
- end
7
-
8
3
  module Alchemy
9
4
  describe AttachmentsController do
10
-
11
- let(:public_page) { FactoryGirl.create(:public_page, :restricted => true) }
12
- let(:element) { FactoryGirl.create(:element, :page => public_page, :name => 'download', :create_contents_after_create => true) }
13
- let(:attachment) { Attachment.create(:file => File.new(File.expand_path('../../support/image.png', __FILE__))) }
14
-
15
- before do
16
- essence = element.contents.where(:name => 'file').first.essence
17
- essence.attachment_id = attachment.id
18
- essence.save
19
- end
20
-
21
- it "should not be possible to download attachments from restricted pages" do
22
- get :download, :id => attachment.id
23
- response.status.should == 302
24
- response.should redirect_to(login_path)
25
- end
5
+ let(:attachment) { FactoryGirl.build_stubbed(:attachment) }
26
6
 
27
7
  it "should raise ActiveRecord::RecordNotFound for requesting not existing attachments" do
28
8
  expect { get :download, id: 0 }.to raise_error(ActiveRecord::RecordNotFound)
29
9
  end
30
10
 
31
- context "as registered user" do
32
-
11
+ context 'with restricted attachment' do
33
12
  before do
34
- sign_in(registered_user)
13
+ attachment.stub(:restricted?).and_return(true)
14
+ Attachment.stub(:find).and_return(attachment)
35
15
  end
36
16
 
37
- it "should be possible to download attachments from restricted pages" do
38
- get :download, :id => attachment.id
39
- response.status.should == 200
17
+ context 'as anonymous user' do
18
+ it "should not be possible to download attachments from restricted pages" do
19
+ get :download, :id => attachment.id
20
+ response.status.should == 302
21
+ response.should redirect_to(Alchemy.login_path)
22
+ end
23
+
24
+ it "should not be possible to see attachments from restricted pages" do
25
+ get :show, :id => attachment.id
26
+ response.status.should == 302
27
+ response.should redirect_to(Alchemy.login_path)
28
+ end
40
29
  end
41
30
 
42
- end
43
-
44
- it "should not be possible to see attachments from restricted pages" do
45
- get :show, :id => attachment.id
46
- response.status.should == 302
47
- response.should redirect_to(login_path)
48
- end
49
-
50
- context "as registered user" do
31
+ context "as registered user" do
32
+ before { sign_in(registered_user) }
51
33
 
52
- before do
53
- sign_in(registered_user)
54
- end
34
+ it "should be possible to download attachments from restricted pages" do
35
+ get :download, :id => attachment.id
36
+ response.status.should == 200
37
+ end
55
38
 
56
- it "should be possible to see attachments from restricted pages" do
57
- get :show, :id => attachment.id
58
- response.status.should == 200
39
+ it "should be possible to see attachments from restricted pages" do
40
+ get :show, :id => attachment.id
41
+ response.status.should == 200
42
+ end
59
43
  end
60
-
61
44
  end
62
-
63
45
  end
64
46
  end
@@ -41,7 +41,7 @@ module Alchemy
41
41
  context "with no lang param" do
42
42
 
43
43
  it "should set the default language" do
44
- controller.stub!(:params).and_return({})
44
+ controller.stub(:params).and_return({})
45
45
  controller.send :set_language
46
46
  assigns(:language).should == default_language
47
47
  controller.session.should include_language_information_for(default_language)
@@ -51,7 +51,7 @@ module Alchemy
51
51
 
52
52
  context "with language set in the session" do
53
53
  before do
54
- controller.stub!(:session).and_return(language_id: klingonian.id, language_code: klingonian.code)
54
+ controller.stub(:session).and_return(language_id: klingonian.id, language_code: klingonian.code)
55
55
  end
56
56
 
57
57
  it "should use the language set in the session cookie" do
@@ -63,7 +63,7 @@ module Alchemy
63
63
  context "with lang param" do
64
64
 
65
65
  it "should set the language" do
66
- controller.stub!(:params).and_return(:lang => klingonian.code)
66
+ controller.stub(:params).and_return(:lang => klingonian.code)
67
67
  controller.send :set_language
68
68
  assigns(:language).should == klingonian
69
69
  controller.session.should include_language_information_for(klingonian)
@@ -72,7 +72,7 @@ module Alchemy
72
72
  context "for language that does not exist" do
73
73
 
74
74
  before do
75
- controller.stub!(:params).and_return(:lang => 'fo')
75
+ controller.stub(:params).and_return(:lang => 'fo')
76
76
  controller.send :set_language
77
77
  end
78
78
 
@@ -95,49 +95,24 @@ module Alchemy
95
95
 
96
96
  end
97
97
 
98
- describe '#store_user_request_time' do
99
-
100
- context "user not logged in" do
101
- before { controller.stub!(:user_signed_in?).and_return(false) }
102
-
103
- it "should not store the current request time" do
104
- controller.send(:store_user_request_time).should == nil
105
- end
106
-
107
- end
108
-
109
- context "user logged in" do
110
- before do
111
- controller.stub!(:user_signed_in?).and_return(true)
112
- controller.stub!(:current_user).and_return(FactoryGirl.create(:user))
113
- end
114
-
115
- it "should not store the current request time" do
116
- controller.send(:store_user_request_time).should == true
117
- end
118
-
119
- end
120
-
121
- end
122
-
123
98
  describe "#layout_for_page" do
124
99
  it "should return false if params[:layout] is set to false" do
125
- controller.stub!(:params).and_return(layout: 'false')
100
+ controller.stub(:params).and_return(layout: 'false')
126
101
  expect(controller.send(:layout_for_page)).to be_false
127
102
  end
128
103
 
129
104
  it "should return false if params[:layout] is set to none" do
130
- controller.stub!(:params).and_return(layout: 'none')
105
+ controller.stub(:params).and_return(layout: 'none')
131
106
  expect(controller.send(:layout_for_page)).to be_false
132
107
  end
133
108
 
134
109
  it "should return the layout name set through params[:layout]" do
135
- controller.stub!(:params).and_return(layout: 'my_layout')
110
+ controller.stub(:params).and_return(layout: 'my_layout')
136
111
  expect(controller.send(:layout_for_page)).to eq('my_layout')
137
112
  end
138
113
 
139
114
  it "should return 'application' if params[:layout] is not set" do
140
- controller.stub!(:params).and_return({})
115
+ controller.stub(:params).and_return({})
141
116
  expect(controller.send(:layout_for_page)).to eq('application')
142
117
  end
143
118
  end
@@ -16,7 +16,7 @@ module Alchemy
16
16
  end
17
17
 
18
18
  it "should raise ActiveRecord::RecordNotFound error for trashed elements" do
19
- element.trash
19
+ element.trash!
20
20
  expect { get(:show, :id => element.id) }.to raise_error(ActiveRecord::RecordNotFound)
21
21
  end
22
22
 
@@ -6,12 +6,13 @@ module Alchemy
6
6
 
7
7
  let(:default_language) { Language.get_default }
8
8
  let(:default_language_root) { FactoryGirl.create(:language_root_page, :language => default_language, :name => 'Home', :public => true) }
9
+ let(:page) { FactoryGirl.create(:public_page, :parent_id => default_language_root.id, :page_layout => 'news', :name => 'News', :language => default_language, :do_not_autogenerate => false) }
10
+
11
+ before { controller.stub(:signup_required?).and_return(false) }
9
12
 
10
13
  context "requested for a page containing a feed" do
11
14
  render_views
12
15
 
13
- let(:page) { FactoryGirl.create(:public_page, :parent_id => default_language_root.id, :page_layout => 'news', :name => 'News', :language => default_language, :do_not_autogenerate => false) }
14
-
15
16
  it "should render a rss feed" do
16
17
  get :show, :urlname => page.urlname, :format => :rss
17
18
  response.content_type.should == 'application/rss+xml'
@@ -35,23 +36,18 @@ module Alchemy
35
36
  end
36
37
 
37
38
  describe "Layout rendering" do
38
-
39
39
  context "with param layout set to none" do
40
-
41
40
  it "should not render a layout" do
42
- get :show, :urlname => :home, :layout => 'none'
41
+ get :show, :urlname => page.urlname, :layout => 'none'
43
42
  response.body.should_not match /<head>/
44
43
  end
45
-
46
44
  end
47
45
 
48
46
  context "with param layout set to false" do
49
-
50
47
  it "should not render a layout" do
51
- get :show, :urlname => :home, :layout => 'false'
48
+ get :show, :urlname => page.urlname, :layout => 'false'
52
49
  response.body.should_not match /<head>/
53
50
  end
54
-
55
51
  end
56
52
 
57
53
  context "with params layout set to not existing layout" do
@@ -92,8 +88,8 @@ module Alchemy
92
88
  let(:product) { FactoryGirl.create(:public_page, :name => "Screwdriver", :parent_id => products.id, :language => default_language, :do_not_autogenerate => false, :visible => true) }
93
89
 
94
90
  before do
95
- User.stub!(:admins).and_return(OpenStruct.new(count: 1))
96
- Config.stub!(:get) { |arg| arg == :url_nesting ? true : false }
91
+ Alchemy.user_class.stub(:admins).and_return(OpenStruct.new(count: 1))
92
+ Config.stub(:get) { |arg| arg == :url_nesting ? true : false }
97
93
  product.elements.find_by_name('article').contents.essence_texts.first.essence.update_column(:body, 'screwdriver')
98
94
  end
99
95
 
@@ -121,7 +117,6 @@ module Alchemy
121
117
 
122
118
  context "when a non-existent page is requested" do
123
119
  it "should rescue a RoutingError with rendering a 404 page." do
124
- FactoryGirl.create(:admin_user) # otherwise we are redirected to create_user
125
120
  get :show, {:urlname => 'doesntexist'}
126
121
  response.status.should == 404
127
122
  response.body.should have_content('The page you were looking for doesn\'t exist')
@@ -170,9 +165,6 @@ module Alchemy
170
165
  describe 'Redirecting to legacy page urls' do
171
166
  context 'Request a page with legacy url' do
172
167
 
173
- # otherwise we are redirected to signup
174
- before { FactoryGirl.create(:admin_user) }
175
-
176
168
  let(:page) { FactoryGirl.create(:public_page, :name => 'New page name') }
177
169
  let(:second_page) { FactoryGirl.create(:public_page, :name => 'Second Page') }
178
170
  let(:legacy_page) { FactoryGirl.create(:public_page, :name => 'Legacy Url') }
@@ -12,7 +12,7 @@ module Alchemy
12
12
  let(:restricted_page) { FactoryGirl.create(:public_page, :restricted => true) }
13
13
  let(:element) { FactoryGirl.create(:element, :page => public_page, :name => 'bild', :create_contents_after_create => true) }
14
14
  let(:restricted_element) { FactoryGirl.create(:element, :page => restricted_page, :name => 'bild', :create_contents_after_create => true) }
15
- let(:picture) { Picture.create(:image_file => fixture_file_upload(File.expand_path('../../support/image.png', __FILE__), 'image/png')) }
15
+ let(:picture) { Picture.create(:image_file => fixture_file_upload(File.expand_path('../../fixtures/image.png', __FILE__), 'image/png')) }
16
16
 
17
17
  context "Requesting a picture that is not assigned with any page" do
18
18
  it "should render the picture" do
@@ -51,7 +51,7 @@ module Alchemy
51
51
  it "should not render the picture, but redirect to login path" do
52
52
  get :show, :id => picture.id, :sh => picture.security_token
53
53
  response.status.should == 302
54
- response.should redirect_to(login_path)
54
+ response.should redirect_to(Alchemy.login_path)
55
55
  end
56
56
  end
57
57
 
@@ -68,11 +68,9 @@ module Alchemy
68
68
  end
69
69
 
70
70
  describe 'Picture processing' do
71
+ let(:big_picture) { Picture.create(:image_file => fixture_file_upload(File.expand_path('../../fixtures/80x60.png', __FILE__), 'image/png')) }
71
72
 
72
73
  context "with crop and size parameters" do
73
-
74
- let(:big_picture) { Picture.create(:image_file => fixture_file_upload(File.expand_path('../../support/80x60.png', __FILE__), 'image/png')) }
75
-
76
74
  it "should return a cropped image." do
77
75
  options = {
78
76
  :crop => 'crop',
@@ -83,6 +81,19 @@ module Alchemy
83
81
  response.body[0x10..0x18].unpack('NN').should == [10,10]
84
82
  end
85
83
 
84
+ context "without a full size specification" do
85
+ it "should raise an error" do
86
+ options = {
87
+ :crop => 'crop',
88
+ :size => '10',
89
+ :format => 'png'
90
+ }
91
+ expect do
92
+ get :show, options.merge(:id => big_picture.id, :sh => big_picture.security_token(options))
93
+ end.to raise_error ArgumentError
94
+ end
95
+ end
96
+
86
97
  context "without upsample parameter" do
87
98
  it "should not upsample the image." do
88
99
  options = {
@@ -107,7 +118,35 @@ module Alchemy
107
118
  response.body[0x10..0x18].unpack('NN').should == [10,10]
108
119
  end
109
120
  end
121
+ end
110
122
 
123
+ context "without crop but with size parameter" do
124
+ it "should resize the image preserving aspect ratio" do
125
+ options = {
126
+ :size => '40x40',
127
+ :format => 'png'
128
+ }
129
+ get :show, options.merge(:id => big_picture.id, :sh => big_picture.security_token(options))
130
+ response.body[0x10..0x18].unpack('NN').should == [40,30]
131
+ end
132
+
133
+ it "should resize the image inferring the height if not given" do
134
+ options = {
135
+ :size => '40',
136
+ :format => 'png'
137
+ }
138
+ get :show, options.merge(:id => big_picture.id, :sh => big_picture.security_token(options))
139
+ response.body[0x10..0x18].unpack('NN').should == [40,30]
140
+ end
141
+
142
+ it "should resize the image inferring the width if not given" do
143
+ options = {
144
+ :size => 'x30',
145
+ :format => 'png'
146
+ }
147
+ get :show, options.merge(:id => big_picture.id, :sh => big_picture.security_token(options))
148
+ response.body[0x10..0x18].unpack('NN').should == [40,30]
149
+ end
111
150
  end
112
151
 
113
152
  end
@@ -1,3 +1,11 @@
1
1
  class ApplicationController < ActionController::Base
2
- protect_from_forgery
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+
6
+ private
7
+
8
+ def current_user
9
+ nil
10
+ end
3
11
  end
@@ -0,0 +1,14 @@
1
+ class User
2
+ extend ::ActiveModel::Naming
3
+ extend ::ActiveModel::Translation
4
+ include ::ActiveModel::Validations
5
+ include ::ActiveModel::Conversion
6
+ include ::ActiveModel::MassAssignmentSecurity
7
+ attr_accessor :alchemy_roles, :email, :password
8
+
9
+ alias_method :role_symbols, :alchemy_roles
10
+
11
+ def self.logged_in
12
+ []
13
+ end
14
+ end
@@ -265,37 +265,6 @@ class AlchemyTwoPointSix < ActiveRecord::Migration
265
265
  add_index "alchemy_sites", ["host", "public"], :name => "alchemy_sites_public_hosts_idx"
266
266
  add_index "alchemy_sites", ["host"], :name => "index_alchemy_sites_on_host"
267
267
 
268
- create_table "alchemy_users", :force => true do |t|
269
- t.string "firstname"
270
- t.string "lastname"
271
- t.string "login"
272
- t.string "email"
273
- t.string "gender"
274
- t.string "roles", :default => "registered"
275
- t.string "language"
276
- t.string "encrypted_password", :limit => 128, :default => "", :null => false
277
- t.string "password_salt", :limit => 128, :default => "", :null => false
278
- t.integer "sign_in_count", :default => 0, :null => false
279
- t.integer "failed_attempts", :default => 0, :null => false
280
- t.datetime "last_request_at"
281
- t.datetime "current_sign_in_at"
282
- t.datetime "last_sign_in_at"
283
- t.string "current_sign_in_ip"
284
- t.string "last_sign_in_ip"
285
- t.datetime "created_at", :null => false
286
- t.datetime "updated_at", :null => false
287
- t.integer "creator_id"
288
- t.integer "updater_id"
289
- t.text "cached_tag_list"
290
- t.string "reset_password_token"
291
- t.datetime "reset_password_sent_at"
292
- end
293
-
294
- add_index "alchemy_users", ["email"], :name => "index_alchemy_users_on_email", :unique => true
295
- add_index "alchemy_users", ["login"], :name => "index_alchemy_users_on_login", :unique => true
296
- add_index "alchemy_users", ["reset_password_token"], :name => "index_alchemy_users_on_reset_password_token", :unique => true
297
- add_index "alchemy_users", ["roles"], :name => "index_alchemy_users_on_roles"
298
-
299
268
  create_table "events", :force => true do |t|
300
269
  t.string "name"
301
270
  t.string "hidden_name"