cornerstone 0.0.1 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +23 -0
  4. data/Gemfile.lock +168 -0
  5. data/Guardfile +22 -0
  6. data/README.rdoc +4 -1
  7. data/Rakefile +11 -1
  8. data/TODO +11 -0
  9. data/VERSION +1 -0
  10. data/app/assets/images/.gitkeep +0 -0
  11. data/app/assets/javascripts/.gitkeep +0 -0
  12. data/app/assets/javascripts/cornerstone.js +11 -0
  13. data/app/assets/javascripts/cornerstone/discussions.js +2 -0
  14. data/app/assets/javascripts/cornerstone/help.js +2 -0
  15. data/app/assets/stylesheets/.gitkeep +0 -0
  16. data/app/assets/stylesheets/cornerstone.css +8 -0
  17. data/app/assets/stylesheets/cornerstone/discussions.css +4 -0
  18. data/app/assets/stylesheets/cornerstone/help.css +4 -0
  19. data/app/controllers/.gitkeep +0 -0
  20. data/app/controllers/cornerstone/admin/application_controller.rb +7 -0
  21. data/app/controllers/cornerstone/admin/articles_controller.rb +61 -0
  22. data/app/controllers/cornerstone/admin/categories_controller.rb +46 -0
  23. data/app/controllers/cornerstone/admin/discussions_controller.rb +32 -0
  24. data/app/controllers/cornerstone/application_controller.rb +6 -0
  25. data/app/controllers/cornerstone/discussions_controller.rb +58 -0
  26. data/app/controllers/cornerstone/help_controller.rb +11 -0
  27. data/app/controllers/cornerstone/posts_controller.rb +66 -0
  28. data/app/helpers/.gitkeep +0 -0
  29. data/app/helpers/cornerstone/application_helper.rb +5 -0
  30. data/app/helpers/cornerstone/discussions_helper.rb +16 -0
  31. data/app/helpers/cornerstone/help_helper.rb +4 -0
  32. data/app/mailers/cornerstone/cornerstone_mailer.rb +31 -0
  33. data/app/models/.gitkeep +0 -0
  34. data/app/models/cornerstone/article.rb +20 -0
  35. data/app/models/cornerstone/category.rb +45 -0
  36. data/app/models/cornerstone/discussion.rb +90 -0
  37. data/app/models/cornerstone/post.rb +103 -0
  38. data/app/models/cornerstone/post_observer.rb +23 -0
  39. data/app/views/.gitkeep +0 -0
  40. data/app/views/cornerstone/admin/articles/_article.html.erb +9 -0
  41. data/app/views/cornerstone/admin/articles/_form.html.erb +22 -0
  42. data/app/views/cornerstone/admin/articles/edit.html.erb +7 -0
  43. data/app/views/cornerstone/admin/articles/index.html.erb +25 -0
  44. data/app/views/cornerstone/admin/articles/new.html.erb +6 -0
  45. data/app/views/cornerstone/admin/articles/show.html.erb +4 -0
  46. data/app/views/cornerstone/admin/categories/_category.html.erb +12 -0
  47. data/app/views/cornerstone/admin/categories/_form.html.erb +17 -0
  48. data/app/views/cornerstone/admin/categories/edit.html.erb +6 -0
  49. data/app/views/cornerstone/admin/categories/index.html.erb +11 -0
  50. data/app/views/cornerstone/admin/categories/new.html.erb +6 -0
  51. data/app/views/cornerstone/admin/discussions/edit.html.erb +7 -0
  52. data/app/views/cornerstone/cornerstone_mailer/new_discussion.html.erb +14 -0
  53. data/app/views/cornerstone/cornerstone_mailer/new_discussion.text.erb +5 -0
  54. data/app/views/cornerstone/cornerstone_mailer/new_discussion_user.html.erb +7 -0
  55. data/app/views/cornerstone/cornerstone_mailer/new_post.html.erb +7 -0
  56. data/app/views/cornerstone/cornerstone_mailer/new_post.text.erb +8 -0
  57. data/app/views/cornerstone/discussions/_discussion.html.erb +12 -0
  58. data/app/views/cornerstone/discussions/_discussion_category.html.erb +14 -0
  59. data/app/views/cornerstone/discussions/_form.html.erb +33 -0
  60. data/app/views/cornerstone/discussions/_latest_discussion.html.erb +4 -0
  61. data/app/views/cornerstone/discussions/categorical_index.html.erb +27 -0
  62. data/app/views/cornerstone/discussions/index.html.erb +25 -0
  63. data/app/views/cornerstone/discussions/new.html.erb +6 -0
  64. data/app/views/cornerstone/discussions/show.html.erb +19 -0
  65. data/app/views/cornerstone/help/index.html.erb +7 -0
  66. data/app/views/cornerstone/posts/_fields.html.erb +44 -0
  67. data/app/views/cornerstone/posts/_form.html.erb +19 -0
  68. data/app/views/cornerstone/posts/_post.html.erb +17 -0
  69. data/app/views/cornerstone/posts/edit.html.erb +9 -0
  70. data/app/views/cornerstone/shared/_errors.html.erb +11 -0
  71. data/app/views/cornerstone/shared/_flash_messages.html.erb +15 -0
  72. data/app/views/layouts/cornerstone/application.html.erb +16 -0
  73. data/config/cucumber.yml +8 -0
  74. data/config/locales/cornerstone.action_mailer.en.yml +9 -0
  75. data/config/routes.rb +24 -0
  76. data/cornerstone-0.0.1.gem +0 -0
  77. data/cornerstone.gemspec +33 -0
  78. data/db/migrate/20110723004024_create_cornerstone_discussions.rb +17 -0
  79. data/db/migrate/20110804190853_create_cornerstone_categories.rb +15 -0
  80. data/db/migrate/20110809233551_create_cornerstone_posts.rb +13 -0
  81. data/db/migrate/20111006172857_create_cornerstone_articles.rb +12 -0
  82. data/lib/cornerstone.rb +6 -0
  83. data/lib/cornerstone/acts_as_cornerstone_user.rb +79 -0
  84. data/lib/cornerstone/config.rb +33 -0
  85. data/lib/cornerstone/controller_additions.rb +25 -0
  86. data/lib/cornerstone/engine.rb +8 -1
  87. data/lib/cornerstone/exceptions.rb +16 -0
  88. data/lib/cornerstone/helpers.rb +35 -0
  89. data/lib/tasks/cucumber.rake +65 -0
  90. data/lib/templates/cornerstone_config.rb +31 -0
  91. data/script/cucumber +10 -0
  92. data/script/rails +7 -0
  93. data/spec/controllers/cornerstone/admin/articles_controller_spec.rb +250 -0
  94. data/spec/controllers/cornerstone/admin/categories_controller_spec.rb +205 -0
  95. data/spec/controllers/cornerstone/admin/discussions_controller_spec.rb +95 -0
  96. data/spec/controllers/cornerstone/application_controller_spec.rb +34 -0
  97. data/spec/controllers/cornerstone/discussions_controller_spec.rb +157 -0
  98. data/spec/controllers/cornerstone/help_controller_spec.rb +20 -0
  99. data/spec/controllers/cornerstone/posts_controller_spec.rb +212 -0
  100. data/spec/dummy/Rakefile +7 -0
  101. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  102. data/spec/dummy/app/assets/javascripts/tester.js +2 -0
  103. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  104. data/spec/dummy/app/assets/stylesheets/tester.css +4 -0
  105. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  106. data/spec/dummy/app/controllers/tester_controller.rb +7 -0
  107. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  108. data/spec/dummy/app/helpers/tester_helper.rb +6 -0
  109. data/spec/dummy/app/mailers/.gitkeep +0 -0
  110. data/spec/dummy/app/models/.gitkeep +0 -0
  111. data/spec/dummy/app/models/user.rb +23 -0
  112. data/spec/dummy/app/views/devise/confirmations/new.html.erb +12 -0
  113. data/spec/dummy/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  114. data/spec/dummy/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  115. data/spec/dummy/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  116. data/spec/dummy/app/views/devise/passwords/edit.html.erb +16 -0
  117. data/spec/dummy/app/views/devise/passwords/new.html.erb +12 -0
  118. data/spec/dummy/app/views/devise/registrations/edit.html.erb +29 -0
  119. data/spec/dummy/app/views/devise/registrations/new.html.erb +22 -0
  120. data/spec/dummy/app/views/devise/sessions/new.html.erb +19 -0
  121. data/spec/dummy/app/views/devise/shared/_links.erb +25 -0
  122. data/spec/dummy/app/views/devise/unlocks/new.html.erb +12 -0
  123. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  124. data/spec/dummy/app/views/tester/index.html.erb +14 -0
  125. data/spec/dummy/config.ru +4 -0
  126. data/spec/dummy/config/application.rb +42 -0
  127. data/spec/dummy/config/boot.rb +10 -0
  128. data/spec/dummy/config/database.yml +28 -0
  129. data/spec/dummy/config/environment.rb +5 -0
  130. data/spec/dummy/config/environments/development.rb +31 -0
  131. data/spec/dummy/config/environments/production.rb +54 -0
  132. data/spec/dummy/config/environments/test.rb +39 -0
  133. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  134. data/spec/dummy/config/initializers/cornerstone_config.rb +30 -0
  135. data/spec/dummy/config/initializers/devise.rb +204 -0
  136. data/spec/dummy/config/initializers/inflections.rb +10 -0
  137. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  138. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  139. data/spec/dummy/config/initializers/session_store.rb +8 -0
  140. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  141. data/spec/dummy/config/locales/devise.en.yml +53 -0
  142. data/spec/dummy/config/locales/en.yml +5 -0
  143. data/spec/dummy/config/routes.rb +65 -0
  144. data/spec/dummy/db/migrate/20110724011421_create_user.rb +11 -0
  145. data/spec/dummy/db/migrate/20110724194307_devise_create_users.rb +41 -0
  146. data/spec/dummy/db/migrate/20110804174004_add_name_to_user.rb +5 -0
  147. data/spec/dummy/db/schema.rb +76 -0
  148. data/spec/dummy/log/.gitkeep +0 -0
  149. data/spec/dummy/public/404.html +26 -0
  150. data/spec/dummy/public/422.html +26 -0
  151. data/spec/dummy/public/500.html +26 -0
  152. data/spec/dummy/public/favicon.ico +0 -0
  153. data/spec/dummy/script/rails +6 -0
  154. data/spec/dummy/test/functional/tester_controller_test.rb +9 -0
  155. data/spec/dummy/test/unit/helpers/tester_helper_test.rb +4 -0
  156. data/spec/fixtures/cornerstone/cornerstone_mailer/new_discussion +3 -0
  157. data/spec/lib/cornerstone/acts_as_cornerstone_user_spec.rb +56 -0
  158. data/spec/lib/cornerstone/helpers_spec.rb +32 -0
  159. data/spec/mailers/cornerstone/cornerstone_mailer_spec.rb +55 -0
  160. data/spec/models/cornerstone/article_spec.rb +25 -0
  161. data/spec/models/cornerstone/category_spec.rb +97 -0
  162. data/spec/models/cornerstone/discussion_spec.rb +243 -0
  163. data/spec/models/cornerstone/post_observer_spec.rb +65 -0
  164. data/spec/models/cornerstone/post_spec.rb +210 -0
  165. data/spec/requests/emails_spec.rb +51 -0
  166. data/spec/requests/interact_discussions_spec.rb +103 -0
  167. data/spec/requests/manage_articles_spec.rb +59 -0
  168. data/spec/requests/manage_categories_spec.rb +64 -0
  169. data/spec/requests/view_home_spec.rb +26 -0
  170. data/spec/spec_helper.rb +40 -0
  171. data/spec/support/devise.rb +4 -0
  172. data/spec/support/factories.rb +62 -0
  173. data/spec/support/general_helper_methods.rb +20 -0
  174. data/spec/support/mailer_macros.rb +15 -0
  175. data/spec/support/mass_assignment.rb +46 -0
  176. data/tmp/log/development.log +0 -0
  177. metadata +301 -20
