# frozen_string_literal: true describe JekyllRedirectFrom::RedirectPage do let(:from) { "/foo" } let(:to) { "/bar" } let(:site_url) { site.config["url"] } subject { described_class.from_paths(site, from, to) } before { site.read } context "being a page" do before { subject.read_yaml(nil, nil, nil) } it "returns no content" do expect(subject.content).to eql("") end it "returns no output" do expect(subject.output).to eql("") end it "sets default data" do expect(subject.to_liquid["layout"]).to eql("redirect") expect(subject.to_liquid["sitemap"]).to be_falsey end end context "creating a page from paths" do it "sets the permalink" do expect(subject.to_liquid["permalink"]).to eql(from) end it "sets redirect metadata" do expect(subject.to_liquid).to have_key("redirect") expect(subject.to_liquid["redirect"]["from"]).to eql(from) expect(subject.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") end context "with a document" do let(:doc) { site.documents.first } context "redirect from" do let(:page) { described_class.redirect_from(doc, from) } it "creates with redirect_from" do expect(page.to_liquid["permalink"]).to eql(from) expect(page.to_liquid).to have_key("redirect") expect(page.to_liquid["redirect"]["from"]).to eql(from) expected = "http://jekyllrb.com/2014/01/03/redirect-me-plz.html" expect(page.to_liquid["redirect"]["to"]).to eql(expected) end end context "redirect to" do let(:page) { described_class.redirect_to(doc, to) } context "redirecting to a path" do let(:to) { "/bar" } it "redirects" do expect(page.to_liquid["permalink"]).to eql("/2014/01/03/redirect-me-plz.html") expect(page.to_liquid).to have_key("redirect") expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") expect(page.to_liquid["redirect"]["from"]).to eql("/2014/01/03/redirect-me-plz.html") end context "with no leading slash" do let(:to) { "bar" } it "redirects" do expect(page.to_liquid).to have_key("redirect") expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}/#{to}") end end context "with a trailing slash" do let(:to) { "/bar/" } it "redirects" do expect(page.to_liquid).to have_key("redirect") expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") end end end context "redirecting to a URL" do let(:to) { "https://foo.invalid" } it "redirects" do expect(page.to_liquid["permalink"]).to eql("/2014/01/03/redirect-me-plz.html") expect(page.to_liquid).to have_key("redirect") expect(page.to_liquid["redirect"]["to"]).to eql("https://foo.invalid") expect(page.to_liquid["redirect"]["from"]).to eql("/2014/01/03/redirect-me-plz.html") end end end end end context "setting the paths" do let(:from) { "/foo2" } let(:to) { "/bar2" } before { subject.set_paths(from, to) } it "sets the paths" do expect(subject.to_liquid["permalink"]).to eql(from) expect(subject.to_liquid).to have_key("redirect") expect(subject.to_liquid["redirect"]["from"]).to eql(from) expect(subject.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") end end context "generating" do before { site.generate } let(:output) { Jekyll::Renderer.new(site, subject, site.site_payload).run } it "renders the template" do expect(output).to_not be_nil expect(output.to_s).to_not be_empty end it "contains the meta refresh tag" do expect(output).to match("") end it "contains the javascript redirect" do expect(output).to match("") end it "contains canonical link in header" do expect(output).to match("") end it "contains the clickable link" do expect(output).to match("Click here if you are not redirected.") end end context "redirect from destination" do context "when redirect from has no extension" do let(:from) { "/foo" } it "adds .html" do expected = File.expand_path "foo.html", site.dest expect(subject.destination("/")).to eql(expected) end end context "when redirect from is a directory" do let(:from) { "/foo/" } it "knows to add the index.html" do expected = File.expand_path "foo/index.html", site.dest expect(subject.destination("/")).to eql(expected) end end context "when redirect from is an HTML file" do let(:from) { "/foo.html" } it "adds .html" do expected = File.expand_path "foo.html", site.dest expect(subject.destination("/")).to eql(expected) end end context "when redirect from is another extension" do let(:from) { "/foo.htm" } it "doesn't add .html" do expected = File.expand_path "foo.htm", site.dest expect(subject.destination("/")).to eql(expected) end end context "when redirect from has no leading slash" do let(:from) { "foo" } it "adds the slash" do expected = File.expand_path "foo.html", site.dest expect(subject.destination("/")).to eql(expected) end end end context "output extension" do context "with an extension" do let(:from) { "foo.htm" } it "honors the extension" do expect(subject.output_ext).to eql(".htm") end end context "with a trailing slash" do let(:from) { "foo/" } it "uses HTML" do expect(subject.output_ext).to eql(".html") end end context "with no slash" do let(:from) { "foo" } it "uses HTML" do expect(subject.output_ext).to eql(".html") end end end end