- Status
- runnable in repo test
- Industry
- Cross-industry
- Language
- Python
- Framework
- pytest
- CI
- GitHub Actions / GitLab CI
- Fulfilment
- LEASE_CERTIFIED_VERSION
- Profile
- orders-pr-regression
About this example
All data is synthetic. DataNivra provisions approved test data into a customer-controlled target; it does not run these tests. Credentials for the target are never returned by DataNivra — your runner holds its own.
Why test data matters
Each pull request needs the same DataNivra-certified data in its own database so parallel builds never interfere.
What is requested
A 30-minute lease of the certified orders dataset.
Policy gates
Certified, provisionable version only; target chosen from the approved pool (never by the request); for CI identities the envelope caps the TTL at one hour.
What is provisioned
An isolated copy in one pool target per request.
Expected output
AUTO_APPROVED, state PROVISIONING then READY; a second concurrent request gets a different environment_id.
Cleanup
Release tears the copy down; the certified version stays PUBLISHED.
Files
request.yamlexample.pytest_with_datanivra.py
Run
- A tenant administrator defines and a second person approves the profile (
datanivra test-data define ../../profiles/orders-pr-regression.yaml --submit, thendatanivra policies approve). datanivra test-data validate request.yaml && datanivra test-data plan request.yaml- Run the example with
DATANIVRA_BASE_URLand a session or workload token.
Files
Exactly as they are in the examples repository. Every value is a synthetic placeholder; nothing here is a credential.
request.yaml
# yaml-language-server: $schema=../../../../packages/contracts/schemas/v1/manifests/test-data-request.schema.json
# DataNivra test-data-request manifest (apiVersion datanivra.io/v1alpha1). Validate: datanivra test-data validate <file>
apiVersion: datanivra.io/v1alpha1
kind: TestDataRequest
metadata:
name: orders-pr
spec:
profile: { name: orders-pr-regression, version: 1 }
ttl_seconds: 1800
purpose_ref: QA-77
examples/test-data-api/scenarios/09-postgresql-per-pr-lease/request.yaml
example.py
"""Per-PR PostgreSQL lease — provision approved test data through the Python SDK.
``provision`` only asks DataNivra for data from the approved ``orders-pr-regression`` profile; your own test
suite runs against the approved target with its own, separately managed database access.
"""
from __future__ import annotations
from pathlib import Path
from datanivra_contracts.testdata import TestDataRequest
from datanivra_sdk import DataNivraClient
from datanivra_sdk.testdata import TestDataClient
REQUEST = Path(__file__).with_name("request.yaml")
def provision(api: DataNivraClient, *, idempotency_key: str | None = None) -> TestDataRequest:
"""Create (or, for the same key, return) the request; DENIED raises ``DataNivraApiError``."""
return TestDataClient(api).request(REQUEST, idempotency_key=idempotency_key)
examples/test-data-api/scenarios/09-postgresql-per-pr-lease/example.py
test_with_datanivra.py
"""Per-PR PostgreSQL lease (pytest).
Run in your CI with ``DATANIVRA_BASE_URL`` and a token (``datanivra login --workload-identity ...``
or ``DATANIVRA_TOKEN``). The data is released after the session, even when tests fail.
"""
from __future__ import annotations
import os
from collections.abc import Iterator
import pytest
from datanivra_contracts.testdata import TestDataRequest
from datanivra_sdk import DataNivraClient
from datanivra_sdk.testdata import TestDataClient
from example import REQUEST
@pytest.fixture(scope="session")
def test_data() -> Iterator[TestDataRequest]:
api = DataNivraClient(os.environ["DATANIVRA_BASE_URL"], token=os.environ["DATANIVRA_TOKEN"])
with TestDataClient(api).acquire(REQUEST, idempotency_key=os.environ.get("CI_RUN_KEY")) as request:
yield request
def test_orders_are_available_in_my_pr_database(test_data: TestDataRequest) -> None:
# Your assertions run against your application and the approved target environment
# ``test_data.environment_id``; DataNivra only returns metadata (ids, states, digests).
assert test_data.state.value == "READY"
examples/test-data-api/scenarios/09-postgresql-per-pr-lease/test_with_datanivra.py
The profile it uses: orders-pr-regression
A tenant administrator defines this profile and a second person approves it; requests can only ask for what it allows. All profiles
orders-pr-regression.yaml
# yaml-language-server: $schema=../../../packages/contracts/schemas/v1/manifests/test-data-profile.schema.json
# DataNivra test-data-profile manifest (apiVersion datanivra.io/v1alpha1). Validate: datanivra test-data validate <file>
# Placeholder ids (00000000-0000-4000-8000-0000000000NN): replace with your ids.
# 01 = approved target environment, 11 = certified dataset, 21 = customer agent,
# 99 = workload identity trust (datanivra workload-identities list).
apiVersion: datanivra.io/v1alpha1
kind: TestDataProfile
metadata:
name: orders-pr-regression
description: Certified orders dataset leased into an isolated CI database per pull request
spec:
fulfilment: LEASE_CERTIFIED_VERSION
lease:
dataset_id: 00000000-0000-4000-8000-000000000011
agent_id: 00000000-0000-4000-8000-000000000021
provider_kind: POSTGRESQL_CONTAINER
default_ttl_seconds: 1800
max_ttl_seconds: 7200
target_pool:
- env://DATANIVRA_CI_DB_1
- env://DATANIVRA_CI_DB_2
- env://DATANIVRA_CI_DB_3
- env://DATANIVRA_CI_DB_4
automation:
workload_identity_ids: [00000000-0000-4000-8000-000000000099]
max_ttl_seconds: 3600
max_live_requests: 4
audit_tags: [CI_PULL_REQUEST]