cornerstone 0.0.1 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +168 -0
- data/Guardfile +22 -0
- data/README.rdoc +4 -1
- data/Rakefile +11 -1
- data/TODO +11 -0
- data/VERSION +1 -0
- data/app/assets/images/.gitkeep +0 -0
- data/app/assets/javascripts/.gitkeep +0 -0
- data/app/assets/javascripts/cornerstone.js +11 -0
- data/app/assets/javascripts/cornerstone/discussions.js +2 -0
- data/app/assets/javascripts/cornerstone/help.js +2 -0
- data/app/assets/stylesheets/.gitkeep +0 -0
- data/app/assets/stylesheets/cornerstone.css +8 -0
- data/app/assets/stylesheets/cornerstone/discussions.css +4 -0
- data/app/assets/stylesheets/cornerstone/help.css +4 -0
- data/app/controllers/.gitkeep +0 -0
- data/app/controllers/cornerstone/admin/application_controller.rb +7 -0
- data/app/controllers/cornerstone/admin/articles_controller.rb +61 -0
- data/app/controllers/cornerstone/admin/categories_controller.rb +46 -0
- data/app/controllers/cornerstone/admin/discussions_controller.rb +32 -0
- data/app/controllers/cornerstone/application_controller.rb +6 -0
- data/app/controllers/cornerstone/discussions_controller.rb +58 -0
- data/app/controllers/cornerstone/help_controller.rb +11 -0
- data/app/controllers/cornerstone/posts_controller.rb +66 -0
- data/app/helpers/.gitkeep +0 -0
- data/app/helpers/cornerstone/application_helper.rb +5 -0
- data/app/helpers/cornerstone/discussions_helper.rb +16 -0
- data/app/helpers/cornerstone/help_helper.rb +4 -0
- data/app/mailers/cornerstone/cornerstone_mailer.rb +31 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/cornerstone/article.rb +20 -0
- data/app/models/cornerstone/category.rb +45 -0
- data/app/models/cornerstone/discussion.rb +90 -0
- data/app/models/cornerstone/post.rb +103 -0
- data/app/models/cornerstone/post_observer.rb +23 -0
- data/app/views/.gitkeep +0 -0
- data/app/views/cornerstone/admin/articles/_article.html.erb +9 -0
- data/app/views/cornerstone/admin/articles/_form.html.erb +22 -0
- data/app/views/cornerstone/admin/articles/edit.html.erb +7 -0
- data/app/views/cornerstone/admin/articles/index.html.erb +25 -0
- data/app/views/cornerstone/admin/articles/new.html.erb +6 -0
- data/app/views/cornerstone/admin/articles/show.html.erb +4 -0
- data/app/views/cornerstone/admin/categories/_category.html.erb +12 -0
- data/app/views/cornerstone/admin/categories/_form.html.erb +17 -0
- data/app/views/cornerstone/admin/categories/edit.html.erb +6 -0
- data/app/views/cornerstone/admin/categories/index.html.erb +11 -0
- data/app/views/cornerstone/admin/categories/new.html.erb +6 -0
- data/app/views/cornerstone/admin/discussions/edit.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion.html.erb +14 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion.text.erb +5 -0
- data/app/views/cornerstone/cornerstone_mailer/new_discussion_user.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_post.html.erb +7 -0
- data/app/views/cornerstone/cornerstone_mailer/new_post.text.erb +8 -0
- data/app/views/cornerstone/discussions/_discussion.html.erb +12 -0
- data/app/views/cornerstone/discussions/_discussion_category.html.erb +14 -0
- data/app/views/cornerstone/discussions/_form.html.erb +33 -0
- data/app/views/cornerstone/discussions/_latest_discussion.html.erb +4 -0
- data/app/views/cornerstone/discussions/categorical_index.html.erb +27 -0
- data/app/views/cornerstone/discussions/index.html.erb +25 -0
- data/app/views/cornerstone/discussions/new.html.erb +6 -0
- data/app/views/cornerstone/discussions/show.html.erb +19 -0
- data/app/views/cornerstone/help/index.html.erb +7 -0
- data/app/views/cornerstone/posts/_fields.html.erb +44 -0
- data/app/views/cornerstone/posts/_form.html.erb +19 -0
- data/app/views/cornerstone/posts/_post.html.erb +17 -0
- data/app/views/cornerstone/posts/edit.html.erb +9 -0
- data/app/views/cornerstone/shared/_errors.html.erb +11 -0
- data/app/views/cornerstone/shared/_flash_messages.html.erb +15 -0
- data/app/views/layouts/cornerstone/application.html.erb +16 -0
- data/config/cucumber.yml +8 -0
- data/config/locales/cornerstone.action_mailer.en.yml +9 -0
- data/config/routes.rb +24 -0
- data/cornerstone-0.0.1.gem +0 -0
- data/cornerstone.gemspec +33 -0
- data/db/migrate/20110723004024_create_cornerstone_discussions.rb +17 -0
- data/db/migrate/20110804190853_create_cornerstone_categories.rb +15 -0
- data/db/migrate/20110809233551_create_cornerstone_posts.rb +13 -0
- data/db/migrate/20111006172857_create_cornerstone_articles.rb +12 -0
- data/lib/cornerstone.rb +6 -0
- data/lib/cornerstone/acts_as_cornerstone_user.rb +79 -0
- data/lib/cornerstone/config.rb +33 -0
- data/lib/cornerstone/controller_additions.rb +25 -0
- data/lib/cornerstone/engine.rb +8 -1
- data/lib/cornerstone/exceptions.rb +16 -0
- data/lib/cornerstone/helpers.rb +35 -0
- data/lib/tasks/cucumber.rake +65 -0
- data/lib/templates/cornerstone_config.rb +31 -0
- data/script/cucumber +10 -0
- data/script/rails +7 -0
- data/spec/controllers/cornerstone/admin/articles_controller_spec.rb +250 -0
- data/spec/controllers/cornerstone/admin/categories_controller_spec.rb +205 -0
- data/spec/controllers/cornerstone/admin/discussions_controller_spec.rb +95 -0
- data/spec/controllers/cornerstone/application_controller_spec.rb +34 -0
- data/spec/controllers/cornerstone/discussions_controller_spec.rb +157 -0
- data/spec/controllers/cornerstone/help_controller_spec.rb +20 -0
- data/spec/controllers/cornerstone/posts_controller_spec.rb +212 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/javascripts/tester.js +2 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/assets/stylesheets/tester.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/tester_controller.rb +7 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/tester_helper.rb +6 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/user.rb +23 -0
- data/spec/dummy/app/views/devise/confirmations/new.html.erb +12 -0
- data/spec/dummy/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/spec/dummy/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/spec/dummy/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/spec/dummy/app/views/devise/passwords/edit.html.erb +16 -0
- data/spec/dummy/app/views/devise/passwords/new.html.erb +12 -0
- data/spec/dummy/app/views/devise/registrations/edit.html.erb +29 -0
- data/spec/dummy/app/views/devise/registrations/new.html.erb +22 -0
- data/spec/dummy/app/views/devise/sessions/new.html.erb +19 -0
- data/spec/dummy/app/views/devise/shared/_links.erb +25 -0
- data/spec/dummy/app/views/devise/unlocks/new.html.erb +12 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/app/views/tester/index.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +42 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +28 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +31 -0
- data/spec/dummy/config/environments/production.rb +54 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cornerstone_config.rb +30 -0
- data/spec/dummy/config/initializers/devise.rb +204 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/devise.en.yml +53 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +65 -0
- data/spec/dummy/db/migrate/20110724011421_create_user.rb +11 -0
- data/spec/dummy/db/migrate/20110724194307_devise_create_users.rb +41 -0
- data/spec/dummy/db/migrate/20110804174004_add_name_to_user.rb +5 -0
- data/spec/dummy/db/schema.rb +76 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/test/functional/tester_controller_test.rb +9 -0
- data/spec/dummy/test/unit/helpers/tester_helper_test.rb +4 -0
- data/spec/fixtures/cornerstone/cornerstone_mailer/new_discussion +3 -0
- data/spec/lib/cornerstone/acts_as_cornerstone_user_spec.rb +56 -0
- data/spec/lib/cornerstone/helpers_spec.rb +32 -0
- data/spec/mailers/cornerstone/cornerstone_mailer_spec.rb +55 -0
- data/spec/models/cornerstone/article_spec.rb +25 -0
- data/spec/models/cornerstone/category_spec.rb +97 -0
- data/spec/models/cornerstone/discussion_spec.rb +243 -0
- data/spec/models/cornerstone/post_observer_spec.rb +65 -0
- data/spec/models/cornerstone/post_spec.rb +210 -0
- data/spec/requests/emails_spec.rb +51 -0
- data/spec/requests/interact_discussions_spec.rb +103 -0
- data/spec/requests/manage_articles_spec.rb +59 -0
- data/spec/requests/manage_categories_spec.rb +64 -0
- data/spec/requests/view_home_spec.rb +26 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/devise.rb +4 -0
- data/spec/support/factories.rb +62 -0
- data/spec/support/general_helper_methods.rb +20 -0
- data/spec/support/mailer_macros.rb +15 -0
- data/spec/support/mass_assignment.rb +46 -0
- data/tmp/log/development.log +0 -0
- metadata +301 -20
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cornerstone::Admin::DiscussionsController do
|
4
|
+
|
5
|
+
def mock_category(stubs={})
|
6
|
+
@mock_category ||= mock_model(Cornerstone::Category, stubs).as_null_object
|
7
|
+
end
|
8
|
+
|
9
|
+
def mock_discussion(stubs={})
|
10
|
+
@mock_discussion ||= mock_model(Cornerstone::Discussion, stubs).as_null_object
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "GET edit" do
|
14
|
+
context "with an administrator" do
|
15
|
+
before do
|
16
|
+
sign_in_admin
|
17
|
+
end
|
18
|
+
it "assigns the discussion as @discussion" do
|
19
|
+
Cornerstone::Discussion.stub_chain(:includes, :find) {mock_discussion}
|
20
|
+
get :edit, :id => "2", :use_route => :cornerstone
|
21
|
+
assigns(:discussion).should eql(mock_discussion)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "exposes discussion categories for selection as @categories" do
|
25
|
+
Cornerstone::Discussion.stub_chain(:includes, :find) {mock_discussion}
|
26
|
+
Cornerstone::Category.should_receive(:discussions) {[mock_category]}
|
27
|
+
get :edit, :id => "2", :use_route => :cornerstone
|
28
|
+
assigns(:categories).should eql([mock_category])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with a normal user" do
|
33
|
+
it "raises the unauthorized error" do
|
34
|
+
lambda {
|
35
|
+
get :edit, :id => "2", :use_route => :cornerstone
|
36
|
+
}.should raise_error(Cornerstone::AccessDenied)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "PUT update" do
|
42
|
+
context "with an administrator" do
|
43
|
+
before do
|
44
|
+
sign_in_admin
|
45
|
+
end
|
46
|
+
it "exposes the discussion as @discussion" do
|
47
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8") {mock_discussion}
|
48
|
+
put :update, :id => "8", :discussion => {}, :use_route => :cornerstone
|
49
|
+
assigns[:discussion].should == mock_discussion
|
50
|
+
end
|
51
|
+
|
52
|
+
it "updates the requested discussion with the given parameters" do
|
53
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8") {mock_discussion}
|
54
|
+
mock_discussion.should_receive(:update_attributes).with({"these" => "params"})
|
55
|
+
put :update, :id => "8", :discussion => {"these" => "params"},
|
56
|
+
:use_route => :cornerstone
|
57
|
+
end
|
58
|
+
context "with valid parameters" do
|
59
|
+
before do
|
60
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8")
|
61
|
+
.and_return(mock_discussion(:update_attributes => true))
|
62
|
+
end
|
63
|
+
|
64
|
+
it "redirects to the discussion" do
|
65
|
+
put :update, :id => "8", :discussion => {"these" => "params"},
|
66
|
+
:use_route => :cornerstone
|
67
|
+
response.should redirect_to(category_discussion_path(mock_discussion.category, mock_discussion))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
context "with invalid parameters" do
|
71
|
+
before do
|
72
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8")
|
73
|
+
.and_return(mock_discussion(:update_attributes => false))
|
74
|
+
end
|
75
|
+
|
76
|
+
it "renders the edit template" do
|
77
|
+
put :update, :id => "8", :discussion => {},
|
78
|
+
:use_route => :cornerstone
|
79
|
+
response.should render_template :edit
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
context "with a normal user" do
|
84
|
+
it "raises the unauthorized error" do
|
85
|
+
lambda {
|
86
|
+
get :edit, :id => "2", :use_route => :cornerstone
|
87
|
+
}.should raise_error(Cornerstone::AccessDenied)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
pending "DESTROY"
|
93
|
+
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cornerstone::ApplicationController do
|
4
|
+
|
5
|
+
describe "Helpers" do
|
6
|
+
|
7
|
+
ActionController::Base.send :include, Cornerstone::Helpers
|
8
|
+
|
9
|
+
|
10
|
+
describe "#cornerstone_user" do
|
11
|
+
|
12
|
+
context "with warden" do
|
13
|
+
|
14
|
+
include Devise::TestHelpers
|
15
|
+
|
16
|
+
before do
|
17
|
+
Cornerstone::Config.auth_with = [:warden]
|
18
|
+
@request.env["devise.mapping"] = Devise.mappings[:user]
|
19
|
+
@user = Factory(:user)
|
20
|
+
sign_in @user
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: Make this test work
|
24
|
+
it "should return the signed in user" #do
|
25
|
+
# controller.cornerstone_user.should == @user
|
26
|
+
# end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cornerstone::DiscussionsController do
|
4
|
+
|
5
|
+
def mock_category(stubs={})
|
6
|
+
@mock_category ||= mock_model(Cornerstone::Category, stubs).as_null_object
|
7
|
+
end
|
8
|
+
|
9
|
+
def mock_discussion(stubs={})
|
10
|
+
@mock_discussion ||= mock_model(Cornerstone::Discussion, stubs).as_null_object
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "GET index" do
|
14
|
+
it "should expose categories for discussion as @categories" do
|
15
|
+
Cornerstone::Category.should_receive(:discussions) {mock_category}
|
16
|
+
get :index, :use_route => :cornerstone
|
17
|
+
assigns[:categories].should equal(mock_category)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "GET new" do
|
22
|
+
it "should expose a new discussion as @discussion" do
|
23
|
+
Cornerstone::Discussion.should_receive(:new) {mock_discussion}
|
24
|
+
get :new, :use_route => :cornerstone
|
25
|
+
assigns[:discussion].should equal(mock_discussion)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should build a post for the first post of the discussion" do
|
29
|
+
Cornerstone::Discussion.stub(:new) {mock_discussion}
|
30
|
+
posts_assoc = mock("posts assoc")
|
31
|
+
post = mock_model(Cornerstone::Post).as_null_object
|
32
|
+
mock_discussion.should_receive(:posts) {posts_assoc}
|
33
|
+
posts_assoc.should_receive(:build) {post}
|
34
|
+
get :new, :use_route => :cornerstone
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should set the discussion's category if given in parameters" do
|
38
|
+
Cornerstone::Category.should_receive(:find).with("1") {mock_category}
|
39
|
+
Cornerstone::Discussion.should_receive(:new) {mock_discussion}
|
40
|
+
get :new, :cat => "1", :use_route => :cornerstone
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not set the discussion's category if not given param[:cat]" do
|
44
|
+
Cornerstone::Category.should_not_receive(:find)
|
45
|
+
Cornerstone::Discussion.should_receive(:new) {mock_discussion}
|
46
|
+
get :new, :use_route => :cornerstone
|
47
|
+
end
|
48
|
+
|
49
|
+
it "exposes discussion categories for selection as @categories" do
|
50
|
+
Cornerstone::Category.should_receive(:discussions) {[mock_category]}
|
51
|
+
get :new, :use_route => :cornerstone
|
52
|
+
assigns(:categories).should eql([mock_category])
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "POST create" do
|
58
|
+
context "with valid parameters" do
|
59
|
+
it "exposes a newly created discussion as @discussion" do
|
60
|
+
Cornerstone::Discussion.should_receive(:new)
|
61
|
+
.with({'these' => 'params'}) {mock_discussion :save => true}
|
62
|
+
post :create, :discussion => {:these => 'params'}, :use_route => :cornerstone
|
63
|
+
assigns(:discussion).should equal(mock_discussion)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "redirects to the discussion" do
|
67
|
+
Cornerstone::Discussion.stub!(:new) {mock_discussion(:save => true,
|
68
|
+
:category => mock_category)}
|
69
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
70
|
+
response.should redirect_to(category_discussion_path(mock_category, mock_discussion))
|
71
|
+
end
|
72
|
+
|
73
|
+
context "and a logged in user" do
|
74
|
+
before do
|
75
|
+
@user = Factory(:user)
|
76
|
+
sign_in @user
|
77
|
+
Cornerstone::Discussion.stub!(:new) {mock_discussion(:save => true,
|
78
|
+
:category => mock_category)}
|
79
|
+
controller.stub!(:current_cornerstone_user) {@user}
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should assign the logged in user as the owner of the discussion" do
|
83
|
+
mock_discussion.stub(:user=).with(@user)
|
84
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should assign the logged in user as the owner of the post" do
|
88
|
+
posted = mock_model(Cornerstone::Post).as_null_object
|
89
|
+
posts = mock("posts")
|
90
|
+
mock_discussion.should_receive(:posts) {posts}
|
91
|
+
posts.should_receive(:first) {posted}
|
92
|
+
posted.should_receive(:user=).with(@user)
|
93
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "with invalid parameters" do
|
99
|
+
before do
|
100
|
+
Cornerstone::Discussion.stub!(:new) {mock_discussion(:save => false)}
|
101
|
+
end
|
102
|
+
|
103
|
+
it "exposes a newly created but unsaved discussion as @discussion" do
|
104
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
105
|
+
assigns(:discussion).should equal(mock_discussion)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "it exposes discussion categories for selection as @categories" do
|
109
|
+
Cornerstone::Category.should_receive(:discussions) {mock_category}
|
110
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
111
|
+
assigns(:categories).should equal(mock_category)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "re-renders the 'new' template" do
|
115
|
+
post :create, :discussion => {}, :use_route => :cornerstone
|
116
|
+
response.should render_template(:new)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "GET Category" do
|
123
|
+
it "assigns the given category as @category" do
|
124
|
+
Cornerstone::Category.stub_chain(:includes, :find).with("8") {mock_category}
|
125
|
+
get :category, :category => "8", :use_route => :cornerstone
|
126
|
+
assigns[:category].should == mock_category
|
127
|
+
end
|
128
|
+
it "assigns the given category's discussions as @discussions" do
|
129
|
+
Cornerstone::Category.stub_chain(:includes, :find).with("8") {mock_category}
|
130
|
+
mock_category.should_receive(:discussions) {[mock_discussion]}
|
131
|
+
get :category, :category => "8", :use_route => :cornerstone
|
132
|
+
assigns[:discussions].should == [mock_discussion]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "GET Show" do
|
137
|
+
it "assigns the discussion as @discussion" do
|
138
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8") {mock_discussion}
|
139
|
+
get :show, :category => mock_category.id, :id => "8", :use_route => :cornerstone
|
140
|
+
assigns[:discussion].should == mock_discussion
|
141
|
+
end
|
142
|
+
it "assigns the discussion's posts as @posts" do
|
143
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8") {mock_discussion}
|
144
|
+
mock_post = mock_model(Cornerstone::Post).as_null_object
|
145
|
+
mock_discussion.should_receive(:posts) {[mock_post]}
|
146
|
+
get :show, :category => mock_category.id, :id => "8", :use_route => :cornerstone
|
147
|
+
assigns[:posts].should == [mock_post]
|
148
|
+
end
|
149
|
+
it "creates a new post for the reply form" do
|
150
|
+
Cornerstone::Discussion.stub_chain(:includes, :find).with("8") {mock_discussion}
|
151
|
+
get :show, :category => mock_category.id, :id => "8", :use_route => :cornerstone
|
152
|
+
assigns[:new_post].should be_a_new(Cornerstone::Post)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cornerstone::HelpController do
|
4
|
+
|
5
|
+
def mock_category(stubs={})
|
6
|
+
@mock_category ||= mock_model(Cornerstone::Category, stubs)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "GET index" do
|
10
|
+
|
11
|
+
it "exposes all discussion categories as @discussion_categories" do
|
12
|
+
Cornerstone::Category.stub_chain(:select, :discussions) {mock_category}
|
13
|
+
get :index, :use_route => :cornerstone
|
14
|
+
assigns[:discussion_categories].should == mock_category
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cornerstone::PostsController do
|
4
|
+
|
5
|
+
def mock_discussion(stubs={})
|
6
|
+
@mock_discussion ||= mock_model(Cornerstone::Discussion, stubs).as_null_object
|
7
|
+
end
|
8
|
+
|
9
|
+
def mock_post(stubs={})
|
10
|
+
@mock_post ||= mock_model(Cornerstone::Post, stubs).as_null_object
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "POST create" do
|
14
|
+
before do
|
15
|
+
@discussion = Factory(:discussion)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "finds and exposes the discussion as @discussion" do
|
19
|
+
post :create, :discussion_id => @discussion.id, :post => {}, :use_route => :cornerstone
|
20
|
+
assigns[:discussion].should == @discussion
|
21
|
+
end
|
22
|
+
|
23
|
+
it "exposes a newly created post as @post from the params" do
|
24
|
+
attrs = Factory.attributes_for(:post)
|
25
|
+
post :create, :discussion_id => @discussion.id, :post => attrs, :use_route => :cornerstone
|
26
|
+
assigns[:post].body.should == attrs[:body]
|
27
|
+
assigns[:post].discussion.should == @discussion
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets the current user if there is one" do
|
31
|
+
@user = Factory(:user)
|
32
|
+
sign_in @user
|
33
|
+
attrs = Factory.attributes_for(:post)
|
34
|
+
controller.stub!(:current_cornerstone_user) {@user}
|
35
|
+
post :create, :discussion_id => @discussion.id, :post => attrs, :use_route => :cornerstone
|
36
|
+
assigns[:post].user.should == @user
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with valid parameters" do
|
40
|
+
before do
|
41
|
+
Cornerstone::Post.any_instance.stub(:save) {true}
|
42
|
+
end
|
43
|
+
it "redirects to the discussion" do
|
44
|
+
attrs = Factory.attributes_for(:post)
|
45
|
+
post :create, :discussion_id => @discussion.id, :post => attrs, :use_route => :cornerstone
|
46
|
+
response.should redirect_to(category_discussion_path(@discussion.category, @discussion))
|
47
|
+
end
|
48
|
+
|
49
|
+
context "discussion status" do
|
50
|
+
it "is changed to closed if params dictate" do
|
51
|
+
attrs = Factory.attributes_for(:post)
|
52
|
+
post :create, :discussion_id => @discussion.id, :post => attrs,
|
53
|
+
:comment_close => true, :use_route => :cornerstone
|
54
|
+
@discussion.reload.status.should == Cornerstone::Discussion::STATUS.last
|
55
|
+
end
|
56
|
+
it "is changed to open if discussion was previously closed" do
|
57
|
+
@discussion.status = Cornerstone::Discussion::STATUS.last
|
58
|
+
@discussion.save!
|
59
|
+
attrs = Factory.attributes_for(:post)
|
60
|
+
post :create, :discussion_id => @discussion.id, :post => attrs,
|
61
|
+
:use_route => :cornerstone
|
62
|
+
@discussion.reload.status.should == Cornerstone::Discussion::STATUS.first
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with invalid parameters" do
|
68
|
+
before do
|
69
|
+
Cornerstone::Post.any_instance.stub(:save) {false}
|
70
|
+
end
|
71
|
+
|
72
|
+
it "assigns a new post as @new_post" do
|
73
|
+
post :create, :discussion_id => @discussion.id, :post => {}, :use_route => :cornerstone
|
74
|
+
assigns[:new_post].should be_a_new(Cornerstone::Post)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "assigns the existing posts as @posts" do
|
78
|
+
p = Factory(:post_no_user, :discussion => @discussion)
|
79
|
+
post :create, :discussion_id => @discussion.id, :post => {}, :use_route => :cornerstone
|
80
|
+
assigns[:posts].should == [p]
|
81
|
+
end
|
82
|
+
|
83
|
+
it "renders the discussion show template" do
|
84
|
+
post :create, :discussion_id => @discussion.id, :post => {}, :use_route => :cornerstone
|
85
|
+
response.should render_template "cornerstone/discussions/show"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "GET edit" do
|
92
|
+
|
93
|
+
it "assigns the post as @post" do
|
94
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
95
|
+
get :edit, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
96
|
+
assigns[:post].should == mock_post
|
97
|
+
end
|
98
|
+
|
99
|
+
it "assigns the post's discussion as @discussion" do
|
100
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
101
|
+
mock_post.should_receive(:discussion) {mock_discussion}
|
102
|
+
get :edit, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
103
|
+
assigns[:discussion].should == mock_discussion
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should render the edit template" do
|
107
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
108
|
+
get :edit, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
109
|
+
response.should render_template :edit
|
110
|
+
end
|
111
|
+
|
112
|
+
it "raises Cornerstone::AccessDenied if the user did not create the post" do
|
113
|
+
user = Factory(:user)
|
114
|
+
sign_in user
|
115
|
+
user2 = Factory(:user)
|
116
|
+
post = Factory(:post_w_user, :user => user2)
|
117
|
+
|
118
|
+
lambda {
|
119
|
+
get :edit, :discussion_id => "2", :id => post.id, :use_route => :cornerstone
|
120
|
+
}.should raise_error(Cornerstone::AccessDenied)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "PUT update" do
|
125
|
+
it "assigns the post as @post" do
|
126
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
127
|
+
put :update, :discussion_id => "2", :id => "8", :post => {}, :use_route => :cornerstone
|
128
|
+
assigns[:post].should == mock_post
|
129
|
+
end
|
130
|
+
|
131
|
+
it "assigns the post's discussion as @discussion" do
|
132
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
133
|
+
mock_post.should_receive(:discussion) {mock_discussion}
|
134
|
+
put :update, :discussion_id => "2", :id => "8", :post => {}, :use_route => :cornerstone
|
135
|
+
assigns[:discussion].should == mock_discussion
|
136
|
+
end
|
137
|
+
|
138
|
+
it "raises Cornerstone::AccessDenied if the user did not create the post" do
|
139
|
+
user = Factory(:user)
|
140
|
+
sign_in user
|
141
|
+
user2 = Factory(:user)
|
142
|
+
post = Factory(:post_w_user, :user => user2)
|
143
|
+
|
144
|
+
lambda {
|
145
|
+
put :update, :discussion_id => "2", :id => post.id, :post => {},
|
146
|
+
:use_route => :cornerstone
|
147
|
+
}.should raise_error(Cornerstone::AccessDenied)
|
148
|
+
end
|
149
|
+
|
150
|
+
context "with valid parameters" do
|
151
|
+
it "updates the post with the params" do
|
152
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
153
|
+
mock_post.should_receive(:update_attributes).with("these" => "params") {true}
|
154
|
+
mock_post.stub(:discussion) {mock_discussion}
|
155
|
+
put :update, :discussion_id => "2", :id => "8", :post => {"these" => "params"},
|
156
|
+
:use_route => :cornerstone
|
157
|
+
end
|
158
|
+
it "redirects to the discussion" do
|
159
|
+
Cornerstone::Post.any_instance.stub(:update_attributes) {true}
|
160
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
161
|
+
mock_post.stub(:discussion) {mock_discussion}
|
162
|
+
put :update, :discussion_id => "2", :id => "8", :post => {}, :use_route => :cornerstone
|
163
|
+
response.should redirect_to category_discussion_path(mock_discussion.category, mock_discussion)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
context "with in-valid parameters" do
|
167
|
+
# TODO: spec not working for render
|
168
|
+
# it "renders the edit page" do
|
169
|
+
# Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
170
|
+
# mock_post.should_receive(:update_attributes) {false}
|
171
|
+
# mock_post.stub(:discussion) {mock_discussion}
|
172
|
+
# put :update, :discussion_id => "2", :id => "8", :post => {}, :use_route => :cornerstone
|
173
|
+
# response.should render_template :edit
|
174
|
+
# end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe "DELETE destroy" do
|
179
|
+
it "assigns the post as @post" do
|
180
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
181
|
+
mock_post.stub(:discussion) {mock_discussion}
|
182
|
+
delete :destroy, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
183
|
+
assigns[:post].should == mock_post
|
184
|
+
end
|
185
|
+
|
186
|
+
it "assigns the post's discussion as @discussion" do
|
187
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post}
|
188
|
+
mock_post.should_receive(:discussion) {mock_discussion}
|
189
|
+
delete :destroy, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
190
|
+
assigns[:discussion].should == mock_discussion
|
191
|
+
end
|
192
|
+
|
193
|
+
it "redirects to the discussion" do
|
194
|
+
Cornerstone::Post.stub_chain(:includes, :find).with("8") {mock_post(:destroy => true)}
|
195
|
+
mock_post.stub(:discussion) {mock_discussion}
|
196
|
+
delete :destroy, :discussion_id => "2", :id => "8", :use_route => :cornerstone
|
197
|
+
response.should redirect_to category_discussion_path(mock_discussion.category, mock_discussion)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "raises Cornerstone::AccessDenied if the user did not create the post" do
|
201
|
+
user = Factory(:user)
|
202
|
+
sign_in user
|
203
|
+
user2 = Factory(:user)
|
204
|
+
post = Factory(:post_w_user, :user => user2)
|
205
|
+
|
206
|
+
lambda {
|
207
|
+
delete :destroy, :discussion_id => "2", :id => post.id, :use_route => :cornerstone
|
208
|
+
}.should raise_error(Cornerstone::AccessDenied)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|