knapsack_pro 3.8.0 → 7.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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +377 -23
  3. data/.github/dependabot.yml +11 -0
  4. data/.github/pull_request_template.md +22 -0
  5. data/.gitignore +4 -0
  6. data/CHANGELOG.md +325 -1
  7. data/Gemfile +9 -0
  8. data/README.md +3 -10
  9. data/bin/test +15 -0
  10. data/knapsack_pro.gemspec +7 -6
  11. data/lib/knapsack_pro/adapters/base_adapter.rb +17 -2
  12. data/lib/knapsack_pro/adapters/cucumber_adapter.rb +3 -3
  13. data/lib/knapsack_pro/adapters/minitest_adapter.rb +2 -0
  14. data/lib/knapsack_pro/adapters/rspec_adapter.rb +88 -49
  15. data/lib/knapsack_pro/adapters/spinach_adapter.rb +2 -0
  16. data/lib/knapsack_pro/adapters/test_unit_adapter.rb +2 -0
  17. data/lib/knapsack_pro/allocator.rb +2 -0
  18. data/lib/knapsack_pro/allocator_builder.rb +2 -0
  19. data/lib/knapsack_pro/base_allocator_builder.rb +8 -25
  20. data/lib/knapsack_pro/build_distribution_fetcher.rb +2 -0
  21. data/lib/knapsack_pro/client/api/action.rb +2 -0
  22. data/lib/knapsack_pro/client/api/v1/base.rb +2 -0
  23. data/lib/knapsack_pro/client/api/v1/build_distributions.rb +5 -0
  24. data/lib/knapsack_pro/client/api/v1/build_subsets.rb +2 -0
  25. data/lib/knapsack_pro/client/api/v1/queues.rb +6 -1
  26. data/lib/knapsack_pro/client/connection.rb +5 -6
  27. data/lib/knapsack_pro/config/ci/app_veyor.rb +18 -0
  28. data/lib/knapsack_pro/config/ci/base.rb +27 -0
  29. data/lib/knapsack_pro/config/ci/buildkite.rb +18 -0
  30. data/lib/knapsack_pro/config/ci/circle.rb +18 -0
  31. data/lib/knapsack_pro/config/ci/cirrus_ci.rb +18 -0
  32. data/lib/knapsack_pro/config/ci/codefresh.rb +18 -0
  33. data/lib/knapsack_pro/config/ci/codeship.rb +18 -0
  34. data/lib/knapsack_pro/config/ci/github_actions.rb +26 -0
  35. data/lib/knapsack_pro/config/ci/gitlab_ci.rb +20 -1
  36. data/lib/knapsack_pro/config/ci/heroku.rb +18 -0
  37. data/lib/knapsack_pro/config/ci/semaphore.rb +16 -0
  38. data/lib/knapsack_pro/config/ci/semaphore2.rb +19 -0
  39. data/lib/knapsack_pro/config/ci/travis.rb +18 -0
  40. data/lib/knapsack_pro/config/env.rb +46 -22
  41. data/lib/knapsack_pro/config/env_generator.rb +2 -0
  42. data/lib/knapsack_pro/config/temp_files.rb +8 -4
  43. data/lib/knapsack_pro/crypto/branch_encryptor.rb +2 -0
  44. data/lib/knapsack_pro/crypto/decryptor.rb +2 -0
  45. data/lib/knapsack_pro/crypto/digestor.rb +2 -0
  46. data/lib/knapsack_pro/crypto/encryptor.rb +2 -0
  47. data/lib/knapsack_pro/extensions/rspec_extension.rb +137 -0
  48. data/lib/knapsack_pro/formatters/rspec_json_formatter.rb +2 -0
  49. data/lib/knapsack_pro/formatters/time_tracker.rb +152 -0
  50. data/lib/knapsack_pro/formatters/time_tracker_fetcher.rb +20 -0
  51. data/lib/knapsack_pro/hooks/queue.rb +2 -0
  52. data/lib/knapsack_pro/logger_wrapper.rb +2 -0
  53. data/lib/knapsack_pro/mask_string.rb +9 -0
  54. data/lib/knapsack_pro/presenter.rb +6 -3
  55. data/lib/knapsack_pro/pure/queue/rspec_pure.rb +92 -0
  56. data/lib/knapsack_pro/queue_allocator.rb +2 -0
  57. data/lib/knapsack_pro/queue_allocator_builder.rb +2 -0
  58. data/lib/knapsack_pro/railtie.rb +2 -0
  59. data/lib/knapsack_pro/report.rb +15 -9
  60. data/lib/knapsack_pro/repository_adapter_initiator.rb +2 -0
  61. data/lib/knapsack_pro/repository_adapters/base_adapter.rb +2 -0
  62. data/lib/knapsack_pro/repository_adapters/env_adapter.rb +2 -0
  63. data/lib/knapsack_pro/repository_adapters/git_adapter.rb +50 -0
  64. data/lib/knapsack_pro/runners/base_runner.rb +2 -0
  65. data/lib/knapsack_pro/runners/cucumber_runner.rb +2 -0
  66. data/lib/knapsack_pro/runners/minitest_runner.rb +2 -0
  67. data/lib/knapsack_pro/runners/queue/base_runner.rb +29 -0
  68. data/lib/knapsack_pro/runners/queue/cucumber_runner.rb +9 -6
  69. data/lib/knapsack_pro/runners/queue/minitest_runner.rb +13 -6
  70. data/lib/knapsack_pro/runners/queue/rspec_runner.rb +128 -135
  71. data/lib/knapsack_pro/runners/rspec_runner.rb +22 -3
  72. data/lib/knapsack_pro/runners/spinach_runner.rb +2 -0
  73. data/lib/knapsack_pro/runners/test_unit_runner.rb +2 -0
  74. data/lib/knapsack_pro/slow_test_file_determiner.rb +2 -0
  75. data/lib/knapsack_pro/slow_test_file_finder.rb +2 -0
  76. data/lib/knapsack_pro/task_loader.rb +2 -0
  77. data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +2 -0
  78. data/lib/knapsack_pro/test_case_mergers/base_merger.rb +2 -0
  79. data/lib/knapsack_pro/test_case_mergers/rspec_merger.rb +2 -0
  80. data/lib/knapsack_pro/test_file_cleaner.rb +2 -0
  81. data/lib/knapsack_pro/test_file_finder.rb +2 -0
  82. data/lib/knapsack_pro/test_file_pattern.rb +2 -0
  83. data/lib/knapsack_pro/test_file_presenter.rb +2 -0
  84. data/lib/knapsack_pro/test_files_with_test_cases_composer.rb +2 -0
  85. data/lib/knapsack_pro/test_flat_distributor.rb +2 -0
  86. data/lib/knapsack_pro/tracker.rb +3 -3
  87. data/lib/knapsack_pro/urls.rb +4 -0
  88. data/lib/knapsack_pro/utils.rb +2 -0
  89. data/lib/knapsack_pro/version.rb +3 -1
  90. data/lib/knapsack_pro.rb +5 -3
  91. data/lib/tasks/cucumber.rake +2 -0
  92. data/lib/tasks/encrypted_branch_names.rake +2 -0
  93. data/lib/tasks/encrypted_test_file_names.rake +2 -0
  94. data/lib/tasks/minitest.rake +2 -0
  95. data/lib/tasks/queue/cucumber.rake +13 -0
  96. data/lib/tasks/queue/minitest.rake +13 -0
  97. data/lib/tasks/queue/rspec.rake +13 -0
  98. data/lib/tasks/rspec.rake +5 -0
  99. data/lib/tasks/salt.rake +2 -0
  100. data/lib/tasks/spinach.rake +2 -0
  101. data/lib/tasks/test_unit.rake +2 -0
  102. data/spec/integration/api/build_distributions_subset_spec.rb +1 -0
  103. data/spec/integration/runners/queue/rspec_runner.rb +80 -0
  104. data/spec/integration/runners/queue/rspec_runner_spec.rb +2232 -0
  105. data/spec/knapsack_pro/adapters/base_adapter_spec.rb +30 -11
  106. data/spec/knapsack_pro/adapters/cucumber_adapter_spec.rb +2 -5
  107. data/spec/knapsack_pro/adapters/rspec_adapter_spec.rb +146 -174
  108. data/spec/knapsack_pro/base_allocator_builder_spec.rb +22 -48
  109. data/spec/knapsack_pro/client/api/v1/build_distributions_spec.rb +19 -27
  110. data/spec/knapsack_pro/client/api/v1/queues_spec.rb +23 -43
  111. data/spec/knapsack_pro/client/connection_spec.rb +59 -7
  112. data/spec/knapsack_pro/config/ci/app_veyor_spec.rb +22 -8
  113. data/spec/knapsack_pro/config/ci/base_spec.rb +1 -0
  114. data/spec/knapsack_pro/config/ci/buildkite_spec.rb +51 -16
  115. data/spec/knapsack_pro/config/ci/circle_spec.rb +48 -13
  116. data/spec/knapsack_pro/config/ci/cirrus_ci_spec.rb +12 -12
  117. data/spec/knapsack_pro/config/ci/codefresh_spec.rb +21 -6
  118. data/spec/knapsack_pro/config/ci/codeship_spec.rb +20 -6
  119. data/spec/knapsack_pro/config/ci/github_actions_spec.rb +37 -10
  120. data/spec/knapsack_pro/config/ci/gitlab_ci_spec.rb +48 -13
  121. data/spec/knapsack_pro/config/ci/heroku_spec.rb +12 -12
  122. data/spec/knapsack_pro/config/ci/semaphore2_spec.rb +11 -11
  123. data/spec/knapsack_pro/config/ci/semaphore_spec.rb +12 -12
  124. data/spec/knapsack_pro/config/ci/travis_spec.rb +8 -8
  125. data/spec/knapsack_pro/config/env_spec.rb +204 -124
  126. data/spec/knapsack_pro/formatters/time_tracker_specs.rb +424 -0
  127. data/spec/knapsack_pro/hooks/queue_spec.rb +2 -2
  128. data/spec/knapsack_pro/presenter_spec.rb +1 -1
  129. data/spec/knapsack_pro/pure/queue/rspec_pure_spec.rb +224 -0
  130. data/spec/knapsack_pro/repository_adapters/git_adapter_spec.rb +72 -0
  131. data/spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb +18 -16
  132. data/spec/knapsack_pro/runners/queue/minitest_runner_spec.rb +17 -14
  133. data/spec/knapsack_pro/runners/rspec_runner_spec.rb +40 -23
  134. data/spec/knapsack_pro/test_case_detectors/rspec_test_example_detector_spec.rb +1 -0
  135. data/spec/knapsack_pro/tracker_spec.rb +0 -4
  136. data/spec/knapsack_pro_spec.rb +3 -3
  137. data/spec/spec_helper.rb +0 -1
  138. metadata +26 -23
  139. data/lib/knapsack_pro/config/ci/snap_ci.rb +0 -35
  140. data/lib/knapsack_pro/config/ci/solano_ci.rb +0 -32
  141. data/lib/knapsack_pro/extensions/time.rb +0 -7
  142. data/lib/knapsack_pro/formatters/rspec_queue_profile_formatter_extension.rb +0 -56
  143. data/lib/knapsack_pro/formatters/rspec_queue_summary_formatter.rb +0 -112
  144. data/spec/knapsack_pro/config/ci/snap_ci_spec.rb +0 -104
  145. data/spec/knapsack_pro/config/ci/solano_ci_spec.rb +0 -73
  146. data/spec/knapsack_pro/extensions/time_spec.rb +0 -5
  147. data/spec/knapsack_pro/runners/queue/rspec_runner_spec.rb +0 -342
