114 lines
3.1 KiB
Python
114 lines
3.1 KiB
Python
from app.modules.rag.contracts.enums import RagLayer
|
|
from app.modules.rag.indexing.docs.pipeline import DocsIndexingPipeline
|
|
|
|
|
|
def test_docs_pipeline_builds_new_d0_to_d5_layers() -> None:
|
|
pipeline = DocsIndexingPipeline()
|
|
content = """---
|
|
id: api.billing.create_invoice
|
|
type: api_method
|
|
name: create_invoice
|
|
title: Create Invoice API
|
|
module: billing
|
|
layer: application
|
|
status: draft
|
|
updated_at: 2026-03-23
|
|
tags: [billing, api]
|
|
entities: [Invoice]
|
|
parent: billing_api
|
|
children: []
|
|
links:
|
|
- type: related_api
|
|
target: api.billing.validate_invoice
|
|
---
|
|
# Summary
|
|
|
|
Creates an invoice in billing.
|
|
|
|
# Details
|
|
|
|
## Описание
|
|
|
|
Создает счет на оплату.
|
|
|
|
## Сценарий
|
|
|
|
**Название:**
|
|
Create invoice
|
|
|
|
**Предусловия:**
|
|
- billing service is available
|
|
|
|
**Триггер:**
|
|
- client sends create invoice request
|
|
|
|
**Основной сценарий:**
|
|
1. Validate payload.
|
|
2. Create invoice.
|
|
|
|
**Альтернативный сценарий:**
|
|
1. Reject invalid payload.
|
|
|
|
**Обработка ошибок:**
|
|
1. Return validation error.
|
|
|
|
**Постусловие:**
|
|
- Invoice is created.
|
|
|
|
## Контракт
|
|
|
|
### Входные параметры
|
|
|
|
| field | type | required | validation |
|
|
| --- | --- | --- | --- |
|
|
| amount | decimal | yes | > 0 |
|
|
|
|
### Выходные параметры
|
|
|
|
| field | type | required |
|
|
| --- | --- | --- |
|
|
| invoice_id | string | yes |
|
|
|
|
## Ошибки
|
|
|
|
| status | error | client action |
|
|
| --- | --- | --- |
|
|
| 400 | invalid_amount | fix request |
|
|
"""
|
|
docs = pipeline.index_file(
|
|
repo_id="acme/proj",
|
|
commit_sha="abc123",
|
|
path="docs/billing/create_invoice.md",
|
|
content=content,
|
|
)
|
|
|
|
layers = {doc.layer for doc in docs}
|
|
assert RagLayer.DOCS_DOC_CHUNKS in layers
|
|
assert RagLayer.DOCS_DOCUMENT_CATALOG in layers
|
|
assert RagLayer.DOCS_FACT_INDEX in layers
|
|
assert RagLayer.DOCS_ENTITY_CATALOG in layers
|
|
assert RagLayer.DOCS_WORKFLOW_INDEX in layers
|
|
assert RagLayer.DOCS_RELATION_GRAPH in layers
|
|
|
|
catalog_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_DOCUMENT_CATALOG)
|
|
assert catalog_doc.metadata["document_id"] == "api.billing.create_invoice"
|
|
assert catalog_doc.metadata["module"] == "billing"
|
|
|
|
fact_texts = [doc.text for doc in docs if doc.layer == RagLayer.DOCS_FACT_INDEX]
|
|
assert any("has_field amount" in text for text in fact_texts)
|
|
assert any("field_required amount:yes" in text for text in fact_texts)
|
|
assert any("returns_error invalid_amount" in text for text in fact_texts)
|
|
|
|
entity_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_ENTITY_CATALOG)
|
|
assert entity_doc.metadata["entity_name"] == "Invoice"
|
|
|
|
workflow_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_WORKFLOW_INDEX)
|
|
assert workflow_doc.metadata["workflow_name"] == "Create invoice"
|
|
|
|
relation_targets = [doc.metadata["target_id"] for doc in docs if doc.layer == RagLayer.DOCS_RELATION_GRAPH]
|
|
assert "billing_api" in relation_targets
|
|
assert "api.billing.validate_invoice" in relation_targets
|
|
|
|
chunk_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_DOC_CHUNKS)
|
|
assert chunk_doc.metadata["section_path"]
|