Skip to content

fix(auditlog-ng): strip prompt/response text from AiMessageContext #164

fix(auditlog-ng): strip prompt/response text from AiMessageContext

fix(auditlog-ng): strip prompt/response text from AiMessageContext #164

name: Integration Tests
on:
workflow_dispatch:
pull_request:
paths:
- '.github/workflows/integration-tests.yml'
- 'src/**/*.py'
- 'tests/**/*.py'
- 'pyproject.toml'
- 'uv.lock'
push:
branches: [main]
paths:
- '.github/workflows/integration-tests.yml'
- 'src/**/*.py'
- 'tests/**/*.py'
- 'pyproject.toml'
- 'uv.lock'
jobs:
# ── Determine which integration test directories to run ──────────────────────
detect-scope:
name: Detect test scope
runs-on: ubuntu-latest
outputs:
run_all: ${{ steps.scope.outputs.run_all }}
test_paths: ${{ steps.scope.outputs.test_paths }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Compute scope
id: scope
env:
EVENT: ${{ github.event_name }}
run: |
# On push to main or workflow_dispatch → always run everything
if [[ "$EVENT" == "push" || "$EVENT" == "workflow_dispatch" ]]; then
echo "run_all=true" >> "$GITHUB_OUTPUT"
echo "test_paths=tests/*/integration/" >> "$GITHUB_OUTPUT"
echo "Scope: full run (push/workflow_dispatch)"
exit 0
fi
# On pull_request → diff against the base branch
BASE_SHA="${{ github.event.pull_request.base.sha }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
CHANGED=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")
echo "Changed files:"
echo "$CHANGED"
# Global triggers: any of these → run everything
# core/ is foundational — changes there can affect any module
GLOBAL_PATTERNS=(
"pyproject.toml"
"uv.lock"
"src/sap_cloud_sdk/core/"
"tests/core/"
)
for pattern in "${GLOBAL_PATTERNS[@]}"; do
if echo "$CHANGED" | grep -q "^${pattern}"; then
echo "run_all=true" >> "$GITHUB_OUTPUT"
echo "test_paths=tests/*/integration/" >> "$GITHUB_OUTPUT"
echo "Scope: full run (global file changed: $pattern)"
exit 0
fi
done
# Modules that have integration test directories
MODULES_WITH_INTEGRATION=(
adms
agent_memory
agentgateway
aicore
destination
dms
dpi_ng
objectstore
outputmanagement
)
PATHS=()
for module in "${MODULES_WITH_INTEGRATION[@]}"; do
if echo "$CHANGED" | grep -qE "^(src/sap_cloud_sdk|tests)/${module}/"; then
PATHS+=("tests/${module}/integration/")
echo "Module affected: $module"
fi
done
if [[ ${#PATHS[@]} -eq 0 ]]; then
echo "run_all=false" >> "$GITHUB_OUTPUT"
echo "test_paths=" >> "$GITHUB_OUTPUT"
echo "Scope: no integration tests affected — skipping"
else
echo "run_all=false" >> "$GITHUB_OUTPUT"
echo "test_paths=${PATHS[*]}" >> "$GITHUB_OUTPUT"
echo "Scope: ${PATHS[*]}"
fi
# ── Run the integration tests ─────────────────────────────────────────────────
integration-tests:
name: Integration Tests
needs: detect-scope
# Skip for fork PRs (no secrets), and skip when no integration tests are affected
if: >
(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) &&
needs.detect-scope.outputs.test_paths != ''
runs-on: ${{ contains(github.server_url, 'github.com') && 'ubuntu-latest' || fromJSON('["self-hosted"]') }}
permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install uv
uses: astral-sh/setup-uv@v3
- name: Install dependencies
run: uv sync --dev
- name: Set up integration test environment
env:
AICORE_CLIENT_ID: ${{ secrets.AICORE_CLIENT_ID }}
AICORE_CLIENT_SECRET: ${{ secrets.AICORE_CLIENT_SECRET }}
AICORE_FILTER_TEST_SELF_HARM_PROMPT: ${{ secrets.AICORE_FILTER_TEST_SELF_HARM_PROMPT }}
CLOUD_SDK_CFG_AGW_DEFAULT_LANDSCAPE: ${{ secrets.CLOUD_SDK_CFG_AGW_DEFAULT_LANDSCAPE }}
CLOUD_SDK_CFG_AGW_DEFAULT_TENANT_SUBDOMAIN: ${{ secrets.CLOUD_SDK_CFG_AGW_DEFAULT_TENANT_SUBDOMAIN }}
CLOUD_SDK_CFG_AUDITLOG_DEFAULT_UAA: ${{ secrets.CLOUD_SDK_CFG_AUDITLOG_DEFAULT_UAA }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_CLIENTID: ${{ secrets.CLOUD_SDK_CFG_DESTINATION_DEFAULT_CLIENTID }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_CLIENTSECRET: ${{ secrets.CLOUD_SDK_CFG_DESTINATION_DEFAULT_CLIENTSECRET }}
CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_UAA: ${{ secrets.CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_UAA }}
CLOUD_SDK_CFG_OBJECTSTORE_AZURE_SAS_TOKEN: ${{ secrets.CLOUD_SDK_CFG_OBJECTSTORE_AZURE_SAS_TOKEN }}
CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_ACCESS_KEY_ID: ${{ secrets.CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_ACCESS_KEY_ID }}
CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_SECRET_ACCESS_KEY: ${{ secrets.CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_SECRET_ACCESS_KEY }}
CLOUD_SDK_CFG_OBJECTSTORE_GCS_BASE64ENCODEDPRIVATEKEYDATA: ${{ secrets.CLOUD_SDK_CFG_OBJECTSTORE_GCS_BASE64ENCODEDPRIVATEKEYDATA }}
CLOUD_SDK_CFG_SDM_DEFAULT_UAA: ${{ secrets.CLOUD_SDK_CFG_SDM_DEFAULT_UAA }}
AICORE_AUTH_URL: ${{ vars.AICORE_AUTH_URL }}
AICORE_BASE_URL: ${{ vars.AICORE_BASE_URL }}
AICORE_FALLBACK_TEST_FALLBACK_MODEL: ${{ vars.AICORE_FALLBACK_TEST_FALLBACK_MODEL }}
AICORE_FALLBACK_TEST_PRIMARY_MODEL: ${{ vars.AICORE_FALLBACK_TEST_PRIMARY_MODEL }}
AICORE_FILTER_TEST_MODEL: ${{ vars.AICORE_FILTER_TEST_MODEL }}
AICORE_RESOURCE_GROUP: ${{ vars.AICORE_RESOURCE_GROUP }}
CLOUD_SDK_CFG_AUDITLOG_DEFAULT_URL: ${{ vars.CLOUD_SDK_CFG_AUDITLOG_DEFAULT_URL }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_IDENTITYZONE: ${{ vars.CLOUD_SDK_CFG_DESTINATION_DEFAULT_IDENTITYZONE }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_TENANT_SUBDOMAIN: ${{ vars.CLOUD_SDK_CFG_DESTINATION_DEFAULT_TENANT_SUBDOMAIN }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_URI: ${{ vars.CLOUD_SDK_CFG_DESTINATION_DEFAULT_URI }}
CLOUD_SDK_CFG_DESTINATION_DEFAULT_URL: ${{ vars.CLOUD_SDK_CFG_DESTINATION_DEFAULT_URL }}
CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_APPLICATION_URL: ${{ vars.CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_APPLICATION_URL }}
CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_SUBSCRIBER_TENANT: ${{ vars.CLOUD_SDK_CFG_HANA_AGENT_MEMORY_DEFAULT_SUBSCRIBER_TENANT }}
CLOUD_SDK_CFG_OBJECTSTORE_AZURE_CONTAINER_NAME: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_AZURE_CONTAINER_NAME }}
CLOUD_SDK_CFG_OBJECTSTORE_AZURE_CONTAINER_URI: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_AZURE_CONTAINER_URI }}
CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_BUCKET: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_BUCKET }}
CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_HOST: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_DEFAULT_HOST }}
CLOUD_SDK_CFG_OBJECTSTORE_GCS_BUCKET: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_GCS_BUCKET }}
CLOUD_SDK_CFG_OBJECTSTORE_GCS_PROJECTID: ${{ vars.CLOUD_SDK_CFG_OBJECTSTORE_GCS_PROJECTID }}
CLOUD_SDK_CFG_SDM_DEFAULT_URI: ${{ vars.CLOUD_SDK_CFG_SDM_DEFAULT_URI }}
run: |
env | grep -E '^(CLOUD_SDK_CFG_|AICORE_)' >> "$GITHUB_ENV"
echo "Integration test environment set up."
- name: Run integration tests
env:
TEST_PATHS: ${{ needs.detect-scope.outputs.test_paths }}
run: uv run pytest $TEST_PATHS -v --tb=short