creddit/spec/controllers/comments_controller_spec.rb

201 lines
5.1 KiB
Ruby

require 'rails_helper'
describe CommentsController, type: :controller do
let!(:user) { build(:user) }
let!(:subcreddit) { create(:subcreddit) }
let!(:tpost) { create(:post, subcreddit: subcreddit) }
let(:data) { { content: 'Here is some updated content for a comment' } }
before(:each) do
allow_any_instance_of(ApplicationController)
.to receive(:current_user).and_return(user)
end
describe '#show' do
let!(:comment) { create(:comment) }
before(:each) do
get :show,
subcreddit_id: comment.post.subcreddit,
post_id: comment.post,
id: comment
end
it 'should render :show' do
expect(response).to render_template(:show)
end
it 'should assign correct Comment to @comment' do
expect(assigns(:comment)).to eq(comment)
end
end
describe '#new' do
let(:comment) { build(:comment) }
before(:each) do
get :new,
subcreddit_id: comment.post.subcreddit,
post_id: comment.post
end
it 'should render :new' do
expect(response).to render_template(:new)
end
it 'should assign new Comment to @comment' do
expect(assigns(:comment)).to be_a_new(Comment)
end
end
describe '#create' do
context 'with valid data' do
it 'should create a comment' do
expect do
post :create,
subcreddit_id: subcreddit,
post_id: tpost,
comment: data
end.to change(Comment, :count).by(1)
end
it 'should redirect to the parent post' do
expect(post :create,
subcreddit_id: subcreddit,
post_id: tpost,
comment: data
).to redirect_to(subcreddit_post_path(assigns(:post).subcreddit,
assigns(:post)))
end
it 'should send a notice flash message' do
expect(post :create,
subcreddit_id: subcreddit,
post_id: tpost,
comment: data)
expect(flash[:notice]).to be_present
end
end
context 'with invalid data' do
before(:each) { data['content'] = '' }
it 'should not create a new comment' do
expect do
post :create,
subcreddit_id: subcreddit,
post_id: tpost,
comment: data
end.to change(Comment, :count).by(0)
end
it 'should render :new' do
expect(post :create,
subcreddit_id: subcreddit,
post_id: tpost,
comment: data
).to redirect_to(subcreddit_post_path(subcreddit, tpost))
end
end
end
describe '#edit' do
let!(:comment) { create(:comment) }
before(:each) do
get :edit,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit
end
context 'with valid comment' do
it 'should render :edit' do
expect(response).to render_template(:edit)
end
it 'should assign correct Comment to @comment' do
expect(assigns(:comment)).to eq(comment)
end
end
end
context '#update' do
let!(:comment) { create(:comment) }
let(:data) { { content: 'Some edited comment content goes here' } }
context 'with valid data' do
before(:each) do
put :update,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit,
comment: data
end
it 'should assign correct Comment to @comment' do
expect(assigns(:comment)).to eq(comment)
end
it 'should update the comment' do
comment.reload
expect(comment.content).to eq(data[:content])
end
it 'should redirect to the post' do
expect(response)
.to redirect_to(subcreddit_post_path(assigns(:post).subcreddit,
assigns(:post)))
end
it 'should display a notice flash message' do
expect(flash[:notice]).to be_present
end
end
context 'with invalid data' do
before(:each) { data[:content] = '' }
it 'should render :edit' do
put :update,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit,
comment: data
expect(response).to render_template(:edit)
end
end
end
context '#destroy' do
let!(:comment) { create(:comment) }
it 'should delete the post' do
delete :destroy,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit
comment.reload
expect(comment.destroyed?).to be(true)
end
it 'should redirect to the post' do
delete :destroy,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit
expect(response).to redirect_to(subcreddit_post_path(assigns(:subcreddit),
assigns(:post)))
end
it 'should send a notice flash message' do
delete :destroy,
id: comment,
post_id: comment.post,
subcreddit_id: comment.post.subcreddit
expect(flash[:notice]).to be_present
end
end
end