MPT-19910: add e2e tests for currency endpoints#275
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository YAML (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (6)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughAdded Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/e2e/exchange/currencies/conftest.py`:
- Around line 42-45: The teardown currently catches all MPTAPIError when calling
currencies_service.delete(currency.id) which hides real failures; change the
handler to only suppress expected not-found errors by checking the error's
status/code (e.g., error.status == 404 or error.code == "not_found") and
silently ignore those, but for any other MPTAPIError re-raise or log and raise
so real teardown failures surface; apply the same change to the other similar
block that calls currencies_service.delete.
In `@tests/e2e/exchange/currencies/test_async_currencies.py`:
- Around line 29-36: The test_update_currency may send an empty file because
logo_fd was already consumed by the initial create call; before calling
async_currencies_service.update in test_update_currency, reset the file-like
object's cursor (e.g., call logo_fd.seek(0)) so the uploaded file is read from
the start when async_currencies_service.update(...) is invoked; update
references: test_update_currency, async_currencies_service.update, and
async_created_currency.create.
In `@tests/e2e/exchange/currencies/test_sync_currencies.py`:
- Around line 29-33: The test test_update_currency uses logo_fd previously
consumed during creation, so reset the file pointer before reuse: ensure logo_fd
is rewound (e.g., call logo_fd.seek(0) or equivalent) right before invoking
currencies_service.update(created_currency.id, update_data, file=logo_fd) so the
upload reads the file from the beginning; check logo_fd supports seek to avoid
flaky EOF uploads.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 461d270a-eb76-4c9f-982b-6e0345f9febf
📒 Files selected for processing (6)
e2e_config.test.jsontests/e2e/exchange/__init__.pytests/e2e/exchange/currencies/__init__.pytests/e2e/exchange/currencies/conftest.pytests/e2e/exchange/currencies/test_async_currencies.pytests/e2e/exchange/currencies/test_sync_currencies.py
bb0d8b0 to
45d37c8
Compare
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
45d37c8 to
6fdb67a
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (2)
tests/e2e/exchange/currencies/conftest.py (2)
40-43:⚠️ Potential issue | 🟠 MajorTeardown still swallows all API errors (duplicate of previous review).
The teardown continues to catch all
MPTAPIErrorexceptions without discriminating. Only 404 (resource already deleted) should be suppressed; other failures (permissions, network issues, etc.) should surface to prevent resource leaks and mask real problems.🛡️ Proposed fix to check error status
try: currencies_service.delete(currency.id) except MPTAPIError as error: - print(f"TEARDOWN - Unable to delete currency {currency.id}: {error.title}") # noqa: WPS421 + if error.status != 404: + raise🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/e2e/exchange/currencies/conftest.py` around lines 40 - 43, The teardown currently swallows all MPTAPIError exceptions in the call to currencies_service.delete(currency.id); modify the except block for MPTAPIError to inspect the HTTP status on the exception (e.g., error.status or error.status_code) and only suppress/log and continue when it equals 404 (resource already gone), otherwise re-raise the exception so permission/network/errors surface and don't get masked.
52-55:⚠️ Potential issue | 🟠 MajorAsync teardown has the same error suppression issue (duplicate).
Same as the sync version: all
MPTAPIErrorexceptions are caught without checking the status. Only 404 should be ignored; other errors must surface.🛡️ Proposed fix to check error status
try: await async_currencies_service.delete(currency.id) except MPTAPIError as error: - print(f"TEARDOWN - Unable to delete currency {currency.id}: {error.title}") # noqa: WPS421 + if error.status != 404: + raise🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/e2e/exchange/currencies/conftest.py` around lines 52 - 55, The async teardown is suppressing all MPTAPIError exceptions—update the exception handler around async_currencies_service.delete(currency.id) so it only ignores the error when the MPTAPIError indicates a 404 (e.g., check error.status == 404 or equivalent property on MPTAPIError) and re-raise or let other errors surface; keep the existing log for the 404 case but do not swallow non-404 errors.
🧹 Nitpick comments (1)
tests/e2e/exchange/currencies/conftest.py (1)
23-31: Currency code generation is functional but has minor collision risk.The digit-to-alpha translation for generating unique currency codes works correctly. Since
short_uuidis hex (0-9a-f), the first three characters could theoretically collide (e.g., "abc" → "ABC", "afc" → "AFC" differ by only one char). For sequential E2E tests this is likely acceptable, but be aware of potential collisions if tests run concurrently.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/e2e/exchange/currencies/conftest.py` around lines 23 - 31, The currency code generation in fixture currency_data uses only the first three chars of short_uuid and a digit->alpha map (digit_to_alpha) which can lead to collisions in concurrent runs; update currency_data to produce a more unique code by expanding the input (e.g., use the first 4–6 characters of short_uuid or append a short random/timestamp suffix) and keep the same translation logic (digit_to_alpha) and .upper() call so existing downstream expectations remain valid; ensure the resulting code still meets any length/format constraints expected by the system.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/e2e/exchange/currencies/conftest.py`:
- Line 43: Remove the inline "# noqa: WPS421" from the print statement in
tests/e2e/exchange/currencies/conftest.py (the print(f"TEARDOWN - Unable to
delete currency {currency.id}: {error.title}") line) and add a per-file-ignores
entry in pyproject.toml under [tool.flake8] to suppress WPS421 for this file (or
for the broader tests/e2e/**/conftest.py pattern if preferred); update the
per-file-ignores list to include the path and WPS421 so the inline suppression
can be deleted.
---
Duplicate comments:
In `@tests/e2e/exchange/currencies/conftest.py`:
- Around line 40-43: The teardown currently swallows all MPTAPIError exceptions
in the call to currencies_service.delete(currency.id); modify the except block
for MPTAPIError to inspect the HTTP status on the exception (e.g., error.status
or error.status_code) and only suppress/log and continue when it equals 404
(resource already gone), otherwise re-raise the exception so
permission/network/errors surface and don't get masked.
- Around line 52-55: The async teardown is suppressing all MPTAPIError
exceptions—update the exception handler around
async_currencies_service.delete(currency.id) so it only ignores the error when
the MPTAPIError indicates a 404 (e.g., check error.status == 404 or equivalent
property on MPTAPIError) and re-raise or let other errors surface; keep the
existing log for the 404 case but do not swallow non-404 errors.
---
Nitpick comments:
In `@tests/e2e/exchange/currencies/conftest.py`:
- Around line 23-31: The currency code generation in fixture currency_data uses
only the first three chars of short_uuid and a digit->alpha map (digit_to_alpha)
which can lead to collisions in concurrent runs; update currency_data to produce
a more unique code by expanding the input (e.g., use the first 4–6 characters of
short_uuid or append a short random/timestamp suffix) and keep the same
translation logic (digit_to_alpha) and .upper() call so existing downstream
expectations remain valid; ensure the resulting code still meets any
length/format constraints expected by the system.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: e744d9b9-f101-4864-b678-bf5a0a182f4b
📒 Files selected for processing (1)
tests/e2e/exchange/currencies/conftest.py
|
Bumps the python-development group with 4 updates: [mypy](https://github.com/python/mypy), [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures), [ruff](https://github.com/astral-sh/ruff) and [types-python-dateutil](https://github.com/python/typeshed). Updates `mypy` from 2.0.0 to 2.1.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's changelog</a>.</em></p> <blockquote> <h1>Mypy Release Notes</h1> <h2>Next Release</h2> <h2>Mypy 2.1</h2> <p>We’ve just uploaded mypy 2.1.0 to the Python Package Index (<a href="https://pypi.org/project/mypy/">PyPI</a>). Mypy is a static type checker for Python. This release includes new features, performance improvements and bug fixes. You can install it as follows:</p> <pre><code>python3 -m pip install -U mypy </code></pre> <p>You can read the full documentation for this release on <a href="http://mypy.readthedocs.io">Read the Docs</a>.</p> <h3>librt.vecs: Fast Growable Array Type for Mypyc</h3> <p>The new <code>librt.vecs</code> module provides an efficient growable array type <code>vec</code> that is optimized for mypyc use. It provides fast, packed arrays with integer and floating point value types, which can be <strong>several times faster</strong> than <code>list</code>, and tens of times faster than <code>array.array</code> in code compiled using mypyc. It also supports nested <code>vec</code> objects and non-value-type items, such as <code>vec[vec[str]]</code>.</p> <p>Refer to the <a href="https://mypyc.readthedocs.io/en/latest/librt_vecs.html">documentation</a> for the details.</p> <p>Contributed by Jukka Lehtosalo.</p> <h3>librt.random: Fast Pseudo-Random Number Generation</h3> <p>The new <code>librt.random</code> module provides fast pseudo-random number generation that is optimized for code compiled using mypyc. It can be 3x to 10x faster than the stdlib <code>random</code> module in compiled code.</p> <p>Refer to the <a href="https://mypyc.readthedocs.io/en/latest/librt_random.html">documentation</a> for the details.</p> <p>Contributed by Jukka Lehtosalo (PR <a href="https://redirect.github.com/python/mypy/pull/21433">21433</a>).</p> <h3>Mypyc Improvements</h3> <ul> <li>Make compilation order with multiple files consistent (Piotr Sawicki, PR <a href="https://redirect.github.com/python/mypy/pull/21419">21419</a>)</li> <li>Fix crash on accessing <code>StopAsyncIteration</code> (Piotr Sawicki, PR <a href="https://redirect.github.com/python/mypy/pull/21406">21406</a>)</li> <li>Fix incremental compilation with <code>separate</code> flag (Vaggelis Danias, PR <a href="https://redirect.github.com/python/mypy/pull/21299">21299</a>)</li> </ul> <h3>Fixes to Crashes</h3> <ul> <li>Fix crash on partial type with <code>--allow-redefinition</code> and <code>global</code> declaration (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21428">21428</a>)</li> <li>Fix broken awaitable generator patching (Ivan Levkivskyi, PR <a href="https://redirect.github.com/python/mypy/pull/21435">21435</a>)</li> </ul> <h3>Changes to Messages</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python/mypy/commit/c1c336d7e34eb313080c79b156518c58d27c7234"><code>c1c336d</code></a> Remove +dev from version</li> <li><a href="https://github.com/python/mypy/commit/74df14b7cbf08140236aa45bbb7f42219b0b1df7"><code>74df14b</code></a> Add changelog for mypy 2.1 (<a href="https://redirect.github.com/python/mypy/issues/21464">#21464</a>)</li> <li><a href="https://github.com/python/mypy/commit/022d9bc96f86c40f338a5cf150f1806cc8f300ff"><code>022d9bc</code></a> Revert "TypeForm: Enable by default (<a href="https://redirect.github.com/python/mypy/issues/21262">#21262</a>)"</li> <li><a href="https://github.com/python/mypy/commit/8826288214f1cb31496e610667481221e025359c"><code>8826288</code></a> [mypyc] Document librt.random (<a href="https://redirect.github.com/python/mypy/issues/21463">#21463</a>)</li> <li><a href="https://github.com/python/mypy/commit/3f4067b699dbe52d08e42ef3b3ebfdebdc06bd96"><code>3f4067b</code></a> Bump librt version to 0.11.0 (<a href="https://redirect.github.com/python/mypy/issues/21458">#21458</a>)</li> <li><a href="https://github.com/python/mypy/commit/2b1eb58a250c5f1eb4ef5fb1f312ff528c5a1d4e"><code>2b1eb58</code></a> [mypyc] Enable incremental self-compilation (<a href="https://redirect.github.com/python/mypy/issues/21369">#21369</a>)</li> <li><a href="https://github.com/python/mypy/commit/8152f4af3f6c03beaf2660026240f0fdce7feecc"><code>8152f4a</code></a> Respect file config comments for stale modules (<a href="https://redirect.github.com/python/mypy/issues/21444">#21444</a>)</li> <li><a href="https://github.com/python/mypy/commit/116d60bdd3fdfe8d97c6afe99370910db56f1b92"><code>116d60b</code></a> Fix nondeterminism from nonassociativity of overload joins (<a href="https://redirect.github.com/python/mypy/issues/21455">#21455</a>)</li> <li><a href="https://github.com/python/mypy/commit/6c4af8e42110cea3f84bc02add2ca7b89c268210"><code>6c4af8e</code></a> Fix function call message change for small number of args (<a href="https://redirect.github.com/python/mypy/issues/21432">#21432</a>)</li> <li><a href="https://github.com/python/mypy/commit/4b8fdcaf24032592510e8f15421fb32d82a71800"><code>4b8fdca</code></a> [mypyc] Add librt.random module (<a href="https://redirect.github.com/python/mypy/issues/21433">#21433</a>)</li> <li>Additional commits viewable in <a href="https://github.com/python/mypy/compare/v2.0.0...v2.1.0">compare view</a></li> </ul> </details> <br /> Updates `pytest-rerunfailures` from 16.1 to 16.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst">pytest-rerunfailures's changelog</a>.</em></p> <blockquote> <h2>16.2 (2026-05-13)</h2> <p>Breaking changes ++++++++++++++++</p> <ul> <li>Drop support for pytest 8.0. Minimum pytest version is now 8.1.</li> </ul> <p>Features ++++++++</p> <ul> <li>Add support for pytest 9.0.</li> </ul> <p>Bug fixes +++++++++</p> <ul> <li> <p>Fix missing teardown for session and module scoped fixtures when fixture teardown fails. Fixes <code>[#314](pytest-dev/pytest-rerunfailures#314) <https://github.com/pytest-dev/pytest-rerunfailures/issues/314></code>_.</p> </li> <li> <p>Clear fixture finalizers when removing cached results from failed fixtures to fix compatibility with pytest >= 9, which asserts that <code>_finalizers</code> is empty before executing a fixture. Fixes <code>[#323](pytest-dev/pytest-rerunfailures#323) <https://github.com/pytest-dev/pytest-rerunfailures/issues/323></code>_.</p> </li> <li> <p>Accept exception classes (not only regex strings) in the <code>only_rerun</code> and <code>rerun_except</code> marker keyword arguments instead of crashing with an internal error. Fixes <code>[#275](pytest-dev/pytest-rerunfailures#275) <https://github.com/pytest-dev/pytest-rerunfailures/issues/275></code>_.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/88a84d8471219ae517dfd3752a181b22e51a2b8c"><code>88a84d8</code></a> Preparing release 16.2</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/5e0ad6a3080d778f2d3de8975aceafed0c843b12"><code>5e0ad6a</code></a> fix: accept exception classes in only_rerun and rerun_except markers (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/327">#327</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/928aa2bb654b18157e6614c15f22091e9997d540"><code>928aa2b</code></a> Update minimum pytest version to 8.1 and add support for pytest 9.0 (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/325">#325</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/b53ef720219427c569bddee7e37d92cc3423e2c9"><code>b53ef72</code></a> Fix support for pytest-main. (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/324">#324</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/d9ef70e5451f604dcc764861f4b0a65dc9dfd202"><code>d9ef70e</code></a> Preserve session and module teardown when fixture teardown fails (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/319">#319</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/a22edc3de88eeb17f3dcdf482b3f5a13ea9af874"><code>a22edc3</code></a> Bump actions/cache from 4 to 5 in the actions group (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/317">#317</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/365dc54ba3069f55a870cda2c3e1e3c33c68f326"><code>365dc54</code></a> Bump actions/checkout from 5 to 6 in the actions group (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/316">#316</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/a484d569b55875c827f091c5f17b9087ab9169d9"><code>a484d56</code></a> Update to current versions of pre-commit hooks. (<a href="https://redirect.github.com/pytest-dev/pytest-rerunfailures/issues/312">#312</a>)</li> <li><a href="https://github.com/pytest-dev/pytest-rerunfailures/commit/3447ea8684e5b74656f0a2d6b3de34b046bab0ce"><code>3447ea8</code></a> Back to development: 16.2</li> <li>See full diff in <a href="https://github.com/pytest-dev/pytest-rerunfailures/compare/16.1...16.2">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.12 to 0.15.13 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.15.13</h2> <h2>Release Notes</h2> <p>Released on 2026-05-14.</p> <h3>Preview features</h3> <ul> <li>Add a rule to flag lazy imports that are eagerly evaluated (<a href="https://redirect.github.com/astral-sh/ruff/pull/25016">#25016</a>)</li> <li>[<code>pylint</code>] Standardize diagnostic message (<code>PLR0914</code>, <code>PLR0917</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24996">#24996</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix <code>F811</code> false positive for class methods (<a href="https://redirect.github.com/astral-sh/ruff/pull/24933">#24933</a>)</li> <li>Fix setting selection for multi-folder workspace (<a href="https://redirect.github.com/astral-sh/ruff/pull/24819">#24819</a>)</li> <li>[<code>eradicate</code>] Fix false positive for lines with leading whitespace (<code>ERA001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25122">#25122</a>)</li> <li>[<code>flake8-pyi</code>] Fix false positive for f-string debug specifier (<code>PYI016</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24098">#24098</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>Always include panic payload in panic diagnostic message (<a href="https://redirect.github.com/astral-sh/ruff/pull/24873">#24873</a>)</li> <li>Restrict <code>PYI034</code> for in-place operations to enclosing class (<a href="https://redirect.github.com/astral-sh/ruff/pull/24511">#24511</a>)</li> <li>Improve error message for parameters that are declared <code>global</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24902">#24902</a>)</li> <li>Update known stdlib (<a href="https://redirect.github.com/astral-sh/ruff/pull/25103">#25103</a>)</li> </ul> <h3>Performance</h3> <ul> <li>[<code>isort</code>] Avoid constructing <code>glob::Pattern</code>s for literal known modules (<a href="https://redirect.github.com/astral-sh/ruff/pull/25123">#25123</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Add TOML examples to <code>--config</code> help text (<a href="https://redirect.github.com/astral-sh/ruff/pull/25013">#25013</a>)</li> <li>Colorize ruff check 'All checks passed' (<a href="https://redirect.github.com/astral-sh/ruff/pull/25085">#25085</a>)</li> </ul> <h3>Configuration</h3> <ul> <li>Increase max allowed value of <code>line-length</code> setting (<a href="https://redirect.github.com/astral-sh/ruff/pull/24962">#24962</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Add <code>D203</code> to rules that conflict with the formatter (<a href="https://redirect.github.com/astral-sh/ruff/pull/25044">#25044</a>)</li> <li>Clarify <code>COM819</code> and formatter interaction (<a href="https://redirect.github.com/astral-sh/ruff/pull/25045">#25045</a>)</li> <li>Clarify that <code>NotImplemented</code> is a value, not an exception (<code>F901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25054">#25054</a>)</li> <li>Update number of lint rules supported (<a href="https://redirect.github.com/astral-sh/ruff/pull/24942">#24942</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Simplify the playground's markdown template (<a href="https://redirect.github.com/astral-sh/ruff/pull/24924">#24924</a>)</li> </ul> <h3>Contributors</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.15.13</h2> <p>Released on 2026-05-14.</p> <h3>Preview features</h3> <ul> <li>Add a rule to flag lazy imports that are eagerly evaluated (<a href="https://redirect.github.com/astral-sh/ruff/pull/25016">#25016</a>)</li> <li>[<code>pylint</code>] Standardize diagnostic message (<code>PLR0914</code>, <code>PLR0917</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24996">#24996</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix <code>F811</code> false positive for class methods (<a href="https://redirect.github.com/astral-sh/ruff/pull/24933">#24933</a>)</li> <li>Fix setting selection for multi-folder workspace (<a href="https://redirect.github.com/astral-sh/ruff/pull/24819">#24819</a>)</li> <li>[<code>eradicate</code>] Fix false positive for lines with leading whitespace (<code>ERA001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25122">#25122</a>)</li> <li>[<code>flake8-pyi</code>] Fix false positive for f-string debug specifier (<code>PYI016</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24098">#24098</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>Always include panic payload in panic diagnostic message (<a href="https://redirect.github.com/astral-sh/ruff/pull/24873">#24873</a>)</li> <li>Restrict <code>PYI034</code> for in-place operations to enclosing class (<a href="https://redirect.github.com/astral-sh/ruff/pull/24511">#24511</a>)</li> <li>Improve error message for parameters that are declared <code>global</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24902">#24902</a>)</li> <li>Update known stdlib (<a href="https://redirect.github.com/astral-sh/ruff/pull/25103">#25103</a>)</li> </ul> <h3>Performance</h3> <ul> <li>[<code>isort</code>] Avoid constructing <code>glob::Pattern</code>s for literal known modules (<a href="https://redirect.github.com/astral-sh/ruff/pull/25123">#25123</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Add TOML examples to <code>--config</code> help text (<a href="https://redirect.github.com/astral-sh/ruff/pull/25013">#25013</a>)</li> <li>Colorize ruff check 'All checks passed' (<a href="https://redirect.github.com/astral-sh/ruff/pull/25085">#25085</a>)</li> </ul> <h3>Configuration</h3> <ul> <li>Increase max allowed value of <code>line-length</code> setting (<a href="https://redirect.github.com/astral-sh/ruff/pull/24962">#24962</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Add <code>D203</code> to rules that conflict with the formatter (<a href="https://redirect.github.com/astral-sh/ruff/pull/25044">#25044</a>)</li> <li>Clarify <code>COM819</code> and formatter interaction (<a href="https://redirect.github.com/astral-sh/ruff/pull/25045">#25045</a>)</li> <li>Clarify that <code>NotImplemented</code> is a value, not an exception (<code>F901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25054">#25054</a>)</li> <li>Update number of lint rules supported (<a href="https://redirect.github.com/astral-sh/ruff/pull/24942">#24942</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Simplify the playground's markdown template (<a href="https://redirect.github.com/astral-sh/ruff/pull/24924">#24924</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/2afb467ce397e4a89c13a0a814c62cfecb0e9e49"><code>2afb467</code></a> Bump 0.15.13 (<a href="https://redirect.github.com/astral-sh/ruff/issues/25157">#25157</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/300879600fa3af7cde1e675c63de6ad9d0797d1b"><code>3008796</code></a> [ty] classify TypeVar semantic tokens as type parameters (<a href="https://redirect.github.com/astral-sh/ruff/issues/24891">#24891</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/79470e31877acb6074f3bbff2a49e508822ae4e8"><code>79470e3</code></a> [<code>isort</code>] Avoid constructing <code>glob::Pattern</code>s for literal known modules (<a href="https://redirect.github.com/astral-sh/ruff/issues/25123">#25123</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/2522549901d50f18775999f0fb802b19229417f0"><code>2522549</code></a> Remove shellcheck from prek (<a href="https://redirect.github.com/astral-sh/ruff/issues/25154">#25154</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/7db7170020f539d6d2bc01dbd0b0c09fab91dc06"><code>7db7170</code></a> [ty] Support TypedDict key completions in incomplete, anonymous contexts (<a href="https://redirect.github.com/astral-sh/ruff/issues/25">#25</a>...</li> <li><a href="https://github.com/astral-sh/ruff/commit/bb3dd535f1c5a83e2e56ac93a771fadbeeceebd0"><code>bb3dd53</code></a> [ty] Run full iteration analysis on narrowed typevars (<a href="https://redirect.github.com/astral-sh/ruff/issues/25143">#25143</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/828cdb7732efcb16a53f4ee5f011cf653b834d1a"><code>828cdb7</code></a> [ty] Isolate file-watching test environment (<a href="https://redirect.github.com/astral-sh/ruff/issues/25151">#25151</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/89e1d8670ea4d3af60c8143ee552dc750200718d"><code>89e1d86</code></a> [ty] Preserve TypedDict keys through dict unpacking (<a href="https://redirect.github.com/astral-sh/ruff/issues/24523">#24523</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/86f3064d6fffa5697d174f26b840bd6857b381da"><code>86f3064</code></a> [ty] Avoid accessing <code>args[0]</code> for <code>static_assert</code> (<a href="https://redirect.github.com/astral-sh/ruff/issues/25149">#25149</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/ed819f947dc27e36eac8bb3134153c4668d76a3a"><code>ed819f9</code></a> [ty] Treat custom enum <code>__new__</code> values as dynamic (<a href="https://redirect.github.com/astral-sh/ruff/issues/25136">#25136</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.12...0.15.13">compare view</a></li> </ul> </details> <br /> Updates `types-python-dateutil` from 2.9.0.20260508 to 2.9.0.20260518 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/python/typeshed/commits">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details>



Summary
Adds end-to-end tests for the
CurrenciesServiceandAsyncCurrenciesServicecovering all operations exposed by the service.Changes
tests/e2e/exchange/__init__.py— new module inittests/e2e/exchange/currencies/__init__.py— new module inittests/e2e/exchange/currencies/conftest.py— fixtures for service, currency ID, currency data, and created currency (with icon upload + teardown)tests/e2e/exchange/currencies/test_sync_currencies.py— sync e2e teststests/e2e/exchange/currencies/test_async_currencies.py— async e2e testse2e_config.test.json— addedexchange.currency.idseeded valueTests covered
Closes MPT-19910