@@ -72,8 +72,10 @@ describe KnapsackPro::Config::Env do
72
72
  end
73
73
  end
74
74
 
75
- context "when ENV doesn't exist" do
76
- it { should eq 'missing-build-id' }
75
+ context "when ENV does not exist" do
76
+ it 'raises' do
77
+ expect { subject }.to raise_error(/Missing environment variable KNAPSACK_PRO_CI_NODE_BUILD_ID/)
78
+ end
77
79
  end
78
80
  end
79
81
 
@@ -182,6 +184,55 @@ describe KnapsackPro::Config::Env do
182
184
  end
183
185
  end
184
186
 
187
+ describe '.user_seat' do
188
+ subject { described_class.user_seat }
189
+
190
+ context 'when ENV exists' do
191
+ context 'when KNAPSACK_PRO_USER_SEAT has value' do
192
+ before { stub_const("ENV", { 'KNAPSACK_PRO_USER_SEAT' => 'John Doe' }) }
193
+ it { should eq 'John Doe' }
194
+ end
195
+
196
+ context 'when CI environment has value' do
197
+ before do
198
+ expect(described_class).to receive(:ci_env_for).with(:user_seat).and_return('Jane Doe')
199
+ end
200
+
201
+ it { should eq 'Jane Doe' }
202
+ end
203
+ end
204
+
205
+ context "when ENV doesn't exist" do
206
+ it { should be nil }
207
+ end
208
+ end
209
+
210
+ describe '.masked_seat_hash' do
211
+ subject { described_class.masked_user_seat }
212
+
213
+ before do
214
+ expect(described_class).to receive(:user_seat).at_least(1).and_return(user_seat)
215
+ end
216
+
217
+ context 'when the user seat is a name' do
218
+ let(:user_seat) { 'John Doe' }
219
+
220
+ it { expect(subject).to eq 'Jo** Do*' }
221
+ end
222
+
223
+ context 'when the user seat is an e-mail' do
224
+ let(:user_seat) { 'john.doe@example.com' }
225
+
226
+ it { expect(subject).to eq 'jo**.do*@ex*****.co*' }
227
+ end
228
+
229
+ context 'when the user seat is nil' do
230
+ let(:user_seat) { nil }
231
+
232
+ it { expect(subject).to be_nil }
233
+ end
234
+ end
235
+
185
236
  describe '.test_file_pattern' do
