adanos-cli 1.27.2__tar.gz → 1.28.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/CHANGELOG.md +6 -0
  2. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/PKG-INFO +2 -2
  3. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/README.md +1 -1
  4. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/__init__.py +1 -1
  5. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/endpoints.py +1 -6
  6. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/main.py +0 -1
  7. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/summaries.py +6 -6
  8. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_agent_contract.py +2 -2
  9. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_endpoint_coverage.py +16 -36
  10. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_power_features.py +20 -27
  11. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/ci.yml +0 -0
  12. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/cli-binaries.yml +0 -0
  13. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/publish-pypi.yml +0 -0
  14. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.gitignore +0 -0
  15. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/LICENSE +0 -0
  16. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/install.ps1 +0 -0
  17. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/install.sh +0 -0
  18. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/pyproject.toml +0 -0
  19. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/build_cli_binary.py +0 -0
  20. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/generate_homebrew_formula.py +0 -0
  21. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/pyinstaller_entrypoint.py +0 -0
  22. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/__main__.py +0 -0
  23. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/activity_log.py +0 -0
  24. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/__init__.py +0 -0
  25. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/auth.py +0 -0
  26. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/config.py +0 -0
  27. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/extensions.py +0 -0
  28. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/config.py +0 -0
  29. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/nlp.py +0 -0
  30. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/shell_history.py +0 -0
  31. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/tty.py +0 -0
  32. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/update_notifier.py +0 -0
  33. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/utils.py +0 -0
  34. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/watchlists.py +0 -0
  35. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/__init__.py +0 -0
  36. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/conftest.py +0 -0
  37. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_account.py +0 -0
  38. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_activity_log.py +0 -0
  39. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_auth.py +0 -0
  40. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_config_runtime.py +0 -0
  41. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_diagnostics.py +0 -0
  42. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_distribution.py +0 -0
  43. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_extensions.py +0 -0
  44. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_logs.py +0 -0
  45. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_onboarding.py +0 -0
  46. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_shell.py +0 -0
  47. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_tty.py +0 -0
  48. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_update_notifier.py +0 -0
  49. {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_watchlists.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to `adanos-cli` will be documented in this file.
5
5
  Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
6
  Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
7
7
 
8
+ ## [1.28.0] - 2026-05-25
9
+
10
+ ### Changed
11
+ - Synced CLI endpoint coverage with Adanos Market Sentiment API `1.39.0`.
12
+ - Removed `--from`, `--to`, and `--days` from search endpoint calls and the top-level `adanos search` command; search endpoints now accept only `--limit` and use API-managed recent summary windows.
13
+
8
14
  ## [1.27.2] - 2026-05-21
9
15
 
10
16
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adanos-cli
3
- Version: 1.27.2
3
+ Version: 1.28.0
4
4
  Summary: CLI for the Adanos Market Sentiment API
5
5
  Project-URL: Homepage, https://adanos.org
6
6
  Project-URL: API_Docs, https://api.adanos.org/docs
@@ -206,7 +206,7 @@ adanos endpoint call x-stocks.stock.explain --ticker TSLA
206
206
 
207
207
  Polymarket endpoint output includes both `market_count` for selected-window breadth and `current_market_count` for live-only active-market breadth.
208
208
 
209
- Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`.
209
+ Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`. Search commands are the exception: they accept only `--limit` and use the API-managed recent summary window.
210
210
 
211
211
  ## AI / Automation
212
212
 
@@ -180,7 +180,7 @@ adanos endpoint call x-stocks.stock.explain --ticker TSLA
180
180
 
181
181
  Polymarket endpoint output includes both `market_count` for selected-window breadth and `current_market_count` for live-only active-market breadth.
182
182
 
183
- Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`.
183
+ Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`. Search commands are the exception: they accept only `--limit` and use the API-managed recent summary window.
184
184
 
185
185
  ## AI / Automation
186
186
 
@@ -1,4 +1,4 @@
1
1
  """Adanos CLI package."""
2
2
 
3
3
  __all__ = ["__version__"]
4
- __version__ = "1.27.2"
4
+ __version__ = "1.28.0"
@@ -25,7 +25,7 @@ class EndpointSpec:
25
25
  PERIOD_PARAMS = ("from", "to", "days")
26
26
  TRENDING_PARAMS = (*PERIOD_PARAMS, "limit", "offset")
27
27
  TRENDING_TYPE_PARAMS = (*TRENDING_PARAMS, "type")
28
- SEARCH_PARAMS = (*PERIOD_PARAMS, "limit")
28
+ SEARCH_PARAMS = ("limit",)
29
29
  RAW_MENTION_PARAMS = (*PERIOD_PARAMS, "limit", "offset")
30
30
 
31
31
 
@@ -134,7 +134,6 @@ def _reddit_stocks_explain(client: Any, args: Namespace) -> Any:
134
134
  def _reddit_stocks_search(client: Any, args: Namespace) -> Any:
135
135
  return client.reddit.search(
136
136
  _require_str(args, "q", "query"),
137
- **_period_kwargs(args, default_days=7),
138
137
  limit=_with_default(args.limit, 20),
139
138
  )
140
139
 
@@ -208,7 +207,6 @@ def _news_stocks_explain(client: Any, args: Namespace) -> Any:
208
207
  def _news_stocks_search(client: Any, args: Namespace) -> Any:
209
208
  return client.news.search(
210
209
  _require_str(args, "q", "query"),
211
- **_period_kwargs(args, default_days=7),
212
210
  limit=_with_default(args.limit, 20),
213
211
  )
214
212
 
@@ -259,7 +257,6 @@ def _reddit_crypto_mentions(client: Any, args: Namespace) -> Any:
259
257
  def _reddit_crypto_search(client: Any, args: Namespace) -> Any:
260
258
  return client.crypto.search(
261
259
  _require_str(args, "q", "query"),
262
- **_period_kwargs(args, default_days=7),
263
260
  limit=_with_default(args.limit, 20),
264
261
  )
265
262
 
@@ -327,7 +324,6 @@ def _x_stocks_explain(client: Any, args: Namespace) -> Any:
327
324
  def _x_stocks_search(client: Any, args: Namespace) -> Any:
328
325
  return client.x.search(
329
326
  _require_str(args, "q", "query"),
330
- **_period_kwargs(args, default_days=7),
331
327
  limit=_with_default(args.limit, 20),
332
328
  )
333
329
 
@@ -391,7 +387,6 @@ def _polymarket_stocks_mentions(client: Any, args: Namespace) -> Any:
391
387
  def _polymarket_stocks_search(client: Any, args: Namespace) -> Any:
392
388
  return client.polymarket.search(
393
389
  _require_str(args, "q", "query"),
394
- **_period_kwargs(args, default_days=7),
395
390
  limit=_with_default(args.limit, 20),
396
391
  )
397
392
 
@@ -2206,7 +2206,6 @@ def _build_parser() -> argparse.ArgumentParser:
2206
2206
  p_search = subs.add_parser("search", help="Search assets by platform")
2207
2207
  p_search.add_argument("--platform", choices=["news-stocks", "reddit-stocks", "reddit-crypto", "x-stocks", "polymarket-stocks"], required=True)
2208
2208
  p_search.add_argument("query")
2209
- _add_period_args(p_search, default_days=7)
2210
2209
  p_search.add_argument("--limit", type=int, default=20)
2211
2210
  p_search.add_argument("--json", action="store_true")
2212
2211
  p_search.set_defaults(_handler="search")
@@ -154,7 +154,7 @@ def build_crypto_report(client: Any, symbol: str, *, days: int | None, from_: st
154
154
  "symbol": token,
155
155
  **_period_metadata(days, from_, to),
156
156
  "reddit_crypto": _call_safe(lambda: client.crypto.token(token, **period)),
157
- "search": _call_safe(lambda: client.crypto.search(token, **period)),
157
+ "search": _call_safe(lambda: client.crypto.search(token)),
158
158
  "stats": _call_safe(lambda: client.crypto.stats()),
159
159
  }
160
160
 
@@ -458,11 +458,11 @@ def build_search_fallback_report(client: Any, query: str) -> dict[str, Any]:
458
458
  return {
459
459
  "kind": "search_fallback",
460
460
  "query": query,
461
- "news_stocks": _call_safe(lambda: client.news.search(query, days=7, limit=10)),
462
- "reddit_stocks": _call_safe(lambda: client.reddit.search(query, days=7, limit=10)),
463
- "x_stocks": _call_safe(lambda: client.x.search(query, days=7, limit=10)),
464
- "polymarket_stocks": _call_safe(lambda: client.polymarket.search(query, days=7, limit=10)),
465
- "reddit_crypto": _call_safe(lambda: client.crypto.search(query, days=7, limit=10)),
461
+ "news_stocks": _call_safe(lambda: client.news.search(query, limit=10)),
462
+ "reddit_stocks": _call_safe(lambda: client.reddit.search(query, limit=10)),
463
+ "x_stocks": _call_safe(lambda: client.x.search(query, limit=10)),
464
+ "polymarket_stocks": _call_safe(lambda: client.polymarket.search(query, limit=10)),
465
+ "reddit_crypto": _call_safe(lambda: client.crypto.search(query, limit=10)),
466
466
  }
467
467
 
468
468
 
@@ -224,7 +224,7 @@ class _SearchNamespace:
224
224
  def __init__(self, rows: list[dict]):
225
225
  self._rows = rows
226
226
 
227
- def search(self, query: str, *, days: int = 7, limit: int = 20):
227
+ def search(self, query: str, *, limit: int = 20):
228
228
  query_upper = query.upper()
229
229
  matched = []
230
230
  for row in self._rows:
@@ -233,7 +233,7 @@ class _SearchNamespace:
233
233
  ticker = str(row.get("ticker") or "").upper()
234
234
  if query_upper in name or query_upper in ticker or any(query_upper in alias for alias in aliases):
235
235
  matched.append(row)
236
- return {"query": query, "count": len(matched), "period_days": days, "results": matched[:limit]}
236
+ return {"query": query, "count": len(matched), "period_days": 7, "results": matched[:limit]}
237
237
 
238
238
 
239
239
  class _AliasClient:
@@ -46,7 +46,7 @@ NEWS_ENDPOINT_IDS = {
46
46
  "news-stocks.search": {
47
47
  "path": "/news/stocks/v1/search",
48
48
  "required": ("q",),
49
- "optional": ("from", "to", "days", "limit"),
49
+ "optional": ("limit",),
50
50
  },
51
51
  "news-stocks.compare": {
52
52
  "path": "/news/stocks/v1/compare",
@@ -124,7 +124,7 @@ def test_raw_mention_endpoint_specs_support_offset() -> None:
124
124
 
125
125
  def test_invoke_endpoint_rejects_unsupported_source() -> None:
126
126
  class DummyNews:
127
- def search(self, query: str, *, days: int = 7, limit: int = 20) -> dict[str, str | int]:
127
+ def search(self, query: str, *, limit: int = 20) -> dict[str, str | int]:
128
128
  return {"query": query}
129
129
 
130
130
  class DummyClient:
@@ -134,13 +134,13 @@ def test_invoke_endpoint_rejects_unsupported_source() -> None:
134
134
  invoke_endpoint(DummyClient(), "news-stocks.search", Namespace(q="Tesla", source="wsj"))
135
135
 
136
136
 
137
- def test_invoke_endpoint_search_passes_days_and_limit() -> None:
137
+ def test_invoke_endpoint_search_passes_limit_only() -> None:
138
138
  class DummyNews:
139
139
  def __init__(self) -> None:
140
- self.calls: list[tuple[str, int, int]] = []
140
+ self.calls: list[tuple[str, int]] = []
141
141
 
142
- def search(self, query: str, *, days: int = 7, limit: int = 20) -> dict[str, int | str]:
143
- self.calls.append((query, days, limit))
142
+ def search(self, query: str, *, limit: int = 20) -> dict[str, int | str]:
143
+ self.calls.append((query, limit))
144
144
  return {"query": query, "count": 1}
145
145
 
146
146
  class DummyClient:
@@ -148,39 +148,19 @@ def test_invoke_endpoint_search_passes_days_and_limit() -> None:
148
148
  self.news = DummyNews()
149
149
 
150
150
  client = DummyClient()
151
- invoke_endpoint(client, "news-stocks.search", Namespace(q="Tesla", days=14, limit=5, source=None))
152
- assert client.news.calls == [("Tesla", 14, 5)]
151
+ invoke_endpoint(client, "news-stocks.search", Namespace(q="Tesla", days=14, from_="2026-05-01", to="2026-05-07", limit=5, source=None))
152
+ assert client.news.calls == [("Tesla", 5)]
153
153
 
154
154
 
155
- def test_invoke_endpoint_search_passes_from_to_without_days() -> None:
156
- class DummyNews:
157
- def __init__(self) -> None:
158
- self.calls: list[tuple[str, str | None, str | None, int]] = []
159
-
160
- def search(
161
- self,
162
- query: str,
163
- *,
164
- from_: str | None = None,
165
- to: str | None = None,
166
- days: int | None = None,
167
- limit: int = 20,
168
- ) -> dict[str, int | str]:
169
- assert days is None
170
- self.calls.append((query, from_, to, limit))
171
- return {"query": query, "count": 1}
172
-
173
- class DummyClient:
174
- def __init__(self) -> None:
175
- self.news = DummyNews()
176
-
177
- client = DummyClient()
178
- invoke_endpoint(
179
- client,
155
+ def test_search_endpoint_specs_accept_limit_only() -> None:
156
+ for endpoint_id in (
180
157
  "news-stocks.search",
181
- Namespace(q="Tesla", days=None, from_="2026-05-01", to="2026-05-07", limit=5, source=None),
182
- )
183
- assert client.news.calls == [("Tesla", "2026-05-01", "2026-05-07", 5)]
158
+ "reddit-stocks.search",
159
+ "reddit-crypto.search",
160
+ "x-stocks.search",
161
+ "polymarket-stocks.search",
162
+ ):
163
+ assert ENDPOINTS[endpoint_id].optional_params == ("limit",)
184
164
 
185
165
 
186
166
  def test_invoke_endpoint_rejects_days_with_full_date_window() -> None:
@@ -9,6 +9,7 @@ from pathlib import Path
9
9
 
10
10
  import adanos_cli.config as cli_config
11
11
  import adanos_cli.main as cli_main
12
+ from adanos_cli.summaries import build_crypto_report
12
13
 
13
14
 
14
15
  def _isolate_config(tmp_path: Path, monkeypatch) -> None:
@@ -39,13 +40,11 @@ class _RedditNS:
39
40
  def explain(self, ticker: str):
40
41
  return {"ticker": ticker, "explanation": f"{ticker} explanation"}
41
42
 
42
- def search(self, query: str, *, days: int = 7, from_: str | None = None, to: str | None = None, limit: int = 20):
43
+ def search(self, query: str, *, limit: int = 20):
43
44
  return {
44
45
  "query": query,
45
46
  "count": 1,
46
- "period_days": days,
47
- "from": from_,
48
- "to": to,
47
+ "period_days": 7,
49
48
  "results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
50
49
  }
51
50
 
@@ -72,13 +71,11 @@ class _NewsNS:
72
71
  def explain(self, ticker: str):
73
72
  return {"ticker": ticker, "explanation": f"{ticker} news backdrop"}
74
73
 
75
- def search(self, query: str, *, days: int = 7, from_: str | None = None, to: str | None = None, limit: int = 20):
74
+ def search(self, query: str, *, limit: int = 20):
76
75
  return {
77
76
  "query": query,
78
77
  "count": 1,
79
- "period_days": days,
80
- "from": from_,
81
- "to": to,
78
+ "period_days": 7,
82
79
  "results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
83
80
  }
84
81
 
@@ -102,13 +99,11 @@ class _XNS:
102
99
  def explain(self, ticker: str):
103
100
  return {"ticker": ticker, "explanation": f"{ticker} X discussion"}
104
101
 
105
- def search(self, query: str, *, days: int = 7, from_: str | None = None, to: str | None = None, limit: int = 20):
102
+ def search(self, query: str, *, limit: int = 20):
106
103
  return {
107
104
  "query": query,
108
105
  "count": 1,
109
- "period_days": days,
110
- "from": from_,
111
- "to": to,
106
+ "period_days": 7,
112
107
  "results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
113
108
  }
114
109
 
@@ -123,13 +118,11 @@ class _PolymarketNS:
123
118
  def stock(self, ticker: str, *, days: int = 7):
124
119
  return {"ticker": ticker, "found": True, "buzz_score": 79.0, "trend": "rising", "trade_count": 500, "sentiment_score": 0.2}
125
120
 
126
- def search(self, query: str, *, days: int = 7, from_: str | None = None, to: str | None = None, limit: int = 20):
121
+ def search(self, query: str, *, limit: int = 20):
127
122
  return {
128
123
  "query": query,
129
124
  "count": 1,
130
- "period_days": days,
131
- "from": from_,
132
- "to": to,
125
+ "period_days": 7,
133
126
  "results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
134
127
  }
135
128
 
@@ -144,13 +137,11 @@ class _CryptoNS:
144
137
  def token(self, symbol: str, *, days: int = 7):
145
138
  return {"symbol": symbol, "found": True, "buzz_score": 78.0, "mentions": 1000, "sentiment_score": 0.05}
146
139
 
147
- def search(self, query: str, *, days: int = 7, from_: str | None = None, to: str | None = None, limit: int = 20):
140
+ def search(self, query: str, *, limit: int = 20):
148
141
  return {
149
142
  "query": query,
150
143
  "count": 1,
151
- "period_days": days,
152
- "from": from_,
153
- "to": to,
144
+ "period_days": 7,
154
145
  "results": [{"symbol": "BTC", "name": "Bitcoin"}][:limit],
155
146
  }
156
147
 
@@ -238,7 +229,7 @@ def test_scan_briefing_and_watchlist_report(tmp_path, monkeypatch, capsys) -> No
238
229
  assert payload["crypto_focus"]["symbols"] == ["BTC", "ETH"]
239
230
 
240
231
 
241
- def test_search_command_accepts_period_and_limit(tmp_path, monkeypatch, capsys) -> None:
232
+ def test_search_command_accepts_limit(tmp_path, monkeypatch, capsys) -> None:
242
233
  _isolate_config(tmp_path, monkeypatch)
243
234
  monkeypatch.setattr(cli_main, "_load_sdk_client_class", lambda: _FakeClient)
244
235
 
@@ -250,10 +241,6 @@ def test_search_command_accepts_period_and_limit(tmp_path, monkeypatch, capsys)
250
241
  "--platform",
251
242
  "news-stocks",
252
243
  "Tesla",
253
- "--from",
254
- "2026-05-15",
255
- "--to",
256
- "2026-05-21",
257
244
  "--limit",
258
245
  "1",
259
246
  "--json",
@@ -265,11 +252,17 @@ def test_search_command_accepts_period_and_limit(tmp_path, monkeypatch, capsys)
265
252
  assert payload["kind"] == "endpoint_result"
266
253
  assert payload["endpoint"] == "news-stocks.search"
267
254
  assert payload["data"]["query"] == "Tesla"
268
- assert payload["data"]["from"] == "2026-05-15"
269
- assert payload["data"]["to"] == "2026-05-21"
270
255
  assert payload["result_count"] == 1
271
256
 
272
257
 
258
+ def test_crypto_report_search_uses_api_managed_window() -> None:
259
+ report = build_crypto_report(_FakeClient("adanos_key_test", "https://api.adanos.org"), "BTC", days=7)
260
+
261
+ assert report["reddit_crypto"]["ok"] is True
262
+ assert report["search"]["ok"] is True
263
+ assert report["search"]["data"]["query"] == "BTC"
264
+
265
+
273
266
  def test_ask_routes_scan_briefing_and_watchlist(tmp_path, monkeypatch, capsys) -> None:
274
267
  _isolate_config(tmp_path, monkeypatch)
275
268
  monkeypatch.setattr(cli_main, "_load_sdk_client_class", lambda: _FakeClient)
File without changes
File without changes
File without changes
File without changes
File without changes