require "rails_helper"

RSpec.describe Articles::Builder, type: :service do
  let(:user) { create(:user) }
  let(:tag) { nil }
  let(:prefill) { nil }
  let(:article) { described_class.new(user, tag, prefill) }

  describe "#build" do
    context "when tag_user_editor_v2" do
      let(:user) { create(:user, editor_version: "v2") }
      let(:tag) { create(:tag) }
      let(:submission_template) { tag.submission_template_customized(user.name).to_s }
      let(:correct_attributes) do
        {
          body_markdown: submission_template.split("---").last.to_s.strip,
          cached_tag_list: tag.name,
          processed_html: "",
          user_id: user.id,
          title: submission_template.split("title:")[1].to_s.split("\n")[0].to_s.strip
        }
      end

      it "initializes an article with the correct attributes and needs authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be true
      end
    end

    context "when tag_user" do
      let(:tag) { create(:tag, submission_template: "submission_template") }
      let(:correct_attributes) do
        {
          body_markdown: tag.submission_template_customized(user.name),
          processed_html: "",
          user_id: user.id
        }
      end

      it "initializes an article with the correct attributes and needs authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be true
      end
    end

    context "when prefill_user_editor_v2" do
      let(:user) { create(:user, editor_version: "v2") }
      let(:prefill) { "dsdweewewew" }
      let(:correct_attributes) do
        {
          body_markdown: prefill.split("---").last.to_s.strip,
          cached_tag_list: prefill.split("tags:")[1].to_s.split("\n")[0].to_s.strip,
          processed_html: "",
          user_id: user.id,
          title: prefill.split("title:")[1].to_s.split("\n")[0].to_s.strip
        }
      end

      it "initializes an article with the correct attributesand needs authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be true
      end
    end

    context "when prefill_user" do
      let(:prefill) { "dsdweewewew" }
      let(:correct_attributes) do
        {
          body_markdown: prefill,
          processed_html: "",
          user_id: user.id
        }
      end

      it "initializes an article with the correct attributes and needs authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be true
      end
    end

    context "when tag" do
      let(:tag) { create(:tag) }
      let(:correct_attributes) do
        {
          body_markdown: "---\ntitle: \npublished: false\ndescription: \ntags: #{tag.name}\n---\n\n",
          processed_html: "",
          user_id: user.id
        }
      end

      it "initializes an article with the correct attributes and does not need authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be false
      end
    end

    context "when user_editor_v2" do
      let(:user) { create(:user, editor_version: "v2") }
      let(:correct_attributes) do
        {
          user_id: user.id
        }
      end

      it "initializes an article with the correct attributes and does not need authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be false
      end
    end

    context "when user_editor_v1" do
      let(:correct_attributes) do
        {
          body_markdown: "---\ntitle: \npublished: false\ndescription: \ntags: \n---\n\n",
          processed_html: "",
          user_id: user.id
        }
      end

      it "initializes an article with the correct attributes and does not need authorization" do
        subject, needs_authorization = article.build

        expect(subject).to be_an_instance_of(Article)
        expect(subject).to have_attributes(correct_attributes)
        expect(needs_authorization).to be false
      end
    end
  end
end