186
237
  subject { described_class.test_file_pattern }
187
238
 
@@ -460,40 +511,6 @@ describe KnapsackPro::Config::Env do
460
511
  end
461
512
  end
462
513
 
463
- describe '.modify_default_rspec_formatters' do
464
- subject { described_class.modify_default_rspec_formatters }
465
-
466
- context 'when ENV exists' do
467
- let(:modify_default_rspec_formatters) { 'false' }
468
- before { stub_const("ENV", { 'KNAPSACK_PRO_MODIFY_DEFAULT_RSPEC_FORMATTERS' => modify_default_rspec_formatters }) }
469
- it { should eq modify_default_rspec_formatters }
470
- end
471
-
472
- context "when ENV doesn't exist" do
473
- it { should be true }
474
- end
475
- end
476
-
477
- describe '.modify_default_rspec_formatters?' do
478
- subject { described_class.modify_default_rspec_formatters? }
479
-
480
- before do
481
- expect(described_class).to receive(:modify_default_rspec_formatters).and_return(modify_default_rspec_formatters)
482
- end
483
-
484
- context 'when enabled' do
485
- let(:modify_default_rspec_formatters) { true }
486
-
487
- it { should be true }
488
- end
489
-
490
- context 'when disabled' do
491
- let(:modify_default_rspec_formatters) { false }
492
-
493
- it { should be false }
494
- end
495
- end
496
-
497
514
  describe '.branch_encrypted' do
