summaryrefslogtreecommitdiff
path: root/test/api.scm
diff options
context:
space:
mode:
authorDan Rostovtsev <dan@rostovtsev.org>2026-04-06 15:48:14 -0400
committerDan Rostovtsev <dan@rostovtsev.org>2026-04-06 15:48:14 -0400
commit0716a22d1fab76a18606ec031d33914ccbc56633 (patch)
treed63cc7ee4fd73bac935a776d09dc0ec78c8335e2 /test/api.scm
parent2c6cf786c151118232533a6cfbc769ce1514aa9e (diff)
First working IBKR API implementation.HEADmain
* doc/ibkr.org: Docs for using the IBKR API. * manifest.scm: Guix Manifest of all project dependencies. * scripts/run-gateway.bash: A script for building and deploying the IBKR Client Gateway. * src/ibkr/api.scm: Support for specific endpoints, and generic tools for using the IBKR API. * src/ibkr/types.scm: Basic types for the IBKR endpoints. Orders, positions, securities, etc. * test/*.json: IBKR response and request examples for testing. * test/api.scm: Response handling and endpoint construction. * test/types.scm: Tests JSON parsing of IBKR requests and responses.
Diffstat (limited to 'test/api.scm')
-rw-r--r--test/api.scm93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/api.scm b/test/api.scm
new file mode 100644
index 0000000..1a85a77
--- /dev/null
+++ b/test/api.scm
@@ -0,0 +1,93 @@
+(use-modules (ibkr api)
+ (ibkr types)
+ (json)
+ (web uri)
+ (web request)
+ (srfi srfi-64)
+ (ice-9 textual-ports)
+ (ice-9 iconv))
+
+;; (test-begin "errors")
+;; (test-error &ibkr-request-error (auth-status-connected "http://localhost:12345"))
+;; (test-end "errors")
+
+(define (read-text path)
+ (call-with-input-file path (lambda (p) (get-string-all p))))
+
+(test-begin "auth-status")
+(test-equal "uri" "http://base/v1/api/iserver/auth/status"
+ (auth-status-uri "http://base"))
+(test-end "auth-status")
+
+(test-begin "accounts")
+(test-equal "uri" "http://base/v1/api/portfolio/accounts"
+ (accounts-uri "http://base"))
+(let ((body (read-text "test/account-response.json")))
+ (test-assert "conversion" (account? (car (response-body->accounts body)))))
+(test-end "accounts")
+
+(test-begin "positions")
+(test-equal "uri" "http://base/v1/api/portfolio2/ACCT/positions"
+ (positions-uri "http://base" "ACCT"))
+(let ((body (read-text "test/position-response.json")))
+ (test-assert "conversion" (position? (car (response-body->positions body)))))
+(test-end "positions")
+
+(test-begin "ledger")
+(test-equal "uri" "http://base/v1/api/portfolio/ACCT/ledger"
+ (ledger-uri "http://base" "ACCT"))
+(let ((body (read-text "test/ledger-response.json")))
+ (test-assert "conversion" (ledger? (response-body->ledger body "USD"))))
+(test-end "ledger")
+
+(test-begin "stocks")
+(test-equal "uri"
+ "http://base/v1/api/trsrv/stocks?symbols=IBKR"
+ (stocks-by-symbol-uri "http://base" "IBKR"))
+(let* ((body (read-text "test/stocks-response.json"))
+ (converted (response-body->stocks-by-symbol body "AAPL")))
+ (test-assert "conversion-list" (list? converted))
+ (test-assert "conversion-type" (stock? (car converted)))
+ (test-assert "contract-list" (list? (stock-contracts (car converted))))
+ (test-equal "exchange-search"
+ 265598 (contract-id (first-contract-on-exchange converted "NASDAQ"))))
+(test-end "stocks")
+
+(test-begin "contract-snapshot")
+(test-equal "uri"
+ "http://base/v1/api/iserver/marketdata/snapshot?conids=265598&fields=31"
+ (contract-snapshot-uri "http://base" 265598 'last-trade))
+(let ((body (read-text "test/snapshot-response.json")))
+ (test-assert "conversion"
+ (number? (response-body->contract-snapshot body 'last-trade))))
+(test-end "contract-snapshot")
+
+(test-begin "order-preview")
+(test-equal "uri" "http://base/v1/api/iserver/account/ACCT/orders/whatif"
+ (order-preview-uri "http://base" "ACCT"))
+(test-end "order-preview")
+
+(test-begin "order-submit")
+(test-equal "uri" "http://base/v1/api/iserver/account/ACCT/orders"
+ (order-submit-uri "http://base" "ACCT"))
+(test-end "order-submit")
+
+(test-begin "order-status")
+(test-equal "uri" "http://base/v1/api/iserver/account/order/status/OID"
+ (order-status-uri "http://base" "OID"))
+(test-end "order-status")
+
+(test-begin "suppress")
+(test-equal "uri" "http://base/v1/api/iserver/questions/suppress"
+ (suppress-uri "http://base"))
+(test-end "suppress")
+
+(test-begin "reset-suppress")
+(test-equal "uri" "http://base/v1/api/iserver/questions/suppress/reset"
+ (reset-suppress-uri "http://base"))
+(test-end "reset-suppress")
+
+(test-begin "reply")
+(test-equal "uri" "http://base/v1/api/iserver/reply/REPID"
+ (reply-uri "http://base" "REPID"))
+(test-end "reply")