161 lines
5.4 KiB
Elixir
161 lines
5.4 KiB
Elixir
defmodule AutoSyncChannelTest do
|
|
require Helpers
|
|
use ExUnit.Case, async: false
|
|
use Mimic
|
|
alias FarmbotExt.AMQP.AutoSyncChannel
|
|
|
|
alias FarmbotExt.{
|
|
AMQP.ConnectionWorker,
|
|
API.Preloader,
|
|
JWT
|
|
}
|
|
|
|
setup :verify_on_exit!
|
|
setup :set_mimic_global
|
|
|
|
@fake_jwt "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZ" <>
|
|
"G1pbkBhZG1pbi5jb20iLCJpYXQiOjE1MDIxMjcxMTcsImp0a" <>
|
|
"SI6IjlhZjY2NzJmLTY5NmEtNDhlMy04ODVkLWJiZjEyZDlhY" <>
|
|
"ThjMiIsImlzcyI6Ii8vbG9jYWxob3N0OjMwMDAiLCJleHAiO" <>
|
|
"jE1MDU1ODMxMTcsIm1xdHQiOiJsb2NhbGhvc3QiLCJvc191c" <>
|
|
"GRhdGVfc2VydmVyIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvb" <>
|
|
"S9yZXBvcy9mYXJtYm90L2Zhcm1ib3Rfb3MvcmVsZWFzZXMvb" <>
|
|
"GF0ZXN0IiwiZndfdXBkYXRlX3NlcnZlciI6Imh0dHBzOi8vY" <>
|
|
"XBpLmdpdGh1Yi5jb20vcmVwb3MvRmFybUJvdC9mYXJtYm90L" <>
|
|
"WFyZHVpbm8tZmlybXdhcmUvcmVsZWFzZXMvbGF0ZXN0IiwiY" <>
|
|
"m90IjoiZGV2aWNlXzE1In0.XidSeTKp01ngtkHzKD_zklMVr" <>
|
|
"9ZUHX-U_VDlwCSmNA8ahOHxkwCtx8a3o_McBWvOYZN8RRzQV" <>
|
|
"LlHJugHq1Vvw2KiUktK_1ABQ4-RuwxOyOBqqc11-6H_GbkM8" <>
|
|
"dyzqRaWDnpTqHzkHGxanoWVTTgGx2i_MZLr8FPZ8prnRdwC1" <>
|
|
"x9zZ6xY7BtMPtHW0ddvMtXU8ZVF4CWJwKSaM0Q2pTxI9GRqr" <>
|
|
"p5Y8UjaKufif7bBPOUbkEHLNOiaux4MQr-OWAC8TrYMyFHzt" <>
|
|
"eXTEVkqw7rved84ogw6EKBSFCVqwRA-NKWLpPMV_q7fRwiEG" <>
|
|
"Wj7R-KZqRweALXuvCLF765E6-ENxA"
|
|
|
|
def generate_pid do
|
|
apply_default_mocks()
|
|
jwt = JWT.decode!(@fake_jwt)
|
|
{:ok, pid} = AutoSyncChannel.start_link([jwt: jwt], [])
|
|
pid
|
|
end
|
|
|
|
def apply_default_mocks do
|
|
ok1 = fn _ -> :whatever end
|
|
stub(FarmbotExt.API.EagerLoader.Supervisor, :drop_all_cache, fn -> :ok end)
|
|
stub(ConnectionWorker, :close_channel, ok1)
|
|
|
|
stub(ConnectionWorker, :maybe_connect_autosync, fn _ ->
|
|
%{conn: %{fake_conn: true}, chan: %{fake_chan: true}}
|
|
end)
|
|
end
|
|
|
|
def ensure_response_to(msg) do
|
|
# Not much to check here other than matching clauses.
|
|
# AMQP lib handles most all of this.
|
|
expect(Preloader, :preload_all, 1, fn -> :ok end)
|
|
pid = generate_pid()
|
|
send(pid, msg)
|
|
Helpers.wait_for(pid)
|
|
end
|
|
|
|
test "basic_cancel", do: ensure_response_to({:basic_cancel, :anything})
|
|
test "basic_cancel_ok", do: ensure_response_to({:basic_cancel_ok, :anything})
|
|
test "basic_consume_ok", do: ensure_response_to({:basic_consume_ok, :anything})
|
|
|
|
test "init / terminate - auto_sync enabled" do
|
|
expect(Preloader, :preload_all, 1, fn -> :ok end)
|
|
expect(FarmbotCore.Asset.Query, :auto_sync?, 1, fn -> true end)
|
|
expect(FarmbotCore.BotState, :set_sync_status, 1, fn "synced" -> :ok end)
|
|
|
|
expect(FarmbotCore.Leds, :green, 2, fn
|
|
:solid ->
|
|
:ok
|
|
|
|
:really_fast_blink ->
|
|
:ok
|
|
end)
|
|
|
|
# Helpers.expect_log("Failed to connect to AutoSync channel: :whatever")
|
|
# Helpers.expect_log("Disconnected from AutoSync channel: :normal")
|
|
pid = generate_pid()
|
|
IO.puts(" =====RICK: This test blinks and you should fix it.")
|
|
assert %{chan: nil, conn: nil, preloaded: true} == AutoSyncChannel.network_status(pid)
|
|
GenServer.stop(pid, :normal)
|
|
end
|
|
|
|
test "init / terminate - auto_sync disabled" do
|
|
expect(Preloader, :preload_all, 1, fn -> :ok end)
|
|
expect(FarmbotCore.Asset.Query, :auto_sync?, 1, fn -> false end)
|
|
expect(FarmbotCore.BotState, :set_sync_status, 1, fn "sync_now" -> :ok end)
|
|
|
|
expect(FarmbotCore.Leds, :green, 2, fn
|
|
:slow_blink ->
|
|
:ok
|
|
|
|
:really_fast_blink ->
|
|
:ok
|
|
end)
|
|
|
|
Helpers.expect_log("Disconnected from AutoSync channel: :normal")
|
|
pid = generate_pid()
|
|
assert %{chan: nil, conn: nil, preloaded: true} == AutoSyncChannel.network_status(pid)
|
|
GenServer.stop(pid, :normal)
|
|
end
|
|
|
|
test "init / terminate - auto_sync error" do
|
|
Helpers.expect_log("Error preloading. #{inspect("a test example")}")
|
|
Helpers.expect_log("Disconnected from AutoSync channel: :normal")
|
|
expect(FarmbotCore.BotState, :set_sync_status, 1, fn "sync_error" -> :ok end)
|
|
expect(Preloader, :preload_all, 1, fn -> {:error, "a test example"} end)
|
|
|
|
expect(FarmbotCore.Leds, :green, 2, fn
|
|
:slow_blink ->
|
|
:ok
|
|
|
|
:really_fast_blink ->
|
|
:ok
|
|
end)
|
|
|
|
pid = generate_pid()
|
|
assert %{chan: nil, conn: nil, preloaded: false} == AutoSyncChannel.network_status(pid)
|
|
GenServer.stop(pid, :normal)
|
|
end
|
|
|
|
test "delivery of auto sync messages" do
|
|
expect(Preloader, :preload_all, 1, fn -> :ok end)
|
|
|
|
expect(ConnectionWorker, :rpc_reply, 1, fn chan, device, label ->
|
|
assert chan == %{fake_chan: true}
|
|
assert device == "device_15"
|
|
assert label == "thisismylabelinatestsuite"
|
|
:ok
|
|
end)
|
|
|
|
key = "bot.device_15.sync.Device.46"
|
|
|
|
{:ok, payload} =
|
|
FarmbotCore.JSON.encode(%{
|
|
"id" => 46,
|
|
"args" => %{
|
|
"label" => "thisismylabelinatestsuite"
|
|
},
|
|
"body" => %{name: "This is my bot"}
|
|
})
|
|
|
|
pid = generate_pid()
|
|
# We need the process to be preloaded for these tests to work:
|
|
%{preloaded: true} = AutoSyncChannel.network_status(pid)
|
|
send(pid, {:basic_deliver, payload, %{routing_key: key}})
|
|
|
|
expect(FarmbotExt.AMQP.AutoSyncAssetHandler, :handle_asset, fn kind, id, body ->
|
|
assert kind == "Device"
|
|
assert id == 46
|
|
assert body == %{"name" => "This is my bot"}
|
|
:ok
|
|
end)
|
|
|
|
Helpers.wait_for(pid)
|
|
Process.sleep(1000)
|
|
end
|
|
end
|