112 lines
3.1 KiB
Elixir
112 lines
3.1 KiB
Elixir
defmodule PandocTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias Pandoc.Watcher
|
|
import ExUnit.CaptureIO
|
|
|
|
@version Pandoc.latest_version()
|
|
|
|
test "run on default" do
|
|
assert capture_io(fn ->
|
|
assert Pandoc.run(:default, ["--version"]) == 0
|
|
end) =~ @version
|
|
end
|
|
|
|
test "run on profile" do
|
|
assert capture_io(fn ->
|
|
assert Pandoc.run(:another, []) == 0
|
|
end) =~ @version
|
|
end
|
|
|
|
test "updates on install" do
|
|
Application.put_env(:pandoc, :version, "3.6")
|
|
|
|
Mix.Task.rerun("pandoc.install", ["--if-missing"])
|
|
|
|
assert capture_io(fn ->
|
|
assert Pandoc.run(:default, ["--version"]) == 0
|
|
end) =~ "3.6"
|
|
|
|
Application.delete_env(:pandoc, :version)
|
|
|
|
Mix.Task.rerun("pandoc.install", ["--if-missing"])
|
|
|
|
assert capture_io(fn ->
|
|
assert Pandoc.run(:default, ["--version"]) == 0
|
|
end) =~ @version
|
|
after
|
|
Application.delete_env(:pandoc, :version)
|
|
end
|
|
|
|
test "install and run multiple concurrently" do
|
|
bin_path = Pandoc.bin_path()
|
|
|
|
assert :ok = File.exists?(bin_path) && File.rm!(bin_path)
|
|
|
|
results =
|
|
[:extra1, :extra2, :extra3]
|
|
|> Enum.map(fn profile ->
|
|
Application.put_env(:pandoc, profile, args: ["--version"])
|
|
|
|
Task.async(fn ->
|
|
capture_io(fn ->
|
|
ret_code = Pandoc.install_and_run(profile, [])
|
|
# Let the first finished task set the binary file to read and execute only,
|
|
# so that the others will fail if they try to overwrite it.
|
|
File.chmod!(bin_path, 0o500)
|
|
ret_code == 0
|
|
end)
|
|
end)
|
|
end)
|
|
|> Task.await_many(:infinity)
|
|
|
|
File.chmod!(bin_path, 0o700)
|
|
assert Enum.all?(results)
|
|
end
|
|
|
|
test "installs with custom URL" do
|
|
assert :ok =
|
|
Mix.Task.rerun("pandoc.install", [
|
|
"https://github.com/jgm/pandoc/releases/download/$version/pandoc-$version-$target.tar.gz"
|
|
])
|
|
end
|
|
|
|
test "starts watching and writes to stdio" do
|
|
in_tmp("documents", fn ->
|
|
task = Task.async(fn -> Pandoc.watch(:default) end)
|
|
%{pid: pid, ref: ref} = task
|
|
:timer.sleep(200)
|
|
|
|
{_, watcher_pid, _, _} =
|
|
Pandoc.Supervisor
|
|
|> Supervisor.which_children()
|
|
|> Enum.find(fn
|
|
{Watcher, _, _, _} -> true
|
|
_ -> false
|
|
end)
|
|
|
|
assert capture_io(fn ->
|
|
# Redirect watcher output to current process so it can be captured
|
|
Process.group_leader(watcher_pid, Process.group_leader())
|
|
File.write!("hello.md", "# hello")
|
|
Task.yield(task, 200)
|
|
end) =~ ~s{<h1 id="hello">hello</h1>\n}
|
|
|
|
assert :ok = Supervisor.terminate_child(Pandoc.Supervisor, Watcher)
|
|
assert_receive {:DOWN, ^ref, :process, ^pid, :normal}, 1000
|
|
end)
|
|
after
|
|
File.rm_rf!(tmp_path())
|
|
end
|
|
|
|
defp in_tmp(which, function) do
|
|
path = tmp_path(which)
|
|
File.rm_rf!(path)
|
|
File.mkdir_p!(path)
|
|
File.cd!(path, function)
|
|
end
|
|
|
|
defp tmp_path, do: Path.expand("../tmp", __DIR__)
|
|
defp tmp_path(extension), do: Path.join(tmp_path(), extension)
|
|
end
|