require 'spec_helper'

describe "rake work:purge_old_drafts" do
  context "when the draft is 27 days old" do
    it "doesn't delete the draft" do
      draft = travel_to(27.days.ago) do
        create(:draft)
      end

      subject.invoke

      expect { draft.reload }.not_to \
        raise_exception
    end
  end

  context "when there is a posted work that is 32 days old" do
    it "doesn't delete the work" do
      work = travel_to(32.days.ago) do
        create(:work)
      end

      subject.invoke

      expect { work.reload }.not_to \
        raise_exception
    end
  end

  context "when the draft has multiple chapters" do
    it "deletes the draft" do
      draft = travel_to(32.days.ago) do
        create(:draft)
      end

      create(:chapter, :draft, work: draft, authors: draft.pseuds, position: 2)
      create(:chapter, :draft, work: draft, authors: draft.pseuds, position: 3)
      expect(draft.chapters.count).to eq(3)

      subject.invoke

      expect { draft.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
    end
  end

  context "when the draft is in a collection" do
    let(:collection) { create(:collection) }

    it "deletes the draft" do
      draft = travel_to(32.days.ago) do
        create(:draft, collections: [collection])
      end

      subject.invoke

      expect { draft.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
    end
  end

  context "when the draft is the last work in a series" do
    it "deletes the draft" do
      draft = travel_to(32.days.ago) do
        create(:draft)
      end
      series = create(:series, works: [draft])

      subject.invoke

      expect { draft.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
      expect { series.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
    end
  end

  context "when one of the drafts cannot be deleted" do
    let(:collection) { create(:collection) }

    it "deletes the other drafts and prints an error" do
      draft1 = travel_to(34.days.ago) do
        create(:draft)
      end

      draft2 = travel_to(33.days.ago) do
        create(:draft, collections: [collection])
      end

      draft3 = travel_to(32.days.ago) do
        create(:draft)
      end

      # Make the deletion of draft 2 fail.
      allow_any_instance_of(CollectionItem).to \
        receive(:destroy).and_raise("deletion failed!")

      subject.invoke

      expect { draft1.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
      expect { draft2.reload }.not_to \
        raise_exception
      expect { draft3.reload }.to \
        raise_exception(ActiveRecord::RecordNotFound)
    end
  end
end

describe "rake work:reset_word_counts" do
  let(:en) { Language.find_by(short: "en") }
  let(:en_work) { create(:work, language: en, chapter_attributes: { content: "Nice ride, Gloria!" }) }

  context "when there are multiple languages" do
    let(:es) { create(:language, short: "es") }
    let(:es_work) { create(:work, language: es, chapter_attributes: { content: "Así pasa la gloria del mundo." }) }

    before do
      # Screw up the word counts
      en_work.update_column(:word_count, 3000)
      es_work.update_column(:word_count, 4000)
    end

    it "updates only works in the specified language" do
      subject.invoke("es")

      en_work.reload
      es_work.reload

      expect(en_work.word_count).to eq(3000)
      expect(es_work.word_count).to eq(6)
    end

    it "updates works in all languages" do
      subject.invoke

      en_work.reload
      es_work.reload

      expect(en_work.word_count).to eq(3)
      expect(es_work.word_count).to eq(6)
    end
  end

  context "when a work has multiple chapters" do
    let(:chapter) { create(:chapter, work: en_work, position: 2, content: "A few more words never hurt.") }

    before do
      # Screw up the word counts
      chapter.update_column(:word_count, 9001)
      en_work.first_chapter.update_column(:word_count, 100_000)
      en_work.update_column(:word_count, 60)
    end

    it "updates word counts for each chapter and for the work" do
      subject.invoke("en")

      en_work.reload

      expect(en_work.word_count).to eq(9)
      expect(en_work.first_chapter.word_count).to eq(3)
      expect(en_work.last_chapter.word_count).to eq(6)
    end
  end
end
