test_launcher 0.1.0 → 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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/README.md +101 -18
  4. data/Rakefile +6 -0
  5. data/bin/test_launcher +8 -35
  6. data/lib/test_launcher.rb +22 -0
  7. data/lib/test_launcher/cli/input_parser.rb +73 -0
  8. data/lib/test_launcher/frameworks.rb +32 -0
  9. data/lib/test_launcher/frameworks/base.rb +54 -0
  10. data/lib/test_launcher/frameworks/implementation/collection.rb +27 -0
  11. data/lib/test_launcher/{tests/minitest → frameworks/implementation}/consolidator.rb +30 -32
  12. data/lib/test_launcher/frameworks/implementation/locator.rb +74 -0
  13. data/lib/test_launcher/frameworks/implementation/test_case.rb +65 -0
  14. data/lib/test_launcher/frameworks/minitest.rb +67 -0
  15. data/lib/test_launcher/frameworks/rspec.rb +50 -0
  16. data/lib/test_launcher/rubymine.rb +26 -0
  17. data/lib/test_launcher/rubymine/launcher.rb +55 -0
  18. data/lib/test_launcher/search/git.rb +64 -0
  19. data/lib/test_launcher/shell/runner.rb +19 -22
  20. data/lib/test_launcher/version.rb +1 -1
  21. data/test/install +3 -0
  22. data/test/test_helper.rb +32 -17
  23. data/test/test_launcher/fixtures/minitest/test/class_1_test.rb +17 -0
  24. data/test/test_launcher/fixtures/minitest/test/class_2_test.rb +5 -0
  25. data/test/test_launcher/fixtures/minitest/test/different_root/bin/spring +1 -0
  26. data/test/test_launcher/fixtures/minitest/test/different_root/test/different_root_test.rb +2 -0
  27. data/test/test_launcher/fixtures/rspec/spec/class_1_spec.rb +16 -0
  28. data/test/test_launcher/fixtures/rspec/spec/class_2_spec.rb +6 -0
  29. data/test/test_launcher/fixtures/rspec/spec/different_root/spec/different_root_spec.rb +2 -0
  30. data/test/test_launcher/minitest_integration_test.rb +67 -0
  31. data/test/test_launcher/rspec_integration_test.rb +67 -0
  32. data/test/test_launcher/rubymine_test.rb +48 -0
  33. data/test_launcher.gemspec +2 -3
  34. metadata +39 -44
  35. data/bin/test_runner +0 -1
  36. data/lib/test_launcher/searchers/git_searcher.rb +0 -38
  37. data/lib/test_launcher/tests/minitest/finder.rb +0 -50
  38. data/lib/test_launcher/tests/minitest/wrappers/multiple_files.rb +0 -23
  39. data/lib/test_launcher/tests/minitest/wrappers/multiple_roots.rb +0 -23
  40. data/lib/test_launcher/tests/minitest/wrappers/single_file.rb +0 -29
  41. data/lib/test_launcher/tests/minitest/wrappers/single_root.rb +0 -27
  42. data/lib/test_launcher/tests/minitest/wrappers/single_test.rb +0 -37
  43. data/lib/test_launcher/utils/path.rb +0 -32
  44. data/lib/test_launcher/utils/pluralize.rb +0 -14
  45. data/test/test_launcher/searchers/git_searcher_test.rb +0 -50
  46. data/test/test_launcher/tests/minitest/consolidator_integration_test.rb +0 -191
  47. data/test/test_launcher/tests/minitest/finder_test.rb +0 -71
