overrides_tracker 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require_relative '../test_classes/custom_class'
5
+
6
+ describe OverridesTracker::FileObserver do
7
+ it 'calls the method overrides_tracker_finished_file when the file is finished' do
8
+ expect(CustomClass.instance_variable_get(:@overrides_tracker_finished_file_called)).to eq(true)
9
+ end
10
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'overrides_tracker/hash_decorator'
5
+
6
+ describe Hash do
7
+ describe '#deep_merge' do
8
+ let(:hash) { { a: 1, b: { c: 2 } } }
9
+ let(:other_hash) { { a: 3, b: { d: 4 } } }
10
+
11
+ it 'returns a new hash with the contents of both hashes merged' do
12
+ expect(hash.deep_merge(other_hash)).to eq(a: 3, b: { c: 2, d: 4 })
13
+ end
14
+
15
+ it 'does not modify the original hash' do
16
+ expect { hash.deep_merge(other_hash) }.not_to change { hash }
17
+ end
18
+ end
19
+
20
+ describe '#deep_merge!' do
21
+ let(:hash) { { a: 1, b: { c: 2 } } }
22
+ let(:other_hash) { { a: 3, b: { d: 4 } } }
23
+
24
+ it 'modifies the original hash with the contents of the other hash merged' do
25
+ expect { hash.deep_merge!(other_hash) }.to change { hash }.to(a: 3, b: { c: 2, d: 4 })
26
+ end
27
+ end
28
+
29
+ describe '#deep_stringify_keys!' do
30
+ it 'converts all keys in a hash to strings' do
31
+ hash = { a: 1, b: { c: 2, d: 3 } }
32
+ hash.deep_stringify_keys!
33
+ expect(hash).to eq({ 'a' => 1, 'b' => { 'c' => 2, 'd' => 3 } })
34
+ end
35
+
36
+ it 'converts all keys in an array of hashes to strings' do
37
+ array = { a: [{ a: 1, b: 2 }, { c: 3, d: 4 }] }
38
+ array.deep_stringify_keys!
39
+ expect(array).to eq({ 'a' => [{ 'a' => 1, 'b' => 2 }, { 'c' => 3, 'd' => 4 }] })
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,336 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require_relative '../test_classes/custom_class'
4
+
5
+
6
+ WORKING_DIR = Dir.pwd
7
+
8
+
9
+ describe OverridesTracker::MethodsCollector do
10
+ let(:obj) { OverridesTracker::MethodsCollector.instance }
11
+
12
+ describe '#add_method_for_class' do
13
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
14
+
15
+ it 'adds the method to the methods collection' do
16
+ expect(obj.instance_variable_get(:@methods_collection)).to eq(nil)
17
+
18
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
19
+
20
+ expect(obj.instance_variable_get(:@methods_collection)).to eq({"CustomClass" => {:instance_methods=>{:instance_test_method=>{:body=>"def instance_test_method\n 'instance_test_method'\nend\n", :is_part_of_app=>true, :location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 10], :sha=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, :is_part_of_app=>true, :singleton_methods=>{}}})
21
+ end
22
+ end
23
+
24
+ describe '#mark_method_as_override' do
25
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
26
+ let(:overriding_method) { CustomClass.instance_method(:instance_override_test_method) }
27
+
28
+ before do
29
+ obj.instance_variable_set(:@methods_collection, nil)
30
+ end
31
+
32
+ context 'when overriding location is in working directory' do
33
+ it 'adds the method to the overridden methods collection' do
34
+ expect(obj.instance_variable_get(:@methods_collection)).to eq(nil)
35
+
36
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
37
+ obj.mark_method_as_override(:instance_methods, 'CustomClass', :instance_test_method, overriding_method, OverridesTracker::Util.method_hash(overriding_method))
38
+
39
+ expect(obj.instance_variable_get(:@methods_collection)).to eq({"CustomClass" => {:instance_methods=>{:instance_test_method=>{:body=>"def instance_test_method\n 'instance_test_method'\nend\n", :is_part_of_app=>true, :location=>["#{Dir.pwd}/spec/test_classes/custom_class.rb", 10], :overriding_body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :overriding_is_part_of_app=>true, :overriding_location=>["#{Dir.pwd}/spec/test_classes/custom_class.rb", 14], :overriding_sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290", :sha=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, :is_part_of_app=>true, :singleton_methods=>{}}})
40
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq({"CustomClass" => {:added_instance_methods=>{}, :added_singleton_methods=>{}, :instance_methods=>{:instance_test_method=>{:body=>"def instance_test_method\n 'instance_test_method'\nend\n", :is_part_of_app=>true, :location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 10], :overriding_body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :overriding_is_part_of_app=>true, :overriding_location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], :overriding_sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290", :sha=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, :singleton_methods=>{}}})
41
+ end
42
+ end
43
+
44
+ context 'when overriding location is not in working directory' do
45
+ let(:overriding_method) { CustomClass.instance_method(:instance_override_test_method) }
46
+
47
+ before do
48
+ @original_dir = Dir.pwd
49
+ allow(Dir).to receive(:pwd).and_return("another_directory")
50
+ end
51
+
52
+ it 'adds the method to the overridden methods collection' do
53
+ expect(obj.instance_variable_get(:@methods_collection)).to eq(nil)
54
+
55
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
56
+ obj.mark_method_as_override(:instance_methods, 'CustomClass', :instance_test_method, overriding_method, OverridesTracker::Util.method_hash(overriding_method))
57
+
58
+ expect(obj.instance_variable_get(:@methods_collection)).to eq({"CustomClass" => {:instance_methods=>{:instance_test_method=>{:body=>"def instance_test_method\n 'instance_test_method'\nend\n", :is_part_of_app=>false, :location=>["#{@original_dir}/spec/test_classes/custom_class.rb", 10], :overriding_body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :overriding_is_part_of_app=>false, :overriding_location=>["#{@original_dir}/spec/test_classes/custom_class.rb", 14], :overriding_sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290", :sha=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, :is_part_of_app=>false, :singleton_methods=>{}}})
59
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq({"CustomClass" => {:added_instance_methods=>{}, :added_singleton_methods=>{}, :instance_methods=>{:instance_test_method=>{:body=>"def instance_test_method\n 'instance_test_method'\nend\n", :is_part_of_app=>false, :location=>["#{@original_dir}/spec/test_classes/custom_class.rb", 10], :overriding_body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :overriding_is_part_of_app=>false, :overriding_location=>["#{@original_dir}/spec/test_classes/custom_class.rb", 14], :overriding_sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290", :sha=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, :singleton_methods=>{}}})
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '#mark_method_as_added' do
65
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
66
+ let(:overriding_method) { CustomClass.instance_method(:instance_override_test_method) }
67
+
68
+ before do
69
+ obj.instance_variable_set(:@methods_collection, nil)
70
+ obj.instance_variable_set(:@overridden_methods_collection, nil)
71
+ end
72
+
73
+ context 'when overriding location is in working directory' do
74
+ it 'adds the method to the overridden methods collection' do
75
+ expect(obj.instance_variable_get(:@methods_collection)).to eq(nil)
76
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq(nil)
77
+
78
+ obj.mark_method_as_added(:added_instance_methods, 'CustomClass', :instance_test_method, overriding_method, OverridesTracker::Util.method_hash(overriding_method))
79
+
80
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq({"CustomClass" => {:added_instance_methods=>{:instance_test_method=>{:body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :is_part_of_app=>true, :location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], :overriding_is_part_of_app=>true, :overriding_location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], :sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290"}}, :added_singleton_methods=>{}, :instance_methods=>{}, :singleton_methods=>{}}})
81
+ end
82
+ end
83
+
84
+ context 'when overriding location is not in working directory' do
85
+ let(:overriding_method) { CustomClass.instance_method(:instance_override_test_method) }
86
+
87
+ before do
88
+ allow(Dir).to receive(:pwd).and_return("another_directory")
89
+ end
90
+
91
+ it 'adds the method to the overridden methods collection' do
92
+ expect(obj.instance_variable_get(:@methods_collection)).to eq(nil)
93
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq(nil)
94
+
95
+ obj.mark_method_as_added(:added_instance_methods, 'CustomClass', :instance_test_method, overriding_method, OverridesTracker::Util.method_hash(overriding_method))
96
+
97
+ expect(obj.instance_variable_get(:@overridden_methods_collection)).to eq({"CustomClass" => {:added_instance_methods=>{:instance_test_method=>{:body=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", :is_part_of_app=>false, :location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], :overriding_is_part_of_app=>false, :overriding_location=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], :sha=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290"}}, :added_singleton_methods=>{}, :instance_methods=>{}, :singleton_methods=>{}}})
98
+ end
99
+ end
100
+ end
101
+
102
+ describe 'save and load_from_file' do
103
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
104
+ let(:overriding_method) { CustomClass.instance_method(:instance_override_test_method) }
105
+
106
+ let(:file_name) { "branch_name#last_commit_id.otf"}
107
+
108
+
109
+ before do
110
+ allow(obj).to receive(:branch_name).and_return('branch_name')
111
+ allow(obj).to receive(:last_commit_id).and_return('last_commit_id')
112
+ allow(obj).to receive(:last_commit_name).and_return('last_commit_name')
113
+ allow(obj).to receive(:last_commit_name_to_report).and_return('last_commit_name_to_report')
114
+ allow(obj).to receive(:author_name).and_return('author_name')
115
+ allow(obj).to receive(:committer_name).and_return('committer_name')
116
+
117
+ obj.instance_variable_set(:@methods_collection, nil)
118
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
119
+ obj.mark_method_as_override(:instance_methods, 'CustomClass', :instance_test_method, overriding_method, OverridesTracker::Util.method_hash(overriding_method))
120
+ obj.save_to_file
121
+ end
122
+
123
+ it 'loads the methods collection from the file' do
124
+ obj.instance_variable_set(:@methods_collection, nil)
125
+ obj.instance_variable_set(:@overridden_methods_collection, nil)
126
+
127
+ data = obj.load_from_file(file_name)
128
+ expect(data).to eq(
129
+ {"branch_name" => "branch_name","branch_name_to_report" => "master","bundle_path" => Bundler.bundle_path.to_s, "author_name" => "author_name", "committer_name" => "committer_name","last_commit_id" => "last_commit_id","last_commit_name" => "last_commit_name","last_commit_name_to_report" => "last_commit_name_to_report","methods_collection" => {"CustomClass" => {"added_instance_methods"=>{"instance_test_method"=>{"body"=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", "is_part_of_app"=>false, "location"=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], "overriding_is_part_of_app"=>false, "overriding_location"=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], "sha"=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290"}}, "added_singleton_methods"=>{}, "instance_methods"=>{"instance_test_method"=>{"body"=>"def instance_test_method\n 'instance_test_method'\nend\n", "is_part_of_app"=>true, "location"=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 10], "overriding_body"=>"def instance_override_test_method\n 'instance_override_test_method'\nend\n", "overriding_is_part_of_app"=>true, "overriding_location"=>["#{WORKING_DIR}/spec/test_classes/custom_class.rb", 14], "overriding_sha"=>"75cf2b21c3033f33c155a329d8e9110ae3fb0290", "sha"=>"3408e1f1736c6b83bc13f014e5338eec0c67393f"}}, "singleton_methods"=>{}}}, "version" => "#{OverridesTracker::VERSION}", "working_directory" => Dir.pwd,"number_of_classes" => 1, "number_of_classes_in_app_path" => 1, "number_of_methods" => 1, "number_of_methods_in_app_path" => 1})
130
+ end
131
+
132
+ end
133
+
134
+ describe '#build_overrides_hash' do
135
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
136
+
137
+ before do
138
+ obj.instance_variable_set(:@methods_collection, nil)
139
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
140
+ @methods_collection = obj.instance_variable_get(:@methods_collection)
141
+
142
+ allow(obj).to receive(:build_overrides_hash_for_method_type).with(CustomClass, @methods_collection["CustomClass"], :instance_methods, WORKING_DIR)
143
+ allow(obj).to receive(:build_overrides_hash_for_method_type).with(CustomClass, @methods_collection["CustomClass"], :singleton_methods, WORKING_DIR)
144
+ end
145
+
146
+ it 'calls build_overrides_hash_for_method_type' do
147
+ obj.build_overrides_hash
148
+
149
+ expect(obj).to have_received(:build_overrides_hash_for_method_type).with(CustomClass, @methods_collection["CustomClass"], :instance_methods, WORKING_DIR)
150
+ expect(obj).to have_received(:build_overrides_hash_for_method_type).with(CustomClass, @methods_collection["CustomClass"], :singleton_methods, WORKING_DIR)
151
+ end
152
+ end
153
+
154
+ describe '#overridden_methods' do
155
+ let(:overridden_methods_collection) { {test: 'test '} }
156
+
157
+ before do
158
+ obj.instance_variable_set(:@overridden_methods_collection, overridden_methods_collection)
159
+ end
160
+
161
+ it 'returns the overridden_methods_collection' do
162
+ expect(obj.overridden_methods).to eq(overridden_methods_collection)
163
+ end
164
+ end
165
+
166
+ describe '#report' do
167
+ let(:api_token) { 'api_token' }
168
+ let(:branch_name_to_report) { 'branch_name_to_report' }
169
+ let(:last_commit_id) { 'last_commit_id' }
170
+ let(:last_commit_name_to_report) { 'last_commit_name_to_report' }
171
+ let(:path_to_report_file) { 'path_to_report_file' }
172
+
173
+ before do
174
+ allow(obj).to receive(:branch_name_to_report).and_return(branch_name_to_report)
175
+ allow(obj).to receive(:last_commit_id).and_return(last_commit_id)
176
+ allow(obj).to receive(:last_commit_name_to_report).and_return(last_commit_name_to_report)
177
+ allow(obj).to receive(:path_to_report_file).and_return(path_to_report_file)
178
+ allow(OverridesTracker::Api).to receive(:report_build).with(api_token, branch_name_to_report, last_commit_id, last_commit_name_to_report, path_to_report_file)
179
+ end
180
+
181
+ it 'call the API' do
182
+ obj.report(api_token)
183
+
184
+ expect(OverridesTracker::Api).to have_received(:report_build).with(api_token, branch_name_to_report, last_commit_id, last_commit_name_to_report, path_to_report_file)
185
+ end
186
+ end
187
+
188
+ describe '#branch_name' do
189
+ let(:branch_name) { `git rev-parse --abbrev-ref HEAD` }
190
+
191
+ it 'returns the branch name' do
192
+ expect(obj.send(:branch_name)).to eq(branch_name.downcase.gsub('/', '_').gsub(/\s+/, ''))
193
+ end
194
+ end
195
+
196
+ describe '#last_commit_id' do
197
+ let(:last_commit_id) { `git log --format="%H" -n 1` }
198
+
199
+ it 'returns the last_commit_id' do
200
+ expect(obj.send(:last_commit_id)).to eq(last_commit_id.gsub(/\s+/, ''))
201
+ end
202
+ end
203
+
204
+ describe '#last_commit_name_to_report' do
205
+ let(:last_commit_name_to_report) { `git log --format="%s" -n 1` }
206
+
207
+ it 'returns the last_commit_name_to_report' do
208
+ expect(obj.send(:last_commit_name_to_report)).to eq(last_commit_name_to_report.chomp)
209
+ end
210
+ end
211
+
212
+ describe '#author_name' do
213
+ let(:author_name) { `git show -s --format='%an'`.chomp }
214
+
215
+ it 'returns the author_name' do
216
+ expect(obj.send(:author_name)).to eq(author_name)
217
+ end
218
+ end
219
+
220
+ describe '#committer_name' do
221
+ let(:committer_name) { `git show -s --format='%cn'`.chomp }
222
+
223
+ it 'returns the committer_name' do
224
+ expect(obj.send(:committer_name)).to eq(committer_name)
225
+ end
226
+ end
227
+
228
+ describe '#build_overrides_hash_for_method_type' do
229
+
230
+ context 'instance_methods' do
231
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
232
+
233
+ before do
234
+ obj.instance_variable_set(:@methods_collection, nil)
235
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_test_method, OverridesTracker::Util.method_hash(method))
236
+ obj.add_method_for_class(:instance_methods, 'CustomClass', :instance_override_test_method, OverridesTracker::Util.method_hash(method))
237
+ @methods_collection = obj.instance_variable_get(:@methods_collection)
238
+ end
239
+
240
+ context 'when the method is not overridden' do
241
+ let(:method_to_check) { CustomClass.instance_method(:instance_added_test_method) }
242
+
243
+ before do
244
+ allow(obj).to receive(:mark_method_as_added).with(:added_instance_methods, 'CustomClass', :instance_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
245
+ end
246
+
247
+ context 'when the method is part of the app' do
248
+ it 'calls mark_method_as_added_instance_methods' do
249
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :instance_methods, WORKING_DIR)
250
+ expect(obj).to have_received(:mark_method_as_added).with(:added_instance_methods, 'CustomClass', :instance_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
251
+ end
252
+ end
253
+
254
+ context 'when the method is not part of the app' do
255
+ it 'does not call mark_method_as_added_instance_methods' do
256
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :instance_methods, '/not_working_dir')
257
+ expect(obj).to_not have_received(:mark_method_as_added).with(:added_instance_methods, 'CustomClass', :instance_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
258
+ end
259
+ end
260
+ end
261
+
262
+ context 'when the method is override' do
263
+ let(:method_to_check) { CustomClass.instance_method(:instance_override_test_method) }
264
+
265
+ before do
266
+ CustomClass.class_eval do
267
+ def instance_override_test_method
268
+ "instance_override_test_method_override"
269
+ end
270
+ end
271
+ allow(obj).to receive(:mark_method_as_override).with(:instance_methods, 'CustomClass', :instance_override_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
272
+ end
273
+
274
+ it 'calls mark_method_as_added_instance_methods' do
275
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :instance_methods, WORKING_DIR)
276
+ expect(obj).to have_received(:mark_method_as_override).with(:instance_methods, 'CustomClass', :instance_override_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
277
+ end
278
+ end
279
+ end
280
+
281
+ context 'singleton_methods' do
282
+ let(:method) { CustomClass.singleton_method(:singleton_test_method) }
283
+
284
+ before do
285
+ obj.instance_variable_set(:@methods_collection, nil)
286
+ obj.add_method_for_class(:singleton_methods, 'CustomClass', :singleton_test_method, OverridesTracker::Util.method_hash(method))
287
+ obj.add_method_for_class(:singleton_methods, 'CustomClass', :singleton_override_test_method, OverridesTracker::Util.method_hash(method))
288
+ @methods_collection = obj.instance_variable_get(:@methods_collection)
289
+ end
290
+
291
+ context 'when the method is not overridden' do
292
+ let(:method_to_check) { CustomClass.singleton_class.instance_method(:singleton_added_test_method) }
293
+
294
+ before do
295
+ allow(obj).to receive(:mark_method_as_added).with(:added_singleton_methods, 'CustomClass', :singleton_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
296
+ end
297
+
298
+ context 'when the method is part of the app' do
299
+ it 'calls mark_method_as_added_singleton_methods' do
300
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :singleton_methods, WORKING_DIR)
301
+
302
+ expect(obj).to have_received(:mark_method_as_added).with(:added_singleton_methods, 'CustomClass', :singleton_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
303
+ end
304
+ end
305
+
306
+ context 'when the method is not part of the app' do
307
+ it 'does not call mark_method_as_added_singleton_methods' do
308
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :singleton_methods, '/not_working_dir')
309
+
310
+ expect(obj).to_not have_received(:mark_method_as_added).with(:added_singleton_methods, 'CustomClass', :singleton_added_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
311
+ end
312
+ end
313
+ end
314
+
315
+ context 'when the method is override' do
316
+ let(:method_to_check) { CustomClass.singleton_class.instance_method(:singleton_override_test_method) }
317
+
318
+ before do
319
+ CustomClass.class_eval do
320
+ def self.singleton_override_test_method
321
+ "singleton_override_test_method_override"
322
+ end
323
+ end
324
+ allow(obj).to receive(:mark_method_as_override).with(:singleton_methods, 'CustomClass', :singleton_override_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
325
+ end
326
+
327
+ it 'calls mark_method_as_added_singleton_methods' do
328
+ obj.build_overrides_hash_for_method_type(CustomClass, @methods_collection["CustomClass"], :singleton_methods, WORKING_DIR)
329
+
330
+ expect(obj).to have_received(:mark_method_as_override).with(:singleton_methods, 'CustomClass', :singleton_override_test_method, method_to_check, OverridesTracker::Util.method_hash(method_to_check) )
331
+ end
332
+ end
333
+ end
334
+ end
335
+
336
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe String do
6
+ let(:custom_string) { String.new('custom string') }
7
+
8
+ describe '#colorize' do
9
+ it 'returns a string with the color code' do
10
+ expect(custom_string.colorize(31)).to eq "\e[31m#{custom_string}\e[0m"
11
+ end
12
+ end
13
+
14
+ describe '#red' do
15
+ it 'calls colorize with 31' do
16
+ expect(custom_string).to receive(:colorize).with(31)
17
+
18
+ custom_string.red
19
+ end
20
+ end
21
+
22
+ describe '#green' do
23
+ it 'calls colorize with 32' do
24
+ expect(custom_string).to receive(:colorize).with(32)
25
+
26
+ custom_string.green
27
+ end
28
+ end
29
+
30
+ describe '#yellow' do
31
+ it 'calls colorize with 33' do
32
+ expect(custom_string).to receive(:colorize).with(33)
33
+
34
+ custom_string.yellow
35
+ end
36
+ end
37
+
38
+ describe '#blue' do
39
+ it 'calls colorize with 34' do
40
+ expect(custom_string).to receive(:colorize).with(34)
41
+
42
+ custom_string.blue
43
+ end
44
+ end
45
+
46
+ describe '#pink' do
47
+ it 'calls colorize with 35' do
48
+ expect(custom_string).to receive(:colorize).with(35)
49
+
50
+ custom_string.pink
51
+ end
52
+ end
53
+
54
+ describe '#light_blue' do
55
+ it 'calls colorize with 36' do
56
+ expect(custom_string).to receive(:colorize).with(36)
57
+
58
+ custom_string.light_blue
59
+ end
60
+ end
61
+
62
+ describe '#bold' do
63
+ it 'returns a string with the bold code' do
64
+ expect(custom_string.bold).to eq "\e[1m#{custom_string}\e[22m"
65
+ end
66
+ end
67
+
68
+ describe '#italic' do
69
+ it 'returns a string with the italic code' do
70
+ expect(custom_string.italic).to eq "\e[3m#{custom_string}\e[23m"
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require_relative '../test_classes/custom_class'
5
+
6
+ WORKING_DIR = Dir.pwd
7
+
8
+ describe OverridesTracker::Util do
9
+ let(:method) { CustomClass.instance_method(:instance_test_method) }
10
+
11
+ describe '.method_hash' do
12
+ context 'when the method is part of the app' do
13
+ it "returns a hash with the method's name, body and sha" do
14
+ expect(OverridesTracker::Util.method_hash(method)).to eq({ body: "def instance_test_method\n 'instance_test_method'\nend\n",
15
+ is_part_of_app: true,
16
+ location: [
17
+ "#{WORKING_DIR}/spec/test_classes/custom_class.rb", 10
18
+ ],
19
+ sha: '3408e1f1736c6b83bc13f014e5338eec0c67393f' })
20
+ end
21
+ end
22
+
23
+ context 'when the method is not part of the app' do
24
+ before do
25
+ allow(Dir).to receive(:pwd).and_return('another_directory')
26
+ end
27
+
28
+ it "returns a hash with the method's name, body and sha" do
29
+ expect(OverridesTracker::Util.method_hash(method)[:body]).to eq("def instance_test_method\n 'instance_test_method'\nend\n")
30
+ expect(OverridesTracker::Util.method_hash(method)[:is_part_of_app]).to eq(false)
31
+ expect(OverridesTracker::Util.method_hash(method)[:sha]).to eq('3408e1f1736c6b83bc13f014e5338eec0c67393f')
32
+ end
33
+ end
34
+
35
+ context 'when we we run into an error' do
36
+ before do
37
+ allow(method).to receive(:source_location).and_return('/')
38
+ end
39
+
40
+ it "returns a hash with the method's hash" do
41
+ expect(OverridesTracker::Util.method_hash(method)).to eq({ body: nil, is_part_of_app: false, location: nil,
42
+ sha: nil })
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '.outdented_method_body' do
48
+ it 'returns the body of the method without the indentation' do
49
+ expect(OverridesTracker::Util.outdented_method_body(method)).to eq("def instance_test_method\n 'instance_test_method'\nend\n")
50
+ end
51
+ end
52
+
53
+ describe '.method_sha' do
54
+ it 'returns the sha of the method' do
55
+ expect(OverridesTracker::Util.method_sha(method)).to eq('3408e1f1736c6b83bc13f014e5338eec0c67393f')
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe OverridesTracker::VERSION do
6
+ it 'has a version number' do
7
+ expect(OverridesTracker::VERSION).not_to be nil
8
+ end
9
+ end
@@ -0,0 +1,134 @@
1
+ {
2
+ "ClassADifferentSources":{
3
+ "instance_methods":{
4
+ "method_one":{
5
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
6
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
7
+ "location":[
8
+ "/gem/models/class_a.rb",
9
+ 7
10
+ ],
11
+ "body":"def method_one\n master_original_implementation\nend\n",
12
+ "overriding_location":[
13
+ "/app/models/class_a.rb",
14
+ 7
15
+ ],
16
+ "overriding_body":"def method_one\n master_override\nend\n"
17
+ }
18
+ },
19
+ "singleton_methods":{
20
+ "self.method_two":{
21
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
22
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
23
+ "location":[
24
+ "/gem/models/class_a.rb",
25
+ 7
26
+ ],
27
+ "body":"def self.method_two\n master_original_implementation\nend\n",
28
+ "overriding_location":[
29
+ "/app/models/class_a.rb",
30
+ 7
31
+ ],
32
+ "overriding_body":"def self.method_two\n master_override\nend\n"
33
+ }
34
+ },
35
+ "added_instance_methods":{
36
+ "method_three":{
37
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
38
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
39
+ "location":[
40
+ "/gem/models/class_a.rb",
41
+ 7
42
+ ],
43
+ "body":"def method_three\n master_original_implementation\nend\n",
44
+ "overriding_location":[
45
+ "/app/models/class_a.rb",
46
+ 7
47
+ ],
48
+ "overriding_body":"def method_three\n master_override\nend\n"
49
+ }
50
+ },
51
+ "added_singleton_methods":{
52
+ "method_four":{
53
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
54
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
55
+ "location":[
56
+ "/gem/models/class_a.rb",
57
+ 7
58
+ ],
59
+ "body":"def method_four\n master_original_implementation\nend\n",
60
+ "overriding_location":[
61
+ "/app/models/class_a.rb",
62
+ 7
63
+ ],
64
+ "overriding_body":"def method_four\n master_override\nend\n"
65
+ }
66
+ }
67
+ },
68
+ "ClassDifferentOverrides":{
69
+ "instance_methods":{
70
+ "method_one":{
71
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
72
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
73
+ "location":[
74
+ "/gem/models/class_b.rb",
75
+ 7
76
+ ],
77
+ "body":"def method_one\n master_original_implementation\nend\n",
78
+ "overriding_location":[
79
+ "/app/models/class_b.rb",
80
+ 7
81
+ ],
82
+ "overriding_body":"def method_one\n master_override\nend\n"
83
+ }
84
+ },
85
+ "singleton_methods":{
86
+ "self.method_two":{
87
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
88
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
89
+ "location":[
90
+ "/gem/models/class_b.rb",
91
+ 7
92
+ ],
93
+ "body":"def self.method_two\n master_original_implementation\nend\n",
94
+ "overriding_location":[
95
+ "/app/models/class_b.rb",
96
+ 7
97
+ ],
98
+ "overriding_body":"def self.method_two\n master_override\nend\n"
99
+ }
100
+ },
101
+ "added_instance_methods":{
102
+ "method_three":{
103
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
104
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
105
+ "location":[
106
+ "/gem/models/class_b.rb",
107
+ 7
108
+ ],
109
+ "body":"def method_three\n master_original_implementation\nend\n",
110
+ "overriding_location":[
111
+ "/app/models/class_b.rb",
112
+ 7
113
+ ],
114
+ "overriding_body":"def method_three\n master_override\nend\n"
115
+ }
116
+ },
117
+ "added_singleton_methods":{
118
+ "method_four":{
119
+ "sha":"376988d98a7069f2a2914a4544d4e2d1d519f62b",
120
+ "overriding_sha":"376988d98a7069f2a2914a4544d4e2d1d519f345",
121
+ "location":[
122
+ "/gem/models/class_b.rb",
123
+ 7
124
+ ],
125
+ "body":"def method_four\n master_original_implementation\nend\n",
126
+ "overriding_location":[
127
+ "/app/models/class_a.rb",
128
+ 7
129
+ ],
130
+ "overriding_body":"def method_four\n master_override\nend\n"
131
+ }
132
+ }
133
+ }
134
+ }