danger-dangermattic 1.0.0

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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.buildkite/gem-push.sh +15 -0
  3. data/.buildkite/pipeline.yml +69 -0
  4. data/.bundle/config +2 -0
  5. data/.github/workflows/reusable-check-labels-on-issues.yml +91 -0
  6. data/.github/workflows/reusable-run-danger.yml +54 -0
  7. data/.gitignore +30 -0
  8. data/.rubocop.yml +67 -0
  9. data/.ruby-version +1 -0
  10. data/.yardopts +7 -0
  11. data/CHANGELOG.md +7 -0
  12. data/Gemfile +5 -0
  13. data/Gemfile.lock +191 -0
  14. data/Guardfile +21 -0
  15. data/LICENSE +373 -0
  16. data/README.md +68 -0
  17. data/Rakefile +24 -0
  18. data/danger-dangermattic.gemspec +58 -0
  19. data/lib/danger_dangermattic.rb +3 -0
  20. data/lib/danger_plugin.rb +4 -0
  21. data/lib/dangermattic/gem_version.rb +5 -0
  22. data/lib/dangermattic/plugins/android_release_checker.rb +50 -0
  23. data/lib/dangermattic/plugins/android_strings_checker.rb +31 -0
  24. data/lib/dangermattic/plugins/android_unit_test_checker.rb +187 -0
  25. data/lib/dangermattic/plugins/common/common_release_checker.rb +113 -0
  26. data/lib/dangermattic/plugins/common/git_utils.rb +166 -0
  27. data/lib/dangermattic/plugins/common/github_utils.rb +68 -0
  28. data/lib/dangermattic/plugins/common/reporter.rb +38 -0
  29. data/lib/dangermattic/plugins/ios_release_checker.rb +106 -0
  30. data/lib/dangermattic/plugins/labels_checker.rb +74 -0
  31. data/lib/dangermattic/plugins/manifest_pr_checker.rb +106 -0
  32. data/lib/dangermattic/plugins/milestone_checker.rb +98 -0
  33. data/lib/dangermattic/plugins/podfile_checker.rb +122 -0
  34. data/lib/dangermattic/plugins/pr_size_checker.rb +125 -0
  35. data/lib/dangermattic/plugins/tracks_checker.rb +72 -0
  36. data/lib/dangermattic/plugins/view_changes_checker.rb +46 -0
  37. data/spec/android_release_checker_spec.rb +93 -0
  38. data/spec/android_strings_checker_spec.rb +185 -0
  39. data/spec/android_unit_test_checker_spec.rb +343 -0
  40. data/spec/common_release_checker_spec.rb +70 -0
  41. data/spec/fixtures/android_unit_test_checker/Abc.java +7 -0
  42. data/spec/fixtures/android_unit_test_checker/AbcFeatureConfig.java +7 -0
  43. data/spec/fixtures/android_unit_test_checker/Abcdef.kt +5 -0
  44. data/spec/fixtures/android_unit_test_checker/AbcdefgViewHelper.java +7 -0
  45. data/spec/fixtures/android_unit_test_checker/AnotherViewHelper.kt +7 -0
  46. data/spec/fixtures/android_unit_test_checker/MyNewClass.java +7 -0
  47. data/spec/fixtures/android_unit_test_checker/Polygon.kt +3 -0
  48. data/spec/fixtures/android_unit_test_checker/Shape.kt +10 -0
  49. data/spec/fixtures/android_unit_test_checker/TestsINeedThem.java +5 -0
  50. data/spec/fixtures/android_unit_test_checker/TestsINeedThem.kt +7 -0
  51. data/spec/fixtures/android_unit_test_checker/TestsINeedThem2.kt +12 -0
  52. data/spec/fixtures/android_unit_test_checker/src/android/java/org/activities/MyActivity.kt +7 -0
  53. data/spec/fixtures/android_unit_test_checker/src/android/java/org/activities/MyJavaActivity.java +7 -0
  54. data/spec/fixtures/android_unit_test_checker/src/android/java/org/fragments/MyFragment.kt +6 -0
  55. data/spec/fixtures/android_unit_test_checker/src/android/java/org/fragments/MyNewJavaFragment.java +7 -0
  56. data/spec/fixtures/android_unit_test_checker/src/android/java/org/module/MyModule.java +13 -0
  57. data/spec/fixtures/android_unit_test_checker/src/android/java/org/view/ActionCardViewHolder.kt +22 -0
  58. data/spec/fixtures/android_unit_test_checker/src/android/java/org/view/MyRecyclerView.java +7 -0
  59. data/spec/fixtures/android_unit_test_checker/src/androidTest/java/org/test/AbcTests.java +5 -0
  60. data/spec/fixtures/android_unit_test_checker/src/androidTest/java/org/test/AnotherTestClass.java +7 -0
  61. data/spec/fixtures/android_unit_test_checker/src/androidTest/java/org/test/PolygonTest.kt +4 -0
  62. data/spec/fixtures/android_unit_test_checker/src/androidTest/java/org/test/TestMyNewClass.java +9 -0
  63. data/spec/fixtures/android_unit_test_checker/src/androidTest/java/org/test/ToolTest.kt +5 -0
  64. data/spec/fixtures/android_unit_test_checker/src/main/java/org/wordpress/android/widgets/NestedWebView.kt +32 -0
  65. data/spec/fixtures/android_unit_test_checker/src/main/java/org/wordpress/util/config/BloggingPromptsFeatureConfig.kt +23 -0
  66. data/spec/fixtures/android_unit_test_checker/src/test/java/org/test/TestsINeedThem.java +9 -0
  67. data/spec/github_utils_spec.rb +110 -0
  68. data/spec/ios_release_checker_spec.rb +191 -0
  69. data/spec/labels_checker_spec.rb +169 -0
  70. data/spec/manifest_pr_checker_spec.rb +140 -0
  71. data/spec/milestone_checker_spec.rb +222 -0
  72. data/spec/podfile_checker_spec.rb +595 -0
  73. data/spec/pr_size_checker_spec.rb +250 -0
  74. data/spec/spec_helper.rb +115 -0
  75. data/spec/tracks_checker_spec.rb +156 -0
  76. data/spec/view_changes_checker_spec.rb +168 -0
  77. metadata +341 -0
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::AndroidReleaseChecker do
7
+ it 'is a plugin' do
8
+ expect(described_class.new(nil)).to be_a Danger::Plugin
9
+ end
10
+
11
+ describe 'with Dangerfile' do
12
+ before do
13
+ @dangerfile = testing_dangerfile
14
+ @plugin = @dangerfile.android_release_checker
15
+
16
+ allow(@plugin.git).to receive_messages(added_files: [], modified_files: [], deleted_files: [])
17
+ end
18
+
19
+ context 'when changing the release notes' do
20
+ it 'reports a warning when a PR changes the release notes but not the Play Store strings file' do
21
+ allow(@plugin.git).to receive(:modified_files).and_return(['metadata/release_notes.txt'])
22
+
23
+ @plugin.check_release_notes_and_play_store_strings
24
+
25
+ expect(@dangerfile).to report_messages([format(CommonReleaseChecker::MESSAGE_STORE_FILE_NOT_CHANGED, 'metadata/PlayStoreStrings.po', 'metadata/release_notes.txt')])
26
+ end
27
+
28
+ it 'does nothing when a PR changes the release notes and the AppStore strings file' do
29
+ allow(@plugin.git).to receive(:modified_files).and_return(['Resources/release_notes.txt', 'Resources/AppStoreStrings.po'])
30
+
31
+ @plugin.check_release_notes_and_play_store_strings
32
+
33
+ expect(@dangerfile).to not_report
34
+ end
35
+
36
+ it 'does nothing when a PR does not change the release notes or the AppStore strings file' do
37
+ allow(@plugin.git).to receive(:modified_files).and_return(['MyView.swift', 'Resources/AppStoreStrings.tmp'])
38
+
39
+ @plugin.check_release_notes_and_play_store_strings
40
+
41
+ expect(@dangerfile).to not_report
42
+ end
43
+ end
44
+
45
+ describe '#check_modified_localizable_strings_on_release' do
46
+ it 'reports a warning when a PR on a regular branch changes the source strings.xml' do
47
+ allow(@plugin.git).to receive(:modified_files).and_return(['./src/main/res/values/strings.xml'])
48
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
49
+
50
+ @plugin.check_modified_strings_on_release
51
+
52
+ expect(@dangerfile).to report_warnings([AndroidReleaseChecker::MESSAGE_STRINGS_FILE_UPDATED])
53
+ end
54
+
55
+ it 'reports an error when a PR on a regular branch changes the source strings.xml' do
56
+ allow(@plugin.git).to receive(:modified_files).and_return(['./src/main/res/values/strings.xml'])
57
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
58
+
59
+ @plugin.check_modified_strings_on_release(report_type: :error)
60
+
61
+ expect(@dangerfile).to report_errors([AndroidReleaseChecker::MESSAGE_STRINGS_FILE_UPDATED])
62
+ end
63
+
64
+ it 'reports a warning when a PR on a regular branch changes a translated strings.xml' do
65
+ allow(@plugin.git).to receive(:modified_files).and_return(['src/main/res/values-fr/strings.xml'])
66
+ allow(@plugin.github).to receive(:branch_for_base).and_return('trunk')
67
+
68
+ @plugin.check_modified_strings_on_release
69
+
70
+ expect(@dangerfile).to report_warnings([AndroidReleaseChecker::MESSAGE_STRINGS_FILE_UPDATED])
71
+ end
72
+
73
+ it 'does nothing when a PR changes the strings.xml on a release branch' do
74
+ allow(@plugin.git).to receive(:modified_files).and_return(['src/main/res/values/strings.xml'])
75
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
76
+
77
+ @plugin.check_modified_strings_on_release
78
+
79
+ expect(@dangerfile).to not_report
80
+ end
81
+
82
+ it 'does nothing when a PR does not change the strings.xml on a regular branch' do
83
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/model/MyViewModel.kt'])
84
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
85
+
86
+ @plugin.check_modified_strings_on_release
87
+
88
+ expect(@dangerfile).to not_report
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::AndroidStringsChecker do
7
+ it 'is a plugin' do
8
+ expect(described_class.new(nil)).to be_a Danger::Plugin
9
+ end
10
+
11
+ describe 'with Dangerfile' do
12
+ before do
13
+ @dangerfile = testing_dangerfile
14
+ @plugin = @dangerfile.android_strings_checker
15
+
16
+ allow(@plugin.git).to receive_messages(added_files: [], modified_files: [], deleted_files: [])
17
+
18
+ stub_const('GitDiffStruct', Struct.new(:type, :path, :patch))
19
+ end
20
+
21
+ context 'when changing strings.xml files' do
22
+ it 'reports a warning when a PR adds a string resource reference inside a strings.xml file' do
23
+ strings_xml_path = './src/main/res/values/strings.xml'
24
+ allow(@plugin.git).to receive(:modified_files).and_return([strings_xml_path])
25
+
26
+ strings_xml_diff = <<~STRINGS
27
+ diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
28
+ index 5794d472..772e2b99 100644
29
+ --- a/src/main/res/values/strings.xml
30
+ +++ b/src/main/res/values/strings.xml
31
+ @@ -1,3 +1,6 @@
32
+ <?xml version="1.0" encoding="UTF-8"?>
33
+ <resources xmlns:tools="http://schemas.android.com/tools">
34
+ + <string name="select_categories">Select categories</string>
35
+ + <string name="video_quality">Video Quality</string>
36
+ + <string name="screen_title">@string/app_name</string>
37
+ </resources>
38
+ STRINGS
39
+
40
+ diff = GitDiffStruct.new('modified', strings_xml_path, strings_xml_diff)
41
+
42
+ allow(@plugin.git).to receive(:diff_for_file).with(strings_xml_path).and_return(diff)
43
+
44
+ @plugin.check_strings_do_not_refer_resource
45
+
46
+ expected_warning = <<~WARNING
47
+ #{AndroidStringsChecker::MESSAGE}
48
+ File `#{strings_xml_path}`:
49
+ ```diff
50
+ + <string name="screen_title">@string/app_name</string>
51
+ ```
52
+ WARNING
53
+
54
+ expect(@dangerfile).to report_warnings([expected_warning])
55
+ end
56
+
57
+ it 'reports multiple warnings when a PR adds multiple string resource references inside multiple strings.xml files' do
58
+ main_strings_xml = './src/main/res/values/strings.xml'
59
+ ptbr_strings_xml = './src/main/res/values-pt-rBR/strings.xml'
60
+ strings_xml_paths = [main_strings_xml, ptbr_strings_xml]
61
+ allow(@plugin.git).to receive(:modified_files).and_return(strings_xml_paths)
62
+
63
+ main_xml_diff = <<~STRINGS
64
+ diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
65
+ index 5794d472..772e2b99 100644
66
+ --- a/src/main/res/values/strings.xml
67
+ +++ b/src/main/res/values/strings.xml
68
+ @@ -1,3 +1,6 @@
69
+ <?xml version="1.0" encoding="UTF-8"?>
70
+ <resources xmlns:tools="http://schemas.android.com/tools">
71
+ + <string name="select_categories">Select categories</string>
72
+ + <string name="video_quality">Video Quality</string>
73
+ + <string name="screen_title">@string/app_name</string>
74
+ + <string name="screen_button">@string/button</string>
75
+ - <string name="field_hint">@string/hint</string>
76
+ </resources>
77
+ STRINGS
78
+
79
+ main_diff = GitDiffStruct.new('modified', main_strings_xml, main_xml_diff)
80
+
81
+ allow(@plugin.git).to receive(:diff_for_file).with(main_strings_xml).and_return(main_diff)
82
+
83
+ ptbr_xml_diff = <<~STRINGS
84
+ diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml
85
+ index 5794d472..772e2b99 100644
86
+ --- a/src/main/res/values-pt-rBR/strings.xml
87
+ +++ b/src/main/res/values-pt-rBR/strings.xml
88
+ @@ -1,3 +1,6 @@
89
+ <?xml version="1.0" encoding="UTF-8"?>
90
+ <resources xmlns:tools="http://schemas.android.com/tools">
91
+ + <string name="video_quality">Video Quality</string>
92
+ + <string name="popup_title">@string/app_name_title</string>
93
+ - <string name="toast">@string/common_toast</string>
94
+ </resources>
95
+ STRINGS
96
+
97
+ ptbr_diff = GitDiffStruct.new('modified', ptbr_strings_xml, ptbr_xml_diff)
98
+
99
+ allow(@plugin.git).to receive(:diff_for_file).with(ptbr_strings_xml).and_return(ptbr_diff)
100
+
101
+ @plugin.check_strings_do_not_refer_resource
102
+
103
+ expected_warning = <<~WARNING
104
+ #{AndroidStringsChecker::MESSAGE}
105
+ File `#{main_strings_xml}`:
106
+ ```diff
107
+ + <string name="screen_title">@string/app_name</string>
108
+ ```
109
+ WARNING
110
+
111
+ expected_warning2 = <<~WARNING
112
+ #{AndroidStringsChecker::MESSAGE}
113
+ File `#{main_strings_xml}`:
114
+ ```diff
115
+ + <string name="screen_button">@string/button</string>
116
+ ```
117
+ WARNING
118
+
119
+ expected_warning3 = <<~WARNING
120
+ #{AndroidStringsChecker::MESSAGE}
121
+ File `#{ptbr_strings_xml}`:
122
+ ```diff
123
+ + <string name="popup_title">@string/app_name_title</string>
124
+ ```
125
+ WARNING
126
+
127
+ expect(@dangerfile.status_report[:warnings]).to contain_exactly(expected_warning, expected_warning2, expected_warning3)
128
+ end
129
+
130
+ it 'does nothing when a PR adds a string resource reference inside a strings.xml file but with translatable=\"false\"' do
131
+ strings_xml_path = './src/main/res/values/strings.xml'
132
+ allow(@plugin.git).to receive(:modified_files).and_return([strings_xml_path])
133
+
134
+ strings_xml_diff = <<~STRINGS
135
+ diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
136
+ index 5794d472..772e2b99 100644
137
+ --- a/src/main/res/values/strings.xml
138
+ +++ b/src/main/res/values/strings.xml
139
+ @@ -1,3 +1,6 @@
140
+ <?xml version="1.0" encoding="UTF-8"?>
141
+ <resources xmlns:tools="http://schemas.android.com/tools">
142
+ + <string name="select_categories">Select categories</string>
143
+ + <string name="video_quality">Video Quality</string>
144
+ + <string name="screen_title" translatable="false">@string/app_name</string>
145
+ </resources>
146
+ STRINGS
147
+
148
+ diff = GitDiffStruct.new('modified', strings_xml_path, strings_xml_diff)
149
+
150
+ allow(@plugin.git).to receive(:diff_for_file).with(strings_xml_path).and_return(diff)
151
+
152
+ @plugin.check_strings_do_not_refer_resource
153
+
154
+ expect(@dangerfile).to not_report
155
+ end
156
+
157
+ it 'does nothing when a PR adds strings without resource references' do
158
+ strings_xml_path = './src/main/res/values/strings.xml'
159
+ allow(@plugin.git).to receive(:modified_files).and_return([strings_xml_path])
160
+
161
+ strings_xml_diff = <<~STRINGS
162
+ diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
163
+ index 5794d472..772e2b99 100644
164
+ --- a/src/main/res/values/strings.xml
165
+ +++ b/src/main/res/values/strings.xml
166
+ @@ -1,3 +1,6 @@
167
+ <?xml version="1.0" encoding="UTF-8"?>
168
+ <resources xmlns:tools="http://schemas.android.com/tools">
169
+ + <string name="select_categories">Select categories</string>
170
+ + <string name="video_quality">Video Quality</string>
171
+ </resources>
172
+ STRINGS
173
+
174
+ diff = GitDiffStruct.new('modified', strings_xml_path, strings_xml_diff)
175
+
176
+ allow(@plugin.git).to receive(:diff_for_file).with(strings_xml_path).and_return(diff)
177
+
178
+ @plugin.check_strings_do_not_refer_resource
179
+
180
+ expect(@dangerfile).to not_report
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,343 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::AndroidUnitTestChecker do
7
+ it 'is a plugin' do
8
+ expect(described_class.new(nil)).to be_a Danger::Plugin
9
+ end
10
+
11
+ describe 'with Dangerfile' do
12
+ before do
13
+ @dangerfile = testing_dangerfile
14
+ @plugin = @dangerfile.android_unit_test_checker
15
+
16
+ allow(@plugin.github).to receive(:pr_labels).and_return(['my_label'])
17
+
18
+ stub_const('GitDiffStruct', Struct.new(:type, :path, :patch))
19
+ end
20
+
21
+ it 'reports the right errors when a PR adds new classes that do not have corresponding tests' do
22
+ added_files = %w[
23
+ src/main/java/org/wordpress/util/config/BloggingPromptsFeatureConfig.kt
24
+ Abc.java
25
+ src/androidTest/java/org/test/ToolTest.kt
26
+ Polygon.kt
27
+ Abcdef.kt
28
+ TestsINeedThem.java
29
+ TestsINeedThem2.kt
30
+ ]
31
+
32
+ diff = generate_add_diff_from_fixtures(added_files)
33
+
34
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
35
+
36
+ @plugin.check_missing_tests
37
+
38
+ classes = %w[
39
+ BloggingPromptsFeatureConfig
40
+ Abc
41
+ Polygon
42
+ Abcdef
43
+ TestsINeedThem
44
+ TestsINeedThem2
45
+ TestsINeedThem2AnotherClass
46
+ ]
47
+
48
+ expect_class_names_match_report(class_names: classes, error_report: @dangerfile.status_report[:errors])
49
+ end
50
+
51
+ it 'does not report errors when new classes have corresponding tests' do
52
+ added_files = %w[
53
+ Abc.java
54
+ src/androidTest/java/org/test/AbcTests.java
55
+ Polygon.kt
56
+ src/androidTest/java/org/test/PolygonTest.kt
57
+ TestsINeedThem.java
58
+ src/androidTest/java/org/test/AnotherTestClass.java
59
+ MyNewClass.java
60
+ src/androidTest/java/org/test/TestMyNewClass.java
61
+ ]
62
+
63
+ diff = generate_add_diff_from_fixtures(added_files)
64
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
65
+
66
+ @plugin.check_missing_tests
67
+
68
+ expect(@dangerfile).to not_report
69
+ end
70
+
71
+ it 'does not report errors when we are deleting classes' do
72
+ deleted_files = %w[
73
+ Abc.java
74
+ Polygon.kt
75
+ TestsINeedThem.java
76
+ ]
77
+
78
+ diff = generate_delete_diff_from_fixtures(deleted_files)
79
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
80
+
81
+ @plugin.check_missing_tests
82
+
83
+ expect(@dangerfile).to not_report
84
+ end
85
+
86
+ it 'reports errors when we remove test classes for classes we refactored' do
87
+ added_files = %w[
88
+ Abc.java
89
+ Polygon.kt
90
+ TestsINeedThem.kt
91
+ ]
92
+
93
+ removed_files = %w[
94
+ src/androidTest/java/org/test/AbcTests.java
95
+ src/androidTest/java/org/test/PolygonTest.kt
96
+ src/test/java/org/test/TestsINeedThem.java
97
+ ]
98
+
99
+ diff = generate_add_diff_from_fixtures(added_files) + generate_delete_diff_from_fixtures(removed_files)
100
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
101
+
102
+ @plugin.check_missing_tests
103
+
104
+ classes = %w[
105
+ Abc
106
+ Polygon
107
+ TestsINeedThem
108
+ ]
109
+
110
+ expect_class_names_match_report(class_names: classes, error_report: @dangerfile.status_report[:errors])
111
+ end
112
+
113
+ it 'does nothing when a PR adds only tests' do
114
+ added_files = %w[
115
+ src/androidTest/java/org/test/AbcTests.java
116
+ src/androidTest/java/org/test/PolygonTest.kt
117
+ src/test/java/org/test/TestsINeedThem.java
118
+ ]
119
+
120
+ diff = generate_add_diff_from_fixtures(added_files)
121
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
122
+
123
+ @plugin.check_missing_tests
124
+
125
+ expect(@dangerfile).to not_report
126
+ end
127
+
128
+ it 'does nothing when a PR adds classes that dont need tests' do
129
+ added_files = %w[
130
+ src/android/java/org/activities/MyActivity.kt
131
+ src/android/java/org/activities/MyJavaActivity.java
132
+ src/android/java/org/fragments/MyFragment.kt
133
+ src/android/java/org/fragments/MyNewJavaFragment.java
134
+ src/android/java/org/module/MyModule.java
135
+ src/android/java/org/view/MyRecyclerView.java
136
+ src/android/java/org/view/ActionCardViewHolder.kt
137
+ ]
138
+
139
+ diff = generate_add_diff_from_fixtures(added_files)
140
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
141
+
142
+ @plugin.check_missing_tests
143
+
144
+ expect(@dangerfile).to not_report
145
+ end
146
+
147
+ it 'does not report that a PR with the tests bypass label is missing tests' do
148
+ added_files = %w[
149
+ Abc.java
150
+ Abcdef.kt
151
+ TestsINeedThem2.kt
152
+ ]
153
+
154
+ diff = generate_add_diff_from_fixtures(added_files)
155
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
156
+ allow(@plugin.github).to receive(:pr_labels).and_return(['unit-tests-exemption'])
157
+
158
+ @plugin.check_missing_tests
159
+
160
+ expected_warnings = [
161
+ 'Class `Abc` is missing tests, but `unit-tests-exemption` label was set to ignore this.',
162
+ 'Class `Abcdef` is missing tests, but `unit-tests-exemption` label was set to ignore this.',
163
+ 'Class `TestsINeedThem2` is missing tests, but `unit-tests-exemption` label was set to ignore this.',
164
+ 'Class `TestsINeedThem2AnotherClass` is missing tests, but `unit-tests-exemption` label was set to ignore this.'
165
+ ]
166
+ expect(@dangerfile).to report_warnings(expected_warnings)
167
+ end
168
+
169
+ it 'does not report errors when a PR without tests with a custom bypass label is missing tests' do
170
+ added_files = %w[
171
+ Abc.java
172
+ src/androidTest/java/org/test/AnotherTestClass.java
173
+ Abcdef.kt
174
+ ]
175
+
176
+ ignore_label = 'ignore-no-tests'
177
+
178
+ diff = generate_add_diff_from_fixtures(added_files)
179
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
180
+ allow(@plugin.github).to receive(:pr_labels).and_return([ignore_label])
181
+
182
+ @plugin.check_missing_tests(bypass_label: ignore_label)
183
+
184
+ expected_warnings = [
185
+ 'Class `Abc` is missing tests, but `ignore-no-tests` label was set to ignore this.',
186
+ 'Class `Abcdef` is missing tests, but `ignore-no-tests` label was set to ignore this.'
187
+ ]
188
+ expect(@dangerfile).to report_warnings(expected_warnings)
189
+ end
190
+
191
+ it 'does not report that added classes that need tests but with custom classes exception patterns are missing tests' do
192
+ added_files = %w[
193
+ src/androidTest/java/org/test/ToolTest.kt
194
+ AnotherViewHelper.kt
195
+ AbcdefgViewHelper.java
196
+ TestsINeedThem.java
197
+ ]
198
+
199
+ diff = generate_add_diff_from_fixtures(added_files)
200
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
201
+
202
+ classes_to_ignore = [
203
+ /ViewHelper$/
204
+ ].freeze
205
+
206
+ @plugin.check_missing_tests(classes_exceptions: classes_to_ignore)
207
+
208
+ classes = ['TestsINeedThem']
209
+ expect_class_names_match_report(class_names: classes, error_report: @dangerfile.status_report[:errors])
210
+ end
211
+
212
+ it 'does not report that added classes that need tests but with custom subclasses exception patterns are missing tests' do
213
+ added_files = %w[
214
+ AbcFeatureConfig.java
215
+ src/main/java/org/wordpress/android/widgets/NestedWebView.kt
216
+ src/androidTest/java/org/test/AnotherTestClass.java
217
+ src/main/java/org/wordpress/util/config/BloggingPromptsFeatureConfig.kt
218
+ ]
219
+
220
+ diff = generate_add_diff_from_fixtures(added_files)
221
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
222
+
223
+ subclasses_to_ignore = [
224
+ /FeatureConfig$/
225
+ ].freeze
226
+
227
+ @plugin.check_missing_tests(subclasses_exceptions: subclasses_to_ignore)
228
+
229
+ classes = ['NestedWebView']
230
+ expect_class_names_match_report(class_names: classes, error_report: @dangerfile.status_report[:errors])
231
+ end
232
+
233
+ it 'does not report that added classes with a path filter are missing tests' do
234
+ added_files = %w[
235
+ AbcFeatureConfig.java
236
+ AnotherViewHelper.kt
237
+ src/main/java/org/wordpress/util/config/BloggingPromptsFeatureConfig.kt
238
+ ]
239
+
240
+ diff = generate_add_diff_from_fixtures(added_files)
241
+ allow(@dangerfile.git).to receive(:diff).and_return(diff)
242
+
243
+ path_exceptions = ['src/main/java/org/wordpress/**', '*.java']
244
+
245
+ @plugin.check_missing_tests(path_exceptions: path_exceptions)
246
+
247
+ classes = ['AnotherViewHelper']
248
+ expect_class_names_match_report(class_names: classes, error_report: @dangerfile.status_report[:errors])
249
+ end
250
+
251
+ it 'does nothing when a PR moves code around with both additions and removals in the diff' do
252
+ shape_file = 'Shape.kt'
253
+
254
+ polygon_test_diff_str = <<~PATCH
255
+ diff --git a/PolygonTest.kt b/PolygonTest.kt
256
+ index 8c2bed6..ae81c49 100644
257
+ --- a/PolygonTest.kt
258
+ +++ b/PolygonTest.kt
259
+ @@ -1,8 +1,9 @@
260
+ -class PolygonTest {
261
+ - val sut10: Shape = Polygon(sides = 10)
262
+ - val sut5: Shape = Polygon(sides = 5)
263
+ -
264
+ - fun testDraw() {
265
+ - Polygon(sides = 5).draw()
266
+ +class ShapesTest {
267
+ + fun testPentagon() {
268
+ + draw(Polygon(sides = 5))
269
+ + }
270
+ +
271
+ + private fun draw(shape: Shape) {
272
+ + shape.draw()
273
+ }
274
+ }
275
+ PATCH
276
+
277
+ shape_diff = generate_add_diff_from_fixtures([shape_file])
278
+ polygon_diff = GitDiffStruct.new('modified', 'project/src/androidTest/java/shapes/PolygonTest.kt', polygon_test_diff_str)
279
+
280
+ allow(@dangerfile.git).to receive(:diff).and_return(shape_diff + [polygon_diff])
281
+
282
+ @plugin.check_missing_tests
283
+
284
+ expect(@dangerfile).to not_report
285
+ end
286
+ end
287
+
288
+ def generate_add_diff_from_fixtures(paths)
289
+ paths.map do |path|
290
+ content = fixture(File.join('android_unit_test_checker', path))
291
+ diff_str = generate_add_diff(file_path: path, content: content)
292
+
293
+ GitDiffStruct.new('new', path, diff_str)
294
+ end
295
+ end
296
+
297
+ def generate_delete_diff_from_fixtures(paths)
298
+ paths.map do |path|
299
+ content = fixture(File.join('android_unit_test_checker', path))
300
+ diff_str = generate_delete_diff(file_path: path, content: content)
301
+
302
+ GitDiffStruct.new('deleted', path, diff_str)
303
+ end
304
+ end
305
+
306
+ def generate_delete_diff(file_path:, content:)
307
+ <<~PATCH
308
+ diff --git a/#{file_path} b/#{file_path}
309
+ deleted file mode 100644
310
+ index fd48a22..0000000
311
+ --- a/#{file_path}
312
+ +++ /dev/null
313
+ @@ -1 +0,0 @@
314
+ #{prefix_text_lines(content: content, prefix: '-')}
315
+ \
316
+ PATCH
317
+ end
318
+
319
+ def generate_add_diff(file_path:, content:)
320
+ <<~PATCH
321
+ diff --git a/#{file_path} b/#{file_path}
322
+ new file mode 100644
323
+ index 0000000..fd48a22
324
+ --- /dev/null
325
+ +++ b/#{file_path}
326
+ @@ -0,0 +1 @@
327
+ #{prefix_text_lines(content: content, prefix: '+')}
328
+ \
329
+ PATCH
330
+ end
331
+
332
+ def prefix_text_lines(content:, prefix:)
333
+ content.lines.map { |line| "#{prefix}#{line.chomp}" }.join("\n")
334
+ end
335
+
336
+ def expect_class_names_match_report(class_names:, error_report:)
337
+ expect(class_names.length).to eq(error_report.length)
338
+ class_names.zip(error_report).each do |cls, error|
339
+ expect(error).to include "Please add tests for class `#{cls}`"
340
+ end
341
+ end
342
+ end
343
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::CommonReleaseChecker do
7
+ it 'is a plugin' do
8
+ expect(described_class.new(nil)).to be_a Danger::Plugin
9
+ end
10
+
11
+ describe 'with the common_release_checker plugin' do
12
+ before do
13
+ @dangerfile = testing_dangerfile
14
+ @plugin = @dangerfile.common_release_checker
15
+
16
+ allow(@plugin.git).to receive_messages(added_files: [], modified_files: [], deleted_files: [])
17
+ end
18
+
19
+ context 'when changing the internal release notes' do
20
+ it 'reports a warning when a PR on a release branch changes the internal release notes' do
21
+ notes_file = 'RELEASE-NOTES.txt'
22
+ allow(@plugin.git).to receive(:modified_files).and_return([notes_file])
23
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
24
+
25
+ @plugin.check_internal_release_notes_changed
26
+
27
+ expect(@dangerfile).to report_warnings([format(CommonReleaseChecker::MESSAGE_INTERNAL_RELEASE_NOTES_CHANGED, notes_file)])
28
+ end
29
+
30
+ it 'reports a warning when a PR on a release branch changes the internal release notes using a custom filename' do
31
+ notes_file = 'MY-CUSTOM-RELEASE-NOTES.md'
32
+ allow(@plugin.git).to receive(:modified_files).and_return([notes_file])
33
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
34
+
35
+ @plugin.check_internal_release_notes_changed(release_notes_file: notes_file)
36
+
37
+ expect(@dangerfile).to report_warnings([format(CommonReleaseChecker::MESSAGE_INTERNAL_RELEASE_NOTES_CHANGED, notes_file)])
38
+ end
39
+
40
+ it 'does nothing when a PR changes the release notes file on a regular branch' do
41
+ allow(@plugin.git).to receive(:modified_files).and_return(['RELEASE-NOTES.txt'])
42
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
43
+
44
+ @plugin.check_internal_release_notes_changed
45
+
46
+ expect(@dangerfile).to not_report
47
+ end
48
+
49
+ it 'does nothing when a PR changes a custom release notes file on a regular branch' do
50
+ notes_file = 'MY-CUSTOM-RELEASE-NOTES.md'
51
+ allow(@plugin.git).to receive(:modified_files).and_return([notes_file])
52
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
53
+
54
+ @plugin.check_internal_release_notes_changed(release_notes_file: notes_file)
55
+
56
+ expect(@dangerfile).to not_report
57
+ end
58
+
59
+ it 'does nothing when a PR ca warning when a PR does not change the release notes file on the release branch' do
60
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/MyView.swift'])
61
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
62
+
63
+ @plugin.check_internal_release_notes_changed
64
+
65
+ expect(@dangerfile).to not_report
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end