cornerstone 0.0.1 → 0.0.5

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.
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
+