Untitled

mail@pastecode.io avatar
unknown
ruby
2 months ago
4.0 kB
8
Indexable
Never
describe RatingsController, type: :request do
  let!(:user1) { create(:user, email: "user1@mail.com", confirmed_at: Time.zone.now) }
  let!(:user2) { create(:user, email: "user2@mail.com", confirmed_at: Time.zone.now) }
  let!(:post1) { create(:post, user: user1) }

  describe "POST #create" do
    it "should return 400 (bad request) when rating_score is absent" do
      post "/rating/#{post1.slug}"

      expect(response).to have_http_status(:bad_request)
    end

    it "should return 404 (not found) when post with provided slug does not exists" do
      post "/rating/random-slug-string", params: { rating_score: 5 }

      expect(response).to have_http_status(:not_found)
    end

    it "should return 400 (bad request) if user is same as post author" do
      sign_in user1
      post "/rating/#{post1.slug}", params: { rating_score: 5 }

      expect(response).to have_http_status(:bad_request)
    end

    it "should create a post rating relation for the post" do
      post "/rating/#{post1.slug}", params: { rating_score: 5 }

      expect(post1.post_rating).to_not eq nil
    end

    context "with ip address" do
      before do
        post "/rating/#{post1.slug}", params: { rating_score: 5 }, env: { HTTP_CF_CONNECTING_IP: "123.456.789.123" }
      end

      context "and rate once" do
        it "should return 200 (ok) and create a rating with ip address" do
          expect(response).to have_http_status(:ok)
          expect(post1.post_rating.ratings.count).to eq 1
          expect(post1.post_rating.ratings.last.ip_address).to eq "123.456.789.123"
        end
      end

      context "and rate twice" do
        context "with the same ip address" do
          before do
            post "/rating/#{post1.slug}", params: { rating_score: 5 }, env: { HTTP_CF_CONNECTING_IP: "123.456.789.123" }
          end

          it "should return 200 (ok) but should not create a new rating" do
            expect(response).to have_http_status(:ok)
            expect(post1.post_rating.ratings.count).to eq 1
          end
        end

        context "with a different ip address" do
          before do
            post "/rating/#{post1.slug}", params: { rating_score: 5 }, env: { HTTP_CF_CONNECTING_IP: "123.456.789.124" }
          end

          it "should return 200 (ok) and create a rating with ip address" do
            expect(response).to have_http_status(:ok)
            expect(post1.post_rating.ratings.count).to eq 2
            expect(post1.post_rating.ratings.last.ip_address).to eq "123.456.789.124"
          end
        end
      end
    end

    context "as an anonymous user" do
      before do
        post "/rating/#{post1.slug}", params: { rating_score: 5 }
      end

      it "should return 200 (ok) and create a rating without user id" do
        expect(response).to have_http_status(:ok)
        expect(post1.post_rating.ratings.count).to eq 1
        expect(post1.post_rating.ratings.last.user_id).to eq nil
      end
    end

    context "as a logged in user" do
      context "and user has not rated" do
        before do
          sign_in user2
          post "/rating/#{post1.slug}", params: { rating_score: 5 }
        end

        it "should return 200 (ok) and create a rating with user id" do
          expect(response).to have_http_status(:ok)
          expect(post1.post_rating.ratings.count).to eq 1
          expect(post1.post_rating.ratings.last.user_id).to eq user2.id
        end
      end

      context "and user has already rated" do
        let!(:post_rating1) { create(:post_rating, post: post1) }
        let!(:rating) { create(:rating, post_rating: post_rating1, user: user2, rating_score: 5) }

        before do
          sign_in user2
          post "/rating/#{post1.slug}", params: { rating_score: 5 }
        end

        it "should return 400 (bad request) and not create a new rating" do
          expect(response).to have_http_status(:bad_request)
          expect(post1.post_rating.ratings.count).to eq 1
        end
      end
    end
  end
end
Leave a Comment