forked from rubocop/rubocop
/
enforce_superclass_spec.rb
121 lines (107 loc) · 3.87 KB
/
enforce_superclass_spec.rb
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
# frozen_string_literal: true
# rubocop:disable RSpec/FilePath
RSpec.describe RuboCop::Cop::EnforceSuperclass, :restore_registry do
subject(:cop) { cop_class.new }
let(:cop_class) { RuboCop::Cop::RSpec::ApplicationRecord }
let(:msg) { 'Models should subclass `ApplicationRecord`' }
before do
stub_cop_class('RuboCop::Cop::RSpec::ApplicationRecord')
stub_const("#{cop_class}::MSG",
'Models should subclass `ApplicationRecord`')
stub_const("#{cop_class}::SUPERCLASS", 'ApplicationRecord')
stub_const("#{cop_class}::BASE_PATTERN",
'(const (const {nil? cbase} :ActiveRecord) :Base)')
RuboCop::Cop::RSpec::ApplicationRecord.include(described_class)
end
shared_examples 'no offense' do |code|
it "registers no offenses for `#{code}`" do
expect_no_offenses(code)
end
end
it 'registers an offense for models that subclass ActiveRecord::Base' do
expect_offense(<<~RUBY)
class MyModel < ActiveRecord::Base
^^^^^^^^^^^^^^^^^^ #{msg}
end
RUBY
end
it 'registers an offense for single-line definitions' do
expect_offense(<<~RUBY)
class MyModel < ActiveRecord::Base; end
^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
end
it 'registers an offense for Class.new definition' do
expect_offense(<<~RUBY)
MyModel = Class.new(ActiveRecord::Base) {}
^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
expect_offense(<<~RUBY)
MyModel = Class.new(ActiveRecord::Base)
^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
end
it 'registers an offense for model defined using top-level' do
expect_offense(<<~RUBY)
class ::MyModel < ActiveRecord::Base
^^^^^^^^^^^^^^^^^^ #{msg}
end
RUBY
end
it 'registers an offense for models that subclass ::ActiveRecord::Base' do
expect_offense(<<~RUBY)
class MyModel < ::ActiveRecord::Base
^^^^^^^^^^^^^^^^^^^^ #{msg}
end
RUBY
end
it 'registers an offense for top-level constant ::Class.new definition' do
expect_offense(<<~RUBY)
::MyModel = ::Class.new(::ActiveRecord::Base) {}
^^^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
expect_offense(<<~RUBY)
::MyModel = ::Class.new(::ActiveRecord::Base)
^^^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
end
context 'when ApplicationRecord subclasses ActiveRecord::Base' do
it_behaves_like 'no offense',
'class ApplicationRecord < ActiveRecord::Base; end'
it_behaves_like 'no offense',
'class ::ApplicationRecord < ActiveRecord::Base; end'
it_behaves_like 'no offense', <<~RUBY
ApplicationRecord = Class.new(ActiveRecord::Base) do; end
RUBY
it_behaves_like 'no offense', <<~RUBY
ApplicationRecord = Class.new(::ActiveRecord::Base) do; end
RUBY
it_behaves_like 'no offense', <<~RUBY
ApplicationRecord = Class.new(ActiveRecord::Base)
RUBY
it_behaves_like 'no offense', <<~RUBY
::ApplicationRecord = Class.new(ActiveRecord::Base) do; end
RUBY
it_behaves_like 'no offense', <<~RUBY
::ApplicationRecord = ::Class.new(::ActiveRecord::Base) do; end
RUBY
it_behaves_like 'no offense', <<~RUBY
::ApplicationRecord = ::Class.new(::ActiveRecord::Base)
RUBY
end
context 'when MyModel subclasses ApplicationRecord' do
it_behaves_like 'no offense', 'class MyModel < ApplicationRecord; end'
it_behaves_like 'no offense', 'class MyModel < ::ApplicationRecord; end'
it_behaves_like 'no offense', <<~RUBY
MyModel = Class.new(ApplicationRecord) do
end
MyModel = Class.new(ApplicationRecord)
RUBY
it_behaves_like 'no offense', <<~RUBY
MyModel = ::Class.new(::ApplicationRecord) do
end
MyModel = ::Class.new(::ApplicationRecord)
RUBY
end
end
# rubocop:enable RSpec/FilePath