require "spec_helper" describe BuntoRedirectFrom::Redirector do let(:redirector) { described_class.new } let(:post_to_redirect) { setup_post("2014-01-03-redirect-me-plz.md") } let(:doc_to_redirect_from) { setup_doc("redirect-me-plz.md") } let(:doc_to_redirect_to) { setup_doc("redirect-somewhere-else-plz.html") } let(:page_with_one) { setup_page("one_redirect_url.md") } let(:page_with_many) { setup_page("multiple_redirect_urls.md") } let(:page_with_one_redirect_to) { setup_page("one_redirect_to.md") } let(:page_with_many_redirect_to) { setup_page("multiple_redirect_tos.md") } it "knows if a page or post is requesting a redirect page" do if Bunto::VERSION < '3.0.0' expect(redirector.has_alt_urls?(post_to_redirect)).to be_truthy else skip "Don't need to test posts in Bunto 3" end end it "knows if a document is requesting a redirect page" do expect(redirector.has_alt_urls?(doc_to_redirect_from)).to be_truthy end it "knows if a document is requesting a redirect away" do expect(redirector.redirect_to_url(doc_to_redirect_to)).to eql(["http://www.zombo.com"]) end it "handles one redirect path" do expect(redirector.alt_urls(page_with_one)).to eql(["mencius/was/my/father"]) end it "handles many redirect paths" do expect(redirector.alt_urls(page_with_many)).to eql(["help", "contact", "let-there/be/light-he-said", "/geepers/mccreepin"]) end it "handles a single redirect_to url" do expect(redirector.redirect_to_url(page_with_one_redirect_to)).to eql(["https://www.github.com"]) end it "handles a many redirect_to urls" do expect(redirector.redirect_to_url(page_with_many_redirect_to)).to eql(["https://www.bunto.isc"]) end it "does not include pages with a redirect in sitemap" do expect(destination_sitemap).not_to include(%|one_redirect_to.html|) end context "refresh page generation" do before(:each) do described_class.new.generate(@site) end it "generates the refresh page for the post properly" do expect(destination_file_exists?("posts/23128432159832/mary-had-a-little-lamb")).to be_truthy end it "generates the refresh pages for the page with multiple redirect_from urls" do expect(destination_file_exists?("help")).to be_truthy expect(destination_file_exists?("contact")).to be_truthy expect(destination_file_exists?("let-there/be/light-he-said")).to be_truthy expect(destination_file_exists?("/geepers/mccreepin")).to be_truthy end it "generates the refresh page for the page with one redirect_from url" do expect(destination_file_exists?("mencius/was/my/father")).to be_truthy end it "generates the refresh page for the collection with one redirect_to url" do expect(@dest.join("articles", "redirect-somewhere-else-plz.html")).to exist expect(destination_doc_contents("articles", "redirect-somewhere-else-plz.html")).to include(%||) end it "generates the refresh page for the page with one redirect_to url" do expect(destination_file_exists?("one_redirect_to.html")).to be_truthy expect(destination_file_contents("one_redirect_to.html")).to include(%||) end it "generates the refresh page for the page with multiple redirect_to urls" do expect(destination_file_exists?("multiple_redirect_tos.html")).to be_truthy expect(destination_file_contents("multiple_redirect_tos.html")).to include(%||) end end context "prefix" do it "uses site.github.url as the redirect prefix" do @site.config['github'] = { "url" => "http://example.github.io/test" } expect(redirector.redirect_url(@site, page_with_one)).to start_with("http://example.github.io/test") end it "converts non-string values in site.github.url to strings" do @site.config['github'] = { "url" => TestStringContainer.new("http://example.github.io/test") } expect(redirector.redirect_url(@site, page_with_one)).to start_with("http://example.github.io/test") end it "uses site.baseurl as the redirect prefix when site.github.url is not set" do @site.config['baseurl'] = "/fancy/prefix" expect(redirector.redirect_url(@site, page_with_one)).to start_with("/fancy/prefix") end it "prefers site.github.url over site.baseurl" do @site.config['github'] = { "url" => "http://example.github.io/test" } @site.config['baseurl'] = "/fancy/baseurl" expect(redirector.redirect_url(@site, page_with_one)).to start_with("http://example.github.io/test") end it "no-ops when site.github.url and site.baseurl are not set" do expect(redirector.redirect_url(@site, page_with_one)).to eql("/one_redirect_url.html") end it "no-ops when site.github is set but site.github.url is not" do @site.config['github'] = "username" expect(redirector.redirect_url(@site, page_with_one)).to eql("/one_redirect_url.html") end end end