Skip to content

Commit

Permalink
Merge pull request #26 from randycoulman/fix/fail-with-no-matching-pa…
Browse files Browse the repository at this point in the history
…ttern

✨ Show failure message when no tests match
  • Loading branch information
randycoulman committed Jan 24, 2021
2 parents 80b619f + 817feaf commit 07acf24
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 44 deletions.
16 changes: 10 additions & 6 deletions lib/mix_test_interactive/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ defmodule MixTestInteractive.Config do
end

def cli_args(%__MODULE__{initial_cli_args: initial_args} = config) do
initial_args ++ args_from_settings(config)
with {:ok, args} <- args_from_settings(config) do
{:ok, initial_args ++ args}
end
end

def only_patterns(config, patterns) do
Expand Down Expand Up @@ -102,19 +104,21 @@ defmodule MixTestInteractive.Config do
end

defp args_from_settings(%__MODULE__{failed?: true}) do
["--failed"]
{:ok, ["--failed"]}
end

defp args_from_settings(%__MODULE__{stale?: true}) do
["--stale"]
{:ok, ["--stale"]}
end

defp args_from_settings(%__MODULE__{patterns: patterns} = config) when length(patterns) > 0 do
config.list_all_files.()
|> PatternFilter.matches(patterns)
case config.list_all_files.() |> PatternFilter.matches(patterns) do
[] -> {:error, :no_matching_files}
files -> {:ok, files}
end
end

defp args_from_settings(_config), do: []
defp args_from_settings(_config), do: {:ok, []}

defp get_runner do
Application.get_env(@application, :runner, @default_runner)
Expand Down
24 changes: 20 additions & 4 deletions lib/mix_test_interactive/interactive_mode.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ defmodule MixTestInteractive.InteractiveMode do

def start(config) do
ConfigStore.store(config)
run_tests(config)
run(config)
loop(config)
end

def run_tests(config) do
Runner.run(config)
def run(config) do
:ok = run_tests(config)
show_summary(config)
show_usage_prompt()
end
Expand All @@ -19,7 +19,7 @@ defmodule MixTestInteractive.InteractiveMode do
case CommandProcessor.call(command, config) do
{:ok, new_config} ->
ConfigStore.store(new_config)
run_tests(new_config)
run(new_config)
loop(new_config)

:help ->
Expand All @@ -34,6 +34,22 @@ defmodule MixTestInteractive.InteractiveMode do
end
end

defp run_tests(config) do
with :ok <- Runner.run(config) do
:ok
else
{:error, :no_matching_files} ->
[:red, "No matching tests found"]
|> IO.ANSI.format()
|> IO.puts()

:ok

error ->
error
end
end

defp show_summary(config) do
IO.puts("")