498
515
  subject { described_class.branch_encrypted }
499
516
 
@@ -585,20 +602,6 @@ describe KnapsackPro::Config::Env do
585
602
  end
586
603
  end
587
604
 
588
- describe '.fixed_test_suite_split' do
589
- subject { described_class.fixed_test_suite_split }
590
-
591
- context 'when ENV exists' do
592
- before { stub_const("ENV", { 'KNAPSACK_PRO_FIXED_TEST_SUITE_SPLIT' => false }) }
593
- it { should eq false }
594
- end
595
-
596
- context "when ENV doesn't exist" do
597
- before { stub_const("ENV", {}) }
598
- it { should be true }
599
- end
600
- end
601
-
602
605
  describe '.fixed_test_suite_split?' do
603
606
  subject { described_class.fixed_test_suite_split? }
604
607
 
@@ -620,38 +623,94 @@ describe KnapsackPro::Config::Env do
620
623
  end
621
624
  end
622
625
 
623
- describe '.fixed_queue_split' do
624
- subject { described_class.fixed_queue_split }
625
-
626
- context 'when ENV exists' do
627
- before { stub_const("ENV", { 'KNAPSACK_PRO_FIXED_QUEUE_SPLIT' => true }) }
628
- it { should eq true }
629
- end
630
-
631
- context "when ENV doesn't exist" do
632
- before { stub_const("ENV", {}) }
633
- it { should be false }
634
- end
635
- end
636
-
637
626
  describe '.fixed_queue_split?' do
