Packages

Elixir client for Interactive Brokers' Client Portal API

Current section

Files

Jump to
ibkr_api test support http_mock_helper.ex
Raw

test/support/http_mock_helper.ex

defmodule IbkrApi.Support.HTTPMockHelper do
@moduledoc """
Helper module for using HTTP mocks in tests.
**DEPRECATED**: This module is deprecated in favor of using HTTPSandbox and the explicit stub modules.
Use the stub modules directly instead:
```elixir
alias IbkrApi.Support.HTTPStubs.{AuthStub, TradeStub, ContractStub, MarketDataStub, PortfolioStub, OrderStub}
# Register stubs in your test
test "example test" do
AuthStub.stub_auth_status()
TradeStub.stub_list_trades()
# Make your assertions
end
```
See the documentation in guides/how-to/testing_with_http_mocks.md for more details.
@deprecated "Use HTTPSandbox and explicit stub modules instead"
"""
# Alias removed - HTTPSandbox is now the preferred approach
# alias IbkrApi.SharedUtils.HTTP
@doc """
Macro that imports the helper functions for HTTP mocking.
"""
defmacro __using__(_opts) do
quote do
import IbkrApi.Support.HTTPMockHelper
setup do
# Reset all mocks before each test
reset_http_mocks()
:ok
end
end
end
@doc """
Mocks an HTTP function for a specific module.
## Parameters
- module_key: The module key (:auth, :trade, :contract, :market_data, :portfolio, :order)
- function_name: The name of the stub function to use (e.g. :stub_list_trades)
- custom_response: Optional custom response function
## Examples
mock_http(:trade, :stub_list_trades)
mock_http(:auth, :stub_auth_status, my_custom_response_fn)
"""
def mock_http(module_key, function_name, custom_response \\ nil)
def mock_http(module_list, _, _) when is_list(module_list) do
Enum.each(module_list, fn {module_key, function_name} ->
mock_http(module_key, function_name)
end)
end
def mock_http(:auth, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.Auth, function_name, custom_response)
end
def mock_http(:trade, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.Trade, function_name, custom_response)
end
def mock_http(:contract, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.Contract, function_name, custom_response)
end
def mock_http(:market_data, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.MarketData, function_name, custom_response)
end
def mock_http(:portfolio, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.Portfolio, function_name, custom_response)
end
def mock_http(:order, function_name, custom_response) do
mock_module_function(IbkrApi.Support.HTTPMocks.Order, function_name, custom_response)
end
defp mock_module_function(module, function_name, custom_response) do
response_fn = if custom_response, do: custom_response, else: apply(module, function_name, [])
# Map function names to HTTP methods
http_method = function_name_to_http_method(function_name)
# Apply the mock
apply_mock(http_method, response_fn)
end
defp function_name_to_http_method(function_name) do
cond do
String.contains?(Atom.to_string(function_name), "delete") -> :delete
String.contains?(Atom.to_string(function_name), "post") ||
String.contains?(Atom.to_string(function_name), "place") ||
String.contains?(Atom.to_string(function_name), "create") ||
String.contains?(Atom.to_string(function_name), "modify") ||
String.contains?(Atom.to_string(function_name), "update") -> :post
String.contains?(Atom.to_string(function_name), "put") -> :put
true -> :get
end
end
defp apply_mock(:get, _response_fn) do
IO.warn(":meck has been replaced with HTTPSandbox - use explicit stub modules instead")
# Fallback implementation that logs but doesn't fail
# This is just to prevent errors during transition
end
defp apply_mock(:post, _response_fn) do
IO.warn(":meck has been replaced with HTTPSandbox - use explicit stub modules instead")
# Fallback implementation that logs but doesn't fail
end
defp apply_mock(:put, _response_fn) do
IO.warn(":meck has been replaced with HTTPSandbox - use explicit stub modules instead")
# Fallback implementation that logs but doesn't fail
end
defp apply_mock(:delete, _response_fn) do
IO.warn(":meck has been replaced with HTTPSandbox - use explicit stub modules instead")
# Fallback implementation that logs but doesn't fail
end
@doc """
Reset all HTTP mocks to their original implementations.
@deprecated "Use HTTPSandbox.reset() instead"
"""
def reset_http_mocks do
IO.warn(":meck has been replaced with HTTPSandbox - use HTTPSandbox.reset() instead")
# No-op implementation to avoid errors
end
end