Expand Down
34 changes: 19 additions & 15 deletions lib/mix_test_interactive/port_runner.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ defmodule MixTestInteractive.PortRunner do
Run tests using the runner from the config.
"""
def run(%Config{} = config) do
command = build_tasks_cmds(config)

case :os.type() do
{:win32, _} ->
System.cmd("cmd", ["/C", "set MIX_ENV=test&& mix test"], into: IO.stream(:stdio, :line))
with {:ok, command} <- build_tasks_cmds(config) do
case :os.type() do
{:win32, _} ->
System.cmd("cmd", ["/C", "set MIX_ENV=test&& mix test"], into: IO.stream(:stdio, :line))

_ ->
Path.join(:code.priv_dir(@application), "zombie_killer")
|> System.cmd(["sh", "-c", command], into: IO.stream(:stdio, :line))
end

_ ->
Path.join(:code.priv_dir(@application), "zombie_killer")
|> System.cmd(["sh", "-c", command], into: IO.stream(:stdio, :line))
:ok
end

:ok
end

@doc """
Expand All @@ -32,13 +32,17 @@ defmodule MixTestInteractive.PortRunner do
running inside a port.
"""
def build_tasks_cmds(%Config{} = config) do
config.tasks
|> Enum.map(&task_command(&1, config))
|> Enum.join(" && ")
with {:ok, cli_args} <- Config.cli_args(config) do
command =
config.tasks
|> Enum.map(&task_command(&1, config, cli_args))
|> Enum.join(" && ")

{:ok, command}
end
end

defp task_command(task, config) do
cli_args = Config.cli_args(config)
defp task_command(task, config, cli_args) do
args = Enum.join(cli_args, " ")

ansi =
Expand Down
2 changes: 1 addition & 1 deletion lib/mix_test_interactive/runner.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule MixTestInteractive.Runner do
@doc """
Run tests using provided runner.
"""
@spec run(Config.t()) :: :ok
@spec run(Config.t()) :: :ok | {:error, term()}
def run(config) do
:ok = maybe_clear_terminal(config)
IO.puts("\nRunning tests...")
Expand Down
2 changes: 1 addition & 1 deletion lib/mix_test_interactive/watcher.ex
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ defmodule MixTestInteractive.Watcher do
path = to_string(path)

if Paths.watching?(path, config) do
InteractiveMode.run_tests(config)
InteractiveMode.run(config)
MessageInbox.flush()
end

Expand Down
51 changes: 37 additions & 14 deletions test/mix_test_interactive/config_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,14 @@ defmodule MixTestInteractive.ConfigTest do
describe "command line arguments" do
test "passes on provided arguments" do
config = Config.new(["hello", "world"])
assert Config.cli_args(config) == ["hello", "world"]
{:ok, args} = Config.cli_args(config)
assert args == ["hello", "world"]
end

test "passes no arguments by default" do
config = Config.new()
assert Config.cli_args(config) == []
{:ok, args} = Config.cli_args(config)
assert args == []
end

test "initializes stale flag from arguments" do
Expand All @@ -99,23 +101,35 @@ defmodule MixTestInteractive.ConfigTest do
|> with_fake_file_list(all_files)
|> Config.only_patterns(["file", "other"])

assert Config.cli_args(config) == ["provided", "file1", "file2", "other"]
{:ok, args} = Config.cli_args(config)
assert args == ["provided", "file1", "file2", "other"]
end

test "returns error if no files match pattern" do
config =
Config.new()
|> with_fake_file_list([])
|> Config.only_patterns(["file"])

assert {:error, :no_matching_files} = Config.cli_args(config)
end

test "restricts to failed tests" do
config =
Config.new(["provided"])
|> Config.only_failed()

assert Config.cli_args(config) == ["provided", "--failed"]
{:ok, args} = Config.cli_args(config)
assert args == ["provided", "--failed"]
end

test "restricts to stale tests" do
config =
Config.new(["provided"])
|> Config.only_stale()

assert Config.cli_args(config) == ["provided", "--stale"]
{:ok, args} = Config.cli_args(config)
assert args == ["provided", "--stale"]
end

test "pattern filter clears failed flag" do
Expand All @@ -125,7 +139,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_failed()
|> Config.only_patterns(["f"])

assert Config.cli_args(config) == ["file"]
{:ok, args} = Config.cli_args(config)
assert args == ["file"]
end

test "pattern filter clears stale flag" do
Expand All @@ -135,7 +150,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_stale()
|> Config.only_patterns(["f"])

assert Config.cli_args(config) == ["file"]
{:ok, args} = Config.cli_args(config)
assert args == ["file"]
end

test "failed flag clears pattern filters" do
Expand All @@ -144,7 +160,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_patterns(["file"])
|> Config.only_failed()

assert Config.cli_args(config) == ["--failed"]
{:ok, args} = Config.cli_args(config)
assert args == ["--failed"]
end

test "failed flag clears stale flag" do
Expand All @@ -153,7 +170,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_stale()
|> Config.only_failed()

assert Config.cli_args(config) == ["--failed"]
{:ok, args} = Config.cli_args(config)
assert args == ["--failed"]
end

test "stale flag clears pattern filters" do
Expand All @@ -162,7 +180,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_patterns(["file"])
|> Config.only_stale()

assert Config.cli_args(config) == ["--stale"]
{:ok, args} = Config.cli_args(config)
assert args == ["--stale"]
end

test "stale flag clears failed flag" do
Expand All @@ -171,7 +190,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_failed()
|> Config.only_stale()

assert Config.cli_args(config) == ["--stale"]
{:ok, args} = Config.cli_args(config)
assert args == ["--stale"]
end

test "all tests clears pattern filters" do
Expand All @@ -180,7 +200,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_patterns(["pattern"])
|> Config.all_tests()

assert Config.cli_args(config) == []
{:ok, args} = Config.cli_args(config)
assert args == []
end

test "all tests removes stale flag" do
Expand All @@ -189,7 +210,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_stale()
|> Config.all_tests()

assert Config.cli_args(config) == []
{:ok, args} = Config.cli_args(config)
assert args == []
end

test "all tests removes failed flag" do
Expand All @@ -198,7 +220,8 @@ defmodule MixTestInteractive.ConfigTest do
|> Config.only_failed()
|> Config.all_tests()

assert Config.cli_args(config) == []
{:ok, args} = Config.cli_args(config)
assert args == []
end

defp with_fake_file_list(config, files) do
Expand Down
6 changes: 3 additions & 3 deletions test/mix_test_interactive/port_runner_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ defmodule MixTestInteractive.PortRunnerTest do
"MIX_ENV=test mix do run -e " <>
"'Application.put_env(:elixir, :ansi_enabled, true);', " <> "test --exclude integration"

assert PortRunner.build_tasks_cmds(config) == expected
assert {:ok, ^expected} = PortRunner.build_tasks_cmds(config)
end

test "take the command cli_executable from passed config" do
Expand All @@ -21,7 +21,7 @@ defmodule MixTestInteractive.PortRunnerTest do
"MIX_ENV=test iex -S mix do run -e " <>
"'Application.put_env(:elixir, :ansi_enabled, true);', test"

assert PortRunner.build_tasks_cmds(config) == expected
assert {:ok, ^expected} = PortRunner.build_tasks_cmds(config)
end

test "respect no-start commandline argument from passed config" do
Expand All @@ -32,7 +32,7 @@ defmodule MixTestInteractive.PortRunnerTest do
"'Application.put_env(:elixir, :ansi_enabled, true);', " <>
"test --exclude integration --no-start"

assert PortRunner.build_tasks_cmds(config) == expected
assert {:ok, ^expected} = PortRunner.build_tasks_cmds(config)
end
end
end

0 comments on commit 07acf24

Please sign in to comment.