docbrown/spec/requests/social_previews_spec.rb
Mike Coutermarsh 8afb797ec9 Improve social card caching 🚀 (#3265)
* Add failing tests for social previews controller. HTML changes between
requests, which breaks caching.

Since we use the HTML to generate the cache key. When the views have any
randomness in them, it breaks the cache, which means we regenerate
images on each request, rather than using what's in memcached.

Adding test to protect from regressions

* Fix randomness in social card templates

The aria tags are randomly generated. Since this is for rendering
images, they aren't needed.

* Make the linter happy by using the sanitize helper
2019-06-25 08:45:30 -04:00

144 lines
4.9 KiB
Ruby

require "rails_helper"
RSpec.describe "SocialPreviews", type: :request do
let(:user) { create(:user) }
let(:tag) { create(:tag) }
let(:organization) { create(:organization) }
let(:article) { create(:article, user_id: user.id) }
let(:image_url) { "https://hcti.io/v1/image/6c52de9d-4d37-4008-80f8-67155589e1a1" }
let(:listing) { create(:classified_listing, user_id: user.id, category: "cfp") }
before do
stub_request(:post, /hcti.io/).
to_return(status: 200,
body: "{ \"url\": \"#{image_url}\" }",
headers: { "Content-Type" => "application/json" })
end
describe "GET /social_previews/article/:id" do
it "renders proper article title" do
get "/social_previews/article/#{article.id}"
expect(response.body).to include CGI.escapeHTML(article.title)
end
it "renders consistent HTML between requests" do
# We use the HTML for caching. It needs to be deterministic (if data is unchanged, the HTML should be the same)
get "/social_previews/article/#{article.id}"
first_request_body = response.body
get "/social_previews/article/#{article.id}"
second_request_body = response.body
expect(first_request_body).to eq second_request_body
end
it "renders shecoded template when tagged with shecoded" do
she_coded_article = create(:article, tags: "shecoded")
get "/social_previews/article/#{she_coded_article.id}"
expect(response.body).to include CGI.escapeHTML(she_coded_article.title)
end
it "renders an image when requested and redirects to image url" do
get "/social_previews/article/#{article.id}.png"
expect(response).to redirect_to(image_url)
end
end
describe "GET /social_previews/user/:id" do
it "renders proper user name" do
get "/social_previews/user/#{user.id}"
expect(response.body).to include CGI.escapeHTML(user.name)
end
it "renders consistent HTML between requests" do
# We use the HTML for caching. It needs to be deterministic (if data is unchanged, the HTML should be the same)
get "/social_previews/user/#{user.id}"
first_request_body = response.body
get "/social_previews/user/#{user.id}"
second_request_body = response.body
expect(first_request_body).to eq second_request_body
end
it "renders an image when requested and redirects to image url" do
get "/social_previews/user/#{user.id}.png"
expect(response).to redirect_to(image_url)
end
end
describe "GET /social_previews/organization/:id" do
it "renders proper organization name" do
get "/social_previews/organization/#{organization.id}"
expect(response.body).to include CGI.escapeHTML(organization.name)
end
it "renders consistent HTML between requests" do
# We use the HTML for caching. It needs to be deterministic (if data is unchanged, the HTML should be the same)
get "/social_previews/organization/#{organization.id}"
first_request_body = response.body
get "/social_previews/organization/#{organization.id}"
second_request_body = response.body
expect(first_request_body).to eq second_request_body
end
it "renders an image when requested and redirects to image url" do
get "/social_previews/organization/#{organization.id}.png"
expect(response).to redirect_to(image_url)
end
end
describe "GET /social_previews/tag/:id" do
it "renders proper tag name" do
get "/social_previews/tag/#{tag.id}"
expect(response.body).to include CGI.escapeHTML(tag.name)
end
it "renders consistent HTML between requests" do
# We use the HTML for caching. It needs to be deterministic (if data is unchanged, the HTML should be the same)
get "/social_previews/tag/#{tag.id}"
first_request_body = response.body
get "/social_previews/tag/#{tag.id}"
second_request_body = response.body
expect(first_request_body).to eq second_request_body
end
it "renders an image when requested and redirects to image url" do
get "/social_previews/tag/#{tag.id}.png"
expect(response).to redirect_to(image_url)
end
end
describe "GET /social_previews/listing/:id" do
it "renders pretty category name" do
get "/social_previews/listing/#{listing.id}"
expect(response.body).to include CGI.escapeHTML("Call For Proposal")
end
it "renders consistent HTML between requests" do
# We use the HTML for caching. It needs to be deterministic (if data is unchanged, the HTML should be the same)
get "/social_previews/listing/#{listing.id}"
first_request_body = response.body
get "/social_previews/listing/#{listing.id}"
second_request_body = response.body
expect(first_request_body).to eq second_request_body
end
it "renders and image when requested and redirects to iamge url" do
get "/social_previews/listing/#{listing.id}.png"
expect(response).to redirect_to(image_url)
end
end
end