summaryrefslogtreecommitdiff
path: root/spec/models/snippet_input_action_spec.rb
blob: 0a9ab47f2f0b1ad919e4c855f1c1fb904bf767c3 (plain)
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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe SnippetInputAction do
  describe 'validations' do
    using RSpec::Parameterized::TableSyntax

    where(:action, :file_path, :content, :previous_path, :allowed_actions, :is_valid, :invalid_field) do
      :create  | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      :move    | 'foobar'  | 'foobar' | 'foo1'   | nil                | true  | nil
      :delete  | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      :update  | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      :foo     | 'foobar'  | 'foobar' | 'foobar' | nil                | false | :action
      'create' | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      'move'   | 'foobar'  | 'foobar' | 'foo1'   | nil                | true  | nil
      'delete' | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      'update' | 'foobar'  | 'foobar' | 'foobar' | nil                | true  | nil
      'foo'    | 'foobar'  | 'foobar' | 'foobar' | nil                | false | :action
      nil      | 'foobar'  | 'foobar' | 'foobar' | nil                | false | :action
      ''       | 'foobar'  | 'foobar' | 'foobar' | nil                | false | :action
      :move    | 'foobar'  | 'foobar' | nil      | nil                | false | :previous_path
      :move    | 'foobar'  | 'foobar' | ''       | nil                | false | :previous_path
      :move    | 'foobar'  | 'foobar' | 'foobar' | nil                | false | :file_path
      :move    | nil       | 'foobar' | 'foobar' | nil                | true  | nil
      :move    | ''        | 'foobar' | 'foobar' | nil                | true  | nil
      :move    | nil       | 'foobar' | 'foo1'   | nil                | true  | nil
      :move    | 'foobar'  | nil      | 'foo1'   | nil                | true  | nil
      :move    | 'foobar'  | ''       | 'foo1'   | nil                | true  | nil
      :create  | 'foobar'  | nil      | 'foobar' | nil                | false | :content
      :create  | 'foobar'  | ''       | 'foobar' | nil                | false | :content
      :create  | nil       | 'foobar' | 'foobar' | nil                | true  | nil
      :create  | ''        | 'foobar' | 'foobar' | nil                | true  | nil
      :update  | 'foobar'  | nil      | 'foobar' | nil                | false | :content
      :update  | 'foobar'  | ''       | 'foobar' | nil                | false | :content
      :update  | 'other'   | 'foobar' | 'foobar' | nil                | false | :file_path
      :update  | 'foobar'  | 'foobar' | nil      | nil                | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | nil                | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | :update            | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | 'update'           | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | [:update]          | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | [:update, :create] | true  | nil
      :update  | 'foobar'  | 'foobar' | ''       | :create            | false | :action
      :update  | 'foobar'  | 'foobar' | ''       | 'create'           | false | :action
      :update  | 'foobar'  | 'foobar' | ''       | [:create]          | false | :action
      :foo     | 'foobar'  | 'foobar' | ''       | :foo               | false | :action
    end

    with_them do
      subject { described_class.new(action: action, file_path: file_path, content: content, previous_path: previous_path, allowed_actions: allowed_actions) }

      specify do
        expect(subject.valid?).to be is_valid

        unless is_valid
          expect(subject.errors).to include(invalid_field)
        end
      end
    end
  end

  describe '#to_commit_action' do
    let(:action)           { 'create' }
    let(:file_path)        { 'foo' }
    let(:content)          { 'bar' }
    let(:previous_path)    { 'previous_path' }
    let(:options)          { { action: action, file_path: file_path, content: content, previous_path: previous_path } }
    let(:expected_options) { options.merge(action: action.to_sym) }

    subject { described_class.new(**options).to_commit_action }

    it 'transforms attributes to commit action' do
      expect(subject).to eq(expected_options)
    end

    context 'action is update' do
      let(:action) { 'update' }

      context 'when previous_path is present' do
        it 'returns the existing previous_path' do
          expect(subject).to eq(expected_options)
        end
      end

      context 'when previous_path is not present' do
        let(:previous_path) { nil }
        let(:expected_options) { options.merge(action: action.to_sym, previous_path: file_path) }

        it 'assigns the file_path to the previous_path' do
          expect(subject).to eq(expected_options)
        end
      end
    end
  end
end