# encoding: utf-8
require "policy/cli"

describe Policy::CLI, :sandbox, :capture do

  describe ".start" do

    subject { try_in_sandbox { described_class.start options } }

    shared_examples "adding a policy" do |folder: nil|

      let(:filename) { File.join("app", folder, "foo.rb") }

      it "[creates file]" do
        expect(filename).to be_present_in_sandbox
      end

    end # examples

    shared_examples "adding a spec" do |folder: nil|

      let(:filename) { File.join("spec/tests", folder, "foo_spec.rb") }

      it "[creates file]" do
        expect(filename).to be_present_in_sandbox
      end

    end # examples

    shared_examples "adding locales" do |locales, folder: nil|

      let(:dirname) { File.join("config/locales", folder, "foo") }

      it "[creates files]" do
        locales.each do |locale|
          expect("#{ dirname }/#{ locale }.yml").to be_present_in_sandbox
        end
      end

    end # examples

    context "foo" do

      let(:options) { %w(foo) }
      before { subject }

      it_behaves_like "adding a policy", folder: "policies"
      it_behaves_like "adding a spec", folder: "policies"
      it_behaves_like "adding locales", %w(en ru), folder: "policies"

    end # context

    context "foo -n bar/baz" do

      let(:options) { %w(foo -n bar/baz) }
      before { subject }

      it_behaves_like "adding a policy", folder: "bar/baz"
      it_behaves_like "adding a spec", folder: "bar/baz"
      it_behaves_like "adding locales", %w(en ru), folder: "bar/baz"

      it "adds namespace to the policy" do
        content = read_in_sandbox "app/bar/baz/foo.rb"
        expect(content).to include "module Sandbox"
        expect(content).to include "  module Bar"
        expect(content).to include "    module Baz"
      end

      it "describes the specification" do
        content = read_in_sandbox "spec/tests/bar/baz/foo_spec.rb"
        expect(content).to include "describe Sandbox::Bar::Baz::Foo do"
      end

      it "creates the proper locale" do
        content = read_in_sandbox "config/locales/bar/baz/foo/en.yml"
        expect(content).to include "# en:"
        expect(content).to include " sandbox/bar/baz/foo:"
      end

    end # context

    context "foo -a bar baz" do

      let(:options) { %w(foo -a bar baz) }
      before { subject }

      it_behaves_like "adding a policy", folder: "policies"
      it_behaves_like "adding a spec", folder: "policies"
      it_behaves_like "adding locales", %w(en ru), folder: "policies"

      it "adds attributes to the policy" do
        content = read_in_sandbox "app/policies/foo.rb"
        expect(content).to include "attr_reader :bar"
        expect(content).to include "attr_reader :baz"
      end

      it "checks attributes" do
        content = read_in_sandbox "spec/tests/policies/foo_spec.rb"
        expect(content).to include "let(:bar) {"
        expect(content).to include "let(:baz) {"
      end

    end # context

    context "foo -n bar baz" do

      let(:options) { %w(foo -n bar baz) }
      before { subject }

      it_behaves_like "adding a policy", folder: "bar/baz"
      it_behaves_like "adding a spec", folder: "bar/baz"
      it_behaves_like "adding locales", %w(en ru), folder: "bar/baz"

    end # context

    context "foo -l UA jP" do

      let(:options) { %w(foo -l UA jP) }
      before { subject }

      it_behaves_like "adding a policy", folder: "policies"
      it_behaves_like "adding a spec", folder: "policies"
      it_behaves_like "adding locales", %w(ua jp), folder: "policies"

    end # context

  end # describe .start

end # describe Policy::CLI