danger-dangermattic 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,7 @@
1
+ import java.utils.*;
2
+
3
+ public class Abc {
4
+ public static void main(String[] args) {
5
+ System.out.println("");
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import java.util.*;
2
+
3
+ abstract class AbcFeatureConfig
4
+ extends
5
+ MyNewFeatureConfig {
6
+ public abstract void wrangle();
7
+ }
@@ -0,0 +1,5 @@
1
+ class Abcdef(private val name: String) {
2
+ fun testMe() {
3
+ println("")
4
+ }
5
+ }
@@ -0,0 +1,7 @@
1
+ import java.util.List;
2
+
3
+ public final class AbcdefgViewHelper<T extends List<?>> {
4
+ public static void testMe() {
5
+ System.out.println("");
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ class AnotherViewHelper<T>(val type: T)
2
+ {
3
+ fun testMe()
4
+ {
5
+ println("")
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ package src;
2
+
3
+ final class MyNewClass {
4
+ public void testMe() {
5
+ System.out.println("");
6
+ }
7
+ }
@@ -0,0 +1,3 @@
1
+ abstract class Polygon {
2
+ abstract fun draw()
3
+ }
@@ -0,0 +1,10 @@
1
+ open class Polygon(sides: Int): Shape {
2
+ override fun draw() {
3
+ for (i in 1..sides)
4
+ draw()
5
+ }
6
+ }
7
+
8
+ abstract class Shape {
9
+ abstract fun draw()
10
+ }
@@ -0,0 +1,5 @@
1
+ public final class TestsINeedThem {
2
+ public void testMe() {
3
+ System.out.println("");
4
+ }
5
+ }
@@ -0,0 +1,7 @@
1
+ public final class TestsINeedThem
2
+ {
3
+ fun myNewTest()
4
+ {
5
+ println("")
6
+ }
7
+ }
@@ -0,0 +1,12 @@
1
+ public open class TestsINeedThem2 {
2
+ fun testMe2() {
3
+ }
4
+ }
5
+
6
+ class TestsINeedThem2AnotherClass
7
+ {
8
+ fun thisNeedsATest()
9
+ {
10
+ println("thisNeedsATest")
11
+ }
12
+ }
@@ -0,0 +1,7 @@
1
+ import android.content.Context
2
+ import android.content.res.Configuration
3
+ import androidx.appcompat.app.AppCompatActivity
4
+
5
+ class MyActivity: AppCompatActivity {
6
+ fun myActivity() {}
7
+ }
@@ -0,0 +1,7 @@
1
+ package src.android.java.org.activities;
2
+
3
+ import org.wordpress.android.ui.LocaleAwareActivity;
4
+
5
+ public class MyJavaActivity extends LocaleAwareActivity {
6
+ public void myJavaActivity() {}
7
+ }
@@ -0,0 +1,6 @@
1
+ import androidx.fragment.app.Fragment
2
+
3
+ @AndroidEntryPoint
4
+ class MyFragment : Fragment(R.layout.activity_log_item_detail) {
5
+ override fun onBackPressed() {}
6
+ }
@@ -0,0 +1,7 @@
1
+ package src.android.java.org.fragments;
2
+
3
+ import androidx.appcompat.app.AppCompatDialogFragment;
4
+
5
+ public class MyNewJavaFragment<T> extends AppCompatDialogFragment<? extends T> {
6
+ public void myFragment() {}
7
+ }
@@ -0,0 +1,13 @@
1
+ package src.android.java.org.module;
2
+
3
+ import dagger.hilt.components.SingletonComponent;
4
+ import dagger.android.AndroidInjectionModule;
5
+
6
+ @InstallIn(SingletonComponent.class)
7
+ @Module(includes = AndroidInjectionModule.class)
8
+ public class MyModule {
9
+ @Provides
10
+ public static SharedPreferences provideSharedPrefs(@ApplicationContext Context context) {
11
+ return PreferenceManager.getDefaultSharedPreferences(context);
12
+ }
13
+ }
@@ -0,0 +1,22 @@
1
+ // Taken from https://github.com/wordpress-mobile/WordPress-Android/blob/trunk/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/viewholders/ActionCardViewHolder.kt
2
+ import android.view.ViewGroup
3
+ import androidx.core.text.HtmlCompat
4
+ import org.wordpress.android.databinding.StatsBlockListActionCardBinding
5
+ import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ListItemActionCard
6
+ import org.wordpress.android.util.extensions.viewBinding
7
+
8
+ class ActionCardViewHolder(
9
+ val parent: ViewGroup,
10
+ val binding: StatsBlockListActionCardBinding = parent.viewBinding(StatsBlockListActionCardBinding::inflate)
11
+ ) : BlockListItemViewHolder(binding.root) {
12
+ fun bind(
13
+ item: ListItemActionCard
14
+ ) = with(binding) {
15
+ actionTitle.text = parent.context.getString(item.titleResource)
16
+ actionMessage.text = HtmlCompat.fromHtml(parent.context.getString(item.text), HtmlCompat.FROM_HTML_MODE_LEGACY)
17
+ buttonPositive.setText(item.positiveButtonText)
18
+ buttonPositive.setOnClickListener { item.positiveAction.click() }
19
+ buttonNegative.setText(item.negativeButtonText)
20
+ buttonNegative.setOnClickListener { item.negativeAction.click() }
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ package src.android.java.org.view;
2
+
3
+ public class MyRecyclerView extends RecyclerView {
4
+ public List<Items> list() {
5
+
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ package src.androidTest.java.org.test;
2
+
3
+ public class AbcTests {
4
+ public void Abc() { Abc.main([]) }
5
+ }
@@ -0,0 +1,7 @@
1
+ package src.androidTest.java.org.test;
2
+
3
+ public class AnotherTestClass {
4
+ public void testWriteMeATest() {
5
+ new TestsINeedThem().writeMeATest()
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ class PolygonTest
2
+ {
3
+ fun testDraw() { Polygon().draw() }
4
+ }
@@ -0,0 +1,9 @@
1
+ package src.androidTest.java.org.test;
2
+
3
+ class TestMyNewClass
4
+ {
5
+ public void testMe()
6
+ {
7
+ new MyNewClass().testMe()
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ class ToolTest {
2
+ fun testMethod() {
3
+
4
+ }
5
+ }
@@ -0,0 +1,32 @@
1
+ // example declaration taken from https://github.com/wordpress-mobile/WordPress-Android/blob/44282b137085ec230771fc2c87ad9a44610fbeb1/WordPress/src/main/java/org/wordpress/android/widgets/NestedWebView.kt
2
+ package org.wordpress.android.widgets
3
+
4
+ import android.annotation.SuppressLint
5
+ import android.content.Context
6
+ import android.util.AttributeSet
7
+ import android.view.MotionEvent
8
+ import androidx.core.view.NestedScrollingChild3
9
+ import androidx.core.view.NestedScrollingChildHelper
10
+ import androidx.core.view.ViewCompat
11
+ import org.wordpress.android.ui.WPWebView
12
+ import android.R as AndroidR
13
+
14
+ class NestedWebView @JvmOverloads constructor(
15
+ context: Context,
16
+ attrs: AttributeSet? = null,
17
+ defStyleAttr: Int = AndroidR.attr.webViewStyle
18
+ ) : WPWebView(context, attrs, defStyleAttr), NestedScrollingChild3 {
19
+ private var lastY = 0
20
+ private val scrollOffset = IntArray(2)
21
+ private val scrollConsumed = IntArray(2)
22
+ private var nestedOffsetY = 0
23
+ private val nestedScrollingChildHelper: NestedScrollingChildHelper = NestedScrollingChildHelper(this)
24
+
25
+ override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean {
26
+ return nestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY)
27
+ }
28
+
29
+ init {
30
+ isNestedScrollingEnabled = true
31
+ }
32
+ }
@@ -0,0 +1,23 @@
1
+ // Taken from https://github.com/wordpress-mobile/WordPress-Android/blob/44282b137085ec230771fc2c87ad9a44610fbeb1/WordPress/src/main/java/org/wordpress/android/util/config/BloggingPromptsFeatureConfig.kt
2
+ package org.wordpress.android.util.config
3
+
4
+ import org.wordpress.android.BuildConfig
5
+ import org.wordpress.android.annotation.Feature
6
+ import org.wordpress.android.util.config.BloggingPromptsFeatureConfig.Companion.BLOGGING_PROMPTS_REMOTE_FIELD
7
+ import javax.inject.Inject
8
+
9
+ @Feature(BLOGGING_PROMPTS_REMOTE_FIELD, true)
10
+ class BloggingPromptsFeatureConfig
11
+ @Inject constructor(appConfig: AppConfig) : FeatureConfig(
12
+ appConfig,
13
+ BuildConfig.BLOGGING_PROMPTS,
14
+ BLOGGING_PROMPTS_REMOTE_FIELD
15
+ ) {
16
+ override fun isEnabled(): Boolean {
17
+ return super.isEnabled() && BuildConfig.IS_JETPACK_APP
18
+ }
19
+
20
+ companion object {
21
+ const val BLOGGING_PROMPTS_REMOTE_FIELD = "blogging_prompts_remote_field"
22
+ }
23
+ }
@@ -0,0 +1,9 @@
1
+ package src.test.java.org.test;
2
+
3
+ class TestsINeedThemTests
4
+ {
5
+ void testINeedTests()
6
+ {
7
+ new TestsINeedThem().testMe();
8
+ }
9
+ }
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::GithubUtils 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
+ let(:github) do
13
+ instance_double(Danger::DangerfileGitHubPlugin, {
14
+ pr_json: {
15
+ 'base' => { 'repo' => { 'full_name' => 'Automattic/dangermattic' } },
16
+ 'number' => 42,
17
+ 'requested_teams' => [],
18
+ 'requested_reviewers' => []
19
+ },
20
+ api: instance_double(Octokit::Client),
21
+ branch_for_base: 'main',
22
+ pr_labels: [],
23
+ pr_title: 'Some PR Title'
24
+ })
25
+ end
26
+
27
+ before do
28
+ @dangerfile = testing_dangerfile
29
+ @plugin = @dangerfile.github_utils
30
+
31
+ allow(@plugin).to receive(:github).and_return(github)
32
+ end
33
+
34
+ describe '#active_reviewers?' do
35
+ it 'returns true when there are active reviewers' do
36
+ allow(github.api).to receive(:pull_request_reviews).and_return(%w[review1 review2])
37
+ expect(@plugin.active_reviewers?).to be(true)
38
+ end
39
+
40
+ it 'returns false when there are no active reviewers' do
41
+ allow(github.api).to receive(:pull_request_reviews).and_return([])
42
+ expect(@plugin.active_reviewers?).to be(false)
43
+ end
44
+ end
45
+
46
+ describe '#requested_reviewers?' do
47
+ it 'returns true when there are requested reviewers' do
48
+ allow(github.pr_json).to receive(:[]).with('requested_teams').and_return(['team1'])
49
+ expect(@plugin.requested_reviewers?).to be(true)
50
+ end
51
+
52
+ it 'returns true when there are active reviewers' do
53
+ allow(github.api).to receive(:pull_request_reviews).and_return(%w[review1 review2])
54
+ expect(@plugin.requested_reviewers?).to be(true)
55
+ end
56
+
57
+ it 'returns false when there are no requested reviewers or active reviewers' do
58
+ allow(github.api).to receive(:pull_request_reviews).and_return([])
59
+ expect(@plugin.requested_reviewers?).to be(false)
60
+ end
61
+ end
62
+
63
+ describe '#main_branch?' do
64
+ it 'returns true when the branch is a main branch' do
65
+ allow(github).to receive(:branch_for_base).and_return('develop')
66
+ expect(@plugin.main_branch?).to be(true)
67
+ end
68
+
69
+ it 'returns false when the branch is not a main branch' do
70
+ allow(github).to receive(:branch_for_base).and_return('feature-branch')
71
+ expect(@plugin.main_branch?).to be(false)
72
+ end
73
+ end
74
+
75
+ describe '#release_branch?' do
76
+ it 'returns true when the branch is a release branch' do
77
+ allow(github).to receive(:branch_for_base).and_return('release/30.6.0')
78
+ expect(@plugin.release_branch?).to be(true)
79
+ end
80
+
81
+ it 'returns true when the branch is a hotfix branch' do
82
+ allow(github).to receive(:branch_for_base).and_return('hotfix/fix-bug')
83
+ expect(@plugin.release_branch?).to be(true)
84
+ end
85
+
86
+ it 'returns false when the branch is neither a release nor a hotfix branch' do
87
+ allow(github).to receive(:branch_for_base).and_return('feature-branch')
88
+ expect(@plugin.release_branch?).to be(false)
89
+ end
90
+ end
91
+
92
+ describe '#wip_feature?' do
93
+ it 'returns true when there is a WIP label' do
94
+ allow(github).to receive(:pr_labels).and_return(['WIP'])
95
+ expect(@plugin.wip_feature?).to be(true)
96
+ end
97
+
98
+ it 'returns true when there is WIP in the title' do
99
+ allow(github).to receive(:pr_title).and_return('WIP: Some PR Title')
100
+ expect(@plugin.wip_feature?).to be(true)
101
+ end
102
+
103
+ it 'returns false when there is no WIP label or WIP in the title' do
104
+ allow(github).to receive_messages(pr_labels: [], pr_title: 'Some PR Title')
105
+ expect(@plugin.wip_feature?).to be(false)
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,191 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ module Danger
6
+ describe Danger::IosReleaseChecker 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.ios_release_checker
15
+
16
+ allow(@plugin.git).to receive_messages(added_files: [], modified_files: [], deleted_files: [])
17
+ end
18
+
19
+ context 'when changing the Core Data model' do
20
+ it 'reports a warning when a PR on a release branch changes a Core Data model' do
21
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/model/Model.xcdatamodeld'])
22
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
23
+
24
+ @plugin.check_core_data_model_changed
25
+
26
+ expect(@dangerfile).to report_warnings([IosReleaseChecker::MESSAGE_CORE_DATA_UPDATED])
27
+ end
28
+
29
+ it 'does nothing when a PR changes a Core Data model on a regular branch' do
30
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/model/Model.xcdatamodeld'])
31
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
32
+
33
+ @plugin.check_core_data_model_changed
34
+
35
+ expect(@dangerfile).to not_report
36
+ end
37
+
38
+ it 'does nothing when a PR ca warning when a PR does not change a Core Data model on the release branch' do
39
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/model/MyViewModel.swift'])
40
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
41
+
42
+ @plugin.check_core_data_model_changed
43
+
44
+ expect(@dangerfile).to not_report
45
+ end
46
+ end
47
+
48
+ context 'when changing the Localizable.strings files' do
49
+ describe '#check_modified_localizable_strings_on_release' do
50
+ it 'reports a warning when a PR on a regular branch changes the source Localizable.strings' do
51
+ allow(@plugin.git).to receive(:modified_files).and_return(['en.lproj/Localizable.strings'])
52
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
53
+
54
+ @plugin.check_modified_localizable_strings_on_release
55
+
56
+ expect(@dangerfile).to report_warnings([IosReleaseChecker::MESSAGE_STRINGS_FILE_UPDATED])
57
+ end
58
+
59
+ it 'reports a warning when a PR on a regular branch changes a translated Localizable.strings' do
60
+ allow(@plugin.git).to receive(:modified_files).and_return(['nl.lproj/Localizable.strings'])
61
+ allow(@plugin.github).to receive(:branch_for_base).and_return('trunk')
62
+
63
+ @plugin.check_modified_localizable_strings_on_release
64
+
65
+ expect(@dangerfile).to report_warnings([IosReleaseChecker::MESSAGE_STRINGS_FILE_UPDATED])
66
+ end
67
+
68
+ it 'does nothing when a PR changes the Localizable.strings on a release branch' do
69
+ allow(@plugin.git).to receive(:modified_files).and_return(['en.lproj/Localizable.strings'])
70
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
71
+
72
+ @plugin.check_modified_localizable_strings_on_release
73
+
74
+ expect(@dangerfile).to not_report
75
+ end
76
+
77
+ it 'does nothing when a PR does not change the Localizable.strings on a regular branch' do
78
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/model/MyViewModel.swift'])
79
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
80
+
81
+ @plugin.check_modified_localizable_strings_on_release
82
+
83
+ expect(@dangerfile).to not_report
84
+ end
85
+ end
86
+
87
+ describe '#check_modified_en_strings_on_regular_branch' do
88
+ it 'reports a warning when a PR on a release branch changes the source Localizable.strings' do
89
+ allow(@plugin.git).to receive(:modified_files).and_return(['en.lproj/Localizable.strings'])
90
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
91
+
92
+ @plugin.check_modified_en_strings_on_regular_branch
93
+
94
+ expect(@dangerfile).to report_warnings([IosReleaseChecker::MESSAGE_BASE_STRINGS_FILE_UPDATED])
95
+ end
96
+
97
+ it 'does nothing when a PR changes the Localizable.strings on a regular branch' do
98
+ allow(@plugin.git).to receive(:modified_files).and_return(['en.lproj/Localizable.strings'])
99
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
100
+
101
+ @plugin.check_modified_en_strings_on_regular_branch
102
+
103
+ expect(@dangerfile).to not_report
104
+ end
105
+
106
+ it 'does nothing when a PR on a release branch changes a translated Localizable.strings' do
107
+ allow(@plugin.git).to receive(:modified_files).and_return(['nl.lproj/Localizable.strings'])
108
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
109
+
110
+ @plugin.check_modified_en_strings_on_regular_branch
111
+
112
+ expect(@dangerfile).to not_report
113
+ end
114
+
115
+ it 'does nothing when a PR does not change the Localizable.strings on a release branch' do
116
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/model/MyViewModel2.swift'])
117
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
118
+
119
+ @plugin.check_modified_en_strings_on_regular_branch
120
+
121
+ expect(@dangerfile).to not_report
122
+ end
123
+ end
124
+
125
+ describe '#check_modified_translations_on_release_branch' do
126
+ it 'reports a warning when a PR on a regular branch changes a translation file' do
127
+ allow(@plugin.git).to receive(:modified_files).and_return(['be.lproj/Localizable.strings'])
128
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
129
+
130
+ @plugin.check_modified_translations_on_release_branch
131
+
132
+ expect(@dangerfile).to report_warnings([IosReleaseChecker::MESSAGE_TRANSLATION_FILE_UPDATED])
133
+ end
134
+
135
+ it 'does nothing when a PR changes a translation string on a release branch' do
136
+ allow(@plugin.git).to receive(:modified_files).and_return(['fr.lproj/Localizable.strings'])
137
+ allow(@plugin.github).to receive(:branch_for_base).and_return('release/30.6')
138
+
139
+ @plugin.check_modified_translations_on_release_branch
140
+
141
+ expect(@dangerfile).to not_report
142
+ end
143
+
144
+ it 'does nothing when a PR on a regular branch changes the source Localizable.strings' do
145
+ allow(@plugin.git).to receive(:modified_files).and_return(['./en.lproj/Localizable.strings'])
146
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
147
+
148
+ @plugin.check_modified_translations_on_release_branch
149
+
150
+ expect(@dangerfile).to not_report
151
+ end
152
+
153
+ it 'does nothing when a PR does not change a translation file on a regular branch' do
154
+ allow(@plugin.git).to receive(:modified_files).and_return(['./path/to/view/model/MyViewModel3.swift'])
155
+ allow(@plugin.github).to receive(:branch_for_base).and_return('develop')
156
+
157
+ @plugin.check_modified_translations_on_release_branch
158
+
159
+ expect(@dangerfile).to not_report
160
+ end
161
+ end
162
+ end
163
+
164
+ context 'when changing the release notes' do
165
+ it 'reports a warning when a PR changes the release notes but not the AppStore strings file' do
166
+ allow(@plugin.git).to receive(:modified_files).and_return(['Resources/release_notes.txt'])
167
+
168
+ @plugin.check_release_notes_and_app_store_strings
169
+
170
+ expect(@dangerfile).to report_messages([format(CommonReleaseChecker::MESSAGE_STORE_FILE_NOT_CHANGED, 'Resources/AppStoreStrings.po', 'Resources/release_notes.txt')])
171
+ end
172
+
173
+ it 'does nothing when a PR changes the release notes and the AppStore strings file' do
174
+ allow(@plugin.git).to receive(:modified_files).and_return(['Resources/release_notes.txt', 'Resources/AppStoreStrings.po'])
175
+
176
+ @plugin.check_release_notes_and_app_store_strings
177
+
178
+ expect(@dangerfile).to not_report
179
+ end
180
+
181
+ it 'does nothing when a PR does not change the release notes or the AppStore strings file' do
182
+ allow(@plugin.git).to receive(:modified_files).and_return(['MyView.swift', 'Resources/AppStoreStrings.tmp'])
183
+
184
+ @plugin.check_release_notes_and_app_store_strings
185
+
186
+ expect(@dangerfile).to not_report
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end