Packages
tai
0.0.60
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/test_support/e2e_case.ex
defmodule Tai.TestSupport.E2ECase do
use ExUnit.CaseTemplate
using do
quote do
import ExUnit.CaptureIO
import Tai.TestSupport.Assertions.Event
setup do
on_exit(fn -> stop_app() end)
start_mock_server()
before_start_app()
start_app()
after_start_app()
receive do
{TaiEvents.Event, %Tai.Events.BootAdvisors{}, :info} ->
after_boot_app()
{TaiEvents.Event, %Tai.Events.BootAdvisorsError{} = event, :error} ->
after_boot_app_error(event)
after
5000 -> flunk("Time out waiting 5000ms for tai to boot")
end
:ok
end
@spec before_start_app :: no_return
def before_start_app, do: nil
@spec after_start_app :: no_return
def after_start_app, do: nil
@spec after_boot_app :: no_return
def after_boot_app, do: nil
@spec after_boot_app_error(error :: struct) :: no_return
def after_boot_app_error(_error), do: nil
def start_mock_server do
start_supervised!(Tai.TestSupport.Mocks.Server)
end
def start_app do
{:ok, _} = Application.ensure_all_started(:echo_boy)
{:ok, _} = Application.ensure_all_started(:tai_events)
TaiEvents.firehose_subscribe()
{:ok, _} = e2e_app() |> Application.ensure_all_started()
Tai.Settings.enable_send_orders!()
end
def stop_app do
:ok = Application.stop(:echo_boy)
:ok = Application.stop(:tai_events)
:ok = Application.stop(:tai)
:ok = e2e_app() |> Application.stop()
end
def seed_mock_responses(scenario_name) do
scenario = fetch_mod!(scenario_name)
scenario.seed_mock_responses(scenario_name)
end
def seed_venues(scenario_name) do
scenario = fetch_mod!(scenario_name)
scenario.seed_venues(scenario_name)
end
def push_stream_market_data({scenario_name, _, _, _} = args) do
scenario = fetch_mod!(scenario_name)
scenario.push_stream_market_data(args)
end
def push_stream_order_update({scenario_name, _, _, _} = scenario_args, client_id) do
scenario = fetch_mod!(scenario_name)
scenario.push_stream_order_update(scenario_args, client_id)
end
def configure_advisor_group(scenario_name) do
scenario = fetch_mod!(scenario_name)
advisor_group_config = scenario.advisor_group_config(scenario_name)
Tai.Config
|> struct(advisor_groups: Map.put(%{}, scenario_name, advisor_group_config))
|> Tai.Advisors.Specs.from_config()
|> Enum.map(&Tai.Advisors.SpecStore.put/1)
end
def start_advisors(args) do
capture_io(fn -> Tai.IEx.start_advisors(args) end)
end
def start_venue(venue_id) do
capture_io(fn -> Tai.IEx.start_venue(venue_id) end)
receive do
{TaiEvents.Event, %Tai.Events.VenueStart{}, :info} ->
nil
{TaiEvents.Event, %Tai.Events.VenueStartError{} = event, :error} ->
flunk("Error starting venue: #{inspect(event.reason)}")
after
5000 -> flunk("Time out waiting 5000ms for venue to start")
end
end
defp e2e_app, do: Application.fetch_env!(:tai, :e2e_app)
defp fetch_mod!(scenario_name) do
e2e_app()
|> Application.get_env(:e2e_mappings, %{})
|> Map.fetch!(scenario_name)
end
defoverridable before_start_app: 0,
after_start_app: 0,
after_boot_app: 0,
after_boot_app_error: 1
end
end
end