@@ -0,0 +1,65 @@
1
+ # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
2
+ # It is recommended to regenerate this file in the future when you upgrade to a
3
+ # newer version of cucumber-rails. Consider adding your own code to a new file
4
+ # instead of editing this one. Cucumber will automatically load all features/**/*.rb
5
+ # files.
6
+
7
+
8
+ unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
9
+
10
+ vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
11
+ $LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil?
12
+
13
+ begin
14
+ require 'cucumber/rake/task'
15
+
16
+ namespace :cucumber do
17
+ Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
18
+ t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
19
+ t.fork = true # You may get faster startup if you set this to false
20
+ t.profile = 'default'
21
+ end
22
+
23
+ Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
24
+ t.binary = vendored_cucumber_bin
25
+ t.fork = true # You may get faster startup if you set this to false
26
+ t.profile = 'wip'
27
+ end
28
+
29
+ Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
30
+ t.binary = vendored_cucumber_bin
31
+ t.fork = true # You may get faster startup if you set this to false
32
+ t.profile = 'rerun'
33
+ end
34
+
35
+ desc 'Run all features'
36
+ task :all => [:ok, :wip]
37
+
38
+ task :statsetup do
39
+ require 'rails/code_statistics'
40
+ ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
41
+ ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
42
+ end
43
+ end
44
+ desc 'Alias for cucumber:ok'
45
+ task :cucumber => 'cucumber:ok'
46
+
47
+ task :default => :cucumber
48
+
49
+ task :features => :cucumber do
50
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
51
+ end
52
+
53
+ # In case we don't have ActiveRecord, append a no-op task that we can depend upon.
54
+ task 'db:test:prepare' do
55
+ end
56
+
57
+ task :stats => 'cucumber:statsetup'
58
+ rescue LoadError
59
+ desc 'cucumber rake task not available (cucumber not installed)'
60
+ task :cucumber do
61
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,31 @@
1
+ # Use this hook to configure cornerstone.
2
+ Cornerstone::Config.setup do |config|
3
+
4
+ # == Authenticated User Method
5
+ # Specify the method in which your application accesses the authenticated user.
6
+ # You may use a Proc to call a helper method in your application. The helper method
7
+ # must return an authenticated user.
8
+ # Alternatively, you may specify ':warden' if you are using Warden for authentication.
9
+ #
10
+ # Examples:
11
+ #
12
+ # config.auth_with = Proc.new {|helper| helper.current_user}
13
+ # config.auth_with = :warden
14
+ config.auth_with = :warden
15
+
16
+
17
+ # == Discussion Statuses
18
+ # An array of strings which specify the status options for a discussion.
19
+ # The first status option becomes the default value used in the database.
20
+ # The last status option becomes the default value when a discussion is 'closed.'
21
+ config.discussion_statuses = ["Open", "Resolved"]
22
+
23
+ # == Mailer From Address
24
+ # The default 'from' email address for the mailer to use.
25
+ config.mailer_from = "no-reply@cornerstone.com"
26
+
27
+ # == Administrators emails
28
+ # An array of strings which specify which users to email when a new discussion is created.
29
+ config.admin_emails = ["support@cornerstone.com"]
30
+
31
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
4
+ if vendored_cucumber_bin
5
+ load File.expand_path(vendored_cucumber_bin)
6
+ else
7
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
8
+ require 'cucumber'
9
+ load Cucumber::BINARY
10
+ end
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ #!/usr/bin/env ruby
3
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
4
+
5
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
6
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
7
+
@@ -0,0 +1,250 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cornerstone::Admin::ArticlesController do
4
+
5
+ def mock_category(stubs={})
6
+ @mock_category ||= mock_model(Cornerstone::Category, stubs).as_null_object
7
+ end
8
+
9
+ def mock_article(stubs={})
10
+ @mock_article ||= mock_model(Cornerstone::Article, stubs).as_null_object
11
+ end
12
+
13
+ describe "GET index" do
14
+ context "with an administrator" do
15
+ before do
16
+ sign_in_admin
17
+ end
18
+ it "should expose articles as @articles" do
19
+ Cornerstone::Article.should_receive(:all) {[mock_article]}
20
+ get :index, :use_route => :cornerstone
21
+ assigns[:articles].should eql([mock_article])
22
+ end
23
+ end
24
+ context "with a normal user" do
25
+ it "raises the unauthorized error" do
26
+ lambda {
27
+ get :edit, :id => "2", :use_route => :cornerstone
28
+ }.should raise_error(Cornerstone::AccessDenied)
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "GET show" do
34
+ context "with an administrator" do
35
+ before do
36
+ sign_in_admin
37
+ end
38
+ it "should expose the requested article as @article" do
39
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
40
+ get :show, :id => "37", :use_route => :cornerstone
41
+ assigns[:article].should eql(mock_article)
42
+ end
43
+ end
44
+ context "with a normal user" do
45
+ it "raises the unauthorized error" do
46
+ lambda {
47
+ get :edit, :id => "2", :use_route => :cornerstone
48
+ }.should raise_error(Cornerstone::AccessDenied)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "GET new" do
54
+ context "with an administrator" do
55
+ before do
56
+ sign_in_admin
57
+ end
58
+ it "should expose a new article as @article" do
59
+ Cornerstone::Article.should_receive(:new) {mock_article}
60
+ get :new, :use_route => :cornerstone
61
+ assigns[:article].should equal(mock_article)
62
+ end
63
+
64
+ it "exposes article categories for selection as @categories" do
65
+ Cornerstone::Category.should_receive(:articles) {mock_category}
66
+ get :new, :use_route => :cornerstone
67
+ assigns(:categories).should equal(mock_category)
68
+ end
69
+ end
70
+ context "with a normal user" do
71
+ it "raises the unauthorized error" do
72
+ lambda {
73
+ get :edit, :id => "2", :use_route => :cornerstone
74
+ }.should raise_error(Cornerstone::AccessDenied)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "POST create" do
80
+ context "with an administrator" do
81
+ before do
82
+ sign_in_admin
83
+ end
84
+ context "with valid parameters" do
85
+ it "exposes a newly created article as @article" do
86
+ Cornerstone::Article.should_receive(:new)
87
+ .with({'these' => 'params'}) {mock_article :save => true}
88
+ post :create, :article => {:these => 'params'}, :use_route => :cornerstone
89
+ assigns(:article).should equal(mock_article)
90
+ end
91
+
92
+ it "redirects to the article" do
93
+ Cornerstone::Article.stub!(:new) {mock_article(:save => true,
94
+ :category => mock_category)}
95
+ post :create, :article => {}, :use_route => :cornerstone
96
+ response.should redirect_to(admin_article_path(mock_article))
97
+ end
98
+
99
+ end
100
+
101
+ context "with invalid parameters" do
102
+ before do
103
+ Cornerstone::Article.stub!(:new) {mock_article(:save => false)}
104
+ end
105
+
106
+ it "exposes a newly created but unsaved article as @article" do
107
+ post :create, :article => {}, :use_route => :cornerstone
108
+ assigns(:article).should equal(mock_article)
109
+ end
110
+
111
+ it "exposes article categories for selection as @categories" do
112
+ Cornerstone::Category.should_receive(:articles) {mock_category}
113
+ post :create, :article => {}, :use_route => :cornerstone
114
+ assigns(:categories).should equal(mock_category)
115
+ end
116
+
117
+ it "re-renders the 'new' template" do
118
+ post :create, :article => {}, :use_route => :cornerstone
119
+ response.should render_template(:new)
120
+ end
121
+ end
122
+ end
123
+ context "with a normal user" do
124
+ it "raises the unauthorized error" do
125
+ lambda {
126
+ get :edit, :id => "2", :use_route => :cornerstone
127
+ }.should raise_error(Cornerstone::AccessDenied)
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "GET edit" do
133
+ context "with an administrator" do
134
+ before do
135
+ sign_in_admin
136
+ end
137
+ it "exposes the requested article as @article" do
138
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
139
+ get :edit, :id => "37", :use_route => :cornerstone
140
+ assigns[:article].should equal(mock_article)
141
+ end
142
+ it "exposes article categories for selection as @categories" do
143
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
144
+ Cornerstone::Category.should_receive(:articles) {mock_category}
145
+ get :edit, :id => "37", :use_route => :cornerstone
146
+ assigns(:categories).should equal(mock_category)
147
+ end
148
+ end
149
+ context "with a normal user" do
150
+ it "raises the unauthorized error" do
151
+ lambda {
152
+ get :edit, :id => "2", :use_route => :cornerstone
153
+ }.should raise_error(Cornerstone::AccessDenied)
154
+ end
155
+ end
156
+ end
157
+
158
+ describe "PUT update" do
159
+ context "with an administrator" do
160
+ before do
161
+ sign_in_admin
162
+ end
163
+ it "exposes the requested article as @article" do
164
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
165
+ put :update, :id => "37", :article => {"these" => "params"},
166
+ :use_route => :cornerstone
167
+ assigns[:article].should equal(mock_article)
168
+ end
169
+
170
+ it "updates the requested category with the given parameters" do
171
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
172
+ mock_article.should_receive(:update_attributes).with({"these" => "params"})
173
+ put :update, :id => "37", :article => {"these" => "params"},
174
+ :use_route => :cornerstone
175
+ end
176
+
177
+ describe "with valid parameters" do
178
+ before do
179
+ Cornerstone::Article.stub(:find).with("37")
180
+ .and_return(mock_article(:update_attributes => true))
181
+ end
182
+
183
+ it "redirects to the article" do
184
+ put :update, :id => "37", :article => {"these" => "params"},
185
+ :use_route => :cornerstone
186
+ response.should redirect_to(admin_article_path(mock_article))
187
+ end
188
+
189
+ end
190
+
191
+ describe "with invalid parameters" do
192
+ before do
193
+ Cornerstone::Article.stub(:find).with("37")
194
+ .and_return(mock_article(:update_attributes => false))
195
+ end
196
+
197
+ it "renders the edit page" do
198
+ put :update, :id => "37", :article => {}, :use_route => :cornerstone
199
+ response.should render_template :edit
200
+ end
201
+ it "exposes article categories for selection as @categories" do
202
+ Cornerstone::Category.should_receive(:articles) {mock_category}
203
+ put :update, :id => "37", :article => {}, :use_route => :cornerstone
204
+ assigns(:categories).should equal(mock_category)
205
+ end
206
+ end
207
+ end
208
+ context "with a normal user" do
209
+ it "raises the unauthorized error" do
210
+ lambda {
211
+ get :edit, :id => "2", :use_route => :cornerstone
212
+ }.should raise_error(Cornerstone::AccessDenied)
213
+ end
214
+ end
215
+ end
216
+
217
+ describe "DELETE destroy" do
218
+ context "with an administrator" do
219
+ before do
220
+ sign_in_admin
221
+ end
222
+ it "exposes the article as @article" do
223
+ Cornerstone::Article.should_receive(:find).with("37") {mock_article}
224
+ delete :destroy, :id => "37", :use_route => :cornerstone
225
+ assigns[:article].should equal(mock_article)
226
+ end
227
+
228
+ it "redirects to the article list when destroyed" do
229
+ Cornerstone::Article.stub(:find) {mock_article(:destroy => true)}
230
+ delete :destroy, :id => "37", :use_route => :cornerstone
231
+ response.should redirect_to(admin_articles_path)
232
+ end
233
+
234
+ it "redirects to the article list when not destroyed" do
235
+ Cornerstone::Article.stub(:find) {mock_article(:destroy => false)}
236
+ delete :destroy, :id => "37", :use_route => :cornerstone
237
+ response.should redirect_to(admin_articles_path)
238
+ end
239
+ end
240
+ context "with a normal user" do
241
+ it "raises the unauthorized error" do
242
+ lambda {
243
+ get :edit, :id => "2", :use_route => :cornerstone
244
+ }.should raise_error(Cornerstone::AccessDenied)
245
+ end
246
+ end
247
+ end
248
+
249
+ end
250
+
@@ -0,0 +1,205 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cornerstone::Admin::CategoriesController do
4
+
5
+ def mock_category(stubs={})
6
+ @mock_category ||= mock_model(Cornerstone::Category, stubs).as_null_object
7
+ end
8
+
9
+ describe "GET index" do
10
+ context "with an administrator" do
11
+ before do
12
+ sign_in_admin
13
+ end
14
+ it "exposes all discussion categories as @discussion_categories" do
15
+ Cornerstone::Category.should_receive(:discussions) {[mock_category]}
16
+ get :index, :use_route => :cornerstone
17
+ assigns[:discussion_categories].should == [mock_category]
18
+ end
19
+ it "exposes all article categories as @article_categories" do
20
+ Cornerstone::Category.should_receive(:articles) {[mock_category]}
21
+ get :index, :use_route => :cornerstone
22
+ assigns[:article_categories].should == [mock_category]
23
+ end
24
+ end
25
+ context "with a normal user" do
26
+ it "raises the unauthorized error" do
27
+ lambda {
28
+ get :edit, :id => "2", :use_route => :cornerstone
29
+ }.should raise_error(Cornerstone::AccessDenied)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "GET new" do
35
+ context "with an administrator" do
36
+ before do
37
+ sign_in_admin
38
+ end
39
+ it "exposes a new category as @category" do
40
+ Cornerstone::Category.should_receive(:new) {mock_category}
41
+ get :new, :use_route => :cornerstone
42
+ assigns[:category].should == mock_category
43
+ end
44
+ end
45
+ context "with a normal user" do
46
+ it "raises the unauthorized error" do
47
+ lambda {
48
+ get :edit, :id => "2", :use_route => :cornerstone
49
+ }.should raise_error(Cornerstone::AccessDenied)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "POST create" do
55
+ context "with an administrator" do
56
+ before do
57
+ sign_in_admin
58
+ end
59
+ context "with valid parameters" do
60
+ it "exposes a newly created category as @category" do
61
+ Cornerstone::Category.should_receive(:new)
62
+ .with({'these' => 'params'}) {mock_category :save => true}
63
+ post :create, :category => {:these => 'params'}, :use_route => :cornerstone
64
+ assigns(:category).should equal(mock_category)
65
+ end
66
+
67
+ it "redirects to the category list" do
68
+ Cornerstone::Category.stub!(:new) {mock_category(:save => true)}
69
+ post :create, :category => {}, :use_route => :cornerstone
70
+ response.should redirect_to(admin_categories_path)
71
+ end
72
+ end
73
+
74
+ context "with invalid parameters" do
75
+ it "exposes a newly created but unsaved category as @category" do
76
+ Cornerstone::Category.stub!(:new)
77
+ .with({'these' => 'params'}) {mock_category(:save => false)}
78
+ post :create, :category => {:these => 'params'}, :use_route => :cornerstone
79
+ assigns(:category).should equal(mock_category)
80
+ end
81
+
82
+ it "re-renders the 'new' template" do
83
+ Cornerstone::Category.stub!(:new) {mock_category(:save => false)}
84
+ post :create, :category => {}, :use_route => :cornerstone
85
+ response.should render_template(:new)
86
+ end
87
+ end
88
+ end
89
+ context "with a normal user" do
90
+ it "raises the unauthorized error" do
91
+ lambda {
92
+ get :edit, :id => "2", :use_route => :cornerstone
93
+ }.should raise_error(Cornerstone::AccessDenied)
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "GET edit" do
99
+ context "with an administrator" do
100
+ before do
101
+ sign_in_admin
102
+ end
103
+ it "exposes the requested category as @category" do
104
+ Cornerstone::Category.should_receive(:find).with("37") {mock_category}
105
+ get :edit, :id => "37", :use_route => :cornerstone
106
+ assigns[:category].should equal(mock_category)
107
+ end
108
+ end
109
+ context "with a normal user" do
110
+ it "raises the unauthorized error" do
111
+ lambda {
112
+ get :edit, :id => "2", :use_route => :cornerstone
113
+ }.should raise_error(Cornerstone::AccessDenied)
114
+ end
115
+ end
116
+ end
117
+
118
+ describe "PUT update" do
119
+ context "with an administrator" do
120
+ before do
121
+ sign_in_admin
122
+ end
123
+ it "exposes the requested category as @category" do
124
+ Cornerstone::Category.should_receive(:find).with("37") {mock_category}
125
+ put :update, :id => "37", :category => {"these" => "params"},
126
+ :use_route => :cornerstone
127
+ assigns[:category].should equal(mock_category)
128
+ end
129
+
130
+ it "updates the requested category with the given parameters" do
131
+ Cornerstone::Category.should_receive(:find).with("37") {mock_category}
132
+ mock_category.should_receive(:update_attributes).with({"these" => "params"})
133
+ put :update, :id => "37", :category => {"these" => "params"},
134
+ :use_route => :cornerstone
135
+ end
136
+
137
+ describe "with valid parameters" do
138
+ before do
139
+ Cornerstone::Category.stub(:find).with("37")
140
+ .and_return(mock_category(:update_attributes => true))
141
+ end
142
+
143
+ it "redirects to the category list" do
144
+ put :update, :id => "37", :category => {"these" => "params"},
145
+ :use_route => :cornerstone
146
+ response.should redirect_to(admin_categories_path)
147
+ end
148
+
149
+ end
150
+
151
+ describe "with invalid parameters" do
152
+ before do
153
+ Cornerstone::Category.stub(:find).with("37")
154
+ .and_return(mock_category(:update_attributes => false))
155
+ end
156
+ it "renders the edit page" do
157
+ put :update, :id => "37", :category => {}, :use_route => :cornerstone
158
+ response.should render_template :edit
159
+ end
160
+ end
161
+ end
162
+ context "with a normal user" do
163
+ it "raises the unauthorized error" do
164
+ lambda {
165
+ get :edit, :id => "2", :use_route => :cornerstone
166
+ }.should raise_error(Cornerstone::AccessDenied)
167
+ end
168
+ end
169
+ end
170
+
171
+ describe "DELETE destroy" do
172
+ context "with an administrator" do
173
+ before do
174
+ sign_in_admin
175
+ end
176
+ it "exposes the category as @category" do
177
+ Cornerstone::Category.should_receive(:find).with("37") {mock_category}
178
+ delete :destroy, :id => "37", :use_route => :cornerstone
179
+ assigns[:category].should equal(mock_category)
180
+ end
181
+
182
+ it "redirects to the category list when destroyed" do
183
+ Cornerstone::Category.stub(:find) {mock_category(:destroy => true)}
184
+ delete :destroy, :id => "37", :use_route => :cornerstone
185
+ response.should redirect_to(admin_categories_path)
186
+ end
187
+
188
+ it "redirects to the category list when not destroyed" do
189
+ Cornerstone::Category.stub(:find) {mock_category(:destroy => false)}
190
+ delete :destroy, :id => "37", :use_route => :cornerstone
191
+ response.should redirect_to(admin_categories_path)
192
+ end
193
+ end
194
+ context "with a normal user" do
195
+ it "raises the unauthorized error" do
196
+ lambda {
197
+ get :edit, :id => "2", :use_route => :cornerstone
198
+ }.should raise_error(Cornerstone::AccessDenied)
199
+ end
200
+ end
201
+ end
202
+
203
+
204
+ end
205
+