638
627
  subject { described_class.fixed_queue_split? }
628
+ after(:each) { described_class.remove_instance_variable(:@fixed_queue_split) }
639
629
 
640
630
  context 'when ENV exists' do
641
- context 'when KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true' do
642
- before { stub_const("ENV", { 'KNAPSACK_PRO_FIXED_QUEUE_SPLIT' => 'true' }) }
643
- it { should be true }
631
+ context 'when KNAPSACK_PRO_FIXED_QUEUE_SPLIT=false' do
632
+ [
633
+ ['AppVeyor', { 'APPVEYOR' => '123' }],
634
+ ['Buildkite', { 'BUILDKITE' => 'true' }],
635
+ ['CircleCI', { 'CIRCLECI' => 'true' }],
636
+ ['Cirrus CI', { 'CIRRUS_CI' => 'true' }],
637
+ ['Codefresh', { 'CF_BUILD_ID' => '123' }],
638
+ ['Codeship', { 'CI_NAME' => 'codeship' }],
639
+ ['GitHub Actions', { 'GITHUB_ACTIONS' => 'true' }],
640
+ ['GitLab CI', { 'GITLAB_CI' => 'true' }],
641
+ ['Heroku CI', { 'HEROKU_TEST_RUN_ID' => '123' }],
642
+ ['Semaphore CI 1.0', { 'SEMAPHORE_BUILD_NUMBER' => '123' }],
643
+ ['Semaphore CI 2.0', { 'SEMAPHORE' => 'true', 'SEMAPHORE_WORKFLOW_ID' => '123' }],
644
+ ['Travis CI', { 'TRAVIS' => 'true' }],
645
+ ['Unsupported CI', {}],
646
+ ].each do |ci, env|
647
+ it "on #{ci} it is false" do
648
+ logger = instance_double(Logger)
649
+ allow(KnapsackPro).to receive(:logger).and_return(logger)
650
+ expect(logger).not_to receive(:info)
651
+
652
+ stub_const("ENV", env.merge({ 'KNAPSACK_PRO_FIXED_QUEUE_SPLIT' => 'false' }))
653
+
654
+ expect(subject).to eq(false)
655
+ end
656
+ end
644
657
  end
645
658
 
