File: error_spec.rb

package info (click to toggle)
ruby-morpher 0.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 236 kB
  • sloc: ruby: 1,444; makefile: 4
file content (132 lines) | stat: -rw-r--r-- 3,184 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# frozen_string_literal: true

RSpec.describe Morpher::Transform::Error do
  subject { described_class.new(attributes) }

  let(:message)        { 'root-message' }
  let(:direct_cause)   { nil            }
  let(:indirect_cause) { nil            }

  let(:attributes) do
    transform =
      if direct_cause
        Morpher::Transform::Named.new('root', direct_cause.transform)
      else
        Morpher::Transform::Boolean.new
      end

    {
      cause:     direct_cause,
      input:     nil,
      message:   message,
      transform: transform
    }
  end

  shared_context 'direct cause' do
    let(:direct_cause) do
      transform =
        if indirect_cause
          Morpher::Transform::Named.new('direct-cause', indirect_cause.transform)
        else
          Morpher::Transform::Boolean.new
        end

      described_class.new(
        cause:     indirect_cause,
        input:     nil,
        message:   'direct-cause-message',
        transform: transform
      )
    end
  end

  shared_examples 'indirect cause' do
    let(:indirect_cause) do
      described_class.new(
        cause:     nil,
        input:     nil,
        message:   'indirect-cause-message',
        transform: Morpher::Transform::Boolean.new
      )
    end
  end

  describe '#trace' do
    def apply
      subject.trace
    end

    context 'without cause' do
      it 'returns path to self' do
        expect(apply).to eql([subject])
      end
    end

    context 'with direct cause' do
      include_context 'direct cause'

      it 'returns path to direct cause' do
        expect(apply).to eql([subject, direct_cause])
      end
    end

    context 'with indirect cause' do
      include_context 'direct cause'
      include_context 'indirect cause'

      it 'returns path to direct cause' do
        expect(apply).to eql([subject, direct_cause, indirect_cause])
      end
    end
  end

  describe '#compact_message' do
    def apply
      subject.compact_message
    end

    context 'root cause' do
      it 'returns expected message' do
        expect(apply).to eql('Morpher::Transform::Boolean: root-message')
      end
    end

    context 'with direct cause' do
      include_context 'direct cause'

      it 'returns expected message' do
        expect(apply).to eql(<<~'MESSAGE'.chomp)
          root/Morpher::Transform::Boolean: direct-cause-message
        MESSAGE
      end
    end

    context 'with indirect cause' do
      include_context 'direct cause'
      include_context 'indirect cause'

      context 'with present slugs' do
        it 'returns expected message' do
          expect(apply).to eql(<<~'MESSAGE'.chomp)
            root/direct-cause/Morpher::Transform::Boolean: indirect-cause-message
          MESSAGE
        end
      end

      context 'with empty slug' do
        let(:direct_cause) do
          super().with(
            transform: Morpher::Transform::Named.new('', indirect_cause.transform)
          )
        end

        it 'returns expected message' do
          expect(apply).to eql(<<~'MESSAGE'.chomp)
            root/Morpher::Transform::Boolean: indirect-cause-message
          MESSAGE
        end
      end
    end
  end
end