shared_examples_for "an approvable" do
  it { is_expected.to respond_to(:approved_by_user_signature) }

  describe "#approve_by" do
    before do
      allow(BigMediaTime).to receive(:time_zone_now).and_return(1.week.ago)
    end

    it "stores info about the approving user" do
      user = double(full_name: "Jane Doe", email: "jane.doe@test.com")

      subject.approve_by(user)

      expect(subject.approved_by_user_name).to eq "Jane Doe"
      expect(subject.approved_by_user_email).to eq "jane.doe@test.com"
      expect(subject.approved_at).to eq BigMediaTime.time_zone_now
    end

    context "when approval has already been given" do
      it "does not change the existing info" do
        user1 = double(full_name: "Jane Doe", email: "jane.doe@test.com")
        subject.approve_by(user1)

        expect(subject.approved_by_user_name).to eq "Jane Doe"
        expect(subject.approved_by_user_email).to eq "jane.doe@test.com"
        expect(subject.approved_at).to eq BigMediaTime.time_zone_now

        user2 = double(full_name: "John Doe", email: "john.doe@test.com")
        subject.approve_by(user2)

        expect(subject.approved_by_user_name).to eq "Jane Doe"
        expect(subject.approved_by_user_email).to eq "jane.doe@test.com"
        expect(subject.approved_at).to eq BigMediaTime.time_zone_now
      end
    end
  end

  describe "#approved?" do
    it "indicates whether or not it has been approved" do
      subject.approved_at = nil
      expect(subject).not_to be_approved

      subject.approved_at = 1.week.ago
      expect(subject).to be_approved
    end
  end
end
