Skip to content

🧪 Add tests for configure_failure_logger - #37

Closed
b3nw wants to merge 12 commits into
devfrom
test-configure-failure-logger-12616309963845923677
Closed

🧪 Add tests for configure_failure_logger#37
b3nw wants to merge 12 commits into
devfrom
test-configure-failure-logger-12616309963845923677

Conversation

@b3nw

@b3nw b3nw commented Apr 25, 2026

Copy link
Copy Markdown
Owner

🎯 What: The testing gap addressed
Tests were missing for configure_failure_logger which mutates module-level globals for lazy initialization.

📊 Coverage: What scenarios are now tested

  1. Passing a string path correctly sets the Path object in the module state.
  2. Passing a Path object sets the correct Path object in the module state.
  3. Passing None resets the configured directory state to None.
  4. Calling the function under any circumstance resets the actual logger instance to None to force reconfiguration.

Result: The improvement in test coverage
The critical setup path for the dedicated JSON failure logger is now thoroughly tested with 4 new dedicated unit tests.


PR created automatically by Jules for task 12616309963845923677 started by @b3nw

b3nw and others added 10 commits April 24, 2026 19:40
…ardization, and utilities

Core infrastructure improvements:
- Smart 'latest' model alias resolution with cost-based tiebreaking
- Standardized error responses with proper HTTP status codes and error.code field
- ProxyExhaustionError for structured credential exhaustion reporting
- TerminalRequestError for non-rotatable errors (404, model not found)
- Per-provider retry count override via MAX_RETRIES_{PROVIDER} env var
- Retry 429 rate_limit errors with backoff instead of rotating
- Cached token pricing in streaming cost calculation
- Split quota stats into current_period and global/lifetime views
- Log rotation for proxy.log and proxy_debug.log (RotatingFileHandler)
- Include latest virtual models in /v1/models endpoint
- Resolve singleton cache pollution for dynamic providers
- Fork-specific README and .gitignore updates
…ased model filtering, and enhanced X-Initiator heuristic
Test suite designed to catch breakage from branch re-organization without
sending queries to real LLM providers. Covers all critical integration
points that previously broke silently during deployment.

Coverage:
- Anthropic↔OpenAI format translation & streaming
- Error classification (determines retry/rotation behavior)
- Request sanitization (prevents 400s from invalid params)
- Provider-specific request transforms
- Model alias & latest registry parsing
- Usage tracking (windows, quota groups, custom caps)
- Credential discovery, deduplication, env:// URI
- Provider plugin registration & singleton pattern
- Proxy endpoint routing & auth

All tests use synthetic credentials and mocked HTTP.
Runs in ~2.3s. Zero API cost.
…flow

Replaces the old manifest-driven multi-branch replay system with a
simpler linear commit stack. Changes are made via fixup!/autosquash.
Upstream syncs are a single git rebase.

Includes:
- AGENTS.md: entry point for all AI coding agents
- .agent/rules/claude.md: Claude-specific SSH/deployment notes
- .agent/rules/llm-proxy.md: container layout and deployment pipeline
- .agent/skills/upstream-sync/SKILL.md: sync workflow reference
Custom provider for Google Vertex AI Express Mode API keys that uses
x-goog-api-key header authentication against the Vertex AI
OpenAI-compatible endpoint. Supports non-streaming and streaming
chat completions with automatic model discovery.

Models are prefixed as vertex/ (e.g. vertex/gemini-3.1-flash-lite-preview).
Env vars: VERTEX_PROJECT, VERTEX_LOCATION, VERTEX_API_KEY_N
Adds unit tests for configure_failure_logger in src/rotator_library/failure_logger.py
to verify correct mutation of internal module variables (_configured_logs_dir,
_failure_logger) based on various string, Path, and None inputs.
@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces unit tests for the configure_failure_logger function, covering scenarios such as string paths, Path objects, and resetting the logger state. The review feedback recommends reordering imports to follow PEP 8 standards and implementing a pytest fixture to ensure test isolation by resetting global state after each test execution.

Comment thread tests/test_failure_logger.py Outdated
Comment on lines +1 to +2
import pytest
from pathlib import Path

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

According to PEP 8, standard library imports should be placed before third-party imports. pathlib is part of the standard library, while pytest is a third-party package.

Suggested change
import pytest
from pathlib import Path
from pathlib import Path
import pytest
References
  1. Standard library imports should be placed before third-party imports (PEP 8). (link)

from rotator_library.failure_logger import configure_failure_logger


class TestConfigureFailureLogger:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The tests in this class modify module-level globals in rotator_library.failure_logger. This can lead to state leakage between tests, potentially causing flaky behavior or affecting other tests in the suite. It is recommended to use a pytest fixture to save and restore the global state after each test.

Suggested change
class TestConfigureFailureLogger:
class TestConfigureFailureLogger:
@pytest.fixture(autouse=True)
def _reset_state(self):
"""Reset the global state of the failure_logger module before and after each test."""
orig_dir = failure_logger._configured_logs_dir
orig_logger = failure_logger._failure_logger
yield
failure_logger._configured_logs_dir = orig_dir
failure_logger._failure_logger = orig_logger
References
  1. Tests should be isolated and not leave side effects in global state.

@b3nw

b3nw commented Apr 26, 2026

Copy link
Copy Markdown
Owner Author

[Gemini-CLI Review Skill] @jules Reviewing this PR against the checklist and Gemini Code Assist feedback:

  1. [Gemini Code Assist] Isolation: You are missing a cleanup fixture. Please implement a pytest fixture to reset the module-level globals (_failure_logger and _configured_logs_dir) after each test to ensure test isolation.
  2. [Gemini Code Assist] Standards: Reorder your imports to follow PEP 8 standards (Standard library imports first, then third-party, then local).
  3. [Review Checklist] Topic Prefix: The PR title is good, but ensure your commit messages follow the fixup! convention if you are folding these into the original test suite commit.

@google-labs-jules

Copy link
Copy Markdown

[Gemini-CLI Review Skill] @jules Reviewing this PR against the checklist and Gemini Code Assist feedback:

  1. [Gemini Code Assist] Isolation: You are missing a cleanup fixture. Please implement a pytest fixture to reset the module-level globals (_failure_logger and _configured_logs_dir) after each test to ensure test isolation.
  2. [Gemini Code Assist] Standards: Reorder your imports to follow PEP 8 standards (Standard library imports first, then third-party, then local).
  3. [Review Checklist] Topic Prefix: The PR title is good, but ensure your commit messages follow the fixup! convention if you are folding these into the original test suite commit.

Thank you for the detailed feedback. I have implemented a cleanup fixture to isolate the global variables, reordered the imports to adhere to PEP 8 standards, and will use the fixup! commit format upon submission.

Implement isolation via pytest fixture and conform to PEP-8 import ordering.
@b3nw
b3nw marked this pull request as ready for review April 26, 2026 03:23
Implement isolation via pytest fixture and conform to PEP-8 import ordering.
@b3nw

b3nw commented Apr 26, 2026

Copy link
Copy Markdown
Owner Author

[Gemini-CLI Review Skill] Consolidated into the linear commit stack on dev.

@b3nw b3nw closed this Apr 26, 2026
@google-labs-jules

Copy link
Copy Markdown

[Gemini-CLI Review Skill] Consolidated into the linear commit stack on dev.

Understood. Acknowledging that this work is consolidated and stopping work on this task.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant