From 52dfab57d4fdea8a2e6dda61b3b4dcb02ef4aa88 Mon Sep 17 00:00:00 2001 From: Georg Gadinger Date: Thu, 30 Apr 2020 20:46:26 +0200 Subject: [PATCH] add spec for Ajax::FriendController --- .../ajax/friend_controller_spec.rb | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 spec/controllers/ajax/friend_controller_spec.rb diff --git a/spec/controllers/ajax/friend_controller_spec.rb b/spec/controllers/ajax/friend_controller_spec.rb new file mode 100644 index 00000000..13b86ae1 --- /dev/null +++ b/spec/controllers/ajax/friend_controller_spec.rb @@ -0,0 +1,161 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Ajax::FriendController, :ajax_controller, type: :controller do + let(:user) { FactoryBot.create(:user) } + + describe "#create" do + let(:params) do + { + screen_name: screen_name + } + end + + subject { post(:create, params: params) } + + context "when user is signed in" do + before(:each) { sign_in(user) } + + context "when target user exists" do + let(:target_user) { FactoryBot.create(:user) } + let(:screen_name) { target_user.screen_name } + + let(:expected_response) do + { + "success" => true, + "status" => "okay", + "message" => anything + } + end + + it "creates a follow relationship" do + expect(user.friends.ids).not_to include(target_user.id) + expect { subject }.to(change { user.friends.count }.by(1)) + expect(user.friends.ids).to include(target_user.id) + end + + include_examples "returns the expected response" + end + + context "when target user does not exist" do + let(:screen_name) { "tripmeister_eder" } + + let(:expected_response) do + { + "success" => true, + "status" => "okay", + "message" => anything + } + end + + it "does not create a follow relationship" do + expect { subject }.not_to(change { user.friends.count }) + end + + include_examples "returns the expected response" + end + end + + context "when user is not signed in" do + let(:screen_name) { "tutenchamun" } + let(:expected_response) do + { + "success" => false, + "status" => "fail", + "message" => anything + } + end + + include_examples "returns the expected response" + end + end + + describe "#destroy" do + let(:params) do + { + screen_name: screen_name + } + end + + subject { delete(:destroy, params: params) } + + context "when user is signed in" do + before(:each) { sign_in(user) } + + context "when target user exists" do + let(:target_user) { FactoryBot.create(:user) } + let(:screen_name) { target_user.screen_name } + + before(:each) { target_user } + + context "when user follows target" do + let(:expected_response) do + { + "success" => true, + "status" => "okay", + "message" => anything + } + end + + before(:each) { user.follow target_user } + + it "destroys a follow relationship" do + expect(user.friends.ids).to include(target_user.id) + expect { subject }.to(change { user.friends.count }.by(-1)) + expect(user.friends.ids).not_to include(target_user.id) + end + + include_examples "returns the expected response" + end + + context "when user does not already follow target" do + let(:expected_response) do + { + "success" => false, + "status" => "fail", + "message" => anything + } + end + + it "does not destroy a follow relationship" do + expect { subject }.not_to(change { user.friends.count }) + end + + include_examples "returns the expected response" + end + end + + context "when target user does not exist" do + let(:screen_name) { "tripmeister_eder" } + + let(:expected_response) do + { + "success" => false, + "status" => "fail", + "message" => anything + } + end + + it "does not destroy a follow relationship" do + expect { subject }.not_to(change { user.friends.count }) + end + + include_examples "returns the expected response" + end + end + + context "when user is not signed in" do + let(:screen_name) { "tutenchamun" } + let(:expected_response) do + { + "success" => false, + "status" => "fail", + "message" => anything + } + end + + include_examples "returns the expected response" + end + end +end