Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions apps/expert/lib/expert/engine.ex
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,12 @@ defmodule Expert.Engine do
base = base_dir()

if File.exists?(base) do
base
|> File.ls!()
|> Enum.map(&Path.join(base, &1))
|> Enum.filter(&File.dir?/1)
for expert_ver_dir <- File.ls!(base),
tool_ver_dir <- File.ls!(Path.join(base, expert_ver_dir)),
path = Path.join([base, expert_ver_dir, tool_ver_dir]),
File.dir?(path) do
path
end
|> Enum.sort()
else
[]
Expand Down Expand Up @@ -166,7 +168,7 @@ defmodule Expert.Engine do

@spec prompt_delete(dir :: [String.t()]) :: boolean()
defp prompt_delete(dir) do
IO.puts(["Delete #{dir}", IO.ANSI.red(), "?", IO.ANSI.reset(), " [Yn] "])
IO.write(["Delete #{dir}? [Yn]"])

input =
""
Expand Down
77 changes: 34 additions & 43 deletions apps/expert/test/expert/engine_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,9 @@ defmodule Expert.EngineTest do

import ExUnit.CaptureIO

@test_base_dir "test_engine_builds"

setup do
File.mkdir_p!(@test_base_dir)

patch(Engine, :base_dir, @test_base_dir)

on_exit(fn ->
if File.exists?(@test_base_dir) do
File.rm_rf!(@test_base_dir)
end
end)
@moduletag :tmp_dir
setup %{tmp_dir: tmp_dir} do
patch(Engine, :base_dir, tmp_dir)

:ok
end
Expand All @@ -33,9 +24,9 @@ defmodule Expert.EngineTest do
assert output =~ "No engine builds found."
end

test "lists engine directories" do
File.mkdir_p!(Path.join(@test_base_dir, "0.1.0"))
File.mkdir_p!(Path.join(@test_base_dir, "0.2.0"))
test "lists engine directories", %{tmp_dir: tmp_dir} do
File.mkdir_p!(Path.join(tmp_dir, "0.1.0/foobar"))
File.mkdir_p!(Path.join(tmp_dir, "0.2.0/foobar"))

output =
capture_io(fn ->
Expand All @@ -62,10 +53,10 @@ defmodule Expert.EngineTest do
end

describe "run/1 - clean subcommand with --force" do
test "deletes all engine directories with --force and -f flags" do
test "deletes all engine directories with --force and -f flags", %{tmp_dir: tmp_dir} do
for flag <- ["--force", "-f"] do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir2 = Path.join(@test_base_dir, "0.2.0")
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
dir2 = Path.join(tmp_dir, "0.2.0/foobar")
File.mkdir_p!(dir1)
File.mkdir_p!(dir2)

Expand All @@ -87,10 +78,10 @@ defmodule Expert.EngineTest do
end
end

test "stops deleting after first error and returns error code 1" do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir2 = Path.join(@test_base_dir, "0.2.0")
dir3 = Path.join(@test_base_dir, "0.3.0")
test "stops deleting after first error and returns error code 1", %{tmp_dir: tmp_dir} do
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
dir2 = Path.join(tmp_dir, "0.2.0/foobar")
dir3 = Path.join(tmp_dir, "0.2.0/bazbeau")
File.mkdir_p!(dir1)
File.mkdir_p!(dir2)
File.mkdir_p!(dir3)
Expand All @@ -103,8 +94,8 @@ defmodule Expert.EngineTest do
:ok = Agent.update(agent_pid, fn list -> [path | list] end)

cond do
String.ends_with?(path, "0.1.0") -> {:ok, []}
String.ends_with?(path, "0.2.0") -> {:error, :eacces, path}
String.ends_with?(path, "0.1.0/foobar") -> {:ok, []}
String.ends_with?(path, "0.2.0/bazbeau") -> {:error, :eacces, path}
true -> {:ok, []}
end
end)
Expand All @@ -118,7 +109,7 @@ defmodule Expert.EngineTest do
end)

assert output =~ "Error deleting"
assert output =~ dir2
assert output =~ dir3

# Should only attempt dir1 and dir2, not dir3
attempted_dirs =
Expand All @@ -127,15 +118,15 @@ defmodule Expert.EngineTest do
|> Enum.reverse()

assert length(attempted_dirs) == 2
assert Enum.at(attempted_dirs, 0) =~ "0.1.0"
assert Enum.at(attempted_dirs, 1) =~ "0.2.0"
assert Enum.at(attempted_dirs, 0) =~ "0.1.0/foobar"
assert Enum.at(attempted_dirs, 1) =~ "0.2.0/foobar"
end
end

describe "run/1 - clean subcommand interactive mode" do
test "deletes directory when user confirms" do
test "deletes directory when user confirms", %{tmp_dir: tmp_dir} do
for input <- ["y\n", "yes\n", "\n"] do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
File.mkdir_p!(dir1)

assert File.exists?(dir1)
Expand All @@ -149,9 +140,9 @@ defmodule Expert.EngineTest do
end
end

test "keeps directory when user declines" do
test "keeps directory when user declines", %{tmp_dir: tmp_dir} do
for input <- ["n\n", "no\n"] do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
File.mkdir_p!(dir1)

capture_io([input: input], fn ->
Expand All @@ -163,8 +154,8 @@ defmodule Expert.EngineTest do
end
end

test "keeps directory when user enters any other text" do
dir1 = Path.join(@test_base_dir, "0.1.0")
test "keeps directory when user enters any other text", %{tmp_dir: tmp_dir} do
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
File.mkdir_p!(dir1)

capture_io([input: "maybe\n"], fn ->
Expand All @@ -175,10 +166,10 @@ defmodule Expert.EngineTest do
assert File.exists?(dir1)
end

test "handles multiple directories with mixed responses" do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir2 = Path.join(@test_base_dir, "0.2.0")
dir3 = Path.join(@test_base_dir, "0.3.0")
test "handles multiple directories with mixed responses", %{tmp_dir: tmp_dir} do
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
dir2 = Path.join(tmp_dir, "0.2.0/foobar")
dir3 = Path.join(tmp_dir, "0.2.0/bazbeau")
File.mkdir_p!(dir1)
File.mkdir_p!(dir2)
File.mkdir_p!(dir3)
Expand All @@ -204,10 +195,10 @@ defmodule Expert.EngineTest do
assert output =~ "No engine builds found."
end

test "stops deleting after first error and returns error code 1" do
dir1 = Path.join(@test_base_dir, "0.1.0")
dir2 = Path.join(@test_base_dir, "0.2.0")
dir3 = Path.join(@test_base_dir, "0.3.0")
test "stops deleting after first error and returns error code 1", %{tmp_dir: tmp_dir} do
dir1 = Path.join(tmp_dir, "0.1.0/foobar")
dir2 = Path.join(tmp_dir, "0.2.0/foobar")
dir3 = Path.join(tmp_dir, "0.2.0/bazbeau")
File.mkdir_p!(dir1)
File.mkdir_p!(dir2)
File.mkdir_p!(dir3)
Expand All @@ -220,8 +211,8 @@ defmodule Expert.EngineTest do
:ok = Agent.update(agent_pid, fn list -> [path | list] end)

cond do
String.ends_with?(path, "0.1.0") -> {:ok, []}
String.ends_with?(path, "0.2.0") -> {:error, :eacces, path}
String.ends_with?(path, "0.1.0/foobar") -> {:ok, []}
String.ends_with?(path, "0.2.0/bazbeau") -> {:error, :eacces, path}
true -> {:ok, []}
end
end)
Expand Down
Loading