@@ -0,0 +1,64 @@
1
+ module TestLauncher
2
+ module Searchers
3
+ class Git
4
+
5
+ def self.valid?
6
+
7
+ end
8
+
9
+ def initialize(shell)
10
+ @shell = shell
11
+ Dir.chdir(root_path)
12
+ end
13
+
14
+ def find_files(pattern)
15
+ shell.run("git ls-files '*#{pattern}*'").map {|f| system_path(f)}
16
+ end
17
+
18
+ def grep(regex, file_pattern: '*')
19
+ results = shell.run("git grep --untracked --extended-regexp '#{regex}' -- '#{file_pattern}'")
20
+ results.map do |result|
21
+ interpret_grep_result(result)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def interpret_grep_result(grep_result)
28
+ splits = grep_result.split(/:/)
29
+ file = splits.shift.strip
30
+ # we rejoin on ':' because our
31
+ # code may have colons inside of it.
32
+ #
33
+ # example:
34
+ # path/to/file: run_method(a: A, b: B)
35
+ #
36
+ # so shift the first one out, then
37
+ # rejoin the rest
38
+ line = splits.join(':').strip
39
+
40
+ {
41
+ :file => system_path(file),
42
+ :line => line,
43
+ }
44
+ end
45
+
46
+ def system_path(file)
47
+ File.join(root_path, file)
48
+ end
49
+
50
+ def root_path
51
+ @root_path ||= %x[ git rev-parse --show-toplevel ].chomp.tap do
52
+ if $? != 0
53
+ shell.warn "test_launcher must be used in a git repository"
54
+ exit
55
+ end
56
+ end
57
+ end
58
+
59
+ def shell
60
+ @shell
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,5 +1,5 @@
1
1
  require "test_launcher/shell/color"
2
- require "test_launcher/utils/path"
2
+ require "bundler"
3
3
 
4
4
  module TestLauncher
5
5
  module Shell
@@ -8,53 +8,50 @@ module TestLauncher
8
8
 
9
9
  CommandFailureError = Class.new(StandardError)
10
10
 
11
- attr_accessor :working_directory, :log_path, :queue
12
- private :working_directory, :log_path, :queue
11
+ attr_accessor :log_path, :queue
12
+ private :log_path, :queue
13
13
 
14
- def initialize(log_path:, working_directory:)
15
- @working_directory = working_directory
14
+ def initialize(log_path:)
16
15
  @log_path = log_path