646
- context 'when KNAPSACK_PRO_FIXED_QUEUE_SPLIT=false' do
647
- before { stub_const("ENV", { 'KNAPSACK_PRO_FIXED_QUEUE_SPLIT' => 'false' }) }
648
- it { should be false }
659
+ context 'when KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true' do
660
+ [
661
+ ['AppVeyor', { 'APPVEYOR' => '123' }],
662
+ ['Buildkite', { 'BUILDKITE' => 'true' }],
663
+ ['CircleCI', { 'CIRCLECI' => 'true' }],
664
+ ['Cirrus CI', { 'CIRRUS_CI' => 'true' }],
665
+ ['Codefresh', { 'CF_BUILD_ID' => '123' }],
666
+ ['Codeship', { 'CI_NAME' => 'codeship' }],
667
+ ['GitHub Actions', { 'GITHUB_ACTIONS' => 'true' }],
668
+ ['GitLab CI', { 'GITLAB_CI' => 'true' }],
669
+ ['Heroku CI', { 'HEROKU_TEST_RUN_ID' => '123' }],
670
+ ['Semaphore CI 1.0', { 'SEMAPHORE_BUILD_NUMBER' => '123' }],
671
+ ['Semaphore CI 2.0', { 'SEMAPHORE' => 'true', 'SEMAPHORE_WORKFLOW_ID' => '123' }],
672
+ ['Travis CI', { 'TRAVIS' => 'true' }],
673
+ ['Unsupported CI', {}],
674
+ ].each do |ci, env|
675
+ it "on #{ci} it is true" do
676
+ logger = instance_double(Logger)
677
+ allow(KnapsackPro).to receive(:logger).and_return(logger)
678
+ expect(logger).not_to receive(:info)
679
+
680
+ stub_const("ENV", env.merge({ 'KNAPSACK_PRO_FIXED_QUEUE_SPLIT' => 'true' }))
681
+
682
+ expect(subject).to eq(true)
683
+ end
684
+ end
649
685
  end
650
686
  end
651
687
 
652
688
  context "when ENV doesn't exist" do
653
- before { stub_const("ENV", {}) }
654
- it { should be false }
689
+ [
690
+ ['AppVeyor', { 'APPVEYOR' => '123' }, false],
691
+ ['Buildkite', { 'BUILDKITE' => 'true' }, true],
692
+ ['CircleCI', { 'CIRCLECI' => 'true' }, false],
693
+ ['Cirrus CI', { 'CIRRUS_CI' => 'true' }, false],
694
+ ['Codefresh', { 'CF_BUILD_ID' => '123' }, false],
695
+ ['Codeship', { 'CI_NAME' => 'codeship' }, true],
696
+ ['GitHub Actions', { 'GITHUB_ACTIONS' => 'true' }, true],
697
+ ['GitLab CI', { 'GITLAB_CI' => 'true' }, true],
698
+ ['Heroku CI', { 'HEROKU_TEST_RUN_ID' => '123' }, false],
699
+ ['Semaphore CI 1.0', { 'SEMAPHORE_BUILD_NUMBER' => '123' }, false],
700
+ ['Semaphore CI 2.0', { 'SEMAPHORE' => 'true', 'SEMAPHORE_WORKFLOW_ID' => '123' }, false],
701
+ ['Travis CI', { 'TRAVIS' => 'true' }, true],
702
+ ['Unsupported CI', {}, true],
703
+ ].each do |ci, env, expected|
704
+ it "on #{ci} it is #{expected}" do
705
+ logger = instance_double(Logger)
706
+ expect(KnapsackPro).to receive(:logger).and_return(logger)
707
+ expect(logger).to receive(:info).with("KNAPSACK_PRO_FIXED_QUEUE_SPLIT is not set. Using default value: #{expected}. Learn more at #{KnapsackPro::Urls::FIXED_QUEUE_SPLIT}")
708
+
709
+ stub_const("ENV", env)
710
+
711
+ expect(subject).to eq(expected)
712
+ end
713
+ end
655
714
  end
