defmodule CoverTool do def start(path, options) do {dirs, options} = Keyword.pop(options, :dirs, []) fun = ExCoveralls.start(path, options) Mix.shell().info("Cover compiling modules ...") :cover.stop() :cover.start() Enum.each(dirs, fn path -> path |> Path.expand(__DIR__) |> String.to_charlist() |> :cover.compile_beam_directory() end) ExCoveralls.ConfServer.start() ExCoveralls.ConfServer.set(options) ExCoveralls.StatServer.start() fun end end defmodule Mix.Tasks.Suite do @moduledoc """ Helper task to create `suites.elixir` file. It suppose to be used as follows ``` MIX_ENV=integration mix suite > test/elixir/test/config/suite.elixir ``` """ use Mix.Task @shortdoc "Outputs all available integration tests" def run(_) do Path.wildcard(Path.join(Mix.Project.build_path(), "/**/ebin")) |> Enum.filter(&File.dir?/1) |> Enum.map(&Code.append_path/1) tests = Couch.Test.Suite.list() |> Enum.sort() |> Couch.Test.Suite.group_by() IO.puts(Couch.Test.Suite.pretty_print(tests)) end end defmodule CouchDBTest.Mixfile do use Mix.Project def project do [ app: :couchdbtest, version: "0.1.0", elixir: "~> 1.13", lockfile: Path.expand("mix.lock", __DIR__), deps_path: Path.expand("src", __DIR__), build_path: Path.expand("_build", __DIR__), compilers: [:elixir, :app], start_permanent: Mix.env() == :prod, build_embedded: Mix.env() == :prod, deps: deps(), consolidate_protocols: Mix.env() not in [:test, :dev, :integration], test_paths: get_test_paths(Mix.env()), elixirc_paths: elixirc_paths(Mix.env()), test_coverage: [ tool: CoverTool, dirs: get_coverage_paths(), type: "html" ] ] end # Run "mix help compile.app" to learn about applications. def application do [ extra_applications: [:logger], applications: [:httpotion] ] end # Specifies which paths to compile per environment. defp elixirc_paths(:test), do: ["test/elixir/lib", "test/elixir/test/support"] defp elixirc_paths(:integration), do: ["test/elixir/lib", "test/elixir/test/support"] defp elixirc_paths(_), do: ["test/elixir/lib"] # Run "mix help deps" to learn about dependencies. defp deps() do deps_list = [ {:junit_formatter, "~> 3.0", only: [:dev, :test, :integration]}, {:httpotion, ">= 3.1.3", only: [:dev, :test, :integration], runtime: false}, {:excoveralls, "~> 0.12", only: :test}, {:b64url, path: path("b64url")}, {:jiffy, path: path("jiffy")}, {:jwtf, path: path("jwtf")}, {:ibrowse, path: path("ibrowse"), override: true}, {:credo, "~> 1.6.4", only: [:dev, :test, :integration], runtime: false} ] # Some deps may be missing during source check # Besides we don't want to spend time checking them anyway List.foldl([:b64url, :jiffy, :jwtf, :ibrowse], deps_list, fn dep, acc -> if File.dir?(acc[dep][:path]) do acc else List.keydelete(acc, dep, 0) end end) end defp path(app) do lib_dir = Path.expand("src", __DIR__) Path.expand(app, lib_dir) end def get_test_paths(:test) do Path.wildcard("src/*/test/exunit") |> Enum.filter(&File.dir?/1) end def get_test_paths(:integration) do integration_tests = Path.wildcard("src/*/test/integration") |> Enum.filter(&File.dir?/1) ["test/elixir/test" | integration_tests] end def get_test_paths(_) do [] end defp get_deps_paths() do deps = [ "bunt", "certifi", "credo", "excoveralls", "hackney", "httpotion", "ibrowse", "idna", "jason", "jiffy", "junit_formatter", "metrics", "mimerl", "parse_trans", "ssl_verify_fun", "unicode_util_compat", "b64url", "exxhash", "bear", "mochiweb", "snappy", "rebar", "proper", "mochiweb", "meck", "khash", "hyper", "fauxton", "folsom" ] deps |> Enum.map(fn app -> "src/#{app}" end) end defp get_coverage_paths() do deps = get_deps_paths() |> Enum.reduce(MapSet.new(), fn x, set -> MapSet.put(set, "#{x}/ebin") end) Path.wildcard("src/*/ebin") |> Enum.filter(&File.dir?/1) |> Enum.filter(fn path -> not MapSet.member?(deps, path) end) end end