Skip to content
Extraits de code Groupes Projets
likes_controller_spec.rb 4,29 ko
Newer Older
  • Learn to ignore specific revisions
  • # frozen_string_literal: true
    
    
    #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
    
    #   licensed under the Affero General Public License version 3 or later.  See
    #   the COPYRIGHT file.
    
    
    describe LikesController, type: :controller do
    
        @alices_aspect = alice.aspects.where(:name => "generic").first
        @bobs_aspect = bob.aspects.where(:name => "generic").first
    
    cmrd Senya's avatar
    cmrd Senya a validé
        sign_in(alice, scope: :user)
    
      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")
    
        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
    
            post :create, params: like_hash
    
            expect(response.code).to eq("201")
          end
    
          it "doesn't post multiple times" do
            alice.like!(@target)
    
            post :create, params: like_hash
    
            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
    
          it "doesn't post" do
            expect(alice).not_to receive(:like!)
    
            post :create, params: like_hash
    
            expect(response.code).to eq("422")
    
    
        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