656
715
  end
657
716
 
@@ -848,57 +907,6 @@ describe KnapsackPro::Config::Env do
848
907
  end
849
908
  end
850
909
 
851
- describe '.ci_env_for' do
852
- let(:env_name) { :node_total }
853
-
854
- subject { described_class.ci_env_for(env_name) }
855
-
856
- context 'when CI has no value for env_name method' do
857
- before do
858
- expect(KnapsackPro::Config::CI::Circle).to receive_message_chain(:new, env_name).and_return(nil)
859
- expect(KnapsackPro::Config::CI::Semaphore).to receive_message_chain(:new, env_name).and_return(nil)
860
- expect(KnapsackPro::Config::CI::Buildkite).to receive_message_chain(:new, env_name).and_return(nil)
861
- end
862
-
863
- it do
864
- expect(subject).to be_nil
865
- end
866
- end
867
-
868
- context 'when CI has value for env_name method' do
869
- let(:circle_env) { double(:circle) }
870
- let(:semaphore_env) { double(:semaphore) }
871
- let(:buildkite_env) { double(:buildkite) }
872
-
873
- before do
874
- allow(KnapsackPro::Config::CI::Circle).to receive_message_chain(:new, env_name).and_return(circle_env)
875
- allow(KnapsackPro::Config::CI::Semaphore).to receive_message_chain(:new, env_name).and_return(semaphore_env)
876
- allow(KnapsackPro::Config::CI::Buildkite).to receive_message_chain(:new, env_name).and_return(buildkite_env)
877
- end
878
-
879
- context do
880
- let(:buildkite_env) { nil }
881
- let(:semaphore_env) { nil }
882
-
883
- it { should eq circle_env }
884
- end
885
-
886
- context do
887
- let(:circle_env) { nil }
888
- let(:buildkite_env) { nil }
889
-
890
- it { should eq semaphore_env }
891
- end
892
-
893
- context do
894
- let(:circle_env) { nil }
895
- let(:semaphore_env) { nil }
896
-
897
- it { should eq buildkite_env }
898
- end
899
- end
900
- end
901
-
902
910
  describe '.log_level' do
903
911
  subject { described_class.log_level }
904
912
 
@@ -933,7 +941,7 @@ describe KnapsackPro::Config::Env do
933
941
  end
934
942
 
935
943
  context "when ENV doesn't exist" do
936
- it { should eql ::Logger::DEBUG }
944
+ it { should eql ::Logger::INFO }
937
945
  end
938
946
  end
939
947
 
@@ -975,4 +983,76 @@ describe KnapsackPro::Config::Env do
975
983
  expect(described_class.test_runner_adapter).to eql 'RSpecAdapter'
976
984
  end
977
985
  end
