docbrown/spec/models/page_spec.rb
Jeremy Friesen 711f1bb0cd
Let override of ToS and CoC show in onboarding (#16217)
* Let override of ToS and CoC show in onboarding

Prior to this commit any changes to the terms or code of conduct were
not reflected in the onboarding links.

With this commit, I'm leveraging a newly created method that first
checks if there's a page for the given slug.  If there is, use that
page's copy.

To test:

- Overwrite default /terms page on a Forem
- Navigate to /onboarding or sign up as a new user
- Click on Terms of Use link text
- Review Terms of Use

Closes #15296

* Adding spec around not passing a block
2022-01-20 19:45:39 -05:00

113 lines
3.6 KiB
Ruby

require "rails_helper"
RSpec.describe Page, type: :model do
describe ".render_safe_html_for" do
let(:slug) { "the-given-slug" }
context "when no matching slug in Page database" do
specify { expect { |b| described_class.render_safe_html_for(slug: slug, &b) }.to yield_control }
end
context "when no matching slug and the caller didn't pass a block" do
# Instead of raising an exception we could "silently" do nothing. That too might be
# reasonable. But this seems like a good enough test.
it "raises an exception" do
expect { described_class.render_safe_html_for(slug: slug) }.to raise_error(LocalJumpError)
end
end
context "when there's a matching slug" do
subject(:rendered_html) { described_class.render_safe_html_for(slug: page.slug) }
let!(:page) { create(:page, slug: "the-given-slug") }
it { is_expected.to be_html_safe }
it "returns the html safe version of the processed_html" do
expect(rendered_html).to eq(page.processed_html)
end
specify { expect { |b| described_class.render_safe_html_for(slug: slug, &b) }.not_to yield_control }
end
end
describe "#validations" do
it "requires either body_markdown, body_html, or body_json" do
page = build(:page)
page.body_html = nil
page.body_markdown = nil
page.body_json = nil
expect(page).not_to be_valid
end
it "takes organization slug into account" do
create(:organization, slug: "benandfriends")
page = build(:page, slug: "benandfriends")
expect(page).not_to be_valid
expect(page.errors[:slug].to_s.include?("taken")).to be true
end
it "takes podcast slug into account" do
create(:podcast, slug: "benmeetsworld")
page = build(:page, slug: "benmeetsworld")
expect(page).not_to be_valid
expect(page.errors[:slug].to_s.include?("taken")).to be true
end
it "takes user username into account" do
create(:user, username: "bennybenben")
page = build(:page, slug: "bennybenben")
expect(page).not_to be_valid
expect(page.errors[:slug].to_s.include?("taken")).to be true
end
it "takes sitemap into account" do
page = build(:page, slug: "sitemap-hey")
expect(page).not_to be_valid
expect(page.errors[:slug].to_s.include?("taken")).to be true
end
end
context "when callbacks are triggered before save" do
let(:page) { create(:page) }
describe "#processed_html" do
it "accepts body markdown and turns it into html" do
page.update(body_markdown: "Hello `heyhey`")
expect(page.processed_html).to include("<code>")
end
it "accepts body html without changing it" do
html = "Hello `heyhey`"
page.update(body_html: html, body_markdown: "")
expect(page.processed_html).to eq(html)
end
end
end
context "when callbacks are triggered after commit" do
let(:page) { create(:page) }
it "triggers cache busting on save" do
sidekiq_assert_enqueued_with(job: Pages::BustCacheWorker, args: [page.slug]) do
page.save
end
end
it "ensures only one page can be a landing page on create" do
p1 = create(:page, landing_page: true)
create(:page, landing_page: true)
expect(p1.reload.landing_page).to be(false)
end
it "ensures only one page can be a landing page on update" do
p1 = create(:page, landing_page: true)
p2 = create(:page, landing_page: false)
p2.update(landing_page: true)
expect(p1.reload.landing_page).to be(false)
end
end
end