diff --git a/.gitignore b/.gitignore index 250b9e6..c26b7ab 100644 --- a/.gitignore +++ b/.gitignore @@ -146,4 +146,5 @@ dmypy.json Thumbs.db # other -/yoni \ No newline at end of file +/yoni +.cursor/* diff --git a/pyproject.toml b/pyproject.toml index 58f9b76..2c1bf0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,6 +97,7 @@ markers = [ "live: Tests that always use live API (skip cassettes)", "cached: Tests that only run with cached responses", "slow: Tests that are slow to execute", + "production: Production API smoke tests that run against live API", ] [tool.coverage.run] diff --git a/scripts/README.md b/scripts/README.md index 1abfe29..a901f93 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -4,10 +4,73 @@ This directory contains utility scripts used during development and maintenance ## Scripts +### Schema and API Tools + - **`fetch_api_schema.py`** - Fetches the OpenAPI schema from the Tango API and saves it locally - **`generate_schemas_from_api.py`** - Generates schema definitions from the API reference (outputs to stdout) +### Testing and Validation + +- **`test_production.py`** - Runs production API smoke tests against the live API +- **`pr_review.py`** - Runs configurable validation checks for PR review (linting, type checking, tests) + ## Usage -These scripts are primarily for maintainers and are not part of the public API. They require: -- `TANGO_API_KEY` environment variable \ No newline at end of file +These scripts are primarily for maintainers and are not part of the public API. + +### Production API Testing + +Run smoke tests against the production API: + +```bash +# Requires TANGO_API_KEY environment variable +uv run python scripts/test_production.py +``` + +This runs fast smoke tests (~30-60 seconds) that validate core SDK functionality against the live production API. + +### PR Review Validation + +Run validation checks for PR review. **Automatically detects PR context** from GitHub Actions, GitHub CLI, or git branch. + +```bash +# Auto-detect PR and run validation (default: production mode) +uv run python scripts/pr_review.py + +# Review a specific PR number +uv run python scripts/pr_review.py --pr-number 123 + +# Smoke tests only +uv run python scripts/pr_review.py --mode smoke + +# Quick validation (linting + type checking, no tests) +uv run python scripts/pr_review.py --mode quick + +# Full validation (all checks including all tests) +uv run python scripts/pr_review.py --mode full + +# Check only changed files (auto-enabled when PR is detected) +uv run python scripts/pr_review.py --mode production --changed-files-only +``` + +**Validation Modes:** +- `smoke` - Production API smoke tests only +- `quick` - Linting + type checking (no tests) +- `full` - All checks (linting + type checking + all tests) +- `production` - Production API smoke tests + linting + type checking (default) + +**PR Detection:** +The script automatically detects PR information from: +- GitHub Actions environment variables (`GITHUB_EVENT_PATH`, `GITHUB_PR_NUMBER`) +- GitHub CLI (`gh pr view` - requires `gh auth login`) +- Current git branch + +When a PR is detected, the script displays PR information and automatically: +- Detects the base branch from the PR +- Checks only changed files +- Shows PR URL in summary + +## Requirements + +- `TANGO_API_KEY` environment variable (required for production API tests) +- All dependencies installed: `uv sync --all-extras` \ No newline at end of file diff --git a/scripts/pr_review.py b/scripts/pr_review.py new file mode 100755 index 0000000..0352ba7 --- /dev/null +++ b/scripts/pr_review.py @@ -0,0 +1,473 @@ +#!/usr/bin/env python3 +"""PR Review Validation Script + +This script runs validation checks on PR changes, including: +- Production API smoke tests +- Linting (ruff) +- Type checking (mypy) +- Full test suite + +Automatically detects PR context from: +- GitHub Actions environment variables +- GitHub CLI (gh) +- Git branch information + +Usage: + uv run python scripts/pr_review.py --mode smoke + uv run python scripts/pr_review.py --mode quick + uv run python scripts/pr_review.py --mode full + uv run python scripts/pr_review.py --mode production + uv run python scripts/pr_review.py --pr-number 123 + +Validation Modes: + smoke - Production API smoke tests only + quick - Linting + type checking (no tests) + full - All checks (linting + type checking + all tests) + production - Production API smoke tests + linting + type checking +""" + +import argparse +import json +import os +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Literal + +# Add project root to path +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + +# Load environment variables from .env file +try: + from dotenv import load_dotenv + + load_dotenv(project_root / ".env") +except ImportError: + pass # dotenv is optional + +ValidationMode = Literal["smoke", "quick", "full", "production"] + + +@dataclass +class PRInfo: + """Information about a pull request""" + + number: int | None = None + title: str | None = None + author: str | None = None + base_branch: str = "main" + head_branch: str | None = None + url: str | None = None + state: str | None = None + + +class Colors: + """ANSI color codes for terminal output""" + + GREEN = "\033[92m" + RED = "\033[91m" + YELLOW = "\033[93m" + BLUE = "\033[94m" + RESET = "\033[0m" + BOLD = "\033[1m" + + +def print_header(text: str) -> None: + """Print a formatted header""" + print(f"\n{Colors.BOLD}{Colors.BLUE}{'=' * 60}{Colors.RESET}") + print(f"{Colors.BOLD}{Colors.BLUE}{text}{Colors.RESET}") + print(f"{Colors.BOLD}{Colors.BLUE}{'=' * 60}{Colors.RESET}\n") + + +def print_success(text: str) -> None: + """Print a success message""" + print(f"{Colors.GREEN}✓ {text}{Colors.RESET}") + + +def print_error(text: str) -> None: + """Print an error message""" + print(f"{Colors.RED}✗ {text}{Colors.RESET}") + + +def print_warning(text: str) -> None: + """Print a warning message""" + print(f"{Colors.YELLOW}⚠ {text}{Colors.RESET}") + + +def run_command(cmd: list[str], description: str, check: bool = True) -> int: + """Run a command and return its exit code""" + print(f"Running: {description}...") + print(f"Command: {' '.join(cmd)}") + print() + + try: + result = subprocess.run(cmd, cwd=project_root, check=False) + print() + if result.returncode == 0: + print_success(f"{description} passed") + else: + print_error(f"{description} failed") + return result.returncode + except FileNotFoundError as e: + print_error(f"Command not found: {e}") + return 1 + except Exception as e: + print_error(f"Error running command: {e}") + return 1 + + +def detect_pr_from_github_actions() -> PRInfo | None: + """Detect PR information from GitHub Actions environment variables""" + pr_number = os.getenv("GITHUB_PR_NUMBER") + if not pr_number: + # Try alternative env var format + pr_number = os.getenv("PR_NUMBER") + if not pr_number: + # Check if we're in a PR context + event_path = os.getenv("GITHUB_EVENT_PATH") + if event_path and Path(event_path).exists(): + try: + with open(event_path) as f: + event_data = json.load(f) + if "pull_request" in event_data: + pr = event_data["pull_request"] + return PRInfo( + number=pr.get("number"), + title=pr.get("title"), + author=pr.get("user", {}).get("login"), + base_branch=pr.get("base", {}).get("ref", "main"), + head_branch=pr.get("head", {}).get("ref"), + url=pr.get("html_url"), + state=pr.get("state"), + ) + except Exception as e: + print(f"Warning: Could not read/parse GitHub event file: {e}", file=sys.stderr) + + if pr_number: + try: + return PRInfo(number=int(pr_number)) + except ValueError: + pass + + return None + + +def get_pr_info_from_gh_cli(pr_number: int | None = None) -> PRInfo | None: + """Get PR information using GitHub CLI (gh)""" + try: + # Check if gh CLI is available + result = subprocess.run( + ["gh", "--version"], + capture_output=True, + check=False, + ) + if result.returncode != 0: + return None + + # Get current PR or specific PR number + if pr_number: + cmd = ["gh", "pr", "view", str(pr_number), "--json", "number,title,author,baseRefName,headRefName,url,state"] + else: + cmd = ["gh", "pr", "view", "--json", "number,title,author,baseRefName,headRefName,url,state"] + + result = subprocess.run( + cmd, + cwd=project_root, + capture_output=True, + text=True, + check=False, + ) + + if result.returncode == 0: + try: + pr_data = json.loads(result.stdout) + return PRInfo( + number=pr_data.get("number"), + title=pr_data.get("title"), + author=pr_data.get("author", {}).get("login"), + base_branch=pr_data.get("baseRefName", "main"), + head_branch=pr_data.get("headRefName"), + url=pr_data.get("url"), + state=pr_data.get("state"), + ) + except (json.JSONDecodeError, KeyError): + pass + except FileNotFoundError: + # gh CLI not available - this is expected in some environments + pass + except Exception as e: + print(f"Warning: Error getting PR info from gh CLI: {e}", file=sys.stderr) + + return None + + +def detect_pr_from_branch() -> PRInfo | None: + """Try to detect PR from current branch name or git config""" + try: + # Get current branch + result = subprocess.run( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], + cwd=project_root, + capture_output=True, + text=True, + check=False, + ) + if result.returncode == 0: + # Try to get PR info for this branch + return get_pr_info_from_gh_cli(None) + except Exception as e: + print(f"Warning: Error detecting PR from branch: {e}", file=sys.stderr) + + return None + + +def get_pr_info(pr_number: int | None = None) -> PRInfo | None: + """Get PR information from various sources""" + # Try GitHub Actions first + pr_info = detect_pr_from_github_actions() + if pr_info: + return pr_info + + # Try GitHub CLI + pr_info = get_pr_info_from_gh_cli(pr_number) + if pr_info: + return pr_info + + # Try to detect from branch + if not pr_number: + pr_info = detect_pr_from_branch() + if pr_info: + return pr_info + + return None + + +def get_changed_files(base_branch: str = "main") -> list[str]: + """Get list of changed Python files compared to base branch""" + try: + # Check if we're in a git repository + result = subprocess.run( + ["git", "rev-parse", "--git-dir"], + cwd=project_root, + capture_output=True, + check=False, + ) + if result.returncode != 0: + return [] + + # Get changed files + result = subprocess.run( + ["git", "diff", "--name-only", f"origin/{base_branch}...HEAD"], + cwd=project_root, + capture_output=True, + text=True, + check=False, + ) + + if result.returncode != 0: + # Try without origin prefix + result = subprocess.run( + ["git", "diff", "--name-only", f"{base_branch}...HEAD"], + cwd=project_root, + capture_output=True, + text=True, + check=False, + ) + + if result.returncode != 0: + # Fallback to working directory changes + result = subprocess.run( + ["git", "diff", "--name-only", "HEAD"], + cwd=project_root, + capture_output=True, + text=True, + check=False, + ) + + changed_files = [f.strip() for f in result.stdout.split("\n") if f.strip()] + python_files = [f for f in changed_files if f.endswith(".py")] + + return python_files + except Exception as e: + print_warning(f"Could not detect changed files: {e}") + return [] + + +def run_linting(files: list[str] | None = None) -> int: + """Run ruff linting""" + cmd = ["uv", "run", "ruff", "check", "tango/"] + if files: + # Only check changed files + cmd.extend(files) + return run_command(cmd, "Linting (ruff)") + + +def run_formatting_check(files: list[str] | None = None) -> int: + """Check code formatting""" + cmd = ["uv", "run", "ruff", "format", "--check", "tango/"] + if files: + # Only check changed files + cmd.extend(files) + return run_command(cmd, "Formatting check (ruff format)") + + +def run_type_checking(files: list[str] | None = None) -> int: + """Run mypy type checking""" + cmd = ["uv", "run", "mypy", "tango/"] + if files: + # Only check changed files (mypy needs directories) + # For simplicity, we'll check the whole tango/ directory + pass + return run_command(cmd, "Type checking (mypy)") + + +def run_production_tests() -> int: + """Run production API smoke tests""" + api_key = os.getenv("TANGO_API_KEY") + if not api_key: + print_warning("TANGO_API_KEY not set - skipping production tests") + print("Set it with: export TANGO_API_KEY=your-api-key") + return 0 # Don't fail if API key is missing + + cmd = ["uv", "run", "python", "scripts/test_production.py"] + return run_command(cmd, "Production API smoke tests", check=False) + + +def run_all_tests() -> int: + """Run full test suite""" + cmd = ["uv", "run", "pytest", "tests/", "-m", "not integration"] + return run_command(cmd, "Unit tests", check=False) + + +def run_integration_tests() -> int: + """Run integration tests""" + cmd = ["uv", "run", "pytest", "tests/integration/"] + return run_command(cmd, "Integration tests", check=False) + + +def main() -> int: + """Main entry point""" + parser = argparse.ArgumentParser( + description="Run validation checks for PR review", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "--mode", + choices=["smoke", "quick", "full", "production"], + default="production", + help="Validation mode (default: production)", + ) + parser.add_argument( + "--base-branch", + default=None, + help="Base branch to compare against (auto-detected from PR if not specified)", + ) + parser.add_argument( + "--changed-files-only", + action="store_true", + help="Only check changed files (for linting/formatting)", + ) + parser.add_argument( + "--pr-number", + type=int, + default=None, + help="PR number to review (auto-detected if not specified)", + ) + + args = parser.parse_args() + + # Detect PR information + pr_info = get_pr_info(args.pr_number) + + # Determine base branch + base_branch = args.base_branch + if not base_branch and pr_info: + base_branch = pr_info.base_branch + if not base_branch: + base_branch = "main" + + # Print PR information if available + if pr_info and pr_info.number: + print_header(f"PR #{pr_info.number} Review") + if pr_info.title: + print(f"{Colors.BOLD}Title:{Colors.RESET} {pr_info.title}") + if pr_info.author: + print(f"{Colors.BOLD}Author:{Colors.RESET} {pr_info.author}") + if pr_info.base_branch: + print(f"{Colors.BOLD}Base Branch:{Colors.RESET} {pr_info.base_branch}") + if pr_info.head_branch: + print(f"{Colors.BOLD}Head Branch:{Colors.RESET} {pr_info.head_branch}") + if pr_info.url: + print(f"{Colors.BOLD}URL:{Colors.RESET} {pr_info.url}") + print() + else: + print_header(f"PR Review Validation - Mode: {args.mode}") + if args.pr_number: + print_warning(f"Could not fetch PR #{args.pr_number} information") + print("Make sure you're authenticated with GitHub CLI (gh auth login)") + print() + + # Get changed files if requested + changed_files: list[str] | None = None + if args.changed_files_only or pr_info: + changed_files = get_changed_files(base_branch) + if changed_files: + print(f"{Colors.BOLD}Changed Python files: {len(changed_files)}{Colors.RESET}") + for f in changed_files[:10]: # Show first 10 + print(f" - {f}") + if len(changed_files) > 10: + print(f" ... and {len(changed_files) - 10} more") + else: + print("No changed Python files detected") + print() + + exit_codes: list[int] = [] + + # Run validations based on mode + # Auto-enable changed-files-only if PR is detected + use_changed_files = args.changed_files_only or (pr_info is not None) + + if args.mode == "smoke": + exit_codes.append(run_production_tests()) + + elif args.mode == "quick": + exit_codes.append(run_formatting_check(changed_files if use_changed_files else None)) + exit_codes.append(run_linting(changed_files if use_changed_files else None)) + exit_codes.append(run_type_checking(changed_files if use_changed_files else None)) + + elif args.mode == "full": + exit_codes.append(run_formatting_check()) + exit_codes.append(run_linting()) + exit_codes.append(run_type_checking()) + exit_codes.append(run_all_tests()) + exit_codes.append(run_integration_tests()) + + elif args.mode == "production": + exit_codes.append(run_formatting_check(changed_files if use_changed_files else None)) + exit_codes.append(run_linting(changed_files if use_changed_files else None)) + exit_codes.append(run_type_checking(changed_files if use_changed_files else None)) + exit_codes.append(run_production_tests()) + + # Summary + print_header("Summary") + total_failed = sum(1 for code in exit_codes if code != 0) + total_passed = len(exit_codes) - total_failed + + print(f"Total checks: {len(exit_codes)}") + print_success(f"Passed: {total_passed}") + if total_failed > 0: + print_error(f"Failed: {total_failed}") + if pr_info and pr_info.url: + print(f"\n{Colors.BOLD}PR URL:{Colors.RESET} {pr_info.url}") + return 1 + else: + print_success("All checks passed!") + if pr_info and pr_info.url: + print(f"\n{Colors.BOLD}PR URL:{Colors.RESET} {pr_info.url}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/test_production.py b/scripts/test_production.py new file mode 100755 index 0000000..0c9ece5 --- /dev/null +++ b/scripts/test_production.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +"""Run production API smoke tests + +This script runs smoke tests against the live production API to validate +that the SDK works correctly with the real API. + +Usage: + uv run python scripts/test_production.py + TANGO_API_KEY=xxx uv run python scripts/test_production.py + +Environment Variables: + TANGO_API_KEY: API key for authentication (required) +""" + +import os +import sys +from pathlib import Path + +# Add project root to path so we can import tango +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + +# Load environment variables from .env file +try: + from dotenv import load_dotenv + + load_dotenv(project_root / ".env") +except ImportError: + pass # dotenv is optional + +try: + import pytest +except ImportError: + print("Error: pytest is not installed. Install with: uv sync --group dev", file=sys.stderr) + sys.exit(1) + + +def main() -> int: + """Run production smoke tests""" + # Check for API key + api_key = os.getenv("TANGO_API_KEY") + if not api_key: + print( + "Error: TANGO_API_KEY environment variable is required", + file=sys.stderr, + ) + print( + "Set it with: export TANGO_API_KEY=your-api-key", + file=sys.stderr, + ) + return 1 + + # Run production tests + test_path = project_root / "tests" / "production" + if not test_path.exists(): + print(f"Error: Test directory not found: {test_path}", file=sys.stderr) + return 1 + + print("Running production API smoke tests...") + print(f"Test directory: {test_path}") + print() + + # Run pytest with production marker + # Use -v for verbose output, -x to stop on first failure + exit_code = pytest.main( + [ + str(test_path), + "-v", + "-m", + "production", + "--tb=short", + ] + ) + + if exit_code == 0: + print() + print("✓ All production smoke tests passed!") + else: + print() + print("✗ Some production smoke tests failed. See output above for details.") + + return exit_code + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tango/client.py b/tango/client.py index 080b516..c025aa7 100644 --- a/tango/client.py +++ b/tango/client.py @@ -378,7 +378,7 @@ def get_agency(self, code: str) -> Agency: # Contract endpoints def list_contracts( self, - page: int = 1, + cursor: str | None = None, limit: int = 25, shape: str | None = None, flat: bool = False, @@ -390,7 +390,8 @@ def list_contracts( List contracts with optional filtering Args: - page: Page number + cursor: Cursor token for pagination (from previous response.cursor). + If not provided, starts from the beginning. limit: Results per page (max 100) shape: Response shape string (defaults to minimal shape). Use None to disable shaping, ShapeConfig.CONTRACTS_MINIMAL for minimal, @@ -453,6 +454,11 @@ def list_contracts( >>> # Text search >>> contracts = client.list_contracts(keyword="software development") + >>> # Pagination with cursor + >>> response = client.list_contracts(limit=25) + >>> if response.cursor: + ... next_page = client.list_contracts(cursor=response.cursor, limit=25) + >>> # With SearchFilters object (legacy) >>> filters = SearchFilters( ... keyword="IT", @@ -467,8 +473,14 @@ def list_contracts( ... expiring_lte="2025-12-31" ... ) """ - # Start with explicit parameters - params: dict[str, Any] = {"page": page, "limit": min(limit, 100)} + # Start with pagination parameters + # Use cursor if provided, otherwise use page=1 for first request + params: dict[str, Any] = {"limit": min(limit, 100)} + if cursor: + params["cursor"] = cursor + else: + # First page uses page=1, subsequent pages use cursor + params["page"] = 1 # Handle filters parameter (backward compatibility) filter_dict: dict[str, Any] = {} @@ -480,24 +492,20 @@ def list_contracts( # dict filter_dict = filters - # Extract page/limit from filters if using defaults - if page == 1 and "page" in filter_dict: - params["page"] = filter_dict.pop("page", 1) + # Extract limit from filters if using defaults if limit == 25 and "limit" in filter_dict: params["limit"] = min(filter_dict.pop("limit", 25), 100) # Merge kwargs and filter_dict (kwargs take precedence) filter_params = {**filter_dict, **kwargs} - # Explicitly exclude shape-related parameters from filter_params + # Explicitly exclude shape-related and pagination parameters from filter_params # These are handled separately and should not be sent as query parameters - shape_related_params = {"shape", "flat", "flat_lists"} - for param in shape_related_params: + excluded_params = {"shape", "flat", "flat_lists", "cursor", "page"} + for param in excluded_params: filter_params.pop(param, None) - # Extract page/limit from kwargs if provided (override explicit params) - if "page" in filter_params: - params["page"] = filter_params.pop("page") + # Extract limit from kwargs if provided (override explicit params) if "limit" in filter_params: params["limit"] = min(filter_params.pop("limit"), 100) @@ -563,6 +571,7 @@ def list_contracts( next=data.get("next"), previous=data.get("previous"), results=results, + cursor=data.get("cursor"), ) # ============================================================================ diff --git a/tango/models.py b/tango/models.py index 2c509ea..89e893e 100644 --- a/tango/models.py +++ b/tango/models.py @@ -39,10 +39,13 @@ class SearchFilters: - recipient_uei → uei - set_aside_type → set_aside - sort + order → ordering + + Note: Contracts use cursor-based pagination. Use cursor from previous response + to get the next page. """ # Pagination - page: int = 1 + cursor: str | None = None # Cursor token for cursor-based pagination limit: int = 25 # Text search @@ -416,6 +419,7 @@ class PaginatedResponse[T]: next: URL for the next page of results (None if last page) previous: URL for the previous page of results (None if first page) results: List of result items (type depends on shape parameter) + cursor: Cursor token for cursor-based pagination (None if not available) page_metadata: Optional metadata about the current page Examples: @@ -425,12 +429,16 @@ class PaginatedResponse[T]: >>> print(f"Total: {response.count}") >>> for contract in response.results: ... print(contract["piid"]) + >>> # Use cursor for next page + >>> if response.cursor: + ... next_response = client.list_contracts(cursor=response.cursor) """ count: int next: str | None previous: str | None results: list[T] + cursor: str | None = None page_metadata: dict[str, Any] | None = None @@ -477,9 +485,9 @@ class ShapeConfig: # Default for get_idv() IDVS_COMPREHENSIVE: Final = ( - "key,piid,award_date,description,fiscal_year,total_contract_value,base_and_exercised_options_value,obligated," + "key,piid,award_date,description,fiscal_year,total_contract_value,obligated," "idv_type,multiple_or_single_award_idv,type_of_idc,period_of_performance(start_date,last_date_to_order)," - "recipient(display_name,legal_business_name,uei,cage_code)," + "recipient(display_name,legal_business_name,uei,cage)," "awarding_office(*),funding_office(*),place_of_performance(*),parent_award(key,piid)," "competition(*),legislative_mandates(*),transactions(*),subawards_summary(*)" ) diff --git a/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination b/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination new file mode 100644 index 0000000..a9323bf --- /dev/null +++ b/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination @@ -0,0 +1,169 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/contracts/?limit=5&page=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":82287104,"next":"http://tango.makegov.com/api/contracts/?limit=5&page=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value&cursor=WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd","previous":null,"cursor":"WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd","previous_cursor":null,"results":[{"key":"CONT_AWD_15B51926F00000066_1540_36W79720D0001_3600","piid":"15B51926F00000066","award_date":"2026-01-25","description":"FCC + POLLOCK PHARMACY FRIDGE ITEMS","total_contract_value":163478.97,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_36C26226N0339_3600_36C26025A0006_3600","piid":"36C26226N0339","award_date":"2026-01-25","description":"PATIENT + BED MAINTENANCE SERVICE CONTRACT","total_contract_value":368125.0,"recipient":{"display_name":"LE3 + LLC"}},{"key":"CONT_AWD_36C24526N0261_3600_36C24526D0024_3600","piid":"36C24526N0261","award_date":"2026-01-25","description":"IDIQ + FOR WATER INTRUSION REPAIRS","total_contract_value":89975.0,"recipient":{"display_name":"VENERGY + GROUP LLC"}},{"key":"CONT_AWD_15B51926F00000065_1540_36W79720D0001_3600","piid":"15B51926F00000065","award_date":"2026-01-25","description":"FCC + POLLOC EPCLUSA","total_contract_value":52148.25,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_19JA8026P0451_1900_-NONE-_-NONE-","piid":"19JA8026P0451","award_date":"2026-01-25","description":"TOKYO-MINATO + WARD LAND PERMIT PAYMENT","total_contract_value":95432.2,"recipient":{"display_name":"MISCELLANEOUS + FOREIGN AWARDEES"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c428df59983114a-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 19:53:06 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vSYACAc2%2Fn8TfRvdVOmJ4dIpaA2%2BsSAnQ%2Bg4FJvPPgC6p4SNKWLgQA84tK3BW9vNFzwkcDgJhx5D6ZBC%2Brtrrs3fylXLZVObYeDRGLAyXC7xQrzxBdHB3jqRfwQ%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '1620' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.041s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '29' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999959' + x-ratelimit-daily-reset: + - '61635' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '29' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/contracts/?limit=5&cursor=WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":82287104,"next":"http://tango.makegov.com/api/contracts/?limit=5&cursor=WyIyMDI2LTAxLTI0IiwgImZmZjE2N2QxLTE5MjctNWEyOC05NmJmLTExYWM0MGRmN2M3OCJd&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value","previous":"http://tango.makegov.com/api/contracts/?limit=5&cursor=eyJ2IjogWyIyMDI2LTAxLTI1IiwgImI4ZTA4N2U2LTAyZWQtNTkyZS04Yzc3LWY1NjI5NzZiYTNkNyJdLCAiZCI6ICJwcmV2In0%3D&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value","cursor":"WyIyMDI2LTAxLTI0IiwgImZmZjE2N2QxLTE5MjctNWEyOC05NmJmLTExYWM0MGRmN2M3OCJd","previous_cursor":"eyJ2IjogWyIyMDI2LTAxLTI1IiwgImI4ZTA4N2U2LTAyZWQtNTkyZS04Yzc3LWY1NjI5NzZiYTNkNyJdLCAiZCI6ICJwcmV2In0=","results":[{"key":"CONT_AWD_36C78626N0155_3600_36C78624D0009_3600","piid":"36C78626N0155","award_date":"2026-01-25","description":"CONCRETE + GRAVE LINERS","total_contract_value":1980.0,"recipient":{"display_name":"WILBERT + FUNERAL SERVICES, INC."}},{"key":"CONT_AWD_15B51926F00000068_1540_36W79720D0001_3600","piid":"15B51926F00000068","award_date":"2026-01-25","description":"CONTROLLED + SUBS PO 3755","total_contract_value":5464.38,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_36C24826P0388_3600_-NONE-_-NONE-","piid":"36C24826P0388","award_date":"2026-01-25","description":"IMPLANT + HIP","total_contract_value":172502.17,"recipient":{"display_name":"RED ONE + MEDICAL DEVICES LLC"}},{"key":"CONT_AWD_36C24826N0317_3600_36F79718D0437_3600","piid":"36C24826N0317","award_date":"2026-01-25","description":"WHEELCHAIR","total_contract_value":24108.3,"recipient":{"display_name":"PERMOBIL, + INC."}},{"key":"CONT_AWD_47QSSC26F37FG_4732_47QSEA21A0009_4732","piid":"47QSSC26F37FG","award_date":"2026-01-24","description":"BAG,PAPER + (GROCERS) 10-14 DAYS ARO","total_contract_value":71.26,"recipient":{"display_name":"CAPP + LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c428df72b65114a-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 19:53:06 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YKHmVJbthFs4ESHbRKzDkkxKlg3eIMXGgPIE8je1JNdfiadrunCjplqfRnFH0D3K8tXAppMr%2BHdzRSJQZ2xodA0b%2BbT0bCeTreQ8twYk7woQnlXcGCBg127TOhA%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '1894' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.051s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '29' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999958' + x-ratelimit-daily-reset: + - '61635' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '29' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_get_idv_summary b/tests/cassettes/TestIDVsIntegration.test_get_idv_summary new file mode 100644 index 0000000..026d3f6 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_get_idv_summary @@ -0,0 +1,252 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c431392eaa570c4-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:19 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=cIstw%2FQkVVTpk3mVjs76jajMuyEs82Mrhqsrf2Ak864vMKdya7PUUv6AVZg4VKE4Rji%2FvhG0vH%2FgFvXu61A%2FZvVpSoh0HGNASVAtxH6SooBq3WCuQYNf889L2%2Bs%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.028s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '985' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999800' + x-ratelimit-daily-reset: + - '56162' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '985' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"},{"uuid":"eb797c6e-6865-505e-9c71-7d0dfc3b1b35","solicitation_identifier":"0040626388","organization_id":"0d75c931-8b4e-5941-9ec3-2b35df3ea8d9","awardee_count":3,"order_count":6,"vehicle_obligations":37189.74,"vehicle_contracts_value":37189.74,"solicitation_title":"B--AZ + ES ARCHAEOLOGICAL SERVICES","solicitation_date":"2023-08-29"},{"uuid":"ef62a4f0-080a-503f-adbe-a1705ae410c0","solicitation_identifier":"05GA0A22Q0023","organization_id":"2774a854-bcf4-5d85-94c0-d715f0c1819f","awardee_count":4,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"SOLICITATION + - GAO IDIQ CONSTRUCTION SERVICES","solicitation_date":"2022-03-21"},{"uuid":"4c317645-db68-53e7-8d97-eeec38e7da2e","solicitation_identifier":"1069512","organization_id":"384a7047-2f7c-5a2f-88b0-8e47cb5f98f5","awardee_count":2,"order_count":5,"vehicle_obligations":1828095.0,"vehicle_contracts_value":1828095.0,"solicitation_title":"Intent + to Sole Source Procurement for Specific Pathogen Free (SPF) Embryonating Chicken + Eggs","solicitation_date":"2022-09-13"},{"uuid":"98718d55-29c9-56f8-9a19-058f2b6e7174","solicitation_identifier":"1131PL21RIQ71002","organization_id":"afcff312-fd10-5ad4-853a-83e5b0ecc2e0","awardee_count":4,"order_count":6,"vehicle_obligations":332140.66,"vehicle_contracts_value":332140.66,"solicitation_title":"Monitoring + and Evaluations: Program Audit Series Services IDIQ","solicitation_date":"2021-08-06"},{"uuid":"e2b5a801-4ddd-5abe-92b4-ba1807421c8f","solicitation_identifier":"1131PL22RIQ0001","organization_id":"afcff312-fd10-5ad4-853a-83e5b0ecc2e0","awardee_count":18,"order_count":52,"vehicle_obligations":32586217.82,"vehicle_contracts_value":32586217.82,"solicitation_title":"IDIQ: + Multiple Award Contract - - Reverse Trade Missions, Conferences, Workshops, + Training, and Other Events","solicitation_date":"2022-04-08"},{"uuid":"a9df6717-67b2-51c1-9d6d-e29b1d89b4cb","solicitation_identifier":"1145PC20Q0026","organization_id":"5b10eb83-548f-5685-b69e-c00f96ee6ff7","awardee_count":9,"order_count":32,"vehicle_obligations":377286.14,"vehicle_contracts_value":383286.14,"solicitation_title":"Peace + Corps Background Investigators","solicitation_date":"2020-03-17"},{"uuid":"8d124a98-17f3-5143-b11a-cba33b218145","solicitation_identifier":"1145PC22Q0042","organization_id":"5b10eb83-548f-5685-b69e-c00f96ee6ff7","awardee_count":7,"order_count":18,"vehicle_obligations":116624.52,"vehicle_contracts_value":116624.52,"solicitation_title":"Language + Proficiency Interview (LPI) Tester Trainers","solicitation_date":"2022-03-28"},{"uuid":"d9351f6f-3663-5b3e-baa6-629e71f4a6ae","solicitation_identifier":"12-046W-18-Q-0056","organization_id":"2bdc6615-3582-5f85-ace9-470bf8f461f7","awardee_count":2,"order_count":2,"vehicle_obligations":35100.0,"vehicle_contracts_value":35100.0,"solicitation_title":"Trail + Maintenance/Restoration Services","solicitation_date":"2018-08-27"},{"uuid":"e9718942-c9d7-5ca7-a2e6-6eeb3a7a9d4c","solicitation_identifier":"12-04T0-18-Q-0001","organization_id":"2bdc6615-3582-5f85-ace9-470bf8f461f7","awardee_count":14,"order_count":58,"vehicle_obligations":671823.21,"vehicle_contracts_value":671823.21,"solicitation_title":"Region + 6 Coaching Services - BPA","solicitation_date":"2017-12-14"}]}' + headers: + CF-RAY: + - 9c4316dfad3661a6-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:34 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YhGIExzk%2BXb8IQoJa1CUA%2FKQW17W%2BnUptWcExoJW%2FmOhl2vg0oo%2FnlbQ60I%2FL7FccL46wHpj%2F80aCQilDJwFkAvlsGjuMT9oLg6x8y4GBXlrXJ0JHSJk9oomctU%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3915' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.037s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '985' + x-ratelimit-burst-reset: + - '55' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999784' + x-ratelimit-daily-reset: + - '56027' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '985' + x-ratelimit-reset: + - '55' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/0/summary/ + response: + body: + string: '{"solicitation_identifier":"0","competition_details":{"commercial_item_acquisition_procedures":{"code":"A","description":"Commercial + Products/Services"},"evaluated_preference":{"code":"NONE","description":"No + Preference used"},"extent_competed":{"code":"A","description":"Full and Open + Competition"},"most_recent_solicitation_date":"2023-09-22","number_of_offers_received":1,"original_solicitation_date":"2023-09-22","other_than_full_and_open_competition":{"code":"ONE","description":"Only + One Source-Other (FAR 6.302-1 other)"},"set_aside":{"code":"NONE","description":"No + set aside used"},"simplified_procedures_for_certain_commercial_items":{"code":"N","description":"No"},"small_business_competitiveness_demonstration_program":{"code":"N","description":"No"},"solicitation_identifier":"0","solicitation_procedures":{"code":"MAFO","description":"Subject + to Multiple Award Fair Opportunity"}},"acquisition_details":{"naics_code":339113,"psc_code":"6515"},"additional_details":{"contract_type":{"code":"J","description":"Firm + Fixed Price"},"idv_type":{"code":"E","description":"BPA"},"type_of_idc":{"code":"B","description":"Indefinite + Delivery / Indefinite Quantity"},"total_contract_value":0.0},"description":"1-YEAR + LE STAFF HEALTH INSURANCE - KYIV, UKRAINE","agency_details":{"funding_office":{"agency_code":"3600","agency_name":"Department + of Veterans Affairs","office_code":"36C512","office_name":"512-BALTIMORE(00512)(36C512)","department_code":36,"department_name":"Department + of Veterans Affairs"},"awarding_office":{"agency_code":"3600","agency_name":"Department + of Veterans Affairs","office_code":"36C250","office_name":"250-NETWORK CONTRACT + OFFICE 10 (36C250)","department_code":36,"department_name":"Department of + Veterans Affairs"}},"awardee_count":39,"awards_url":"http://tango.makegov.com/api/idvs/0/summary/awards/"}' + headers: + CF-RAY: + - 9c4316e08e1461a6-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:34 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=6NyjEA8vZcKC1Jv%2FSUFW%2BQT4MGovuXcSHKyuQFmwrH%2B0r754YPbuYhhIu5BjWzUMRAwBqAxEpmWkWwwoL6OS%2BT%2FNx%2BvEAAx2Mt9%2BVRxrdctrwyoa7%2BATazAudZY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '1834' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.063s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '984' + x-ratelimit-burst-reset: + - '55' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999783' + x-ratelimit-daily-reset: + - '56027' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '984' + x-ratelimit-reset: + - '55' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape b/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape new file mode 100644 index 0000000..3c27747 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape @@ -0,0 +1,494 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c42ff6548c0a219-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vWpNPPFWjwKTPWHzjWMNFrLy9qO6UOcaqk2c4iu7I%2B1VaXT7KKmmX5QwN%2B4Osm8CZ3n97%2Fek1ZenZof50MJI4qOR55zJk8GtvynWduer1l0q38HFLP1%2FrM2X"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.029s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '985' + x-ratelimit-burst-reset: + - '41' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999816' + x-ratelimit-daily-reset: + - '56989' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '985' + x-ratelimit-reset: + - '41' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/?shape=key%2Cpiid%2Caward_date%2Cdescription%2Cfiscal_year%2Ctotal_contract_value%2Cobligated%2Cidv_type%2Cmultiple_or_single_award_idv%2Ctype_of_idc%2Cperiod_of_performance%28start_date%2Clast_date_to_order%29%2Crecipient%28display_name%2Clegal_business_name%2Cuei%2Ccage%29%2Cawarding_office%28%2A%29%2Cfunding_office%28%2A%29%2Cplace_of_performance%28%2A%29%2Cparent_award%28key%2Cpiid%29%2Ccompetition%28%2A%29%2Clegislative_mandates%28%2A%29%2Ctransactions%28%2A%29%2Csubawards_summary%28%2A%29 + response: + body: + string: '{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","fiscal_year":2026,"total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","multiple_or_single_award_idv":"S","type_of_idc":null,"period_of_performance":{"start_date":"2026-01-25"},"recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"},"awarding_office":{"office_code":"833101","office_name":"EXPORT + IMPORT BANK OF US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"funding_office":{"office_code":"833100","office_name":"EXPORT + IMPORT BANK OF THE US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"place_of_performance":{"country_code":null,"country_name":null,"state_code":null,"state_name":null,"city_name":"","zip_code":""},"parent_award":{"key":"CONT_IDV_47QSMS25D008R_4732","piid":"47QSMS25D008R"},"competition":{"contract_type":{"code":"J","description":"Firm + Fixed Price"},"extent_competed":{"code":"A","description":"Full and Open Competition"},"number_of_offers_received":1,"other_than_full_and_open_competition":null,"solicitation_date":null,"solicitation_identifier":"83310126QC007","solicitation_procedures":{"code":"MAFO","description":"Subject + to Multiple Award Fair Opportunity"}},"legislative_mandates":{"clinger_cohen_act_planning":{"code":"N","description":"No"},"construction_wage_rate_requirements":{"code":"X","description":"Not + Applicable"},"employment_eligibility_verification":null,"interagency_contracting_authority":{"code":"X","description":"Not + Applicable"},"labor_standards":{"code":"Y","description":"Yes"},"materials_supplies_articles_equipment":{"code":"X","description":"Not + Applicable"},"other_statutory_authority":null,"service_contract_inventory":null},"transactions":[{"obligated":0.0,"action_type":null,"description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","transaction_date":"2026-01-23","modification_number":"0"},{"obligated":0.0,"action_type":null,"description":null,"transaction_date":"2026-01-23","modification_number":"0"}],"subawards_summary":{}}' + headers: + CF-RAY: + - 9c42ff660a1da219-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CDmtotyd1YNAcya4vXmxhisr7jUyQG13WnZN7CZ3gwcTjMJJQ9TcPfu7W7kCv7HetrXob7aBKDaWw9uRd0CwO4epYtY7bAU1Gu9FRbiY3i6NzmvjekXxXRAs"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '2300' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.051s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '984' + x-ratelimit-burst-reset: + - '40' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999815' + x-ratelimit-daily-reset: + - '56989' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '984' + x-ratelimit-reset: + - '40' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c431387fdf41156-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:17 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=BwMqzL%2FSx4odkSKpO9f30x%2F5qf0DUVm4mQ01fFR6Rt0AiN0jS62MHEnf48CaFU8yNHf%2By6eCrQ8zy0HqmFldYdTne6gML5N14FI3Z%2F7MQcQNMvJbLBhg9ptMu0g%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.030s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '993' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999808' + x-ratelimit-daily-reset: + - '56164' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '993' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/?shape=key%2Cpiid%2Caward_date%2Cdescription%2Cfiscal_year%2Ctotal_contract_value%2Cobligated%2Cidv_type%2Cmultiple_or_single_award_idv%2Ctype_of_idc%2Cperiod_of_performance%28start_date%2Clast_date_to_order%29%2Crecipient%28display_name%2Clegal_business_name%2Cuei%2Ccage%29%2Cawarding_office%28%2A%29%2Cfunding_office%28%2A%29%2Cplace_of_performance%28%2A%29%2Cparent_award%28key%2Cpiid%29%2Ccompetition%28%2A%29%2Clegislative_mandates%28%2A%29%2Ctransactions%28%2A%29%2Csubawards_summary%28%2A%29 + response: + body: + string: '{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","fiscal_year":2026,"total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","multiple_or_single_award_idv":"S","type_of_idc":null,"period_of_performance":{"start_date":"2026-01-25"},"recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"},"awarding_office":{"office_code":"833101","office_name":"EXPORT + IMPORT BANK OF US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"funding_office":{"office_code":"833100","office_name":"EXPORT + IMPORT BANK OF THE US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"place_of_performance":{"country_code":null,"country_name":null,"state_code":null,"state_name":null,"city_name":"","zip_code":""},"parent_award":{"key":"CONT_IDV_47QSMS25D008R_4732","piid":"47QSMS25D008R"},"competition":{"contract_type":{"code":"J","description":"Firm + Fixed Price"},"extent_competed":{"code":"A","description":"Full and Open Competition"},"number_of_offers_received":1,"other_than_full_and_open_competition":null,"solicitation_date":null,"solicitation_identifier":"83310126QC007","solicitation_procedures":{"code":"MAFO","description":"Subject + to Multiple Award Fair Opportunity"}},"legislative_mandates":{"clinger_cohen_act_planning":{"code":"N","description":"No"},"construction_wage_rate_requirements":{"code":"X","description":"Not + Applicable"},"employment_eligibility_verification":null,"interagency_contracting_authority":{"code":"X","description":"Not + Applicable"},"labor_standards":{"code":"Y","description":"Yes"},"materials_supplies_articles_equipment":{"code":"X","description":"Not + Applicable"},"other_statutory_authority":null,"service_contract_inventory":null},"transactions":[{"obligated":0.0,"action_type":null,"description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","transaction_date":"2026-01-23","modification_number":"0"},{"obligated":0.0,"action_type":null,"description":null,"transaction_date":"2026-01-23","modification_number":"0"}],"subawards_summary":{}}' + headers: + CF-RAY: + - 9c431388ef0f1156-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:17 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=sNNqc9G%2BrY4o357FmfGMUec419NFKSLQMaQ54J25XitqaJ%2Bvn%2Fq5n1xjMrinU0m6ZQ9agiXByyxnZntRwK47vmWGsA6wO0PGSZ7mM%2BQ3KV9A8cgX8r2lRG56sDo%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '2300' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.053s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '992' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999807' + x-ratelimit-daily-reset: + - '56164' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '992' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316d4c9bca242-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=8ecg7W8FD3%2BrCmR4HRWiACkOmCalOOVEFs%2BcbFmG7vj%2B5PBoBz0aowsiG2dlt14dUTvfs9Th5t3uuItTOpqjP9GR9F3ASIgEI6wNkesprWNFTa1lHFwyk5KuiC0%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.033s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '993' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999792' + x-ratelimit-daily-reset: + - '56029' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '993' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/?shape=key%2Cpiid%2Caward_date%2Cdescription%2Cfiscal_year%2Ctotal_contract_value%2Cobligated%2Cidv_type%2Cmultiple_or_single_award_idv%2Ctype_of_idc%2Cperiod_of_performance%28start_date%2Clast_date_to_order%29%2Crecipient%28display_name%2Clegal_business_name%2Cuei%2Ccage%29%2Cawarding_office%28%2A%29%2Cfunding_office%28%2A%29%2Cplace_of_performance%28%2A%29%2Cparent_award%28key%2Cpiid%29%2Ccompetition%28%2A%29%2Clegislative_mandates%28%2A%29%2Ctransactions%28%2A%29%2Csubawards_summary%28%2A%29 + response: + body: + string: '{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","fiscal_year":2026,"total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","multiple_or_single_award_idv":"S","type_of_idc":null,"period_of_performance":{"start_date":"2026-01-25"},"recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"},"awarding_office":{"office_code":"833101","office_name":"EXPORT + IMPORT BANK OF US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"funding_office":{"office_code":"833100","office_name":"EXPORT + IMPORT BANK OF THE US","agency_code":"8300","agency_name":"Export-Import Bank + of the United States","department_code":83,"department_name":"Export-Import + Bank of the United States"},"place_of_performance":{"country_code":null,"country_name":null,"state_code":null,"state_name":null,"city_name":"","zip_code":""},"parent_award":{"key":"CONT_IDV_47QSMS25D008R_4732","piid":"47QSMS25D008R"},"competition":{"contract_type":{"code":"J","description":"Firm + Fixed Price"},"extent_competed":{"code":"A","description":"Full and Open Competition"},"number_of_offers_received":1,"other_than_full_and_open_competition":null,"solicitation_date":null,"solicitation_identifier":"83310126QC007","solicitation_procedures":{"code":"MAFO","description":"Subject + to Multiple Award Fair Opportunity"}},"legislative_mandates":{"clinger_cohen_act_planning":{"code":"N","description":"No"},"construction_wage_rate_requirements":{"code":"X","description":"Not + Applicable"},"employment_eligibility_verification":null,"interagency_contracting_authority":{"code":"X","description":"Not + Applicable"},"labor_standards":{"code":"Y","description":"Yes"},"materials_supplies_articles_equipment":{"code":"X","description":"Not + Applicable"},"other_statutory_authority":null,"service_contract_inventory":null},"transactions":[{"obligated":0.0,"action_type":null,"description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","transaction_date":"2026-01-23","modification_number":"0"},{"obligated":0.0,"action_type":null,"description":null,"transaction_date":"2026-01-23","modification_number":"0"}],"subawards_summary":{}}' + headers: + CF-RAY: + - 9c4316d66b24a242-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ATfp0dpDPDHZG%2Bt9F57m6Em2GBrkaz8ThUXP%2BDFzxUOaJqlsGNrdlxLfSuOhOnEK1SdZ%2BhMIaG%2F80KDPKb93OplPoVW5f5dujBihzwUTkRR6L5bTwAMaMNBJZJQ%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '2300' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.052s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '992' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999791' + x-ratelimit-daily-reset: + - '56029' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '992' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape b/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape new file mode 100644 index 0000000..9032ca0 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape @@ -0,0 +1,302 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c43138aaa7f10d1-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:17 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=yZUNcnkTrEdarVYGa%2FcflMLJhs7NqEtwUH9vY60INmKI49BGiuIVrNb7knmqmK2w75DAObXXWNTRPpCYiMLWMX5YJvbFrD%2FSDxq%2FVYu2A2ISpm5XtE7Zo32vQM0%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.029s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '991' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999806' + x-ratelimit-daily-reset: + - '56164' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '991' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/awards/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":0,"next":null,"previous":null,"cursor":null,"previous_cursor":null,"results":[],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c43138bab6d10d1-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:17 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=8jnqlUQal5PqMf74IreAP%2BFaAQcndsBxY9SWOQV0H0lZ4i%2FdW4cjiUOcmhPtYAzYDDpAjKAICzHawqklt3AquAxRAT6wGyX79fpltj9xEdBXGRcOWiZ%2BVBHVj8s%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '116' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.055s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '990' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999805' + x-ratelimit-daily-reset: + - '56163' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '990' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316d7f9f01150-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Pt8wWegli4AxUywblYHp8njNDZaxgkCLGZvzu4p1vJR4VghvEwCydu5mzWm7ZnDaSub9NSwWeMXo4AENrd3UBJR2Nh2p6xAsl%2BssIfhFUhWogz2ZuMiqKC8GQOE%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.030s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '991' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999790' + x-ratelimit-daily-reset: + - '56028' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '991' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/awards/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":0,"next":null,"previous":null,"cursor":null,"previous_cursor":null,"results":[],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316d8cabb1150-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=10lMw9Ks5igT7hz5N%2Br%2Bhc8S8bu8Fl3wY4Fkl60fAVaGUROD7JgNLZ4ez3ZrGZ7My%2BW9UER7u%2FEK%2BD7ewW2THxyAQc4lrvcI539dTkRyJqLg7x%2FQLaYudzgvFSA%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '116' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.050s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '990' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999789' + x-ratelimit-daily-reset: + - '56028' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '990' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape b/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape new file mode 100644 index 0000000..5c717d9 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape @@ -0,0 +1,302 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c43138d4fb961fa-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:18 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mbUBhGkGLNMJKc2QjTZ3zdX4O52mhg%2Fb%2B8t7GSy8yEhQ8HIKN9hilOlVZpbj%2BPsMZeLg39j8Hm4iEi47Z85wZQJ%2BW2R0d4TeRCGRarXZQfTyF6UxHNAULp3196c%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.034s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '989' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999804' + x-ratelimit-daily-reset: + - '56163' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '989' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":0,"next":null,"previous":null,"cursor":null,"previous_cursor":null,"results":[],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c43138e88e361fa-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:18 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Ix%2B6gYsHTleYSNb2ZBlnbf%2FsHElmiMvPaGRflAdl63XjdwALG%2FRxXEUr4%2FuSST4dEfpChcB%2BHDmU%2FdMNFgBm1S6PdgtfbCnh%2FFXZjRKi5J68kN5EhIv2yBSaHI0%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '116' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.062s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '988' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999803' + x-ratelimit-daily-reset: + - '56163' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '988' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316da899190b3-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=6ro0Aq6AWOpF8H745bomr%2FM5afru2iriLt9shSYY3wal1N3b9A5LFqS4C%2FhNdeUybJvm228gIwElk9by2eRlxNjke33lSXv2tGtM9FgHYIdVdul%2FjLLLw%2BhedAs%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.029s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '989' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999788' + x-ratelimit-daily-reset: + - '56028' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '989' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":0,"next":null,"previous":null,"cursor":null,"previous_cursor":null,"results":[],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316db6d0590b3-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=MaeBch2Z3WPlCvQulvF820SObbCl90D%2BihrKUKChlF6R5sWlD1L8mu208BQrAEkJs0CyV%2F1hjAplRkzlqBHWPgM%2Fiojkd9agiGFCNCQMYvL6ZgYUDdqUQldqUVs%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '116' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.040s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '988' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999787' + x-ratelimit-daily-reset: + - '56028' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '988' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_list_idv_summary_awards b/tests/cassettes/TestIDVsIntegration.test_list_idv_summary_awards new file mode 100644 index 0000000..72f26ac --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_list_idv_summary_awards @@ -0,0 +1,256 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4313947a931140-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:19 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=rpTmNrkW7DlX3HLcVKIuecZtB828kvlNFneOcmJDY9H161skw46fpbQKbJ731LiBbBvyVVPz8qGA3aFmzdW%2BGvmO%2BrajaDNboxmB5z5Qy%2BKMjEQ4AegRYPnRfgw%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.031s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '984' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999799' + x-ratelimit-daily-reset: + - '56162' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '984' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"},{"uuid":"eb797c6e-6865-505e-9c71-7d0dfc3b1b35","solicitation_identifier":"0040626388","organization_id":"0d75c931-8b4e-5941-9ec3-2b35df3ea8d9","awardee_count":3,"order_count":6,"vehicle_obligations":37189.74,"vehicle_contracts_value":37189.74,"solicitation_title":"B--AZ + ES ARCHAEOLOGICAL SERVICES","solicitation_date":"2023-08-29"},{"uuid":"ef62a4f0-080a-503f-adbe-a1705ae410c0","solicitation_identifier":"05GA0A22Q0023","organization_id":"2774a854-bcf4-5d85-94c0-d715f0c1819f","awardee_count":4,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"SOLICITATION + - GAO IDIQ CONSTRUCTION SERVICES","solicitation_date":"2022-03-21"},{"uuid":"4c317645-db68-53e7-8d97-eeec38e7da2e","solicitation_identifier":"1069512","organization_id":"384a7047-2f7c-5a2f-88b0-8e47cb5f98f5","awardee_count":2,"order_count":5,"vehicle_obligations":1828095.0,"vehicle_contracts_value":1828095.0,"solicitation_title":"Intent + to Sole Source Procurement for Specific Pathogen Free (SPF) Embryonating Chicken + Eggs","solicitation_date":"2022-09-13"},{"uuid":"98718d55-29c9-56f8-9a19-058f2b6e7174","solicitation_identifier":"1131PL21RIQ71002","organization_id":"afcff312-fd10-5ad4-853a-83e5b0ecc2e0","awardee_count":4,"order_count":6,"vehicle_obligations":332140.66,"vehicle_contracts_value":332140.66,"solicitation_title":"Monitoring + and Evaluations: Program Audit Series Services IDIQ","solicitation_date":"2021-08-06"},{"uuid":"e2b5a801-4ddd-5abe-92b4-ba1807421c8f","solicitation_identifier":"1131PL22RIQ0001","organization_id":"afcff312-fd10-5ad4-853a-83e5b0ecc2e0","awardee_count":18,"order_count":52,"vehicle_obligations":32586217.82,"vehicle_contracts_value":32586217.82,"solicitation_title":"IDIQ: + Multiple Award Contract - - Reverse Trade Missions, Conferences, Workshops, + Training, and Other Events","solicitation_date":"2022-04-08"},{"uuid":"a9df6717-67b2-51c1-9d6d-e29b1d89b4cb","solicitation_identifier":"1145PC20Q0026","organization_id":"5b10eb83-548f-5685-b69e-c00f96ee6ff7","awardee_count":9,"order_count":32,"vehicle_obligations":377286.14,"vehicle_contracts_value":383286.14,"solicitation_title":"Peace + Corps Background Investigators","solicitation_date":"2020-03-17"},{"uuid":"8d124a98-17f3-5143-b11a-cba33b218145","solicitation_identifier":"1145PC22Q0042","organization_id":"5b10eb83-548f-5685-b69e-c00f96ee6ff7","awardee_count":7,"order_count":18,"vehicle_obligations":116624.52,"vehicle_contracts_value":116624.52,"solicitation_title":"Language + Proficiency Interview (LPI) Tester Trainers","solicitation_date":"2022-03-28"},{"uuid":"d9351f6f-3663-5b3e-baa6-629e71f4a6ae","solicitation_identifier":"12-046W-18-Q-0056","organization_id":"2bdc6615-3582-5f85-ace9-470bf8f461f7","awardee_count":2,"order_count":2,"vehicle_obligations":35100.0,"vehicle_contracts_value":35100.0,"solicitation_title":"Trail + Maintenance/Restoration Services","solicitation_date":"2018-08-27"},{"uuid":"e9718942-c9d7-5ca7-a2e6-6eeb3a7a9d4c","solicitation_identifier":"12-04T0-18-Q-0001","organization_id":"2bdc6615-3582-5f85-ace9-470bf8f461f7","awardee_count":14,"order_count":58,"vehicle_obligations":671823.21,"vehicle_contracts_value":671823.21,"solicitation_title":"Region + 6 Coaching Services - BPA","solicitation_date":"2017-12-14"}]}' + headers: + CF-RAY: + - 9c4316e29bfcae13-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:34 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=AiLUTevyVtkND2ikEiJC1W3S8KKcI7vASBwB9%2B%2F6mf9vofeaRRvRbRYjM4UUcJ%2BLyPBVgqxiHcDFy%2FaKqQM3KsJwxjyn%2Br2bVCfaR%2FaKKNszhOiQaFCamaV5EUE%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3915' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.024s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '983' + x-ratelimit-burst-reset: + - '55' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999782' + x-ratelimit-daily-reset: + - '56027' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '983' + x-ratelimit-reset: + - '55' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/0/summary/awards/?limit=10 + response: + body: + string: '{"count":39,"next":"http://tango.makegov.com/api/idvs/0/summary/awards/?limit=10&cursor=WyIyMDIxLTAzLTE3IiwgIjNhYjQzMjFkLTc2YTUtNThjMi1hYWY2LTg1MzIxY2NkMWJjMSJd","previous":null,"cursor":"WyIyMDIxLTAzLTE3IiwgIjNhYjQzMjFkLTc2YTUtNThjMi1hYWY2LTg1MzIxY2NkMWJjMSJd","previous_cursor":null,"results":[{"key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"},"award_date":"2025-02-26","obligated":0.0,"total_contract_value":242942.75,"fiscal_year":2025,"idv_type":"E","description":null},{"key":"CONT_IDV_19GE5023D0042_1900","piid":"19GE5023D0042","recipient":{"uei":"U5KJFB7SCY51","display_name":"PRIVATE + JOINT STOCK COMPANY ''INSURANCE COMPANY ''UNIQA''"},"award_date":"2023-09-22","obligated":0.0,"total_contract_value":2188360.07,"fiscal_year":2023,"idv_type":"B","description":"1-YEAR + LE STAFF HEALTH INSURANCE - KYIV, UKRAINE"},{"key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."},"award_date":"2023-09-21","obligated":0.0,"total_contract_value":15515.0,"fiscal_year":2023,"idv_type":"E","description":"LEXINGTON + VAMC AMOS CONSIGNMENT"},{"key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."},"award_date":"2023-09-19","obligated":0.0,"total_contract_value":5000000.0,"fiscal_year":2023,"idv_type":"E","description":"HR + SUPPORT SERVICES"},{"key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."},"award_date":"2023-06-23","obligated":0.0,"total_contract_value":240000.0,"fiscal_year":2023,"idv_type":"E","description":"CONSIGNMENT + INVENTORY"},{"key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."},"award_date":"2022-09-12","obligated":0.0,"total_contract_value":100000.0,"fiscal_year":2022,"idv_type":"E","description":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT"},{"key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"},"award_date":"2022-03-17","obligated":0.0,"total_contract_value":1.0,"fiscal_year":2022,"idv_type":"E","description":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA"},{"key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"},"award_date":"2021-10-01","obligated":0.0,"total_contract_value":281508.54,"fiscal_year":2022,"idv_type":"E","description":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS"},{"key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"},"award_date":"2021-03-23","obligated":0.0,"total_contract_value":150000.0,"fiscal_year":2021,"idv_type":"E","description":null},{"key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"},"award_date":"2021-03-17","obligated":0.0,"total_contract_value":2903970.0,"fiscal_year":2021,"idv_type":"E","description":"STERNAL + PLATES AND SCREWS"}]}' + headers: + CF-RAY: + - 9c4316e35ddfae13-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:34 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=dkh41CRYKWPvxHzfzJrjTUmnNsiu8vP3ka9KM2KJrfOkkhuNMB%2FxuhNnJ6FmHVQtN3SnZVscyzMGg%2FdGf%2FSWPUci9pxKL%2Fd1J4C9gzv9Zlg1gAPDEa6AfLHeqXY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3201' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.148s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '982' + x-ratelimit-burst-reset: + - '54' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999781' + x-ratelimit-daily-reset: + - '56026' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '982' + x-ratelimit-reset: + - '54' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions b/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions new file mode 100644 index 0000000..fd29d57 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions @@ -0,0 +1,304 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4313903c821267-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:18 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=G8f2%2B3kfSKV2IxpqfOdnSxX55cZux9BjhrhfLkhNb31fiKVWADI9UBAmOkuaV1jPZ4pVlK9zPP35qtDP7iJWnUaVjOM5hqdjM8afs%2BSqUffJS9UzLUl397okg7k%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.028s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '987' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999802' + x-ratelimit-daily-reset: + - '56163' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '987' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/transactions/?limit=10 + response: + body: + string: '{"count":2,"next":null,"previous":null,"results":[{"modification_number":"0","transaction_date":"2026-01-23","obligated":0.0,"description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","action_type":null},{"modification_number":"0","transaction_date":"2026-01-23","obligated":0.0,"description":null,"action_type":null}]}' + headers: + CF-RAY: + - 9c4313911da11267-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:18 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=hTVbkW0Wx%2BdFijGUOXb0xZ0cXPDSKWQi8DlYx01tMgxVah5yDxK79wKaTPf2leKe3pxgwMHMjKJVb7mlK5f6ifIVUghn3I%2FPFVeWPqAPwbfzMBpl17ES2v4%2FL08%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '324' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.049s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '986' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999801' + x-ratelimit-daily-reset: + - '56162' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '986' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type + response: + body: + string: '{"count":1151197,"next":"http://tango.makegov.com/api/idvs/?limit=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&cursor=WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous":null,"cursor":"WyIyMDI2LTAxLTIzIiwgImUyMzQzNTk2LTQ1MDctNTZjMi1iNjQ0LWJhMmYyODI0OGQ2NyJd","previous_cursor":null,"results":[{"key":"CONT_IDV_83310126AC060_8300","piid":"83310126AC060","award_date":"2026-01-23","description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","total_contract_value":7500000.0,"obligated":0.0,"idv_type":"E","recipient":{"uei":"P4XNSMKPNGM5","display_name":"PRICE + MODERN LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316dcfc5d5552-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CYPjPKD3TTQk7qYy6mworEU3l0O3SJ4ORX9kf9QhQFkuoC7Rg8PIYixvMlAnoymg9IlMlvCZo5NF3vrvxctrNXCD%2FhtgnhSahT7dFIIixWGB3ctxSAyyZ77npMI%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '721' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.029s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '987' + x-ratelimit-burst-reset: + - '56' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999786' + x-ratelimit-daily-reset: + - '56027' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '987' + x-ratelimit-reset: + - '56' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/CONT_IDV_83310126AC060_8300/transactions/?limit=10 + response: + body: + string: '{"count":2,"next":null,"previous":null,"results":[{"modification_number":"0","transaction_date":"2026-01-23","obligated":0.0,"description":"FAR + 8.4 BPA FOR OFFICE FURNITURE - SB SET-ASIDE","action_type":null},{"modification_number":"0","transaction_date":"2026-01-23","obligated":0.0,"description":null,"action_type":null}]}' + headers: + CF-RAY: + - 9c4316ddcd285552-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:33 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=v4zHMW44crJI47MQUZ0lciG5SDraG1F0ZJAgpH%2FcNAkptLITMOg7XqDtPfo8IBbyw4WF9haZPlU%2BHs82NQFO%2BGzpMlLBqGtPAabhmg7W3JVH1Gt%2BSSYX0efs1mY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '324' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.028s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '986' + x-ratelimit-burst-reset: + - '55' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999785' + x-ratelimit-daily-reset: + - '56027' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '986' + x-ratelimit-reset: + - '55' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params b/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params new file mode 100644 index 0000000..f62c629 --- /dev/null +++ b/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params @@ -0,0 +1,284 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700 + response: + body: + string: '{"count":5545,"next":"http://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700&cursor=WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous":null,"cursor":"WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous_cursor":null,"results":[{"key":"CONT_IDV_47QSMS26D0023_4732","piid":"47QSMS26D0023","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":475000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"R7A8T1CDJHA3","display_name":"IMAGE + PRINTING COMPANY, INC."}},{"key":"CONT_IDV_47QTCA26D0031_4732","piid":"47QTCA26D0031","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"VB34UDK8T7S7","display_name":"NAVCARA + LLC"}},{"key":"CONT_IDV_47QRAA26D0032_4732","piid":"47QRAA26D0032","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"GP58ACJU35Q3","display_name":"BONNER + COMMUNICATIONS LLC"}},{"key":"CONT_IDV_47QSMS26D0022_4732","piid":"47QSMS26D0022","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"C1NZB7KDTEK3","display_name":"SENTINEL + SERVICES, LLC"}},{"key":"CONT_IDV_47QRAA26D0031_4732","piid":"47QRAA26D0031","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":5002000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"XKNBXQT1K1Q9","display_name":"BULLDOG + CONSULTING SERVICES LLC"}},{"key":"CONT_IDV_47QRAA26D0030_4732","piid":"47QRAA26D0030","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2850000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PHU5ZESD58A7","display_name":"QSOURCE"}},{"key":"CONT_IDV_47QRAA26D002Z_4732","piid":"47QRAA26D002Z","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PJKDKEL234X1","display_name":"ST. + MORITZ ENTERPRISES, L.L.C."}},{"key":"CONT_IDV_47QSCC26D0001_4732","piid":"47QSCC26D0001","award_date":"2026-01-21","description":"OTHER + THAN SCHEDULE","total_contract_value":77780735.0,"obligated":0.0,"idv_type":"B","recipient":{"uei":"QEMLRQA7PLG4","display_name":"AMENTUM + SERVICES, INC."}},{"key":"CONT_IDV_47QSMS26D0021_4732","piid":"47QSMS26D0021","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":10000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"CMNQCL7FNKB1","display_name":"DRI + INC"}},{"key":"CONT_IDV_47QRCA26DA018_4732","piid":"47QRCA26DA018","award_date":"2026-01-21","description":"ONE + ACQUISITION SOLUTION FOR INTEGRATED SERVICES PLUS (OASIS+) 8(A) SMALL BUSINESS + MULTIPLE AGENCY CONTRACT (MAC)","total_contract_value":999999999999.0,"obligated":2500.0,"idv_type":"B","recipient":{"uei":"N6LCFMKNCNT5","display_name":"CHUGACH + SOLUTIONS ENTERPRISE, LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c42ff639876e544-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Jon5gWiH9%2FIqIbVyXcdfVjZnoDuYOnq8Jsvr6cN6BhY%2Fe7huuo4c8jTP3XHjwqR54x1ySiKun%2BMWJWOtANgc%2F8cf72X0JVkGLFBlT33AE4mXEJJoVyZaVA4NVrQ%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3278' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.081s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '986' + x-ratelimit-burst-reset: + - '41' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999817' + x-ratelimit-daily-reset: + - '56989' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '986' + x-ratelimit-reset: + - '41' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700 + response: + body: + string: '{"count":5545,"next":"http://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700&cursor=WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous":null,"cursor":"WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous_cursor":null,"results":[{"key":"CONT_IDV_47QSMS26D0023_4732","piid":"47QSMS26D0023","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":475000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"R7A8T1CDJHA3","display_name":"IMAGE + PRINTING COMPANY, INC."}},{"key":"CONT_IDV_47QTCA26D0031_4732","piid":"47QTCA26D0031","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"VB34UDK8T7S7","display_name":"NAVCARA + LLC"}},{"key":"CONT_IDV_47QRAA26D0032_4732","piid":"47QRAA26D0032","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"GP58ACJU35Q3","display_name":"BONNER + COMMUNICATIONS LLC"}},{"key":"CONT_IDV_47QSMS26D0022_4732","piid":"47QSMS26D0022","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"C1NZB7KDTEK3","display_name":"SENTINEL + SERVICES, LLC"}},{"key":"CONT_IDV_47QRAA26D0031_4732","piid":"47QRAA26D0031","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":5002000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"XKNBXQT1K1Q9","display_name":"BULLDOG + CONSULTING SERVICES LLC"}},{"key":"CONT_IDV_47QRAA26D0030_4732","piid":"47QRAA26D0030","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2850000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PHU5ZESD58A7","display_name":"QSOURCE"}},{"key":"CONT_IDV_47QRAA26D002Z_4732","piid":"47QRAA26D002Z","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PJKDKEL234X1","display_name":"ST. + MORITZ ENTERPRISES, L.L.C."}},{"key":"CONT_IDV_47QSCC26D0001_4732","piid":"47QSCC26D0001","award_date":"2026-01-21","description":"OTHER + THAN SCHEDULE","total_contract_value":77780735.0,"obligated":0.0,"idv_type":"B","recipient":{"uei":"QEMLRQA7PLG4","display_name":"AMENTUM + SERVICES, INC."}},{"key":"CONT_IDV_47QSMS26D0021_4732","piid":"47QSMS26D0021","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":10000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"CMNQCL7FNKB1","display_name":"DRI + INC"}},{"key":"CONT_IDV_47QRCA26DA018_4732","piid":"47QRCA26DA018","award_date":"2026-01-21","description":"ONE + ACQUISITION SOLUTION FOR INTEGRATED SERVICES PLUS (OASIS+) 8(A) SMALL BUSINESS + MULTIPLE AGENCY CONTRACT (MAC)","total_contract_value":999999999999.0,"obligated":2500.0,"idv_type":"B","recipient":{"uei":"N6LCFMKNCNT5","display_name":"CHUGACH + SOLUTIONS ENTERPRISE, LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4313859b381177-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:17 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=gbn4C1NVvPJ7KoMp%2F75kZlFZB5s33Pzl8gMrqFm%2BagtXTzakrSodS9nank4n4TqNT7rSDERbp%2BqJvNAo6TrSKi%2FGbED%2FCzRJSl0IKisL7quNnHv47IDpPfXeFUs%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3278' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.101s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '994' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999809' + x-ratelimit-daily-reset: + - '56164' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '994' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700 + response: + body: + string: '{"count":5545,"next":"http://tango.makegov.com/api/idvs/?limit=10&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%2Cuei%29%2Cdescription%2Ctotal_contract_value%2Cobligated%2Cidv_type&awarding_agency=4700&cursor=WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous":null,"cursor":"WyIyMDI2LTAxLTIxIiwgIjZkOGUwZWZkLTNmMWUtNTg2Ni1iMzVjLWJiODFmMWIxMTdhMSJd","previous_cursor":null,"results":[{"key":"CONT_IDV_47QSMS26D0023_4732","piid":"47QSMS26D0023","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":475000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"R7A8T1CDJHA3","display_name":"IMAGE + PRINTING COMPANY, INC."}},{"key":"CONT_IDV_47QTCA26D0031_4732","piid":"47QTCA26D0031","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"VB34UDK8T7S7","display_name":"NAVCARA + LLC"}},{"key":"CONT_IDV_47QRAA26D0032_4732","piid":"47QRAA26D0032","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"GP58ACJU35Q3","display_name":"BONNER + COMMUNICATIONS LLC"}},{"key":"CONT_IDV_47QSMS26D0022_4732","piid":"47QSMS26D0022","award_date":"2026-01-23","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":1000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"C1NZB7KDTEK3","display_name":"SENTINEL + SERVICES, LLC"}},{"key":"CONT_IDV_47QRAA26D0031_4732","piid":"47QRAA26D0031","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":5002000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"XKNBXQT1K1Q9","display_name":"BULLDOG + CONSULTING SERVICES LLC"}},{"key":"CONT_IDV_47QRAA26D0030_4732","piid":"47QRAA26D0030","award_date":"2026-01-22","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2850000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PHU5ZESD58A7","display_name":"QSOURCE"}},{"key":"CONT_IDV_47QRAA26D002Z_4732","piid":"47QRAA26D002Z","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":2500000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"PJKDKEL234X1","display_name":"ST. + MORITZ ENTERPRISES, L.L.C."}},{"key":"CONT_IDV_47QSCC26D0001_4732","piid":"47QSCC26D0001","award_date":"2026-01-21","description":"OTHER + THAN SCHEDULE","total_contract_value":77780735.0,"obligated":0.0,"idv_type":"B","recipient":{"uei":"QEMLRQA7PLG4","display_name":"AMENTUM + SERVICES, INC."}},{"key":"CONT_IDV_47QSMS26D0021_4732","piid":"47QSMS26D0021","award_date":"2026-01-21","description":"FEDERAL + SUPPLY SCHEDULE CONTRACT","total_contract_value":10000000.0,"obligated":0.0,"idv_type":"C","recipient":{"uei":"CMNQCL7FNKB1","display_name":"DRI + INC"}},{"key":"CONT_IDV_47QRCA26DA018_4732","piid":"47QRCA26DA018","award_date":"2026-01-21","description":"ONE + ACQUISITION SOLUTION FOR INTEGRATED SERVICES PLUS (OASIS+) 8(A) SMALL BUSINESS + MULTIPLE AGENCY CONTRACT (MAC)","total_contract_value":999999999999.0,"obligated":2500.0,"idv_type":"B","recipient":{"uei":"N6LCFMKNCNT5","display_name":"CHUGACH + SOLUTIONS ENTERPRISE, LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c4316d29c6d61a1-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=LxavUXBOLUK9EVBwDpBQ37sj%2FZtDBQpel35WMOGkYrjhsClltYwTUHXGGFol6Brh8qysVvNqOY0jKa2O%2FEkWlajZYtXC1B%2FRevdP%2F%2FrKyGRAAwtspB9bWDPPDXk%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3278' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.143s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '994' + x-ratelimit-burst-reset: + - '57' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999793' + x-ratelimit-daily-reset: + - '56029' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '994' + x-ratelimit-reset: + - '57' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestProductionSmokeWithCassettes.test_contract_cursor_pagination b/tests/cassettes/TestProductionSmokeWithCassettes.test_contract_cursor_pagination new file mode 100644 index 0000000..a9323bf --- /dev/null +++ b/tests/cassettes/TestProductionSmokeWithCassettes.test_contract_cursor_pagination @@ -0,0 +1,169 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/contracts/?limit=5&page=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":82287104,"next":"http://tango.makegov.com/api/contracts/?limit=5&page=1&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value&cursor=WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd","previous":null,"cursor":"WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd","previous_cursor":null,"results":[{"key":"CONT_AWD_15B51926F00000066_1540_36W79720D0001_3600","piid":"15B51926F00000066","award_date":"2026-01-25","description":"FCC + POLLOCK PHARMACY FRIDGE ITEMS","total_contract_value":163478.97,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_36C26226N0339_3600_36C26025A0006_3600","piid":"36C26226N0339","award_date":"2026-01-25","description":"PATIENT + BED MAINTENANCE SERVICE CONTRACT","total_contract_value":368125.0,"recipient":{"display_name":"LE3 + LLC"}},{"key":"CONT_AWD_36C24526N0261_3600_36C24526D0024_3600","piid":"36C24526N0261","award_date":"2026-01-25","description":"IDIQ + FOR WATER INTRUSION REPAIRS","total_contract_value":89975.0,"recipient":{"display_name":"VENERGY + GROUP LLC"}},{"key":"CONT_AWD_15B51926F00000065_1540_36W79720D0001_3600","piid":"15B51926F00000065","award_date":"2026-01-25","description":"FCC + POLLOC EPCLUSA","total_contract_value":52148.25,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_19JA8026P0451_1900_-NONE-_-NONE-","piid":"19JA8026P0451","award_date":"2026-01-25","description":"TOKYO-MINATO + WARD LAND PERMIT PAYMENT","total_contract_value":95432.2,"recipient":{"display_name":"MISCELLANEOUS + FOREIGN AWARDEES"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c428df59983114a-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 19:53:06 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vSYACAc2%2Fn8TfRvdVOmJ4dIpaA2%2BsSAnQ%2Bg4FJvPPgC6p4SNKWLgQA84tK3BW9vNFzwkcDgJhx5D6ZBC%2Brtrrs3fylXLZVObYeDRGLAyXC7xQrzxBdHB3jqRfwQ%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '1620' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.041s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '29' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999959' + x-ratelimit-daily-reset: + - '61635' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '29' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/contracts/?limit=5&cursor=WyIyMDI2LTAxLTI1IiwgImMwNmNjMTdlLWVhYjEtNTcxYi04M2ZiLWU2YTg1OTlkNTBmZiJd&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value + response: + body: + string: '{"count":82287104,"next":"http://tango.makegov.com/api/contracts/?limit=5&cursor=WyIyMDI2LTAxLTI0IiwgImZmZjE2N2QxLTE5MjctNWEyOC05NmJmLTExYWM0MGRmN2M3OCJd&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value","previous":"http://tango.makegov.com/api/contracts/?limit=5&cursor=eyJ2IjogWyIyMDI2LTAxLTI1IiwgImI4ZTA4N2U2LTAyZWQtNTkyZS04Yzc3LWY1NjI5NzZiYTNkNyJdLCAiZCI6ICJwcmV2In0%3D&shape=key%2Cpiid%2Caward_date%2Crecipient%28display_name%29%2Cdescription%2Ctotal_contract_value","cursor":"WyIyMDI2LTAxLTI0IiwgImZmZjE2N2QxLTE5MjctNWEyOC05NmJmLTExYWM0MGRmN2M3OCJd","previous_cursor":"eyJ2IjogWyIyMDI2LTAxLTI1IiwgImI4ZTA4N2U2LTAyZWQtNTkyZS04Yzc3LWY1NjI5NzZiYTNkNyJdLCAiZCI6ICJwcmV2In0=","results":[{"key":"CONT_AWD_36C78626N0155_3600_36C78624D0009_3600","piid":"36C78626N0155","award_date":"2026-01-25","description":"CONCRETE + GRAVE LINERS","total_contract_value":1980.0,"recipient":{"display_name":"WILBERT + FUNERAL SERVICES, INC."}},{"key":"CONT_AWD_15B51926F00000068_1540_36W79720D0001_3600","piid":"15B51926F00000068","award_date":"2026-01-25","description":"CONTROLLED + SUBS PO 3755","total_contract_value":5464.38,"recipient":{"display_name":"MCKESSON + CORPORATION"}},{"key":"CONT_AWD_36C24826P0388_3600_-NONE-_-NONE-","piid":"36C24826P0388","award_date":"2026-01-25","description":"IMPLANT + HIP","total_contract_value":172502.17,"recipient":{"display_name":"RED ONE + MEDICAL DEVICES LLC"}},{"key":"CONT_AWD_36C24826N0317_3600_36F79718D0437_3600","piid":"36C24826N0317","award_date":"2026-01-25","description":"WHEELCHAIR","total_contract_value":24108.3,"recipient":{"display_name":"PERMOBIL, + INC."}},{"key":"CONT_AWD_47QSSC26F37FG_4732_47QSEA21A0009_4732","piid":"47QSSC26F37FG","award_date":"2026-01-24","description":"BAG,PAPER + (GROCERS) 10-14 DAYS ARO","total_contract_value":71.26,"recipient":{"display_name":"CAPP + LLC"}}],"count_type":"approximate"}' + headers: + CF-RAY: + - 9c428df72b65114a-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 19:53:06 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YKHmVJbthFs4ESHbRKzDkkxKlg3eIMXGgPIE8je1JNdfiadrunCjplqfRnFH0D3K8tXAppMr%2BHdzRSJQZ2xodA0b%2BbT0bCeTreQ8twYk7woQnlXcGCBg127TOhA%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '1894' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.051s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '29' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999958' + x-ratelimit-daily-reset: + - '61635' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '29' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists b/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists new file mode 100644 index 0000000..1e09899 --- /dev/null +++ b/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists @@ -0,0 +1,1352 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42ec0a3cb7224f-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:57:19 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=HXfPsvGuwYgaEvjM6LEVD4ywddD23bqw%2FPJ%2BQikU39eljpq0RogUqhDJ7%2F6IaljAtBMoD%2B2r5q6T9v3xTr3K20i85A54plGF3Un6aEKTn3w%2FEIP%2Blwf9qFaa9XE%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.037s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999877' + x-ratelimit-daily-reset: + - '57781' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42ec0beef1224f-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:57:20 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=d6TreFmTx61O7ZQoUiHrnk5al%2BrjBGA9bAEbQieoIJsgI1vhvsK19J12MY802Waz8cBf6SxYpjMn0bC01MUNnfabh1N8wSRzOkpOq5YIKfI8AH5AIU4lZN7x9f4%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.023s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999876' + x-ratelimit-daily-reset: + - '57781' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42efac4a00a212-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:59:48 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CZdsKaBBxU7yY3SxrpgbrTkDJe9RelZSrbB%2BNNwfpiLOwr079Bvd1oPir5LqE3DT0XQWMF%2FfIweiyvLa2dc0BzfZx4w9yq7qBlUhuStPSGRozFdNUYYArMnX"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.056s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999869' + x-ratelimit-daily-reset: + - '57633' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42efad4c65a212-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:59:48 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=65YwFfVU12bsaheKRWYhBRQsnBKkOeo2C9vi99mNcmI1NBK1SljqT1hIVHm9yFPSrj8XbwPuobxMwzPSjArnUv%2FwLVkIT3k5zh9LdObTskQgS4SoobzBnocT"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.027s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999868' + x-ratelimit-daily-reset: + - '57633' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f550b9a78af6-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:03:39 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YdWUJ6deWMGXKJzG6kjRns9%2FU82%2FZcuG1%2BADpjfJ7zbnKOh8kU7lCCEZELwytVPEUBg85tilR8sdHeUtZmWqEk26FDwdK2RWcJPjCIY3af8S6xRjtCzg1x5nuYg%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.023s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '46' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999857' + x-ratelimit-daily-reset: + - '57402' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '46' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42f5518c7a8af6-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:03:39 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=HMob1Faw4y8K4NzsVfmKfs19lBHOYinELOHoOFq1PQniYm7J9Nch5GduTaqsYizp5MWBnW1ULmM7G3hTHDDF6mscsqzFyQlS5Ulydav91zOP1xDydE9bWQ%2BXNrM%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.043s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '46' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999856' + x-ratelimit-daily-reset: + - '57401' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '46' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f6e0697aac09-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:04:43 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=72Ri0kMedyt2Of4FnpqpswddPJrN4uMuZTQj86iQSTWpz2AHzmFW9ChFIZf%2B0BCZXBqAhPspbdVn03xjC858scroKVtmR7KNot2mu5WyBpwaWDx%2BVKpXRNtVvho%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.021s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '3' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999846' + x-ratelimit-daily-reset: + - '57338' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '3' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42f6e12a6fac09-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:04:43 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=9nXyZtGyy4srDTnrg%2FZS%2FWfpliFDs4mlieyg2AnMEJKnG%2Bx7BtEAgDSTGl9nnkKM9ifFJlbt41GzwMBLKKfd%2BPk5AugsoO%2BTayCW%2Fg0k3Y7De7gKTv%2BKIPSMfYw%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.039s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '994' + x-ratelimit-burst-reset: + - '3' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999845' + x-ratelimit-daily-reset: + - '57338' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '994' + x-ratelimit-reset: + - '3' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f9f0a86c76ed-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:06:49 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=goD1aLR%2F6dnH9%2FeQGmEVMp4rsf8%2Fnwh4gwb6WnE2R5mGo9VEx1qlvUwomzfcSKAqgaVtO31qyutRMoBUuwFdMzFiNKAjtiVY2h5l3s7PXBsoTXcGr5oY3cx0wps%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.023s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999837' + x-ratelimit-daily-reset: + - '57212' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42f9f1ab8276ed-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:06:49 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4Fmbowx3b7Qa3dYH%2FvrSQyEjUNrTAgBoPfJyVmhr%2F%2FwPoIgLNO2OBTjkzbv6MTuV7%2FI8Fx4gI9ka7BryGk9IScUBNiPOZvnVvo1jg%2BHq0qqUDDxbdn8do65LPp8%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.036s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999836' + x-ratelimit-daily-reset: + - '57212' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42fef0ffaf10ae-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:14 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=kljMYMR80BMglE7VRjIR3pZ8fntjEhJUuMTyD%2BxZSRRO49Mgj0rAgB%2BpAH%2FyoJYYXYerJh3VDgj3hV3xQdpY9keUrQ0wscsrBkCnKXSRrPdtNixEEmLlI%2BVE73k%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.030s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999829' + x-ratelimit-daily-reset: + - '57007' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42fef2499a10ae-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:14 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=FRDlWebxQnLdIxhIkCcRxCheWWTqyQMcdIzSjoG62i7QDk2RyN%2BghxG7Ez6o%2FKxuCm6SEgdrJdghiwa6MtvEHGXRvnBIp%2BCPskBZX3e9GVOfXRpj%2FaRYOaULkTI%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.043s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999828' + x-ratelimit-daily-reset: + - '57007' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42ff5e9c1fa224-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=NvP9aI5BKRYHwJ%2BUGxcSZKuxuJvNAvaLR%2BwIPWxN8Zqwxbq5aKK1Ix6SE7t%2B7Z11YamzUkI%2BfThKLUTmGVp5z66eX4aQrT6LgrAboF9S4tmNuRPvjEIE9v2S"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.022s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '990' + x-ratelimit-burst-reset: + - '42' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999821' + x-ratelimit-daily-reset: + - '56990' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '990' + x-ratelimit-reset: + - '42' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c42ff5f5cfda224-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=QreJ%2FLa36Q461hOXjNktPogElHOIQfkydsu9hKKzO6CDr5A%2FjxS6Y7le%2BG0%2Bo9UB9V%2BPAimJznKYCxUzLYyGuYf%2F%2Bu29DHTijvm%2BRMVC2bO1Hb0hn13sm3D9"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.036s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '989' + x-ratelimit-burst-reset: + - '42' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999820' + x-ratelimit-daily-reset: + - '56990' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '989' + x-ratelimit-reset: + - '42' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c43137eceaae8ea-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:15 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=kyFaOHzGnEK%2FYXfNmMWx%2Bjysmibc0layVKeLB9gKzdj8ZEgZ6culInOqPUdoxiqoyJ73dsuSeK9woso%2F1WtB6rDTyDGw%2BmFGPuLMx%2BVDPrOa9krp9G%2BnuyE89b0%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.043s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999813' + x-ratelimit-daily-reset: + - '56165' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c43137fb9d0e8ea-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:16 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=WIWi9DQwmpr98zNkyRTaLI9I%2FmWO6b2rwynyhdZk6KY991v%2FC8F5%2FQb4D16CYFiFhnx%2BQ%2B%2F2Ut6OG95i5nbiufIxgaB%2BU7zkXM33WZLpQmmBJlnFFeJjzGYm0zE%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.052s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999812' + x-ratelimit-daily-reset: + - '56165' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c4316ca0fd15314-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=sVqOlIe1dhvSXdO%2FoFCfNgTdZfGIV%2FByF6bANHtD9xZP97bRQa9syyZK%2BWjzdSPwlt5a%2FA6sZm7%2BxbocEV59vO%2BhRmv4aQYsktUVzGxFD2ZIjaUrHIJHAV%2FknWg%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.316s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '998' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999797' + x-ratelimit-daily-reset: + - '56030' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '998' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/?shape=uuid%2Copportunity%28title%29&flat=true&joiner=__&flat_lists=true + response: + body: + string: '{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","opportunity__title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS"}' + headers: + CF-RAY: + - 9c4316cc9f775314-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=INFTbt3AgFYdlq%2B9VQ7%2BNGNJcuAA%2BSnRfnCH6sIOCxg92oRMSn2PYYh%2BiS7qQjfaWu1ScKXnSPym7ocI%2BMK7aL2c6qslBZKOmDdN7QDa80kG3nvTpvM3u3%2FcPz0%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '161' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.048s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999796' + x-ratelimit-daily-reset: + - '56030' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape b/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape new file mode 100644 index 0000000..362f114 --- /dev/null +++ b/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape @@ -0,0 +1,1505 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42ec0d6a9d22f2-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:57:20 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=y3DsJyUFe2TuARtGz6e92R3MPSrN2X6VWVQDGSuTyM5%2FRNsr8gCbKSX3kyjWImFegehT60gNT9Rr5W2s9WKmkkEWSXVucfjZ4dNVetvM6bgrLtNL81TCC%2BLTYuY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.030s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999875' + x-ratelimit-daily-reset: + - '57781' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42ec0e5bd022f2-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:57:20 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=LVHu2Ux6qHItTmsgSAgwyDVfik0ei5Vbpp9q3yXROX70F5ltN4cyKA7EOaD6lYIj4HzP1jXOlmpcP25znCJrJx4gPPgoYZGIknO6XKTrhV2sL9EJL0pE9K5uylA%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.055s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999874' + x-ratelimit-daily-reset: + - '57781' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42efae7ed9a206-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:59:48 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Hxv%2BoiHzN57PuugErOwBO6949jBnd1F3C5enFAoLNBVwSvxNogu75B4Vfd4idoaSshCt2tL6FV%2BwkenYWnr1Iix7PZLBNrKInzd81vf%2FMM%2ByW%2FvWzr1P%2B3t7"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.024s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999867' + x-ratelimit-daily-reset: + - '57632' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42efaf483aa206-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:59:49 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CKK9DfxqArUGTDHKsrtnwQ6G2L3xhPeST7tbk%2FVw%2F%2Fqefb%2FSO4KVhOwZ49r%2FSfLLMs4kQRGcyx1StUouJ%2FPIwH8ULdySl4bXBSbYXS%2BLZMMVDvdpWw0wlRyD"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.114s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999866' + x-ratelimit-daily-reset: + - '57632' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f5535cddeff9-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:03:40 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=EkcU2tq1UQIYm9cFoeCDnzME%2FSR%2BpUGGr50FWxb8OkVjcKWpFHWfCT6nGvRTySnwkXyPYnAyuJEy18dbUz%2FzqNwGqJj3hEEqSuGySDI9DADm2bvYqhYuGz1Pjns%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.021s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '994' + x-ratelimit-burst-reset: + - '46' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999855' + x-ratelimit-daily-reset: + - '57401' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '994' + x-ratelimit-reset: + - '46' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42f5542fdbeff9-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:03:40 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mP%2FzW1b9j29cfFB66UZe1kBnDBvWm6dD0k8wTMvwJ3S5CZhmFfxHdGRhqyMnoPbauLdJ2I%2B%2BMWfZwb8DhNbTxwRsqlVvR1NcrBtP77Z%2F2tmgFO8gUYnE0txmQMw%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.099s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '993' + x-ratelimit-burst-reset: + - '45' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999854' + x-ratelimit-daily-reset: + - '57401' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '993' + x-ratelimit-reset: + - '45' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f6e2ec1c7769-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:04:44 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=r%2FYAtdqSlOIhFk0s9MPvRkFopL5oO0A8OC%2FlMzLPaQfKNC6rLoTQHB4yxHD17nlCDMoru4qW1MQ2bStcZp6F6ZEB4LXulfgEVmGklXgbf8wHoBSFQ4vwdABcU0U%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.022s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '993' + x-ratelimit-burst-reset: + - '2' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999844' + x-ratelimit-daily-reset: + - '57337' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '993' + x-ratelimit-reset: + - '2' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42f6e3af187769-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:04:44 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ajSYys%2FtFeFHhauEWfQGhEqs7v%2F80gwil71aXzIqY8x8gq8N4oVvcYFEsSMg0Zp8OH1Kn4ynRq%2F4HydvZGQ5K%2FJitPm7YB8QBHJCu%2Bz3dR6enGN0Lgp3qZxhBqc%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.061s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '992' + x-ratelimit-burst-reset: + - '2' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999843' + x-ratelimit-daily-reset: + - '57337' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '992' + x-ratelimit-reset: + - '2' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42f9f30deaa1fa-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:06:49 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vaUzRGeAVdHZ6UGlDxYCq1FDESeTvIH3dlIv2gs2%2FEnUdUXR2YmOCRCJwoLEFwPAfEcBX%2BmdhtTNJ8QcxByBnch%2FJ%2BpHosOvzj9Jm3PKtHPI11tGzb%2F%2Bi%2B4s"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.023s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999835' + x-ratelimit-daily-reset: + - '57212' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42f9f3bf7ea1fa-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:06:49 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CguTArOZfgBzTHnFo8fLJ0Ofyq2DAuTbV95j9v3QT2J%2Ff5KkXoY%2FUSOz60VyNHWzK6SCyKPzUjtt2jx4C7SH5SbFv9%2B9LjY1fYBamOP74Dt9cNdpmSj4ukVS"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.055s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999834' + x-ratelimit-daily-reset: + - '57212' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42fef3fb641259-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:14 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=xLo3MaQuS2BtJAieypg4wV3QRiAxasRHjvHjCmkWdq9RWAN3onXfhK79OpFMX1vn9tPLoPa9%2FqFPrCu%2BuRNks8%2B66G3ei7uW1T7nYespflCDoFL8Dzm90ZWF4BY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.038s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999827' + x-ratelimit-daily-reset: + - '57007' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42fef4fc7a1259-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:14 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4DVZrUd1gFWkOQNmNPFRMqeVGxXKWta1cr%2FNeSKxM7qsGYdHIRJ7RO0zsjH86T%2F9NYgPHpmzQTOZJQuoMXCO4RcpsOXQkIvYtX6TniG%2F6HszRf0clCG%2FEXWdmAk%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.070s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999826' + x-ratelimit-daily-reset: + - '57007' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c42ff60fde19d42-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=k3iVYztqUcguh89MxyY75%2F0Dx0ykrB8Oqn5DWnB5S4WDSmM9qAsczp93cL3Pfu9fHaAXBUcWlWxL6xlrlkBh8WHILXUaFETngX1KpyRbyGfARv8K9Gv2jeHRguw%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.032s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '988' + x-ratelimit-burst-reset: + - '41' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999819' + x-ratelimit-daily-reset: + - '56989' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '988' + x-ratelimit-reset: + - '41' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c42ff61d8c99d42-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:32 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=WLh43ySkfMdYb7hqLyb4C2ZhnQZhNa4XjJfAsrBf920dLrUGbEilrZaOtxqiCQU5CWaahonaPVO9gcsfLgF1wL4lGc1hIb8SZ1VrRvZ6FYaTUv5%2FDbTwKRFWzCs%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.053s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '987' + x-ratelimit-burst-reset: + - '41' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999818' + x-ratelimit-daily-reset: + - '56989' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '987' + x-ratelimit-reset: + - '41' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c43138228256194-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:16 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=L3eQbWp%2FbBtivQcCX2dhIpV1DQ1kqvs810AWNAcr46guTgqoqMZ0VzkMzg8EWNKbdJpnp0s3gxVLTCGigPHnw9V0jgXxYpZuOa4sOFj8qMQgNAVyWVi2BucmSgE%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.032s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999811' + x-ratelimit-daily-reset: + - '56165' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c43138399706194-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:16 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=f4NSNdRPw7Ke3uTg5LaixhAiIz4FQzs6fe6T52eEEz9n5jYlmfDBJD0sdMhRgAw03Eix3smrM3deW9YvjD9xIBF08hRKCStBT1ukt8CqmE7JDux7%2BpgTJxDtblY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.083s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999810' + x-ratelimit-daily-reset: + - '56165' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=1&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date + response: + body: + string: '{"count":5706,"next":"http://tango.makegov.com/api/vehicles/?limit=1&page=2&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"84d76669-61d8-5938-83fb-2d6f8a6c85b7","solicitation_identifier":"0","organization_id":"f6c88e61-3d34-5685-a5ab-670858289883","awardee_count":38,"order_count":65,"vehicle_obligations":8876449.66,"vehicle_contracts_value":9688796.56,"solicitation_title":"X1LZ--618-20-2-6190-0007 + - Service - Minneapolis VA CRRC Parking, 33 Parking Spaces - MPLS","solicitation_date":"2020-03-02"}]}' + headers: + CF-RAY: + - 9c4316ceddf260a2-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=aNGXCsCVXN3UFaB4Hmvuqgx%2FTFOM1QYtAZqihSV6cw%2FQT4DZ0%2Fb2673jXuuDFIiWsL%2FIUaGVQNBvi2K7TnFlqpq8wphApndhRCJ0qXYcdLpIZa3TAvKnZE9Ke5o%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '667' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.021s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '996' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999795' + x-ratelimit-daily-reset: + - '56030' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '996' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?page=1&limit=10&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29 + response: + body: + string: '{"count":38,"next":"http://tango.makegov.com/api/vehicles/84d76669-61d8-5938-83fb-2d6f8a6c85b7/awardees/?limit=10&page=2&shape=uuid%2Ckey%2Cpiid%2Caward_date%2Ctitle%2Corder_count%2Cidv_obligations%2Cidv_contracts_value%2Crecipient%28display_name%2Cuei%29","previous":null,"results":[{"uuid":"d3eec2d2-f46d-5f3a-a2b3-da474202982d","key":"CONT_IDV_36C24925A0044_3600","piid":"36C24925A0044","award_date":"2025-02-26","title":null,"order_count":2,"idv_obligations":97177.1,"idv_contracts_value":97177.1,"recipient":{"uei":"HPNGJJKW7NZ3","display_name":"MIM + SOFTWARE INC"}},{"uuid":"6b35e54e-cdd7-547a-9912-4f32889904ee","key":"CONT_IDV_36C24923A0055_3600","piid":"36C24923A0055","award_date":"2023-09-21","title":"LEXINGTON + VAMC AMOS CONSIGNMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"4734026e-f902-5e4d-ae05-2625e9ee09b3","key":"CONT_IDV_36C10X23A0024_3600","piid":"36C10X23A0024","award_date":"2023-09-19","title":"HR + SUPPORT SERVICES","order_count":2,"idv_obligations":929714.8,"idv_contracts_value":931419.55,"recipient":{"uei":"WRHHNUK5YBN1","display_name":"RIVIDIUM + INC."}},{"uuid":"a2304733-ca28-5157-b800-ace63deb1f79","key":"CONT_IDV_36C24723A0033_3600","piid":"36C24723A0033","award_date":"2023-06-23","title":"CONSIGNMENT + INVENTORY","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"KP5EVFMHUAN1","display_name":"ABBOTT + LABORATORIES INC."}},{"uuid":"8a721329-40f9-5ca3-858d-ed9a067371f2","key":"CONT_IDV_36C26022A0045_3600","piid":"36C26022A0045","award_date":"2022-09-12","title":"INTRA + OCULAR LENSE CONSIGNMENT AGREEMENT","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"G8XGKTUWPM14","display_name":"AMO + SALES AND SERVICE, INC."}},{"uuid":"113dac46-3903-5889-9fc1-d4a58c01c591","key":"CONT_IDV_36C24122A0070_3600","piid":"36C24122A0070","award_date":"2022-03-17","title":"BLANKET + PURCHASE AGREEMENT FOR SUPPLIES NATIONWIDE VHA","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"L3CLKHB2VE24","display_name":"SAGE + PRODUCTS, LLC"}},{"uuid":"040283f5-ed08-5434-9df4-907c7af62e4f","key":"CONT_IDV_36C25022A0009_3600","piid":"36C25022A0009","award_date":"2021-10-01","title":"COOK + MEDICAL LLC CONSIGNMENT - IMPLANTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"GG39AE315NK5","display_name":"COOK + MEDICAL LLC"}},{"uuid":"7fe6ae99-081f-5be6-bd03-6a9bbf354980","key":"CONT_IDV_36C25021A0056_3600","piid":"36C25021A0056","award_date":"2021-03-23","title":null,"order_count":5,"idv_obligations":128048.14,"idv_contracts_value":164888.14,"recipient":{"uei":"STNDUK44ENE8","display_name":"POLYMEDCO + LLC"}},{"uuid":"3ab4321d-76a5-58c2-aaf6-85321ccd1bc1","key":"CONT_IDV_36C24821A0018_3600","piid":"36C24821A0018","award_date":"2021-03-17","title":"STERNAL + PLATES AND SCREWS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"JB1EA2TU8V88","display_name":"BIOMET + MICROFIXATION, LLC"}},{"uuid":"141b0632-e12b-5ac8-a862-869bc1bd9f87","key":"CONT_IDV_36C24821A0016_3600","piid":"36C24821A0016","award_date":"2021-02-15","title":"CONSIGNMENT + AGREEMENT - PERIPHERAL VASCULAR EMBOLIZATION PRODUCTS","order_count":0,"idv_obligations":0.0,"idv_contracts_value":0.0,"recipient":{"uei":"QLC9LYKADGX5","display_name":"PENUMBRA, + INC."}}]}' + headers: + CF-RAY: + - 9c4316cfbeaf60a2-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=NLz29nCCLbZdkOu04laH2zoOFLJhhoad3MuKYTBjGd7Qn39Zvg8fVGHL43UjrIc4WMVm9r5kOejXDyw5tpMgYLq9HLRPk8U62srSEyNbn1KIHFbE3ql%2F3Pnq1o4%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '3417' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.162s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '58' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999794' + x-ratelimit-daily-reset: + - '56029' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '58' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search b/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search new file mode 100644 index 0000000..1d248a8 --- /dev/null +++ b/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search @@ -0,0 +1,812 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42ec08288b6157-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:57:19 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Vd5G0eTbThOypHfG5zl75MpwYZWDHyRWvY7BJ1jSR52vmz%2FAuyM3Ouz%2BHFvw16AwFXPIvYzWbEtXsSjavguf1A6yDTelC9Xg4fh3DOaBJ5AOVVj2j2Awk5Rpm7Q%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.024s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999878' + x-ratelimit-daily-reset: + - '57782' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42efaa397afc89-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 20:59:48 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=IW0sLspMYzZonWLlDxjK33jd%2BROxCnqBO5v1j0XYccssgisfHcCBuioe2e5Bgpih2aOphdQnyVHhKdoZise9BZogocHGNlsni%2FOTC1ELV%2BM6e%2BJMq2hYJ6Cq"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.037s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999870' + x-ratelimit-daily-reset: + - '57633' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42f54f0da8880c-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:03:39 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=DbIa7dUkJt8Rrsci9%2FKRosRY85aG7QgNvDg2ZK0Cv6i2mTDevQeWzfp5oJmRzIwK%2F9A3t8V0vTFXBQtWzrCP7SpDNEA6xdX2HBNn2RVKj%2FhcA8nqpejmQXbE08k%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.041s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '997' + x-ratelimit-burst-reset: + - '46' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999858' + x-ratelimit-daily-reset: + - '57402' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '997' + x-ratelimit-reset: + - '46' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42f6deb8f3ac5a-YYZ + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:04:43 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=GCRp3pPcG27pisclDNFBb0MQuNWx%2FA0GmBEWrpms4q5yvak4McPo0AsOrnFGt8lpe0MnYzJmHCOwCmM7KQ0ym1zlA1QAp2Qo%2BjnJ1aqK8lpQVzOGII%2FF160wW3Q%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.032s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '995' + x-ratelimit-burst-reset: + - '0' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999847' + x-ratelimit-daily-reset: + - '57338' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '995' + x-ratelimit-reset: + - '0' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42f9ee28e6b45f-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:06:48 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=xzdI3nNezC0tkpinOPliSFNMkeYJjhet2tQzcU0u0dcJ4G4aZ7OAKv8xzybr8hROUDzuOZ1x6RBTQJNFCa9OT%2FWu3zBQRvCpD40jP%2FVugHOGXfUYyvnyeKJv"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.032s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999838' + x-ratelimit-daily-reset: + - '57212' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42feeeaee1a20d-MSP + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:13 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vXpDAGdkO9Q4%2BpDoHq7eiyNuIsl8pN0s1hsnAV2iVp4DkAR0wrYYuEFpuynDIzGV0274Ym5f%2FYcKmMWUsXxN2nYsfZTcpnp75aF0JcpqgHgbaMALzf7atNHF"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.043s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999830' + x-ratelimit-daily-reset: + - '57008' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c42ff5d48dfe8fb-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:10:31 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=uvXloYasFnOGONEkPRAKiiK1IOuWnOX5ge3O%2F%2FMU4jmAilThkrzF82XHceOML0PXYDD4hpNtROjD%2FYCfqipwd3EdRG66Kyh%2B765sShYsHe%2BDwSXfX%2FKmRYbpHvo%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.025s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '991' + x-ratelimit-burst-reset: + - '42' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999822' + x-ratelimit-daily-reset: + - '56990' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '991' + x-ratelimit-reset: + - '42' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c43137bcb037a66-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:24:15 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=kw8DCODSDwJpH1z0uqHHAtJBPaJpND1VbZ4XAFMlebD%2BW95hAtOGMBlDt192yl2I5QtO%2B%2B2bWsVie%2FqeAAIaIe2kfe25%2BRDKvCKCyDKSp9oWsVCxgAUGpQkzbVQ%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.074s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999814' + x-ratelimit-daily-reset: + - '56166' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - tango.makegov.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://tango.makegov.com/api/vehicles/?page=1&limit=10&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date&search=GSA + response: + body: + string: '{"count":33,"next":"http://tango.makegov.com/api/vehicles/?limit=10&page=2&search=GSA&shape=uuid%2Csolicitation_identifier%2Corganization_id%2Cawardee_count%2Corder_count%2Cvehicle_obligations%2Cvehicle_contracts_value%2Csolicitation_title%2Csolicitation_date","previous":null,"results":[{"uuid":"4b755976-75c2-573a-bd3a-92147261df2f","solicitation_identifier":"47PB0023R0012","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":24,"order_count":47,"vehicle_obligations":22150617.51,"vehicle_contracts_value":22150617.51,"solicitation_title":"GSA + Region 1 Construction IDIQ - North/Boston/South Zones","solicitation_date":"2023-06-30"},{"uuid":"59cee065-88e2-5a98-be93-004df7e23d18","solicitation_identifier":"47PB0023R0059","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":18,"vehicle_obligations":1076051.76,"vehicle_contracts_value":1118930.13,"solicitation_title":"Architectural + and Engineering Multiple Award IDIQ New England","solicitation_date":"2023-09-13"},{"uuid":"e2e29269-a44e-5490-85a7-c3bba68964cb","solicitation_identifier":"47PC0318R0003","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":0,"vehicle_obligations":0.0,"vehicle_contracts_value":0.0,"solicitation_title":"R&A + IDIQ Puerto Rico and U.S. Virgin Islands","solicitation_date":"2018-04-17"},{"uuid":"62779c22-7aa4-5b4b-8a20-b15e5e088e5e","solicitation_identifier":"47PC0319N0002","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":8,"order_count":82,"vehicle_obligations":102363485.57,"vehicle_contracts_value":129262449.49,"solicitation_title":"Architect-Engineer + Services for Multiple-Award Indefinite Delivery Indefinite Quantity Contracts","solicitation_date":"2019-05-31"},{"uuid":"5e617570-c22e-52a8-b8fa-2be1e421edf3","solicitation_identifier":"47PD0222R0035","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":15,"order_count":26,"vehicle_obligations":89066346.86,"vehicle_contracts_value":96045297.22,"solicitation_title":"Multiple + Award Indefinite Delivery Indefinite Quantity (IDIQ) for General Construction + Services in the East Coast Corridor of PBS Region 3","solicitation_date":"2022-04-20"},{"uuid":"2db26c00-0be0-5220-a275-21d83b06086d","solicitation_identifier":"47PE0119R0001","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":103,"vehicle_obligations":21159088.16,"vehicle_contracts_value":21391358.12,"solicitation_title":"GSA, + PBS Region 4 A&E Services IDIQ (Synopsis Issued 10/19/2018; Solicitation Issued + 11/07/2018; Offer Due Date 12/7/2018; Technical Evaluations 12/10/2018 through + 12/14/2018; Pricing Phase; 12/20/2018; Award; 05/24/2019)","solicitation_date":"2018-10-19"},{"uuid":"c77fc373-4a44-5431-ba2c-723bb1606d0c","solicitation_identifier":"47PE0719R0007","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":3,"order_count":128,"vehicle_obligations":6560553.83,"vehicle_contracts_value":6564627.87,"solicitation_title":"Multiple + Award Indefinite-Delivery Indefinite Quantity Term Construction Contracts + for Florida","solicitation_date":"2018-11-01"},{"uuid":"1e2a03d2-244c-5bc1-a960-79da9fc0efa8","solicitation_identifier":"47PF0018R0061","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":7,"order_count":238,"vehicle_obligations":22366820.83,"vehicle_contracts_value":22500989.68,"solicitation_title":"Northern + Service Center Operations Division (NSCOD) Indefinite Delivery Indefinite + Quantity (IDIQ) Contracts for Architectural and Engineering Services (A/E)","solicitation_date":"2018-04-09"},{"uuid":"04975c1d-2e2e-5fd8-a32f-770893fd6a76","solicitation_identifier":"47PF0019R0083","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":4,"order_count":64,"vehicle_obligations":974694.11,"vehicle_contracts_value":974694.11,"solicitation_title":"R5 + Space Planning and Interior Design Services Indefinite Delivery Indefinite + Quantity (IDIQ) Procurement","solicitation_date":"2019-08-01"},{"uuid":"87ac1077-87f0-5bd6-91c0-5681c7077923","solicitation_identifier":"47PF0020R0004","organization_id":"17417361-31f1-5514-9623-5ef7b0ae02db","awardee_count":6,"order_count":159,"vehicle_obligations":22195074.62,"vehicle_contracts_value":22684204.36,"solicitation_title":"GSA + Region 5 Supplemental Architect & Engineering Services IDIQ","solicitation_date":"2019-12-18"}]}' + headers: + CF-RAY: + - 9c4316c41a4a61d9-ORD + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Mon, 26 Jan 2026 21:26:30 GMT + Nel: + - '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}' + Report-To: + - '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=VjkpxlNc06ToORJqtzsiQ%2BvkskmCULPG%2FlTpXCaHP%2BELiwug1HMSQ%2BlRhnuamTae61juZCkr3QTeqzMeDad%2BMeCg9YWKvrtWIlUCmbjxtuKmvzhSY6sI7tklc%2FY%3D"}]}' + Server: + - cloudflare + Transfer-Encoding: + - chunked + allow: + - GET, HEAD, OPTIONS + cf-cache-status: + - DYNAMIC + content-length: + - '4418' + cross-origin-opener-policy: + - same-origin + referrer-policy: + - same-origin + vary: + - Accept, Cookie + x-content-type-options: + - nosniff + x-execution-time: + - 0.605s + x-frame-options: + - DENY + x-ratelimit-burst-limit: + - '1000' + x-ratelimit-burst-remaining: + - '999' + x-ratelimit-burst-reset: + - '59' + x-ratelimit-daily-limit: + - '2000000' + x-ratelimit-daily-remaining: + - '1999798' + x-ratelimit-daily-reset: + - '56031' + x-ratelimit-limit: + - '1000' + x-ratelimit-remaining: + - '999' + x-ratelimit-reset: + - '59' + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/test_contracts_integration.py b/tests/integration/test_contracts_integration.py index 94b3140..6babc7e 100644 --- a/tests/integration/test_contracts_integration.py +++ b/tests/integration/test_contracts_integration.py @@ -168,9 +168,7 @@ def test_search_contracts_with_filters(self, tango_client): - Results match the filter criteria """ # Create search filters with just date range (award_amount filter may not work as expected) - filters = SearchFilters( - page=1, limit=5, award_date_gte="2023-01-01", award_date_lte="2023-12-31" - ) + filters = SearchFilters(limit=5, award_date_gte="2023-01-01", award_date_lte="2023-12-31") response = tango_client.list_contracts(filters=filters) @@ -215,9 +213,9 @@ def test_list_contracts_with_naics_code_filter(self, tango_client): # Verify that filtered results have fewer or equal count than baseline # (The filter should reduce the result set) - assert ( - filtered_response.count <= baseline_count - ), f"Filtered count ({filtered_response.count}) should be <= baseline count ({baseline_count})" + assert filtered_response.count <= baseline_count, ( + f"Filtered count ({filtered_response.count}) should be <= baseline count ({baseline_count})" + ) # If we have results, validate them if filtered_response.results: @@ -385,9 +383,7 @@ def test_sort_and_order_mapped_to_ordering(self, tango_client, order, expected_p - Sort and order parameters are correctly combined - Ascending order has no prefix, descending has '-' prefix """ - response = tango_client.list_contracts( - sort="award_date", order=order, limit=5 - ) + response = tango_client.list_contracts(sort="award_date", order=order, limit=5) validate_pagination(response) assert len(response.results) > 0 @@ -400,11 +396,13 @@ def test_new_pop_date_filters(self, tango_client): Validates: - New POP date filters work without errors - Filters can be combined - + Note: This test is skipped because POP date queries are very slow (>30s timeout) and cause test timeouts. The filter functionality is validated by other tests. """ - pytest.skip("POP date filters cause slow API responses (>30s), skipping to avoid test timeouts") + pytest.skip( + "POP date filters cause slow API responses (>30s), skipping to avoid test timeouts" + ) @handle_api_exceptions("contracts") def test_new_expiring_filters(self, tango_client): @@ -427,9 +425,7 @@ def test_new_fiscal_year_range_filters(self, tango_client): Validates: - Fiscal year range filters work correctly """ - response = tango_client.list_contracts( - fiscal_year_gte=2020, fiscal_year_lte=2024, limit=5 - ) + response = tango_client.list_contracts(fiscal_year_gte=2020, fiscal_year_lte=2024, limit=5) validate_pagination(response) # Should work without errors @@ -486,3 +482,58 @@ def test_combined_filters_work_together(self, tango_client): validate_pagination(response) # Multiple filters should work together + + @handle_api_exceptions("contracts") + def test_contract_cursor_pagination(self, tango_client): + """Test cursor-based pagination for contracts + + Validates: + - First page returns a cursor + - Cursor can be used to get next page + - Different pages return different results + - Cursor is None on last page + + Note: This test requires a VCR cassette. To record it, run: + TANGO_REFRESH_CASSETTES=true TANGO_API_KEY=your-key pytest tests/integration/test_contracts_integration.py::TestContractsIntegration::test_contract_cursor_pagination + """ + # Get first page + page1 = tango_client.list_contracts(limit=5) + validate_pagination(page1) + assert page1.count > 0, "Expected at least one contract" + assert len(page1.results) > 0, "Expected results in first page" + + # Verify cursor is present (unless it's the last page) + if page1.next: + assert page1.cursor is not None, "Cursor should be present when next page exists" + else: + # If no next page, cursor may be None + pass + + # If we have a cursor, use it to get the next page + if page1.cursor: + page2 = tango_client.list_contracts(cursor=page1.cursor, limit=5) + validate_pagination(page2) + assert len(page2.results) > 0, "Expected results in second page" + + # Verify pages have different results + if page1.results and page2.results: + # Get contract keys (unique identifiers) + contract1_key = ( + page1.results[0].get("key") + if isinstance(page1.results[0], dict) + else getattr(page1.results[0], "key", None) + ) + contract2_key = ( + page2.results[0].get("key") + if isinstance(page2.results[0], dict) + else getattr(page2.results[0], "key", None) + ) + + assert contract1_key is not None, "First contract should have a key" + assert contract2_key is not None, "Second contract should have a key" + assert contract1_key != contract2_key, ( + "Different pages should have different results" + ) + + # Verify total count is consistent + assert page1.count == page2.count, "Total count should be the same across pages" diff --git a/tests/integration/test_vehicles_idvs_integration.py b/tests/integration/test_vehicles_idvs_integration.py new file mode 100644 index 0000000..7184870 --- /dev/null +++ b/tests/integration/test_vehicles_idvs_integration.py @@ -0,0 +1,467 @@ +"""Integration tests for Vehicles and IDV endpoints + +Pytest Markers: + @pytest.mark.integration: Marks tests as integration tests that may hit external APIs + @pytest.mark.vcr(): Enables VCR recording/playback for HTTP interactions + @pytest.mark.live: Forces tests to use live API (skip cassettes) - not used by default + @pytest.mark.cached: Forces tests to only run with cached responses - not used by default + @pytest.mark.slow: Marks tests that are slow to execute - not used by default + +Usage: + # Run all integration tests (uses cassettes if available) + pytest tests/integration/ + + # Run only vehicles/IDV integration tests + pytest tests/integration/test_vehicles_idvs_integration.py + + # Run with live API (requires TANGO_API_KEY environment variable) + TANGO_USE_LIVE_API=true TANGO_API_KEY=xxx pytest tests/integration/test_vehicles_idvs_integration.py + + # Refresh cassettes (re-record all interactions) + TANGO_REFRESH_CASSETTES=true TANGO_API_KEY=xxx pytest tests/integration/test_vehicles_idvs_integration.py +""" + +from datetime import date +from decimal import Decimal + +import pytest + +from tests.integration.conftest import handle_api_exceptions +from tests.integration.validation import validate_no_parsing_errors, validate_pagination + + +@pytest.mark.vcr() +@pytest.mark.integration +class TestVehiclesIntegration: + """Integration tests for Vehicles endpoints using production data""" + + @handle_api_exceptions("vehicles") + def test_list_vehicles_uses_default_shape_and_search(self, tango_client): + """Test listing vehicles with default shape and search parameter + + Validates: + - Default shape is applied + - Search parameter is passed correctly + - Vehicles are parsed correctly with proper types + """ + response = tango_client.list_vehicles(search="GSA", limit=10) + + # Validate response structure + validate_pagination(response) + assert len(response.results) > 0, "Expected at least one vehicle" + + # Validate first vehicle + vehicle = response.results[0] + validate_no_parsing_errors(vehicle) + + # Verify required fields are present + assert vehicle.get("uuid") is not None or hasattr(vehicle, "uuid"), ( + "Vehicle uuid should be present" + ) + assert vehicle.get("solicitation_identifier") is not None or hasattr( + vehicle, "solicitation_identifier" + ), "Vehicle solicitation_identifier should be present" + + # Verify type parsing + if vehicle.get("vehicle_obligations") is not None or ( + hasattr(vehicle, "vehicle_obligations") and vehicle.vehicle_obligations is not None + ): + obligations = ( + vehicle.get("vehicle_obligations") + if isinstance(vehicle, dict) + else vehicle.vehicle_obligations + ) + assert isinstance(obligations, Decimal), "vehicle_obligations should be Decimal" + + if vehicle.get("solicitation_date") is not None or ( + hasattr(vehicle, "solicitation_date") and vehicle.solicitation_date is not None + ): + solicitation_date = ( + vehicle.get("solicitation_date") + if isinstance(vehicle, dict) + else vehicle.solicitation_date + ) + assert isinstance(solicitation_date, date), "solicitation_date should be date" + + @handle_api_exceptions("vehicles") + def test_get_vehicle_supports_joiner_and_flat_lists(self, tango_client): + """Test getting a single vehicle with joiner and flat_lists parameters + + Validates: + - Shape parameter is passed correctly + - flat, flat_lists, and joiner parameters work correctly + - Vehicle is parsed correctly + """ + # First, get a vehicle UUID from listing + list_response = tango_client.list_vehicles(limit=1) + if not list_response.results: + pytest.skip("No vehicles available to test get_vehicle") + + vehicle_uuid = ( + list_response.results[0].get("uuid") + if isinstance(list_response.results[0], dict) + else list_response.results[0].uuid + ) + assert vehicle_uuid is not None, "Vehicle UUID should be present" + + # Test with flat, flat_lists, and joiner + vehicle = tango_client.get_vehicle( + vehicle_uuid, + shape="uuid,opportunity(title)", + flat=True, + flat_lists=True, + joiner="__", + ) + + validate_no_parsing_errors(vehicle) + assert vehicle.get("uuid") is not None or hasattr(vehicle, "uuid"), ( + "Vehicle uuid should be present" + ) + + # If opportunity is present, verify it's accessible + if vehicle.get("opportunity") is not None or ( + hasattr(vehicle, "opportunity") and vehicle.opportunity is not None + ): + opportunity = ( + vehicle.get("opportunity") if isinstance(vehicle, dict) else vehicle.opportunity + ) + if isinstance(opportunity, dict): + assert "title" in opportunity or hasattr(opportunity, "title") + + @handle_api_exceptions("vehicles") + def test_list_vehicle_awardees_uses_default_shape(self, tango_client): + """Test listing vehicle awardees with default shape + + Validates: + - Default shape is applied + - Awardees are parsed correctly with proper types + """ + # First, get a vehicle UUID from listing + list_response = tango_client.list_vehicles(limit=1) + if not list_response.results: + pytest.skip("No vehicles available to test list_vehicle_awardees") + + vehicle_uuid = ( + list_response.results[0].get("uuid") + if isinstance(list_response.results[0], dict) + else list_response.results[0].uuid + ) + assert vehicle_uuid is not None, "Vehicle UUID should be present" + + response = tango_client.list_vehicle_awardees(vehicle_uuid, limit=10) + + # Validate response structure + validate_pagination(response) + + # If we have results, validate them + if response.results: + awardee = response.results[0] + validate_no_parsing_errors(awardee) + + # Verify required fields + assert awardee.get("key") is not None or hasattr(awardee, "key"), ( + "Awardee key should be present" + ) + + # Verify type parsing + if awardee.get("idv_obligations") is not None or ( + hasattr(awardee, "idv_obligations") and awardee.idv_obligations is not None + ): + obligations = ( + awardee.get("idv_obligations") + if isinstance(awardee, dict) + else awardee.idv_obligations + ) + assert isinstance(obligations, Decimal), "idv_obligations should be Decimal" + + if awardee.get("award_date") is not None or ( + hasattr(awardee, "award_date") and awardee.award_date is not None + ): + award_date = ( + awardee.get("award_date") if isinstance(awardee, dict) else awardee.award_date + ) + assert isinstance(award_date, date), "award_date should be date" + + # Verify recipient is accessible if present + if awardee.get("recipient") is not None or ( + hasattr(awardee, "recipient") and awardee.recipient is not None + ): + recipient = ( + awardee.get("recipient") if isinstance(awardee, dict) else awardee.recipient + ) + if isinstance(recipient, dict): + assert "display_name" in recipient or hasattr(recipient, "display_name") + + +@pytest.mark.vcr() +@pytest.mark.integration +class TestIDVsIntegration: + """Integration tests for IDV endpoints using production data""" + + @handle_api_exceptions("idvs") + def test_list_idvs_uses_default_shape_and_keyset_params(self, tango_client): + """Test listing IDVs with default shape and keyset pagination + + Validates: + - Default shape is applied + - Keyset pagination parameters (limit, cursor) work correctly + - Filter parameters are passed correctly + - IDVs are parsed correctly with proper types + """ + response = tango_client.list_idvs(limit=10, awarding_agency="4700") + + # Validate response structure + validate_pagination(response) + + # If we have results, validate them + if response.results: + idv = response.results[0] + validate_no_parsing_errors(idv) + + # Verify required fields + assert idv.get("key") is not None or hasattr(idv, "key"), "IDV key should be present" + + # Verify type parsing + if idv.get("award_date") is not None or ( + hasattr(idv, "award_date") and idv.award_date is not None + ): + award_date = idv.get("award_date") if isinstance(idv, dict) else idv.award_date + assert isinstance(award_date, date), "award_date should be date" + + if idv.get("obligated") is not None or ( + hasattr(idv, "obligated") and idv.obligated is not None + ): + obligated = idv.get("obligated") if isinstance(idv, dict) else idv.obligated + assert isinstance(obligated, Decimal), "obligated should be Decimal" + + @handle_api_exceptions("idvs") + def test_get_idv_uses_default_shape(self, tango_client): + """Test getting a single IDV with default shape + + Validates: + - Default comprehensive shape is applied + - IDV is parsed correctly + """ + # First, get an IDV key from listing + list_response = tango_client.list_idvs(limit=1) + if not list_response.results: + pytest.skip("No IDVs available to test get_idv") + + idv_key = ( + list_response.results[0].get("key") + if isinstance(list_response.results[0], dict) + else list_response.results[0].key + ) + assert idv_key is not None, "IDV key should be present" + + idv = tango_client.get_idv(idv_key) + + validate_no_parsing_errors(idv) + assert idv.get("key") is not None or hasattr(idv, "key"), "IDV key should be present" + assert idv.get("key") == idv_key if isinstance(idv, dict) else idv.key == idv_key, ( + "Returned IDV should match requested key" + ) + + @handle_api_exceptions("idvs") + def test_list_idv_awards_uses_default_shape(self, tango_client): + """Test listing IDV awards (child contracts) with default shape + + Validates: + - Default shape is applied + - Awards are parsed correctly with proper types + - Pagination works correctly + """ + # First, get an IDV key from listing + list_response = tango_client.list_idvs(limit=1) + if not list_response.results: + pytest.skip("No IDVs available to test list_idv_awards") + + idv_key = ( + list_response.results[0].get("key") + if isinstance(list_response.results[0], dict) + else list_response.results[0].key + ) + assert idv_key is not None, "IDV key should be present" + + response = tango_client.list_idv_awards(idv_key, limit=10) + + # Validate response structure + validate_pagination(response) + + # If we have results, validate them + if response.results: + award = response.results[0] + validate_no_parsing_errors(award) + + # Verify required fields + assert award.get("key") is not None or hasattr(award, "key"), ( + "Award key should be present" + ) + + # Verify type parsing + if award.get("award_date") is not None or ( + hasattr(award, "award_date") and award.award_date is not None + ): + award_date = award.get("award_date") if isinstance(award, dict) else award.award_date + assert isinstance(award_date, date), "award_date should be date" + + if award.get("award_amount") is not None or ( + hasattr(award, "award_amount") and award.award_amount is not None + ): + award_amount = ( + award.get("award_amount") if isinstance(award, dict) else award.award_amount + ) + assert isinstance(award_amount, Decimal), "award_amount should be Decimal" + + @handle_api_exceptions("idvs") + def test_list_idv_child_idvs_uses_default_shape(self, tango_client): + """Test listing child IDVs under an IDV with default shape + + Validates: + - Default shape is applied + - Child IDVs are parsed correctly with proper types + - Pagination works correctly + """ + # First, get an IDV key from listing + list_response = tango_client.list_idvs(limit=1) + if not list_response.results: + pytest.skip("No IDVs available to test list_idv_child_idvs") + + idv_key = ( + list_response.results[0].get("key") + if isinstance(list_response.results[0], dict) + else list_response.results[0].key + ) + assert idv_key is not None, "IDV key should be present" + + response = tango_client.list_idv_child_idvs(idv_key, limit=10) + + # Validate response structure + validate_pagination(response) + + # If we have results, validate them + if response.results: + child_idv = response.results[0] + validate_no_parsing_errors(child_idv) + + # Verify required fields + assert child_idv.get("key") is not None or hasattr(child_idv, "key"), ( + "Child IDV key should be present" + ) + + # Verify type parsing + if child_idv.get("award_date") is not None or ( + hasattr(child_idv, "award_date") and child_idv.award_date is not None + ): + award_date = ( + child_idv.get("award_date") + if isinstance(child_idv, dict) + else child_idv.award_date + ) + assert isinstance(award_date, date), "award_date should be date" + + @handle_api_exceptions("idvs") + def test_list_idv_transactions(self, tango_client): + """Test listing transactions for an IDV + + Validates: + - Transactions are returned correctly + - Pagination works correctly + - Response structure is valid + """ + # First, get an IDV key from listing + list_response = tango_client.list_idvs(limit=1) + if not list_response.results: + pytest.skip("No IDVs available to test list_idv_transactions") + + idv_key = ( + list_response.results[0].get("key") + if isinstance(list_response.results[0], dict) + else list_response.results[0].key + ) + assert idv_key is not None, "IDV key should be present" + + response = tango_client.list_idv_transactions(idv_key, limit=10) + + # Validate response structure + validate_pagination(response) + + # If we have results, validate they are dictionaries (transactions don't use shape parsing) + if response.results: + transaction = response.results[0] + assert isinstance(transaction, dict), "Transaction should be a dictionary" + + @handle_api_exceptions("idvs") + def test_get_idv_summary(self, tango_client): + """Test getting an IDV summary by solicitation identifier + + Validates: + - Summary is returned correctly + - Response structure is valid + """ + # Use a vehicle to get solicitation_identifier (vehicles group IDVs by solicitation) + vehicles_response = tango_client.list_vehicles(limit=10) + if not vehicles_response.results: + pytest.skip("No vehicles available to test get_idv_summary") + + # Find a vehicle with a solicitation_identifier + solicitation_identifier = None + for vehicle in vehicles_response.results: + identifier = ( + vehicle.get("solicitation_identifier") + if isinstance(vehicle, dict) + else getattr(vehicle, "solicitation_identifier", None) + ) + if identifier: + solicitation_identifier = identifier + break + + if not solicitation_identifier: + pytest.skip("No vehicles with solicitation_identifier found to test get_idv_summary") + + summary = tango_client.get_idv_summary(solicitation_identifier) + + # Validate response structure + assert isinstance(summary, dict), "Summary should be a dictionary" + assert len(summary) > 0, "Summary should not be empty" + + @handle_api_exceptions("idvs") + def test_list_idv_summary_awards(self, tango_client): + """Test listing awards under an IDV summary + + Validates: + - Awards are returned correctly + - Pagination works correctly + - Response structure is valid + """ + # Use a vehicle to get solicitation_identifier (vehicles group IDVs by solicitation) + vehicles_response = tango_client.list_vehicles(limit=10) + if not vehicles_response.results: + pytest.skip("No vehicles available to test list_idv_summary_awards") + + # Find a vehicle with a solicitation_identifier + solicitation_identifier = None + for vehicle in vehicles_response.results: + identifier = ( + vehicle.get("solicitation_identifier") + if isinstance(vehicle, dict) + else getattr(vehicle, "solicitation_identifier", None) + ) + if identifier: + solicitation_identifier = identifier + break + + if not solicitation_identifier: + pytest.skip( + "No vehicles with solicitation_identifier found to test list_idv_summary_awards" + ) + + response = tango_client.list_idv_summary_awards(solicitation_identifier, limit=10) + + # Validate response structure + validate_pagination(response) + + # If we have results, validate they are dictionaries (awards don't use shape parsing) + if response.results: + award = response.results[0] + assert isinstance(award, dict), "Award should be a dictionary" diff --git a/tests/integration/validation.py b/tests/integration/validation.py index 16dbc19..e729bae 100644 --- a/tests/integration/validation.py +++ b/tests/integration/validation.py @@ -19,6 +19,8 @@ def validate_pagination(response: Any) -> None: assert isinstance(response.results, list), "Response 'results' must be a list" assert response.count >= 0, "Response 'count' must be non-negative" assert isinstance(response.count, int), "Response 'count' must be an integer" + # Cursor field should exist (may be None for last page) + assert hasattr(response, "cursor"), "Response missing 'cursor' attribute" def validate_contract_fields(contract: Any, minimal: bool = True) -> None: diff --git a/tests/production/__init__.py b/tests/production/__init__.py new file mode 100644 index 0000000..cd3a0bf --- /dev/null +++ b/tests/production/__init__.py @@ -0,0 +1,5 @@ +"""Production API tests + +These tests run against the live production API to validate SDK functionality. +They are separate from integration tests which use VCR cassettes by default. +""" diff --git a/tests/production/conftest.py b/tests/production/conftest.py new file mode 100644 index 0000000..565b78e --- /dev/null +++ b/tests/production/conftest.py @@ -0,0 +1,79 @@ +"""Pytest configuration and fixtures for production smoke tests""" + +import os +from collections.abc import Callable +from functools import wraps +from typing import Any + +import pytest +from dotenv import load_dotenv + +from tango import TangoClient +from tango.exceptions import TangoAuthError, TangoRateLimitError + +# Load environment variables from .env file if it exists +load_dotenv() + +# Environment variables for test configuration +API_KEY = os.getenv("TANGO_API_KEY") + + +@pytest.fixture +def production_client() -> TangoClient: + """ + Create TangoClient for production smoke tests + + Requires TANGO_API_KEY environment variable to be set. + """ + if not API_KEY: + pytest.skip("TANGO_API_KEY environment variable required for production tests") + + return TangoClient(api_key=API_KEY) + + +def handle_auth_error(func: Callable[..., Any]) -> Callable[..., Any]: + """Decorator to handle authentication errors in production tests + + Skips the test if authentication fails, which allows the test suite + to continue even if API key is invalid or expired. + + Usage: + @handle_auth_error + def test_something(production_client): + response = production_client.list_contracts() + ... + """ + + @wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> Any: + try: + return func(*args, **kwargs) + except TangoAuthError as e: + pytest.skip(f"Authentication failed: {e}") + return # type: ignore[unreachable] # Explicit return for static analysis + + return wrapper + + +def handle_rate_limit(func: Callable[..., Any]) -> Callable[..., Any]: + """Decorator to handle rate limit errors in production tests + + Skips the test if rate limit is exceeded, which allows the test suite + to continue even if API rate limits are hit. + + Usage: + @handle_rate_limit + def test_something(production_client): + response = production_client.list_contracts() + ... + """ + + @wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> Any: + try: + return func(*args, **kwargs) + except TangoRateLimitError as e: + pytest.skip(f"Rate limit exceeded: {e}") + return # type: ignore[unreachable] # Explicit return for static analysis + + return wrapper diff --git a/tests/production/test_production_smoke.py b/tests/production/test_production_smoke.py new file mode 100644 index 0000000..93442fc --- /dev/null +++ b/tests/production/test_production_smoke.py @@ -0,0 +1,314 @@ +"""Production API smoke tests + +These tests run against the live production API to quickly validate core SDK functionality. +They are designed to be fast (~30-60 seconds) and test critical paths only. + +Pytest Markers: + @pytest.mark.production: Marks tests as production API tests + @pytest.mark.live: Forces tests to use live API (no cassettes) + +Usage: + # Run production smoke tests (requires TANGO_API_KEY) + pytest tests/production/ -m production + + # Run with specific API key + TANGO_API_KEY=xxx pytest tests/production/ +""" + +import pytest + +from tango import ShapeConfig +from tests.integration.validation import ( + validate_agency_fields, + validate_contract_fields, + validate_entity_fields, + validate_no_parsing_errors, + validate_pagination, +) +from tests.production.conftest import handle_auth_error, handle_rate_limit + + +@pytest.mark.production +@pytest.mark.live +class TestProductionSmoke: + """Smoke tests against production API - validates core SDK functionality""" + + @handle_rate_limit + @handle_auth_error + def test_list_contracts_basic(self, production_client): + """Test basic contract listing with minimal shape + + Validates: + - Basic contract listing works + - Response parsing is correct + - Pagination structure is valid + """ + response = production_client.list_contracts(limit=5, shape=ShapeConfig.CONTRACTS_MINIMAL) + + # Validate response structure + validate_pagination(response) + assert response.count > 0, "Expected at least one contract in production" + assert len(response.results) > 0, "Expected results in the response" + + # Validate first contract + contract = response.results[0] + validate_contract_fields(contract, minimal=True) + validate_no_parsing_errors(contract) + assert contract.get("key") is not None, "Contract key should be present" + + @handle_rate_limit + @handle_auth_error + def test_list_contracts_with_shape(self, production_client): + """Test contract listing with custom shape parameter + + Validates: + - Shape parameter works correctly + - Custom shape fields are present + - Response parsing with shaped data + """ + shape = "key,piid,recipient(display_name),total_contract_value,award_date" + response = production_client.list_contracts(limit=3, shape=shape) + + validate_pagination(response) + assert len(response.results) > 0, "Expected results in the response" + + contract = response.results[0] + validate_no_parsing_errors(contract) + # Verify shape fields are present + assert contract.get("key") is not None, "Contract key should be present" + assert contract.get("piid") is not None, "Contract piid should be present" + + @handle_rate_limit + @handle_auth_error + def test_list_entities(self, production_client): + """Test entity listing + + Validates: + - Entity listing works + - Entity parsing is correct + - Required entity fields are present + """ + response = production_client.list_entities(limit=5, shape=ShapeConfig.ENTITIES_MINIMAL) + + validate_pagination(response) + assert response.count > 0, "Expected at least one entity in production" + assert len(response.results) > 0, "Expected results in the response" + + entity = response.results[0] + validate_entity_fields(entity) + validate_no_parsing_errors(entity) + + @handle_rate_limit + @handle_auth_error + def test_list_agencies(self, production_client): + """Test agency listing + + Validates: + - Agency listing works + - Agency parsing is correct + - Required agency fields are present + """ + response = production_client.list_agencies(limit=5) + + validate_pagination(response) + assert response.count > 0, "Expected at least one agency in production" + assert len(response.results) > 0, "Expected results in the response" + + agency = response.results[0] + validate_agency_fields(agency) + validate_no_parsing_errors(agency) + + @handle_rate_limit + @handle_auth_error + def test_get_agency(self, production_client): + """Test getting a specific agency + + Validates: + - Single agency retrieval works + - Agency parsing with full details + """ + # Use a well-known agency code (GSA - General Services Administration) + agency_code = "4700" + + agency = production_client.get_agency(agency_code) + + validate_agency_fields(agency) + validate_no_parsing_errors(agency) + assert agency.code == agency_code, f"Expected agency code {agency_code}, got {agency.code}" + + @handle_rate_limit + @handle_auth_error + def test_list_opportunities(self, production_client): + """Test opportunity listing + + Validates: + - Opportunity listing works + - Response parsing is correct + """ + response = production_client.list_opportunities(limit=3) + + validate_pagination(response) + # Opportunities may be empty, so we just validate structure + assert response.count >= 0, "Count should be non-negative" + + if len(response.results) > 0: + opportunity = response.results[0] + validate_no_parsing_errors(opportunity) + # Opportunities should have an opportunity_id + assert opportunity.get("opportunity_id") is not None, "Opportunity ID should be present" + + @handle_rate_limit + @handle_auth_error + def test_pagination(self, production_client): + """Test pagination works correctly + + Validates: + - Pagination metadata is correct + - Can navigate between pages + """ + # Get first page + page1 = production_client.list_contracts(limit=2, shape=ShapeConfig.CONTRACTS_MINIMAL) + + validate_pagination(page1) + assert page1.count > 0, "Expected contracts in production" + + # If there are more results, test second page + if page1.next is not None and page1.count > 2: + page2 = production_client.list_contracts( + cursor=page1.cursor, limit=2, shape=ShapeConfig.CONTRACTS_MINIMAL + ) + + validate_pagination(page2) + assert len(page2.results) > 0, "Expected results on second page" + # Results should be different + if len(page1.results) > 0 and len(page2.results) > 0: + assert page1.results[0].get("key") != page2.results[0].get("key"), ( + "Page 1 and Page 2 should have different results" + ) + + @handle_rate_limit + @handle_auth_error + def test_search_filters(self, production_client): + """Test search filters work correctly + + Validates: + - Filter parameters are applied correctly + - Filtered results are returned + """ + # Search for contracts with a specific agency (GSA) + response = production_client.list_contracts( + awarding_agency="4700", limit=3, shape=ShapeConfig.CONTRACTS_MINIMAL + ) + + validate_pagination(response) + # Results may be empty, but structure should be valid + assert response.count >= 0, "Count should be non-negative" + + if len(response.results) > 0: + contract = response.results[0] + validate_no_parsing_errors(contract) + + @handle_rate_limit + @handle_auth_error + def test_list_idvs_basic(self, production_client): + """Test basic IDV listing + + Validates: + - Basic IDV listing works + - Response parsing is correct + - Pagination structure is valid + """ + response = production_client.list_idvs(limit=5) + + # Validate response structure + validate_pagination(response) + # IDVs may be empty, so we just validate structure + assert response.count >= 0, "Count should be non-negative" + + if len(response.results) > 0: + idv = response.results[0] + validate_no_parsing_errors(idv) + # Verify required fields are present + assert idv.get("key") is not None, "IDV key should be present" + + @handle_rate_limit + @handle_auth_error + def test_get_idv(self, production_client): + """Test getting a specific IDV + + Validates: + - Single IDV retrieval works + - IDV parsing is correct + """ + # First, get an IDV key from listing + list_response = production_client.list_idvs(limit=1) + if not list_response.results: + pytest.skip("No IDVs available to test get_idv") + + idv_key = ( + list_response.results[0].get("key") + if isinstance(list_response.results[0], dict) + else list_response.results[0].key + ) + assert idv_key is not None, "IDV key should be present" + + idv = production_client.get_idv(idv_key) + + validate_no_parsing_errors(idv) + assert idv.get("key") is not None, "IDV key should be present" + assert idv.get("key") == idv_key if isinstance(idv, dict) else idv.key == idv_key, ( + "Returned IDV should match requested key" + ) + + @handle_rate_limit + @handle_auth_error + def test_list_vehicles_basic(self, production_client): + """Test basic vehicle listing + + Validates: + - Basic vehicle listing works + - Response parsing is correct + - Pagination structure is valid + """ + response = production_client.list_vehicles(limit=5) + + # Validate response structure + validate_pagination(response) + # Vehicles may be empty, so we just validate structure + assert response.count >= 0, "Count should be non-negative" + + if len(response.results) > 0: + vehicle = response.results[0] + validate_no_parsing_errors(vehicle) + # Verify required fields are present + assert vehicle.get("uuid") is not None or hasattr(vehicle, "uuid"), ( + "Vehicle uuid should be present" + ) + + @handle_rate_limit + @handle_auth_error + def test_get_vehicle(self, production_client): + """Test getting a specific vehicle + + Validates: + - Single vehicle retrieval works + - Vehicle parsing is correct + """ + # First, get a vehicle UUID from listing + list_response = production_client.list_vehicles(limit=1) + if not list_response.results: + pytest.skip("No vehicles available to test get_vehicle") + + vehicle_uuid = ( + list_response.results[0].get("uuid") + if isinstance(list_response.results[0], dict) + else list_response.results[0].uuid + ) + assert vehicle_uuid is not None, "Vehicle UUID should be present" + + vehicle = production_client.get_vehicle(vehicle_uuid) + + validate_no_parsing_errors(vehicle) + assert vehicle.get("uuid") is not None or hasattr(vehicle, "uuid"), ( + "Vehicle uuid should be present" + ) diff --git a/tests/test_client.py b/tests/test_client.py index 183b46d..5f35396 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1041,183 +1041,6 @@ def test_list_grants(self, mock_request): assert grants.results[0].opportunity_number == "OPP-123" -# ============================================================================ -# Vehicles (Awards) Endpoint Tests -# ============================================================================ - - -class TestVehiclesEndpoints: - """Test Vehicles endpoints""" - - @patch("tango.client.httpx.Client.request") - def test_list_vehicles_uses_default_shape_and_search(self, mock_request): - mock_response = Mock() - mock_response.is_success = True - mock_response.content = b'{"count": 1}' - mock_response.json.return_value = { - "count": 1, - "next": None, - "previous": None, - "results": [ - { - "uuid": "00000000-0000-0000-0000-000000000001", - "solicitation_identifier": "47QSWA20D0001", - "organization_id": "00000000-0000-0000-0000-000000000099", - "awardee_count": 12, - "order_count": 345, - "vehicle_obligations": "123.45", - "vehicle_contracts_value": "999.99", - "solicitation_title": "GSA MAS", - "solicitation_date": "2024-01-15", - } - ], - } - mock_request.return_value = mock_response - - client = TangoClient(api_key="test-key") - vehicles = client.list_vehicles(search="GSA", limit=10) - - call_args = mock_request.call_args - params = call_args[1]["params"] - assert params["shape"] == ShapeConfig.VEHICLES_MINIMAL - assert params["search"] == "GSA" - - assert vehicles.count == 1 - v = vehicles.results[0] - assert v["solicitation_identifier"] == "47QSWA20D0001" - assert v["vehicle_obligations"] == Decimal("123.45") - assert isinstance(v["solicitation_date"], date) - - @patch("tango.client.httpx.Client.request") - def test_get_vehicle_supports_joiner_and_flat_lists(self, mock_request): - mock_response = Mock() - mock_response.is_success = True - mock_response.content = b'{"uuid": "00000000-0000-0000-0000-000000000001"}' - mock_response.json.return_value = { - "uuid": "00000000-0000-0000-0000-000000000001", - "opportunity__title": "Test Opportunity", - } - mock_request.return_value = mock_response - - client = TangoClient(api_key="test-key") - vehicle = client.get_vehicle( - "00000000-0000-0000-0000-000000000001", - shape="uuid,opportunity(title)", - flat=True, - flat_lists=True, - joiner="__", - ) - - call_args = mock_request.call_args - params = call_args[1]["params"] - assert params["shape"] == "uuid,opportunity(title)" - assert params["flat"] == "true" - assert params["flat_lists"] == "true" - assert params["joiner"] == "__" - - assert vehicle["uuid"] == "00000000-0000-0000-0000-000000000001" - assert vehicle["opportunity"]["title"] == "Test Opportunity" - - @patch("tango.client.httpx.Client.request") - def test_list_vehicle_awardees_uses_default_shape(self, mock_request): - mock_response = Mock() - mock_response.is_success = True - mock_response.content = b'{"count": 1}' - mock_response.json.return_value = { - "count": 1, - "next": None, - "previous": None, - "results": [ - { - "uuid": "00000000-0000-0000-0000-000000000002", - "key": "IDV-KEY", - "piid": "47QSWA20D0001", - "award_date": "2024-01-01", - "title": "Acme Corp", - "order_count": 10, - "idv_obligations": "100.00", - "idv_contracts_value": "250.50", - "recipient": {"display_name": "Acme Corp", "uei": "UEI123"}, - } - ], - } - mock_request.return_value = mock_response - - client = TangoClient(api_key="test-key") - awardees = client.list_vehicle_awardees("00000000-0000-0000-0000-000000000001", limit=10) - - call_args = mock_request.call_args - params = call_args[1]["params"] - assert params["shape"] == ShapeConfig.VEHICLE_AWARDEES_MINIMAL - - assert awardees.count == 1 - a = awardees.results[0] - assert a["key"] == "IDV-KEY" - assert a["idv_obligations"] == Decimal("100.00") - assert isinstance(a["award_date"], date) - assert a["recipient"]["display_name"] == "Acme Corp" - - -class TestIDVEndpoints: - """Test IDV endpoints wiring""" - - @patch("tango.client.httpx.Client.request") - def test_list_idvs_uses_default_shape_and_keyset_params(self, mock_request): - mock_response = Mock() - mock_response.is_success = True - mock_response.content = b'{"count": 1}' - mock_response.json.return_value = { - "count": 1, - "next": "https://example.test/api/idvs/?cursor=next", - "previous": None, - "results": [ - { - "key": "IDV-KEY", - "piid": "47QSWA20D0001", - "award_date": "2024-01-01", - "recipient": {"display_name": "Acme Corp", "uei": "UEI123"}, - "description": "Test IDV", - "total_contract_value": "1000.00", - "obligated": "10.00", - "idv_type": {"code": "A", "description": "GWAC"}, - } - ], - } - mock_request.return_value = mock_response - - client = TangoClient(api_key="test-key") - resp = client.list_idvs(limit=10, cursor="abc", awarding_agency="4700") - - call_args = mock_request.call_args - params = call_args[1]["params"] - assert params["shape"] == ShapeConfig.IDVS_MINIMAL - assert params["limit"] == 10 - assert params["cursor"] == "abc" - assert params["awarding_agency"] == "4700" - - assert resp.count == 1 - item = resp.results[0] - assert item["key"] == "IDV-KEY" - assert isinstance(item["award_date"], date) - assert item["obligated"] == Decimal("10.00") - - @patch("tango.client.httpx.Client.request") - def test_get_idv_uses_default_shape(self, mock_request): - mock_response = Mock() - mock_response.is_success = True - mock_response.content = b'{"key": "IDV-KEY"}' - mock_response.json.return_value = {"key": "IDV-KEY", "piid": "47QSWA20D0001"} - mock_request.return_value = mock_response - - client = TangoClient(api_key="test-key") - idv = client.get_idv("IDV-KEY") - - call_args = mock_request.call_args - params = call_args[1]["params"] - assert params["shape"] == ShapeConfig.IDVS_COMPREHENSIVE - assert idv["key"] == "IDV-KEY" - - # ============================================================================ # Parser Tests # ============================================================================