git-subtree-dir: fiscal git-subtree-mainline:d95165fc8fgit-subtree-split:102ba84500
62 lines
3.0 KiB
Python
62 lines
3.0 KiB
Python
import json
|
|
|
|
import pytest
|
|
|
|
from central.app.ai.questionnaire import build_questionnaire, group_questions, validate_answers
|
|
|
|
|
|
def test_questionnaire_groups_by_scope_and_preserves_effects():
|
|
rows = [
|
|
{"QUESTION_ID": "Q1", "DATABASE": "ACME", "SCOPE": "COMPANY", "GROUP": "", "KEY": "entry_scope",
|
|
"VALID_OPTIONS": ["INTRA", "INTER", "MIXED_OR_DYNAMIC"], "PRODUCTS_AFFECTED": 2, "CELLS": 3,
|
|
"QUESTION": "Escopo?", "EXAMPLES": "P1; P2"},
|
|
{"QUESTION_ID": "Q2", "DATABASE": "ACME", "SCOPE": "GROUP", "GROUP": "G1", "KEY": "product_role",
|
|
"VALID_OPTIONS": ["RESALE"], "PRODUCTS_AFFECTED": 1, "CELLS": 1, "QUESTION": "Papel?"},
|
|
]
|
|
|
|
result = build_questionnaire(rows)
|
|
|
|
assert [item["question_id"] for item in result] == ["Q1", "Q2"]
|
|
assert result[0]["affected"] == {"products": 2, "cells": 3}
|
|
assert "MIXED_OR_DYNAMIC" in result[0]["options"]
|
|
assert result[1]["scope_key"] == "G1"
|
|
|
|
|
|
def test_answers_are_validated_without_persisting_and_mixed_scope_is_explicit():
|
|
questions = build_questionnaire([{
|
|
"QUESTION_ID": "Q1", "DATABASE": "ACME", "SCOPE": "COMPANY", "GROUP": "", "KEY": "entry_scope",
|
|
"VALID_OPTIONS": ["INTRA", "INTER", "MIXED_OR_DYNAMIC"], "QUESTION": "Escopo?",
|
|
}])
|
|
|
|
answers = validate_answers(questions, {"Q1": "MIXED_OR_DYNAMIC"})
|
|
|
|
assert answers["entries"] == [{"scope": "COMPANY", "scope_key": "", "key": "entry_scope", "value": "MIXED_OR_DYNAMIC", "reason": None, "company_key": "ACME"}]
|
|
assert answers["effects"][0]["behavior"] == "no_static_cfop_entrada"
|
|
|
|
with pytest.raises(ValueError, match="nothing was persisted"):
|
|
validate_answers(questions, {"Q1": "OUTSIDE"})
|
|
|
|
|
|
def test_store_ipi_profile_requires_explicit_choice_and_only_plans_rollback():
|
|
questions = build_questionnaire([{
|
|
"QUESTION_ID": "QIPI-ACME", "DATABASE": "ACME", "SCOPE": "COMPANY", "GROUP": "", "KEY": "store_ipi_profile",
|
|
"VALID_OPTIONS": ["POPULATE_REFERENCE_RATE", "LEAVE_NOT_APPLICABLE"], "QUESTION": "IPI?",
|
|
"PRODUCTS_AFFECTED": 4, "CELLS": 4,
|
|
}])
|
|
|
|
result = validate_answers(questions, {"QIPI-ACME": "LEAVE_NOT_APPLICABLE"})
|
|
|
|
assert result["entries"][0]["value"] == "LEAVE_NOT_APPLICABLE"
|
|
assert result["rollback_plan"] == [{"database": "ACME", "field": "IPI", "affected_cells": 4}]
|
|
assert json.dumps(result)
|
|
|
|
|
|
def test_equivalent_questions_are_grouped_with_aggregated_impact():
|
|
questions = build_questionnaire([
|
|
{"QUESTION_ID": "Q1", "DATABASE": "ACME", "SCOPE": "GROUP", "GROUP": "REFRIGERANTES", "KEY": "product_role", "VALID_OPTIONS": ["RESALE"], "CELLS": 10, "PRODUCTS_AFFECTED": 3, "QUESTION": "Qual o papel?"},
|
|
{"QUESTION_ID": "Q2", "DATABASE": "ACME", "SCOPE": "GROUP", "GROUP": "REFRIGERANTES", "KEY": "product_role", "VALID_OPTIONS": ["RESALE"], "CELLS": 20, "PRODUCTS_AFFECTED": 5, "QUESTION": "Qual o papel?"},
|
|
])
|
|
groups = group_questions(questions)
|
|
assert len(groups) == 1 and groups[0]["question_ids"] == ["Q1", "Q2"]
|
|
assert groups[0]["affected"] == {"products": 8, "cells": 30}
|