986
+
987
+ describe '.detected_ci' do
988
+ [
989
+ ['AppVeyor', { 'APPVEYOR' => '123' }, KnapsackPro::Config::CI::AppVeyor],
990
+ ['Buildkite', { 'BUILDKITE' => 'true' }, KnapsackPro::Config::CI::Buildkite],
991
+ ['CircleCI', { 'CIRCLECI' => 'true' }, KnapsackPro::Config::CI::Circle],
992
+ ['Cirrus CI', { 'CIRRUS_CI' => 'true' }, KnapsackPro::Config::CI::CirrusCI],
993
+ ['Codefresh', { 'CF_BUILD_ID' => '123' }, KnapsackPro::Config::CI::Codefresh],
994
+ ['Codeship', { 'CI_NAME' => 'codeship' }, KnapsackPro::Config::CI::Codeship],
995
+ ['GitHub Actions', { 'GITHUB_ACTIONS' => 'true' }, KnapsackPro::Config::CI::GithubActions],
996
+ ['GitLab CI', { 'GITLAB_CI' => 'true' }, KnapsackPro::Config::CI::GitlabCI],
997
+ ['Heroku CI', { 'HEROKU_TEST_RUN_ID' => '123' }, KnapsackPro::Config::CI::Heroku],
998
+ ['Semaphore CI 1.0', { 'SEMAPHORE_BUILD_NUMBER' => '123' }, KnapsackPro::Config::CI::Semaphore],
999
+ ['Semaphore CI 2.0', { 'SEMAPHORE' => 'true', 'SEMAPHORE_WORKFLOW_ID' => '123' }, KnapsackPro::Config::CI::Semaphore2],
1000
+ ['Travis CI', { 'TRAVIS' => 'true' }, KnapsackPro::Config::CI::Travis],
1001
+ ['Unsupported CI', {}, KnapsackPro::Config::CI::Base],
1002
+ ].each do |ci, env, expected|
1003
+ it "detects #{ci}" do
1004
+ stub_const("ENV", env)
1005
+
1006
+ expect(described_class.detected_ci).to eq(expected)
1007
+ end
1008
+ end
1009
+ end
1010
+
1011
+ describe '.ci?' do
1012
+ [
1013
+ ['CI from env', { 'CI' => 'True' }, true],
1014
+ ['Travis CI', { 'TRAVIS' => 'true' }, true],
1015
+ ['missing CI from ENV or development', {}, false],
1016
+ ].each do |ci, env, expected|
1017
+ it "detects #{ci}" do
1018
+ stub_const("ENV", env)
1019
+
1020
+ expect(described_class.ci?).to eq(expected)
1021
+ end
1022
+ end
1023
+ end
1024
+
1025
+ describe '.ci_provider' do
1026
+ [
1027
+ ['AppVeyor', { 'APPVEYOR' => '123' }],
1028
+ ['Azure Pipelines', { 'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI' => '123' }],
1029
+ ['AWS CodeBuild', { 'CODEBUILD_BUILD_ARN' => '123' }],
1030
+ ['Bamboo', { 'bamboo_planKey' => '123' }],
1031
+ ['Bitbucket Pipelines', { 'BITBUCKET_COMMIT' => '123' }],
1032
+ ['Buddy.works', { 'BUDDY' => 'true' }],
1033
+ ['Buildkite', { 'BUILDKITE' => 'true' }],
1034
+ ['CircleCI', { 'CIRCLECI' => 'true' }],
1035
+ ['Cirrus CI', { 'CIRRUS_CI' => 'true' }],
1036
+ ['Codefresh', { 'CF_BUILD_ID' => '123' }],
1037
+ ['Codeship', { 'CI_NAME' => 'codeship' }],
1038
+ ['Drone.io', { 'DRONE' => 'true' }],
1039
+ ['GitHub Actions', { 'GITHUB_ACTIONS' => 'true' }],
1040
+ ['Gitlab CI', { 'GITLAB_CI' => 'true' }],
1041
+ ['Google Cloud Build', { 'BUILDER_OUTPUT' => '123' }],
1042
+ ['Heroku CI', { 'HEROKU_TEST_RUN_ID' => '123' }],
1043
+ ['Jenkins', { 'JENKINS_URL' => '123' }],
1044
+ ['Semaphore CI 1.0', { 'SEMAPHORE_BUILD_NUMBER' => '123' }],
1045
+ ['Semaphore CI 2.0', { 'SEMAPHORE' => 'true', 'SEMAPHORE_WORKFLOW_ID' => '123' }],
1046
+ ['TeamCity', { 'TEAMCITY_VERSION' => '123' }],
1047
+ ['Travis CI', { 'TRAVIS' => 'true' }],
1048
+ ['Other', { 'CI' => 'true'}],
1049
+ [nil, {}],
1050
+ ].each do |ci, env|
1051
+ it "detects #{ci || 'missing CI from env or development'}" do
1052
+ stub_const("ENV", env)
1053
+
1054
+ expect(described_class.ci_provider).to eq(ci)
1055
+ end
1056
+ end
1057
+ end
978
1058
  end