require 'test_helper'
module Proclaim
class PostsControllerTest < ActionController::TestCase
setup do
@routes = Engine.routes
@controller.stubs(:current_user).returns(nil)
@controller.stubs(:authenticate_user).returns(false)
end
teardown do
image = Image.new
FileUtils.rm_rf(File.join(Rails.public_path, image.image.cache_dir))
FileUtils.rm_rf(File.join(Rails.public_path, image.image.store_dir))
end
test "should get index if logged in" do
user = FactoryGirl.create(:user)
sign_in user
post1 = FactoryGirl.create(:post)
post2 = FactoryGirl.create(:published_post)
get :index
assert_response :success
assert_not_nil assigns(:posts)
assert_includes assigns(:posts), post1
assert_includes assigns(:posts), post2
end
test "should get index even if not logged in" do
post1 = FactoryGirl.create(:post)
post2 = FactoryGirl.create(:published_post)
get :index
assert_response :success
assert_not_nil assigns(:posts)
assert_not_includes assigns(:posts), post1
assert_includes assigns(:posts), post2
end
test "posts should be ordered by publication date" do
post1 = FactoryGirl.create(:published_post)
post2 = FactoryGirl.create(:published_post)
get :index
assert_response :success
assert_not_nil assigns(:posts)
assert_equal 2, assigns(:posts).count
assert_equal post2, assigns(:posts).first
assert_equal post1, assigns(:posts).last
end
test "drafts should be ordered by updated date" do
user = FactoryGirl.create(:user)
sign_in user
post1 = FactoryGirl.create(:post)
post2 = FactoryGirl.create(:post)
post3 = FactoryGirl.create(:post)
# Update post1 so its updated_at is newest
post2.body = "Updated Body"
post2.save
get :index
assert_response :success
assert_not_nil assigns(:posts)
assert_equal 3, assigns(:posts).count
assert_equal post2, assigns(:posts).first
assert_equal post3, assigns(:posts).second
assert_equal post1, assigns(:posts).last
end
test "should get new if logged in" do
user = FactoryGirl.create(:user)
sign_in user
get :new
assert_response :success
end
test "should not get new if not logged in" do
get :new
assert_response :redirect
assert_match /not authorized/, flash[:error]
end
test "should create post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.build(:post)
assert_difference('Post.count') do
post :create, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
end
assert_redirected_to post_path(assigns(:post))
assert_match /successfully created/, flash[:notice]
refute assigns(:post).published?
end
test "should create published post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.build(:post)
assert_difference('Post.count') do
post :create, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}, publish: "true"
end
assert_redirected_to post_path(assigns(:post))
assert_match /successfully created/, flash[:notice]
assert assigns(:post).published?
end
test "should upload images when creating post" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.build(:post)
image = FactoryGirl.build(:image, post: newPost)
newPost.body = ""
post :create, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
post = Post.first # This works since there's only one
assert_equal 1, post.images.count, "The post should have an image"
image = post.images.first
save_path = File.join(Rails.public_path, image.image.store_dir)
saved_file_path = File.join(save_path, image.image_identifier)
assert File.exist?(saved_file_path), "File should be saved: #{saved_file_path}"
document = Nokogiri::HTML.fragment(post.body)
image_tags = document.css("img")
assert_equal 1, image_tags.count, "Post body should have one image tag"
# Note that, now that the image is saved, this URL is different than
# the one submitted to :create
assert_equal image.image.url, image_tags.first.attributes["src"].value
end
test "should not create post if not logged in" do
newPost = FactoryGirl.build(:post)
assert_no_difference('Post.count') do
post :create, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
end
assert_response :redirect
assert_match /not authorized/, flash[:error]
end
test "should show draft post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
# Should show draft post
newPost = FactoryGirl.create(:post)
get :show, id: newPost
assert_response :success
assert_equal newPost, assigns(:post)
end
test "should show published post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
# Should show published post
newPost = FactoryGirl.create(:published_post)
get :show, id: newPost
assert_response :success
assert_equal newPost, assigns(:post)
end
test "should not show draft post if not logged in" do
# Should not show draft post
newPost = FactoryGirl.create(:post)
# Controller should hide the "permission denied" in a "not-found"
assert_raises ActiveRecord::RecordNotFound do
get :show, id: newPost
end
end
test "should show published post if not logged in" do
# Should show published post
newPost = FactoryGirl.create(:published_post)
get :show, id: newPost
assert_response :success
assert_equal newPost, assigns(:post)
end
test "should show post via id" do
post = FactoryGirl.create(:published_post, title: "New Post")
# Test with ID
get :show, id: post.id
assert_response :redirect,
"Visiting a post by ID should redirect to slug"
assert_equal post, assigns(:post)
end
test "should show post via slug" do
post = FactoryGirl.create(:published_post, title: "New Post")
# Test with slug
get :show, id: post.friendly_id
assert_response :success
assert_equal post, assigns(:post)
end
test "should not show draft post via old slugs" do
user = FactoryGirl.create(:user)
sign_in user
post = FactoryGirl.create(:post, title: "New Post")
old_slug = post.friendly_id
# Now change slug
post.title = "New Post Modified"
post.save
# Verify that old slug doesn't work
assert_raises ActiveRecord::RecordNotFound,
"Draft posts should not maintain slug history" do
get :show, id: old_slug
end
end
test "should show published post via old slugs" do
post = FactoryGirl.create(:published_post, title: "New Post")
old_slug = post.friendly_id
# Now change slug
post.title = "New Post Modified"
post.save
# Verify that old slug still works
get :show, id: old_slug
assert_response :redirect, "This should redirect to the current slug"
assert_equal assigns(:post), post
end
test "should get edit if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.create(:post)
get :edit, id: newPost
assert_response :success
assert_equal assigns(:post), newPost
end
test "should not get edit if not logged in" do
newPost = FactoryGirl.create(:post)
get :edit, id: newPost
assert_response :redirect
assert_match /not authorized/, flash[:error]
end
test "should update post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.create(:post)
patch :update, id: newPost, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
assert_redirected_to post_path(assigns(:post))
assert_match /successfully updated/, flash[:notice]
refute assigns(:post).published?
end
test "should publish post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.create(:post)
patch :update, id: newPost, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}, publish: "true"
assert_redirected_to post_path(assigns(:post))
assert_match /successfully updated/, flash[:notice]
assert assigns(:post).published?, "Post should now be published!"
end
test "should upload images when updating a post" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.create(:post)
image = FactoryGirl.build(:image, post: newPost)
newPost.body = ""
patch :update, id: newPost, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
post = Post.first # This works since there's only one
assert_equal 1, post.images.count, "The post should have an image"
image = post.images.first
save_path = File.join(Rails.public_path, image.image.store_dir)
saved_file_path = File.join(save_path, image.image_identifier)
assert File.exist?(saved_file_path), "File should be saved: #{saved_file_path}"
document = Nokogiri::HTML.fragment(post.body)
image_tags = document.css("img")
assert_equal 1, image_tags.count,
"Post body should contain one image tag"
# Note that, now that the image is saved, this URL is different than
# the one submitted to :create
assert_equal image.image.url, image_tags.first.attributes["src"].value
end
test "should not update post if not logged in" do
newPost = FactoryGirl.create(:post)
patch :update, id: newPost, post: {
author_id: newPost.author_id,
body: newPost.body,
title: newPost.title
}
assert_response :redirect
assert_match /not authorized/, flash[:error]
end
test "should destroy post if logged in" do
user = FactoryGirl.create(:user)
sign_in user
newPost = FactoryGirl.create(:post)
assert_difference('Post.count', -1) do
delete :destroy, id: newPost
end
assert_redirected_to posts_path
assert_match /successfully destroyed/, flash[:notice]
end
test "should not destroy post if not logged in" do
newPost = FactoryGirl.create(:post)
assert_no_difference('Post.count') do
delete :destroy, id: newPost
end
assert_response :redirect
assert_match /not authorized/, flash[:error]
end
end
end