stevenbeales/mental-test

View on GitHub
spec/models/journal_spec.rb

Summary

Maintainability
A
40 mins
Test Coverage
# frozen_string_literal: true

RSpec.describe Journal, type: :model do
  subject { TestFactory.test_journal }
  let!(:participant) { TestFactory.test_participant }

  include_examples 'valid object creation', Journal

  describe '#respond_to?' do
    include_context 'shared attributes'
    include_examples 'respond', %i[journal_entries participant name]
    include_examples 'common attributes'
  end

  describe '#list_entries' do
    context 'defaults to last 4' do
      it do
        expect(subject.list_entries).to eq subject.journal_entries \
          .order('entry_date DESC').limit(4).join(' ')
      end
    end
  end

  describe '#read_entry' do
    it do
      expect(subject.read_entry(day: Date.today).size).to be > 0
    end
  end

  describe '#read_last' do
    it do
      expect(subject.read_last.size).to eq 1
    end

    it do
      expect(subject.read_last(last_n: 2).size).to eq 2
    end
  end

  include_examples 'required attribute', 'name', 2

  describe '#participant' do
    include_context 'restore attributes'

    it 'is required' do
      subject.participant = nil
      subject.valid?
      expect(subject.errors[:participant].size).to eq(1)
    end
  end

  include_examples 'invalid create', 'without name or study'

  describe '.create!' do
    context '1 character name' do
      it do
        expect do
          Journal.create! name: 'a', participant: participant
        end.to raise_error ActiveRecord::RecordInvalid
      end
    end

    context '2+ character name and title' do
      it do
        expect do
          Journal.find_or_create_by! name: 'as', participant: participant
        end.to_not raise_error
        Journal.find_by(name: 'as', participant: participant).destroy!
      end
    end

    context 'unique name' do
      it do
        another_object = Journal.create! name: 'a14', participant: participant
        begin
          expect do
            Journal.create! name: 'a14', participant: participant
          end.to raise_error ActiveRecord::RecordInvalid
        ensure
          another_object.destroy!
        end
      end
    end

    include_examples '#to_s', 'Name', TestConstants::TEST_JOURNAL

    describe '#create_entry_for_today' do
      it { expect(subject.journal_entries.size).to be > 0 }
    end
  end
end