require 'spec_helper'

RSpec.describe Jekyll::PoolePlugin::Tags do
  let(:index) { { registers: { site: @site, page: @index_page } } }
  let(:default) { { registers: { site: @site, page: @default_post } } }
  let(:custom) { { registers: { site: @site, page: @custom_post } } }
  let(:page) { { registers: { site: @site, page: @about_page } } }

  def render(content, page)
    ::Liquid::Template.parse(content).render({}, page)
  end

  def render_meta(property, content)
    template  = Jekyll::PoolePlugin::Renderer.const_get :META_TAG

    format template, property: property, content: content
  end

  def render_link(rel, href)
    template  = Jekyll::PoolePlugin::Renderer.const_get :LINK_TAG

    format template, rel: rel, href: href
  end

  context '{% poole_tags <tag> %}' do

    # What values will the index page give?
    context 'Index page' do
      context 'site name' do
        subject { render('{% poole_tags site_name %}', index) }
        it { is_expected.to eql render_meta('og:site_name', 'Site Name') }
      end

      context 'page title' do
        subject { render('{% poole_tags title %}', index) }
        it { is_expected.to eql render_meta('og:title', 'Site Name') }
      end

      context 'type' do
        subject { render('{% poole_tags type %}', index) }
        it { is_expected.to eql render_meta('og:type', 'website') }
      end

      context 'description' do
        subject { render('{% poole_tags description %}', index) }
        it { is_expected.to be_empty }
      end

      context 'published_time' do
        subject { render('{% poole_tags published_time %}', index) }
        it { is_expected.to be_empty }
      end

      context 'author' do
        subject { render('{% poole_tags author %}', index) }
        it do
          is_expected.to eql render_meta(
          'article:author',
          'https://google.com')
        end
      end

      context 'url' do
        subject { render('{% poole_tags url %}', index) }
        it do
          is_expected.to eql render_meta(
          'og:url', 'https://iamcarrico.com/')
        end
      end

      context 'canonical' do
        subject { render('{% poole_tags canonical %}', index) }
        it do
          is_expected.to eql render_link(
          'canonical',
          'https://iamcarrico.com/')
        end
      end

      context 'image' do
        subject { render('{% poole_tags image %}', index) }
        it do
          is_expected.to eql render_meta(
          'og:image',
          'https://iamcarrico.com/img/logo.png')
        end
      end
    end

    # The values that a default post, without customization will give.
    context 'Default post' do
      context 'site name' do
        subject { render('{% poole_tags site_name %}', default) }
        it { is_expected.to eql render_meta('og:site_name', 'Site Name') }
      end

      context 'page title' do
        subject { render('{% poole_tags title %}', default) }
        it { is_expected.to eql render_meta('og:title', 'Default Tags') }
      end

      context 'type' do
        subject { render('{% poole_tags type %}', default) }
        it { is_expected.to eql render_meta('og:type', 'article') }
      end

      context 'description' do
        subject { render('{% poole_tags description %}', default) }
        it { is_expected.to be_empty }
      end

      context 'published_time' do
        subject { render('{% poole_tags published_time %}', default) }
        it do
          is_expected.to eql render_meta(
          'article:published_time',
          '2014-11-21T06:00:00-06:00')
        end
      end

      context 'author' do
        subject { render('{% poole_tags author %}', default) }
        it do
          is_expected.to eql render_meta(
          'article:author',
          'https://google.com')
        end
      end

      context 'url' do
        subject { render('{% poole_tags url %}', default) }
        it do
          is_expected.to eql render_meta(
          'og:url',
          'https://iamcarrico.com/2014/11/21/default-tags.html')
        end
      end

      context 'canonical' do
        subject { render('{% poole_tags canonical %}', default) }
        it do
          is_expected.to eql render_link(
          'canonical',
          'https://iamcarrico.com/2014/11/21/default-tags.html')
        end
      end

      context 'image' do
        subject { render('{% poole_tags image %}', default) }
        it do
          is_expected.to eql render_meta(
          'og:image', 'https://iamcarrico.com/img/logo.png')
        end
      end
    end

    # A custom post, with specific values for each field.
    context 'Custom post' do
      context 'site name' do
        subject { render('{% poole_tags site_name %}', custom) }
        it { is_expected.to eql render_meta('og:site_name', 'Site Name') }
      end

      context 'page title' do
        subject { render('{% poole_tags title %}', custom) }
        it { is_expected.to eql render_meta('og:title', 'Custom Tags') }
      end

      context 'type' do
        subject { render('{% poole_tags type %}', custom) }
        it { is_expected.to eql render_meta('og:type', 'article') }
      end

      context 'description' do
        subject { render('{% poole_tags description %}', custom) }
        it do
          is_expected.to eql render_meta(
          'og:description',
          'What can Mr. Poole do for you')
        end
      end

      context 'published_time' do
        subject { render('{% poole_tags published_time %}', custom) }
        it do
          is_expected.to eql render_meta(
          'article:published_time',
          '2014-11-22T06:00:00-06:00')
        end
      end

      context 'author' do
        subject { render('{% poole_tags author %}', custom) }
        it do
          is_expected.to eql render_meta(
          'article:author',
          'https://google.com')
        end
      end

      context 'url' do
        subject { render('{% poole_tags url %}', custom) }
        it do
          is_expected.to eql render_meta(
          'og:url',
          'https://iamcarrico.com/2014/11/22/what-can-poole-do-for-you.html')
        end
      end

      context 'canonical' do
        subject { render('{% poole_tags canonical %}', custom) }
        it do
          is_expected.to eql render_link(
          'canonical',
          'https://iamcarrico.com/2014/11/22/what-can-poole-do-for-you.html')
        end
      end

      context 'image' do
        subject { render('{% poole_tags image %}', custom) }
        it do
          is_expected.to eql render_meta(
          'og:image',
          'https://iamcarrico.com/img/custom-image.png')
        end
      end
    end

    # A page being rendered.
    context 'About page' do
      context 'site name' do
        subject { render('{% poole_tags site_name %}', page) }
        it { is_expected.to eql render_meta('og:site_name', 'Site Name') }
      end

      context 'page title' do
        subject { render('{% poole_tags title %}', page) }
        it { is_expected.to eql render_meta('og:title', 'About Us') }
      end

      context 'type' do
        subject { render('{% poole_tags type %}', page) }
        it { is_expected.to eql render_meta('og:type', 'article') }
      end

      context 'description' do
        subject { render('{% poole_tags description %}', page) }
        it { is_expected.to be_empty }
      end

      context 'published_time' do
        subject { render('{% poole_tags published_time %}', page) }
        it { is_expected.to be_empty }
      end

      context 'author' do
        subject { render('{% poole_tags author %}', page) }
        it do
          is_expected.to eql render_meta(
          'article:author',
          'https://google.com')
        end
      end

      context 'url' do
        subject { render('{% poole_tags url %}', page) }
        it do
          is_expected.to eql render_meta(
          'og:url',
          'https://iamcarrico.com/about.html')
        end
      end

      context 'canonical' do
        subject { render('{% poole_tags canonical %}', page) }
        it do
          is_expected.to eql render_link(
          'canonical',
          'https://iamcarrico.com/about.html')
        end
      end

      context 'image' do
        subject { render('{% poole_tags image %}', page) }
        it do
          is_expected.to eql render_meta(
          'og:image',
          'https://iamcarrico.com/img/logo.png')
        end
      end
    end
  end
end