From ff2954cc63535d4c98238bc2267a9f0cd213a1dc Mon Sep 17 00:00:00 2001 From: miteruzo Date: Fri, 10 Jul 2026 00:56:36 +0900 Subject: [PATCH] #398 --- backend/spec/requests/preview_spec.rb | 46 +++++++++++++++++++-------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/backend/spec/requests/preview_spec.rb b/backend/spec/requests/preview_spec.rb index c7d9d25..b69130e 100644 --- a/backend/spec/requests/preview_spec.rb +++ b/backend/spec/requests/preview_spec.rb @@ -1,28 +1,46 @@ -require "rails_helper" +require 'rails_helper' -RSpec.describe "Preview", type: :request do - describe "GET /preview/title" do - it "401 unless logged in" do +RSpec.describe 'Preview', type: :request do + describe 'GET /preview/title' do + it '401 unless logged in' do sign_out - get "/preview/title", params: { url: "example.com" } + get '/preview/title', params: { url: 'example.com' } expect(response).to have_http_status(:unauthorized) end - it "400 when url blank" do - sign_in_as(create(:user)) - get "/preview/title", params: { url: "" } + it '403 when logged in as guest' do + sign_in_as(create(:user, :guest)) + get '/preview/title', params: { url: 'example.com' } + expect(response).to have_http_status(:forbidden) + end + + it '400 when url blank' do + sign_in_as(create(:user, :member)) + get '/preview/title', params: { url: '' } expect(response).to have_http_status(:bad_request) end - it "returns parsed title (stubbing URI.open)" do - sign_in_as(create(:user)) - fake_html = " Hello " - allow(URI).to receive(:open).and_return(StringIO.new(fake_html)) + it 'returns parsed title' do + sign_in_as(create(:user, :member)) + allow(Preview::ThumbnailFetcher) + .to receive(:title) + .with('example.com') + .and_return('Hello') - get "/preview/title", params: { url: "example.com" } + get '/preview/title', params: { url: 'example.com' } expect(response).to have_http_status(:ok) - expect(json["title"]).to eq("Hello") + expect(json['title']).to eq('Hello') + end + + it '413 when fetched response is too large' do + sign_in_as(create(:user, :member)) + allow(Preview::ThumbnailFetcher) + .to receive(:title) + .and_raise(Preview::HttpFetcher::ResponseTooLarge, '外部データが大きすぎます.') + + get '/preview/title', params: { url: 'example.com' } + expect(response).to have_http_status(:payload_too_large) end end end