diff --git a/test/controllers/posts_controller_test.rb b/test/controllers/posts_controller_test.rb
index 4f468979b38510b319130977cc29ca1cf31074a3..9c3465f1951c2a10651845d7e79f12793a3ef83b 100644
--- a/test/controllers/posts_controller_test.rb
+++ b/test/controllers/posts_controller_test.rb
@@ -316,4 +316,66 @@ class PostsControllerTest < ActionController::TestCase
     end
     assert_equal 'success', JSON.parse(response.body)['status']
   end
+
+  test 'close requires authentication' do
+    post :close, params: { id: posts(:question_one).id, reason_id: close_reasons(:not_good).id }
+    assert_response 302
+    assert_redirected_to new_user_session_path
+  end
+
+  test 'unprivileged user cannot close' do
+    sign_in users(:standard_user)
+    before_history = PostHistory.where(post: posts(:question_one)).count
+    post :close, params: { id: posts(:question_one).id, reason_id: close_reasons(:not_good).id }
+    after_history = PostHistory.where(post: posts(:question_one)).count
+    assert_response 403
+    assert_not_nil assigns(:post)
+    assert_equal before_history, after_history, 'PostHistory event incorrectly created on closure'
+    assert_nothing_raised do
+      JSON.parse(response.body)
+    end
+    assert_equal 'failed', JSON.parse(response.body)['status']
+  end
+
+  test 'cannot close a closed post' do
+    sign_in users(:closer)
+    before_history = PostHistory.where(post: posts(:closed)).count
+    post :close, params: { id: posts(:closed).id, reason_id: close_reasons(:not_good).id }
+    after_history = PostHistory.where(post: posts(:closed)).count
+    assert_response 400
+    assert_not_nil assigns(:post)
+    assert_equal before_history, after_history, 'PostHistory event incorrectly created on closure'
+    assert_nothing_raised do
+      JSON.parse(response.body)
+    end
+    assert_equal 'failed', JSON.parse(response.body)['status']
+  end
+
+  test 'close rejects nonexistent close reason' do
+    sign_in users(:closer)
+    before_history = PostHistory.where(post: posts(:question_one)).count
+    post :close, params: { id: posts(:question_one).id, reason_id: -999 }
+    after_history = PostHistory.where(post: posts(:question_one)).count
+    assert_response 404
+    assert_not_nil assigns(:post)
+    assert_equal before_history, after_history, 'PostHistory event incorrectly created on closure'
+    assert_nothing_raised do
+      JSON.parse(response.body)
+    end
+    assert_equal 'failed', JSON.parse(response.body)['status']
+  end
+
+  test 'close ensures other post exists if reason requires it' do
+    sign_in users(:closer)
+    before_history = PostHistory.where(post: posts(:question_one)).count
+    post :close, params: { id: posts(:question_one).id, reason_id: close_reasons(:duplicate) }
+    after_history = PostHistory.where(post: posts(:question_one)).count
+    assert_response 400
+    assert_not_nil assigns(:post)
+    assert_equal before_history, after_history, 'PostHistory event incorrectly created on closure'
+    assert_nothing_raised do
+      JSON.parse(response.body)
+    end
+    assert_equal 'failed', JSON.parse(response.body)['status']
+  end
 end