From b12829a39be7a9e51665c20062501ad4d9131ee7 Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sat, 27 Apr 2019 21:51:01 +0200 Subject: [PATCH 1/8] first version --- time_nist/lib/time_nist/server.ex | 42 +++++++++++++++++++++++++------ time_nist/test/time_nist_test.exs | 17 ++++++++++--- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/time_nist/lib/time_nist/server.ex b/time_nist/lib/time_nist/server.ex index abde36a..1d9c8cf 100644 --- a/time_nist/lib/time_nist/server.ex +++ b/time_nist/lib/time_nist/server.ex @@ -5,25 +5,53 @@ defmodule TimeNist.Server do # - make a requet to the server every 7s (see handle_info) use GenServer - def start_link() do - # GenServer.start_link ... + @me __MODULE__ + @target_server "time.nist.gov" + + def start_link(_) do + GenServer.start_link(@me, @target_server, name: @me) end @impl true - def init() do - # ... + def init(target_server) do + refresh() + {:ok, %{daytime: get_daytime(target_server), server: target_server}} end ############ API ############### - @spec get_timedate() :: {:ok, String.t()} | {:error, any()} - def get_timedate() do - {:error, :unimplemented} + @spec daytime() :: {:ok, String.t()} | {:error, any()} + def daytime do + GenServer.call(@me, :daytime) end ########## CALLBACK ############ + @impl true + def handle_call(:daytime, _from, %{daytime: daytime} = state) do + {:reply, daytime, state} + end + + @impl true + def handle_info(:refresh, %{server: server} = state) do + refresh() + IO.puts "refresh" + {:noreply, %{state | daytime: get_daytime(server)}} + end ########### PRIVATE ############ + defp refresh do + Process.send_after(self(), :refresh, 7_000_000) + end + + @spec get_daytime(String.t()) :: String.t() + defp get_daytime(host) do + case TimeNist.request(host) do + {:ok, val} -> + val + _ -> + "" + end + end end diff --git a/time_nist/test/time_nist_test.exs b/time_nist/test/time_nist_test.exs index 6fca2fc..6536c06 100644 --- a/time_nist/test/time_nist_test.exs +++ b/time_nist/test/time_nist_test.exs @@ -2,12 +2,23 @@ defmodule TimeNistTest do use ExUnit.Case doctest TimeNist - it "the GenServer is Up & Running" do - + setup do + {:ok, pid} = start_supervised(TimeNist.Server) + [time_server: pid] end - it "Get valid daytime" do + test "the GenServer is Up & Running", %{time_server: pid} do + assert Process.whereis(TimeNist.Server) == pid + end + test "Get a daytime" do + date = TimeNist.Server.daytime() + assert String.length(date) > 0 end + test "Get a valid daytime" do + date = TimeNist.Server.daytime() + now = Time.utc_now + assert String.contains?(date, "#{now.hour}:#{now.minute}") == true + end end From dc0ec9921076e9c3e2d0148c5a4e042fbf993896 Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 14:40:47 +0200 Subject: [PATCH 2/8] adding fake server --- time_nist/lib/time_nist.ex | 4 ++ .../lib/time_nist/{server.ex => client.ex} | 2 +- time_nist/lib/time_nist/fake_server.ex | 41 +++++++++++++++++++ time_nist/lib/time_nist_interface.ex | 3 ++ time_nist/mix.exs | 2 + time_nist/mix.lock | 15 +++++++ time_nist/test/test_helper.exs | 3 ++ time_nist/test/time_nist_test.exs | 10 +++-- 8 files changed, 75 insertions(+), 5 deletions(-) rename time_nist/lib/time_nist/{server.ex => client.ex} (97%) create mode 100644 time_nist/lib/time_nist/fake_server.ex create mode 100644 time_nist/lib/time_nist_interface.ex create mode 100644 time_nist/mix.lock diff --git a/time_nist/lib/time_nist.ex b/time_nist/lib/time_nist.ex index 2746112..b05c06c 100644 --- a/time_nist/lib/time_nist.ex +++ b/time_nist/lib/time_nist.ex @@ -1,5 +1,7 @@ defmodule TimeNist do + @behaviour TimeNist.Interface + @impl TimeNist.Interface @spec request(String.t()) :: {:ok, String.t()} | {:error, any()} def request(host) do {:ok, socket} = connect(host) @@ -8,6 +10,8 @@ defmodule TimeNist do data end + ### API + defp connect(host) do :gen_tcp.connect(host |> to_charlist(), 13, [:binary, {:active, false}]) end diff --git a/time_nist/lib/time_nist/server.ex b/time_nist/lib/time_nist/client.ex similarity index 97% rename from time_nist/lib/time_nist/server.ex rename to time_nist/lib/time_nist/client.ex index 1d9c8cf..46fc11a 100644 --- a/time_nist/lib/time_nist/server.ex +++ b/time_nist/lib/time_nist/client.ex @@ -1,4 +1,4 @@ -defmodule TimeNist.Server do +defmodule TimeNist.Client do # Task: # - define the state # - define the argument of the init & start_link diff --git a/time_nist/lib/time_nist/fake_server.ex b/time_nist/lib/time_nist/fake_server.ex new file mode 100644 index 0000000..7541014 --- /dev/null +++ b/time_nist/lib/time_nist/fake_server.ex @@ -0,0 +1,41 @@ +defmodule TimeNist.Server do + use GenServer + + @me __MODULE__ + + def start_link() do + GenServer.start_link(@me, []) + end + + @impl true + def init(_) do + {:ok, []} + end + + ### API + + def get_daytime(pid) do + GenServer.call(pid, :daytime) + end + + ### CALLBACK + + @impl true + def handle_call(:daytime, _from, state) do + {:reply, current_daytime(), state} + end + + ### PRIVATE + + def current_daytime() do + now = Timex.now + %{year: y, month: m, day: d, hour: h, minute: minutes, second: seconds} = now + j = Timex.to_julian(now) - 2_400_000 + m_s = m |> to_string |> String.pad_leading(2, "0") + d_s = d |> to_string |> String.pad_leading(2, "0") + h_s = h |> to_string |> String.pad_leading(2, "0") + mt_s = minutes |> to_string |> String.pad_leading(2, "0") + sec_s = seconds |> to_string |> String.pad_leading(2, "0") + "#{j} #{y - 2000}-#{m_s}-#{d_s} #{h_s}:#{mt_s}:#{sec_s} 00 0 0 0 UTC(FakeServer) OTM" + end +end diff --git a/time_nist/lib/time_nist_interface.ex b/time_nist/lib/time_nist_interface.ex new file mode 100644 index 0000000..6a14ad8 --- /dev/null +++ b/time_nist/lib/time_nist_interface.ex @@ -0,0 +1,3 @@ +defmodule TimeNist.Interface do + @callback request(String.t()) :: {:ok, String.t()} | {:error, any()} +end diff --git a/time_nist/mix.exs b/time_nist/mix.exs index c0538dd..dd91723 100644 --- a/time_nist/mix.exs +++ b/time_nist/mix.exs @@ -22,6 +22,8 @@ defmodule TimeNist.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ + {:timex, "~> 3.1"}, + {:mox, "~> 0.5", only: :test} # {:dep_from_hexpm, "~> 0.3.0"}, # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} ] diff --git a/time_nist/mix.lock b/time_nist/mix.lock new file mode 100644 index 0000000..39c78f0 --- /dev/null +++ b/time_nist/mix.lock @@ -0,0 +1,15 @@ +%{ + "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, + "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, + "gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"}, + "hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, + "mox": {:hex, :mox, "0.5.0", "c519b48407017a85f03407a9a4c4ceb7cc6dec5fe886b2241869fb2f08476f9e", [:mix], [], "hexpm"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"}, + "timex": {:hex, :timex, "3.5.0", "b0a23167da02d0fe4f1a4e104d1f929a00d348502b52432c05de875d0b9cffa5", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, + "tzdata": {:hex, :tzdata, "0.5.20", "304b9e98a02840fb32a43ec111ffbe517863c8566eb04a061f1c4dbb90b4d84c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, +} diff --git a/time_nist/test/test_helper.exs b/time_nist/test/test_helper.exs index 869559e..5d4658f 100644 --- a/time_nist/test/test_helper.exs +++ b/time_nist/test/test_helper.exs @@ -1 +1,4 @@ ExUnit.start() +Application.ensure_all_started(:mox) + +Mox.defmock(TimeNist.ClientMock, for: TimeNist.Interface) diff --git a/time_nist/test/time_nist_test.exs b/time_nist/test/time_nist_test.exs index 6536c06..aee31ad 100644 --- a/time_nist/test/time_nist_test.exs +++ b/time_nist/test/time_nist_test.exs @@ -2,13 +2,15 @@ defmodule TimeNistTest do use ExUnit.Case doctest TimeNist + setup :verify_on_exit! + setup do - {:ok, pid} = start_supervised(TimeNist.Server) - [time_server: pid] + {:ok, client} = start_supervised(TimeNist.Client) + [time_server: client] end - test "the GenServer is Up & Running", %{time_server: pid} do - assert Process.whereis(TimeNist.Server) == pid + test "the GenServer is Up & Running", %{time_server: client} do + assert Process.whereis(TimeNist.Server) == client end test "Get a daytime" do From 64e2bfd9cdb85efe22a60a27ec10271fd723fd1d Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 14:44:18 +0200 Subject: [PATCH 3/8] formatting --- time_nist/lib/time_nist/client.ex | 3 ++- time_nist/lib/time_nist/fake_server.ex | 2 +- time_nist/test/time_nist_test.exs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/time_nist/lib/time_nist/client.ex b/time_nist/lib/time_nist/client.ex index 46fc11a..b121395 100644 --- a/time_nist/lib/time_nist/client.ex +++ b/time_nist/lib/time_nist/client.ex @@ -35,7 +35,7 @@ defmodule TimeNist.Client do @impl true def handle_info(:refresh, %{server: server} = state) do refresh() - IO.puts "refresh" + IO.puts("refresh") {:noreply, %{state | daytime: get_daytime(server)}} end @@ -50,6 +50,7 @@ defmodule TimeNist.Client do case TimeNist.request(host) do {:ok, val} -> val + _ -> "" end diff --git a/time_nist/lib/time_nist/fake_server.ex b/time_nist/lib/time_nist/fake_server.ex index 7541014..6ffabaa 100644 --- a/time_nist/lib/time_nist/fake_server.ex +++ b/time_nist/lib/time_nist/fake_server.ex @@ -28,7 +28,7 @@ defmodule TimeNist.Server do ### PRIVATE def current_daytime() do - now = Timex.now + now = Timex.now() %{year: y, month: m, day: d, hour: h, minute: minutes, second: seconds} = now j = Timex.to_julian(now) - 2_400_000 m_s = m |> to_string |> String.pad_leading(2, "0") diff --git a/time_nist/test/time_nist_test.exs b/time_nist/test/time_nist_test.exs index aee31ad..3e764a1 100644 --- a/time_nist/test/time_nist_test.exs +++ b/time_nist/test/time_nist_test.exs @@ -20,7 +20,7 @@ defmodule TimeNistTest do test "Get a valid daytime" do date = TimeNist.Server.daytime() - now = Time.utc_now + now = Time.utc_now() assert String.contains?(date, "#{now.hour}:#{now.minute}") == true end end From c27d1a596edde2fb467c2c903e5ec7540a51580f Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 14:52:29 +0200 Subject: [PATCH 4/8] fix test --- time_nist/config/config.exs | 5 ++++- time_nist/lib/time_nist/client.ex | 3 ++- time_nist/test/time_nist_test.exs | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/time_nist/config/config.exs b/time_nist/config/config.exs index 7fbc2c4..ecc47a7 100644 --- a/time_nist/config/config.exs +++ b/time_nist/config/config.exs @@ -21,10 +21,13 @@ use Mix.Config # config :logger, level: :info # +config :time_nist, :nist_api, TimeNist + # It is also possible to import configuration files, relative to this # directory. For example, you can emulate configuration per environment # by uncommenting the line below and defining dev.exs, test.exs and such. # Configuration from the imported file will override the ones defined # here (which is why it is important to import them last). # -# import_config "#{Mix.env()}.exs" + +import_config "#{Mix.env()}.exs" diff --git a/time_nist/lib/time_nist/client.ex b/time_nist/lib/time_nist/client.ex index b121395..4ecb91c 100644 --- a/time_nist/lib/time_nist/client.ex +++ b/time_nist/lib/time_nist/client.ex @@ -6,6 +6,7 @@ defmodule TimeNist.Client do use GenServer @me __MODULE__ + @api_nist Application.get_env(:time_nist, :nist_api) @target_server "time.nist.gov" def start_link(_) do @@ -47,7 +48,7 @@ defmodule TimeNist.Client do @spec get_daytime(String.t()) :: String.t() defp get_daytime(host) do - case TimeNist.request(host) do + case @api_nist.request(host) do {:ok, val} -> val diff --git a/time_nist/test/time_nist_test.exs b/time_nist/test/time_nist_test.exs index 3e764a1..ea68d76 100644 --- a/time_nist/test/time_nist_test.exs +++ b/time_nist/test/time_nist_test.exs @@ -10,16 +10,16 @@ defmodule TimeNistTest do end test "the GenServer is Up & Running", %{time_server: client} do - assert Process.whereis(TimeNist.Server) == client + assert Process.whereis(TimeNist.Client) == client end test "Get a daytime" do - date = TimeNist.Server.daytime() + date = TimeNist.Client.daytime() assert String.length(date) > 0 end test "Get a valid daytime" do - date = TimeNist.Server.daytime() + date = TimeNist.Client.daytime() now = Time.utc_now() assert String.contains?(date, "#{now.hour}:#{now.minute}") == true end From 1e80c067d093848d00fa82bf01aa5985bc743d49 Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 14:54:48 +0200 Subject: [PATCH 5/8] add conf for mox --- time_nist/config/dev.exs | 0 time_nist/config/test.exs | 1 + time_nist/mix.exs | 3 ++- time_nist/mix.lock | 3 +++ 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 time_nist/config/dev.exs create mode 100644 time_nist/config/test.exs diff --git a/time_nist/config/dev.exs b/time_nist/config/dev.exs new file mode 100644 index 0000000..e69de29 diff --git a/time_nist/config/test.exs b/time_nist/config/test.exs new file mode 100644 index 0000000..3ffa7ab --- /dev/null +++ b/time_nist/config/test.exs @@ -0,0 +1 @@ +config :time_nist, :nist_api, TimeNist.ClientMock diff --git a/time_nist/mix.exs b/time_nist/mix.exs index dd91723..cabb7d6 100644 --- a/time_nist/mix.exs +++ b/time_nist/mix.exs @@ -23,7 +23,8 @@ defmodule TimeNist.MixProject do defp deps do [ {:timex, "~> 3.1"}, - {:mox, "~> 0.5", only: :test} + {:mox, "~> 0.5", only: :test}, + {:credo, "~> 1.0.0", only: [:dev, :test], runtime: false} # {:dep_from_hexpm, "~> 0.3.0"}, # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} ] diff --git a/time_nist/mix.lock b/time_nist/mix.lock index 39c78f0..e533a56 100644 --- a/time_nist/mix.lock +++ b/time_nist/mix.lock @@ -1,9 +1,12 @@ %{ + "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, + "credo": {:hex, :credo, "1.0.5", "fdea745579f8845315fe6a3b43e2f9f8866839cfbc8562bb72778e9fdaa94214", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"}, "hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, "mox": {:hex, :mox, "0.5.0", "c519b48407017a85f03407a9a4c4ceb7cc6dec5fe886b2241869fb2f08476f9e", [:mix], [], "hexpm"}, From a9421a5b60b3081818a699481d22cef8096723ee Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 16:27:12 +0200 Subject: [PATCH 6/8] fix tests --- time_nist/config/dev.exs | 3 +++ time_nist/config/test.exs | 2 ++ time_nist/lib/time_nist.ex | 2 +- time_nist/lib/time_nist/fake_server.ex | 4 ++-- time_nist/mix.exs | 7 ++++++- time_nist/mix.lock | 2 ++ time_nist/test/test_helper.exs | 2 -- time_nist/test/time_nist_test.exs | 19 ++++++++++++++++++- 8 files changed, 34 insertions(+), 7 deletions(-) diff --git a/time_nist/config/dev.exs b/time_nist/config/dev.exs index e69de29..8cd9454 100644 --- a/time_nist/config/dev.exs +++ b/time_nist/config/dev.exs @@ -0,0 +1,3 @@ +use Mix.Config + +config :time_nist, :nist_api, TimeNist diff --git a/time_nist/config/test.exs b/time_nist/config/test.exs index 3ffa7ab..81ad56a 100644 --- a/time_nist/config/test.exs +++ b/time_nist/config/test.exs @@ -1 +1,3 @@ +use Mix.Config + config :time_nist, :nist_api, TimeNist.ClientMock diff --git a/time_nist/lib/time_nist.ex b/time_nist/lib/time_nist.ex index b05c06c..b22271c 100644 --- a/time_nist/lib/time_nist.ex +++ b/time_nist/lib/time_nist.ex @@ -10,7 +10,7 @@ defmodule TimeNist do data end - ### API + ### PRIVATE defp connect(host) do :gen_tcp.connect(host |> to_charlist(), 13, [:binary, {:active, false}]) diff --git a/time_nist/lib/time_nist/fake_server.ex b/time_nist/lib/time_nist/fake_server.ex index 6ffabaa..2cda4ec 100644 --- a/time_nist/lib/time_nist/fake_server.ex +++ b/time_nist/lib/time_nist/fake_server.ex @@ -1,9 +1,9 @@ -defmodule TimeNist.Server do +defmodule TimeNist.FakeServer do use GenServer @me __MODULE__ - def start_link() do + def start_link(_) do GenServer.start_link(@me, []) end diff --git a/time_nist/mix.exs b/time_nist/mix.exs index cabb7d6..c133eb3 100644 --- a/time_nist/mix.exs +++ b/time_nist/mix.exs @@ -7,6 +7,7 @@ defmodule TimeNist.MixProject do version: "0.1.0", elixir: "~> 1.8", start_permanent: Mix.env() == :prod, + elixirc_paths: elixirc_paths(Mix.env()), deps: deps() ] end @@ -24,9 +25,13 @@ defmodule TimeNist.MixProject do [ {:timex, "~> 3.1"}, {:mox, "~> 0.5", only: :test}, - {:credo, "~> 1.0.0", only: [:dev, :test], runtime: false} + {:credo, "~> 1.0.0", only: [:dev, :test], runtime: false}, + {:dialyxir, "~> 1.0.0-rc.6", only: [:dev], runtime: false} # {:dep_from_hexpm, "~> 0.3.0"}, # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} ] end + + defp elixirc_paths(:test), do: ["test/support", "lib"] + defp elixirc_paths(_), do: ["lib"] end diff --git a/time_nist/mix.lock b/time_nist/mix.lock index e533a56..b464815 100644 --- a/time_nist/mix.lock +++ b/time_nist/mix.lock @@ -3,6 +3,8 @@ "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "credo": {:hex, :credo, "1.0.5", "fdea745579f8845315fe6a3b43e2f9f8866839cfbc8562bb72778e9fdaa94214", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, + "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"}, + "erlex": {:hex, :erlex, "0.2.1", "cee02918660807cbba9a7229cae9b42d1c6143b768c781fa6cee1eaf03ad860b", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"}, "hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, diff --git a/time_nist/test/test_helper.exs b/time_nist/test/test_helper.exs index 5d4658f..a1b6e56 100644 --- a/time_nist/test/test_helper.exs +++ b/time_nist/test/test_helper.exs @@ -1,4 +1,2 @@ ExUnit.start() Application.ensure_all_started(:mox) - -Mox.defmock(TimeNist.ClientMock, for: TimeNist.Interface) diff --git a/time_nist/test/time_nist_test.exs b/time_nist/test/time_nist_test.exs index ea68d76..886999f 100644 --- a/time_nist/test/time_nist_test.exs +++ b/time_nist/test/time_nist_test.exs @@ -1,10 +1,18 @@ defmodule TimeNistTest do - use ExUnit.Case + use ExUnit.Case, async: false doctest TimeNist + import Mox + + setup :set_mox_global setup :verify_on_exit! setup do + {:ok, fake_server} = start_supervised(TimeNist.FakeServer) + + TimeNist.ClientMock + |> expect(:request, fn _ -> {:ok, TimeNist.FakeServer.get_daytime(fake_server)} end) + {:ok, client} = start_supervised(TimeNist.Client) [time_server: client] end @@ -23,4 +31,13 @@ defmodule TimeNistTest do now = Time.utc_now() assert String.contains?(date, "#{now.hour}:#{now.minute}") == true end + + test "multiple request" do + times = + 1..100 + |> Enum.map(fn _ -> TimeNist.Client.daytime() end) + + assert Enum.count(times) == 100 + assert times |> Enum.filter(fn e -> String.length(e) > 0 end) |> Enum.count() == 100 + end end From 0e76d493394378916cc37d6718ad67334edfcff1 Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 16:28:06 +0200 Subject: [PATCH 7/8] add mock --- time_nist/test/support/client_mock.ex | 1 + 1 file changed, 1 insertion(+) create mode 100644 time_nist/test/support/client_mock.ex diff --git a/time_nist/test/support/client_mock.ex b/time_nist/test/support/client_mock.ex new file mode 100644 index 0000000..7d67890 --- /dev/null +++ b/time_nist/test/support/client_mock.ex @@ -0,0 +1 @@ +Mox.defmock(TimeNist.ClientMock, for: TimeNist.Interface) From d3af3a56528854844b0fcab3d9369eb118b0a3de Mon Sep 17 00:00:00 2001 From: Gian Lorenzo Meocci Date: Sun, 28 Apr 2019 17:15:17 +0200 Subject: [PATCH 8/8] fix --- time_nist/lib/time_nist/client.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/time_nist/lib/time_nist/client.ex b/time_nist/lib/time_nist/client.ex index 4ecb91c..05cb47c 100644 --- a/time_nist/lib/time_nist/client.ex +++ b/time_nist/lib/time_nist/client.ex @@ -43,7 +43,7 @@ defmodule TimeNist.Client do ########### PRIVATE ############ defp refresh do - Process.send_after(self(), :refresh, 7_000_000) + Process.send_after(self(), :refresh, 7_000) end @spec get_daytime(String.t()) :: String.t()