17
-
18
16
  %x{echo "" > #{log_path}}
19
- Dir.chdir(%x[ git rev-parse --show-toplevel ].chomp)
20
17
  end
21
18
 
22
- def run(cmd, dir: working_directory, &block)
23
- command = "cd #{Utils::Path.relative_join(dir)} && #{cmd}"
24
- handle_output_for(command)
19
+ def run(cmd, dir: ".")
20
+ command = "cd #{dir} && #{cmd}"
21
+ log(command)
25
22
 
26
23
  shell_out(command).split("\n")
27
24
  end
28
25
 
29
26
  def exec(cmd)
30
27
  notify cmd
31
- Kernel.exec cmd
28
+ Bundler.clean_exec(cmd)
32
29
  end
33
30
 
34
31
  def warn(msg)
35
- log msg.to_s
36
- print "#{red(msg.to_s)}\n"
32
+ log msg
33
+ print "#{red(msg)}\n"
37
34
  end
38
35
 
39
36
  def notify(msg)
40
- log msg.to_s
41
- print "#{yellow(msg.to_s)}\n"
37
+ log msg
38
+ print "#{yellow(msg)}\n"
39
+ end
40
+
41
+ def puts(msg)
42
+ log msg
43
+ print "#{msg}\n"
42
44
  end
43
45
 
44
46
  def confirm?(question)
45
47
  warn "#{question} [Yn]"
46
- answer = STDIN.gets.strip.downcase
47
- return answer != 'n'
48
+ STDIN.gets.strip.downcase != 'n'
48
49
  end
49
50
 
50
51
  private
51
52
 
52
53
  def log(msg)
53
- %x{echo "#{msg.to_s}" >> #{log_path}}
54
- end
55
-
56
- def handle_output_for(cmd)
57
- log(cmd)
54
+ %x{echo "#{msg}" >> #{log_path}}
58
55
  end
59
56
 
60
57
  def shell_out(command)
@@ -1,3 +1,3 @@
1
1
  module TestLauncher
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem uninstall -Ix test_launcher && gem build test_launcher.gemspec && gem install test_launcher-0.1.0.gem
@@ -1,8 +1,40 @@
1
1
  $LOAD_PATH.unshift(File.join(File.split(File.dirname(__FILE__))[0], 'lib'))
2
2
  require "minitest/autorun"
3
3
  require "mocha/mini_test"
4
+ require "pry"
5
+
6
+ require "test_launcher"
7
+
8
+ class TestLauncher::Shell::Runner
9
+ def exec(cmd)
10
+ raise "execed twice" if defined?(@exec)
11
+ @@exec = cmd
12
+ end
13
+
14
+ def notify(*)
15
+ # silence logs during test
16
+ end
17
+
18
+ def warn(*)
19
+ # silence logs during test
20
+ end
21
+
22
+ def self.recall_exec
23
+ return unless @@exec
24
+ @@exec.to_s
25
+ end
26
+
27
+ def self.reset
28
+ @@exec = nil
29
+ end
30
+ end
4
31
 
5
32
  class TestCase < Minitest::Test
33
+
34
+ def setup
35
+ TestLauncher::Shell::Runner.reset
36
+ end
37
+
6
38
  class DummyShell
7
39
 
8
40
  def method_missing(method, *args)
@@ -20,23 +52,6 @@ class TestCase < Minitest::Test
20
52
  end
21
53
  end
22
54
 
23
- def assert_notified(string)
24
- unless dummy_shell.recall(:notify).flatten.include?(string)
25
- flunk <<-FLUNK
26
- could not find: "#{string}"
27
- shell.notify called with:
28
- #{dummy_shell.recall(:notify)}
29
- FLUNK
30
- end
31
- end
32
-
33
- def assert_paragraphs_equal(expected, actual)
34
- expecteds = expected.split("\n").map {|l| l.to_s.strip}
35
- actuals = actual.split("\n").map {|l| l.to_s.strip}
36
-
37
- assert_equal expecteds, actuals
38
- end
39
-
40
55
  private
41
56
 
42
57
  def dummy_shell
@@ -0,0 +1,17 @@
1
+ class Root1DummyTestClass1Test
2
+ def test__file_name_1__method_name_1
3
+ test_unit_test_method_body
4
+ end
5
+
6
+ def test__file_name_1__method_name_2
7
+ test_unit_test_method_body
8
+ end
9
+
10
+ def test__multiple_files__same_method
11
+
12
+ end
13
+
14
+ def helper_method
15
+
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ class Root1DummyTestClass2Test
2
+ def test__multiple_files__same_method
3
+
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ # stub to indicate that spring is active in this root
@@ -0,0 +1,16 @@
1
+ describe Root1DummyTestClass1 do
2
+
3
+ context "file_name_1 context_1" do
4
+ it "file_name_1 example_name_1 '\" " do
5
+ test_unit_test_method_body
6
+ end
7
+
8
+ it 'file_name_1 example_name_2' do
9
+ test_unit_test_method_body
10
+ end
11
+
12
+ it "multiple_files same_example" do
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ describe Root1DummyTestClass2 do
2
+
3
+ it "multiple_files same_example" do
4
+ a_test_that_uses(Root1DummyTestClass1)
5
+ end
6
+ end
@@ -0,0 +1,2 @@
1
+ describe Root2DummyTestClass1 do
2
+ end
@@ -0,0 +1,67 @@
1
+ require "test_helper"
2
+
3
+ module TestLauncher
4
+ class MinitestIntegrationTest < TestCase
5
+ def test__single_method
6
+ TestLauncher.launch("file_name_1__method_name_1", framework: "minitest")
7
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test test/class_1_test.rb --name=/file_name_1__method_name_1/", Shell::Runner.recall_exec
8
+ end
9
+
10
+ def test__multiple_methods__same_file
11
+ TestLauncher.launch("file_name_1", framework: "minitest")
12
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test test/class_1_test.rb --name=/file_name_1/", Shell::Runner.recall_exec
13
+ end
14
+
15
+ def test__multiple_methods__different_files
16
+ TestLauncher.launch("multiple_files__same_method", framework: "minitest")
17
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test test/class_2_test.rb --name=/multiple_files__same_method/", Shell::Runner.recall_exec
18
+ end
19
+
20
+ def test__single_file
21
+ TestLauncher.launch("class_1_test", framework: "minitest")
22
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_1_test.rb", Shell::Runner.recall_exec
23
+ end
24
+
25
+ def test__uses_spring
26
+ TestLauncher.launch("different_roo""t_test", framework: "minitest") # don't trigger the find in *this* file
27
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest/test/different_root")} && bundle exec spring testunit test/different_root_test.rb", Shell::Runner.recall_exec
28
+ end
29
+
30
+ def test__multiple_files
31
+ TestLauncher.launch("Root1""Dum""myTest""Class", framework: "minitest") # don't trigger the find in *this* file
32
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_2_test.rb", Shell::Runner.recall_exec
33
+ end
34
+
35
+ def test__multiple_files__all
36
+ TestLauncher.launch("Root1""DummyTest""Class", run_all: true, framework: "minitest") # don't trigger the find in *this* file
37
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_1_test.rb test/class_2_test.rb", Shell::Runner.recall_exec
38
+ end
39
+
40
+ def test__multiple_files__different_roots__all
41
+ TestLauncher.launch("DummyTest""Class", run_all: true, framework: "minitest") # don't trigger the find in *this* file
42
+ expected = "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_1_test.rb test/class_2_test.rb; cd -;\n\ncd #{system_path("test/test_launcher/fixtures/minitest/test/different_root")} && bundle exec spring testunit test/different_root_test.rb"
43
+ assert_equal expected, Shell::Runner.recall_exec
44
+ end
45
+
46
+ def test__regex
47
+ TestLauncher.launch("Root1""DummyTest""Class1""Test", framework: "minitest") # don't trigger the find in *this* file
48
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_1_test.rb", Shell::Runner.recall_exec
49
+ end
50
+
51
+ def test__regex__does_not_test_helper__methods
52
+ TestLauncher.launch("helper_meth""od", framework: "minitest") # don't trigger the find in *this* file
53
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/minitest")} && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/class_1_test.rb", Shell::Runner.recall_exec
54
+ end
55
+
56
+ def test__not_found
57
+ TestLauncher.launch("not_found""thing", framework: "minitest")
58
+ assert_equal nil, Shell::Runner.recall_exec
59
+ end
60
+
61
+ private
62
+
63
+ def system_path(relative_dir)
64
+ File.join(Dir.pwd, relative_dir)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,67 @@
1
+ require "test_helper"
2
+
3
+ module TestLauncher
4
+ class RspecIntegrationTest < TestCase
5
+ def test__single_method
6
+ TestLauncher.launch("file_name_1 example_name_""1", framework: "rspec")
7
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb --example file_name_1\\ example_name_1", Shell::Runner.recall_exec
8
+ end
9
+
10
+ def test__single_context
11
+ TestLauncher.launch("file_name_1 con""text_1", framework: "rspec")
12
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb --example file_name_1\\ context_1", Shell::Runner.recall_exec
13
+ end
14
+
15
+ def test__single_describe
16
+ TestLauncher.launch("Root1DummyTes""tClass1", framework: "rspec")
17
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb --example Root1DummyTes""tClass1", Shell::Runner.recall_exec
18
+ end
19
+
20
+ def test__multiple_methods__same_file
21
+ TestLauncher.launch("file_name_1", framework: "rspec")
22
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb --example file_name_1", Shell::Runner.recall_exec
23
+ end
24
+
25
+ def test__multiple_methods__different_files
26
+ TestLauncher.launch("multiple_files same_example", framework: "rspec")
27
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_2_spec.rb --example multiple_files\\ same_example", Shell::Runner.recall_exec
28
+ end
29
+
30
+ def test__single_file
31
+ TestLauncher.launch("class_1_spec", framework: "rspec")
32
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb", Shell::Runner.recall_exec
33
+ end
34
+
35
+ def test__multiple_files
36
+ TestLauncher.launch("Root1", framework: "rspec") # don't trigger the find in *this* file
37
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_2_spec.rb --example Roo""t1", Shell::Runner.recall_exec
38
+ end
39
+
40
+ def test__multiple_files__all
41
+ TestLauncher.launch("Root1""DummyTest""Class", run_all: true, framework: "rspec") # don't trigger the find in *this* file
42
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb spec/class_2_spec.rb", Shell::Runner.recall_exec
43
+ end
44
+
45
+ def test__multiple_files__different_roots__all
46
+ TestLauncher.launch("DummyTest""Class", run_all: true, framework: "rspec") # don't trigger the find in *this* file
47
+ expected = "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_1_spec.rb spec/class_2_spec.rb; cd -;\n\ncd #{system_path("test/test_launcher/fixtures/rspe")}c/spec/different_root && rspec spec/different_root_spec.rb"
48
+ assert_equal expected, Shell::Runner.recall_exec
49
+ end
50
+
51
+ def test__regex
52
+ TestLauncher.launch("a_test_that_u""ses", framework: "rspec") # don't trigger the find in *this* file
53
+ assert_equal "cd #{system_path("test/test_launcher/fixtures/rspec")} && rspec spec/class_2_spec.rb", Shell::Runner.recall_exec
54
+ end
55
+
56
+ def test__not_found
57
+ TestLauncher.launch("not_found""thing", framework: "minitest")
58
+ assert_equal nil, Shell::Runner.recall_exec
59
+ end
60
+
61
+ private
62
+
63
+ def system_path(relative_dir)
64
+ File.join(Dir.pwd, relative_dir)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,48 @@
1
+ require "test_helper"
2
+ require "test_launcher/rubymine/launcher"
3
+
4
+ module TestLauncher
5
+ class RubymineTest < TestCase
6
+ def test_launch__run__file
7
+ args = "/Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb"
8
+ expected_command = "cd /Users/username/some_app/engines/some_engine && bundle exec ruby -I test -e 'ARGV.each {|f| require(File.join(Dir.pwd, f))}' test/does_something_test.rb"
9
+
10
+ assert_executes expected_command, args
11
+ end
12
+
13
+ def test_launch__run__example
14
+ args = "/Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb --name=some_test_name"
15
+ expected_command = "cd /Users/username/some_app/engines/some_engine && bundle exec ruby -I test test/does_something_test.rb --name=some_test_name"
16
+
17
+ assert_executes expected_command, args
18
+ end
19
+
20
+ def test_launch__debug__example
21
+ args = "/Users/username/.rvm/gems/ruby-2.2.3/gems/ruby-debug-ide-0.6.1.beta2/bin/rdebug-ide --disable-int-handler --evaluation-timeout 10 --rubymine-protocol-extensions --port 58930 --host 0.0.0.0 --dispatcher-port 58931 -- /Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb --name=some_test_name"
22
+ expected_command = "cd /Users/username/some_app/engines/some_engine && ruby -I test /Users/username/.rvm/gems/ruby-2.2.3/gems/ruby-debug-ide-0.6.1.beta2/bin/rdebug-ide --disable-int-handler --evaluation-timeout 10 --rubymine-protocol-extensions --port 58930 --host 0.0.0.0 --dispatcher-port 58931 -- /Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb --name=some_test_name"
23
+
24
+ assert_executes(expected_command, args)
25
+ end
26
+
27
+ def test_launch__debug__file
28
+ args = "/Users/username/.rvm/gems/ruby-2.2.3/gems/ruby-debug-ide-0.6.1.beta2/bin/rdebug-ide --disable-int-handler --evaluation-timeout 10 --rubymine-protocol-extensions --port 58930 --host 0.0.0.0 --dispatcher-port 58931 -- /Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb"
29
+ expected_command = "cd /Users/username/some_app/engines/some_engine && ruby -I test /Users/username/.rvm/gems/ruby-2.2.3/gems/ruby-debug-ide-0.6.1.beta2/bin/rdebug-ide --disable-int-handler --evaluation-timeout 10 --rubymine-protocol-extensions --port 58930 --host 0.0.0.0 --dispatcher-port 58931 -- /Users/username/some_app/bin/spring testunit /Users/username/some_app/engines/some_engine/test/does_something_test.rb"
30
+
31
+ assert_executes(expected_command, args)
32
+ end
33
+
34
+ private
35
+
36
+ def assert_executes(expected_command, args)
37
+ launcher = Rubymine::Launcher.new(
38
+ args: args.split(" "),
39
+ shell: dummy_shell
40
+ )
41
+
42
+ launcher.launch
43
+ assert_equal 1, dummy_shell.recall(:exec).size
44
+ assert_equal [[expected_command]], dummy_shell.recall(:exec)
45
+
46
+ end
47
+ end
48
+ end