Newer
Older
# frozen_string_literal: true
# Copyright (c) 2010-2011, Diaspora Inc. This file is
MrZYX
a validé
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
describe LikesController, type: :controller do
MrZYX
a validé
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
@bobs_aspect = bob.aspects.where(:name => "generic").first
MrZYX
a validé
MrZYX
a validé
end
describe "#create" do
let(:like_hash) {
{post_id: @target.id}
}
context "on my own post" do
it "succeeds" do
@target = alice.post :status_message, text: "AWESOME", to: @alices_aspect.id
post :create, params: like_hash, format: :json
expect(response.code).to eq("201")
MrZYX
a validé
end
end
context "on a post from a contact" do
before do
@target = bob.post(:status_message, text: "AWESOME", to: @bobs_aspect.id)
end
it "likes" do
expect(response.code).to eq("201")
end
it "doesn't post multiple times" do
alice.like!(@target)
expect(response.code).to eq("422")
end
end
context "on a post from a stranger" do
before do
@target = eve.post :status_message, text: "AWESOME", to: eve.aspects.first.id
MrZYX
a validé
end
it "doesn't post" do
expect(alice).not_to receive(:like!)
expect(response.code).to eq("422")
MrZYX
a validé
end
end
context "when an the exception is raised" do
before do
@target = alice.post :status_message, text: "AWESOME", to: @alices_aspect.id
end
it "should be catched when it means that the target is not found" do
post :create, params: {post_id: -1}, format: :json
expect(response.code).to eq("422")
end
it "should not be catched when it is unexpected" do
@target = alice.post :status_message, text: "AWESOME", to: @alices_aspect.id
allow(alice).to receive(:like!).and_raise("something")
allow(@controller).to receive(:current_user).and_return(alice)
expect { post :create, params: like_hash, format: :json }.to raise_error("something")
end
end
end
describe "#index" do
before do
@message = alice.post(:status_message, text: "hey", to: @alices_aspect.id)
end
it "returns a 404 for a post not visible to the user" do
sign_in eve
expect {
get :index, params: {post_id: @message.id}
}.to raise_error(ActiveRecord::RecordNotFound)
end
it "returns an array of likes for a post" do
bob.like!(@message)
get :index, params: {post_id: @message.id}
expect(JSON.parse(response.body).map {|h| h["id"] }).to match_array(@message.likes.map(&:id))
end
it "returns an empty array for a post with no likes" do
get :index, params: {post_id: @message.id}
expect(JSON.parse(response.body)).to eq([])
end
it "returns likes for a public post without login" do
post = alice.post(:status_message, text: "hey", public: true)
bob.like!(post)
sign_out :user
get :index, params: {post_id: post.id}, format: :json
expect(JSON.parse(response.body).map {|h| h["id"] }).to match_array(post.likes.map(&:id))
it "returns a 401 for a private post when logged out" do
bob.like!(@message)
sign_out :user
get :index, params: {post_id: @message.id}, format: :json
expect(response.status).to eq(401)
end
end
describe "#destroy" do
before do
@message = bob.post(:status_message, text: "hey", to: @alices_aspect.id)
@like = alice.like!(@message)
end
it "lets a user destroy their like" do
current_user = controller.send(:current_user)
expect(current_user).to receive(:retract).with(@like)
delete :destroy, params: {post_id: @message.id, id: @like.id}, format: :json
expect(response.status).to eq(204)
end
it "does not let a user destroy other likes" do
like2 = eve.like!(@message)
like_count = Like.count
delete :destroy, params: {post_id: @message.id, id: like2.id}, format: :json
expect(response.status).to eq(404)
expect(response.body).to eq(I18n.t("likes.destroy.error"))
expect(Like.count).to eq(like_count)
end