Dynavera/apps/onboarding/tests/test_consumers.py

111 lines
4.1 KiB
Python
Raw Normal View History

from asgiref.sync import async_to_sync
from django.contrib.auth import get_user_model
from django.test import TestCase
from apps.accounts.models import Organization, Role
from apps.onboarding.consumers import OnboardingConsumer
from apps.onboarding.models import AgentConfig
User = get_user_model()
class OnboardingConsumerConfigSelectionTests(TestCase):
def setUp(self):
self.user = User.objects.create_user(
email_address='consumer-test@example.com',
password='pass1234',
first_name='Consumer',
last_name='Tester',
date_of_birth='1992-02-02',
is_manager=True,
)
self.org = Organization.objects.create(name='Consumer Test Org', owner=self.user)
self.org.members.add(self.user)
self.quant_role = Role.objects.create(name='Quant Role Consumer', organization=self.org)
self.ux_role = Role.objects.create(name='UX Role Consumer', organization=self.org)
self.consumer = OnboardingConsumer()
def test_get_config_by_type_prefers_exact_role(self):
quant_cfg = AgentConfig.objects.create(
organization=self.org,
role=self.quant_role,
name='Quant Curriculum Override',
agent_type='curriculum',
system_prompt='Quant-specific prompt',
)
AgentConfig.objects.create(
organization=self.org,
role=self.ux_role,
name='UX Curriculum Override',
agent_type='curriculum',
system_prompt='UX-specific prompt',
)
selected = async_to_sync(self.consumer.get_config_by_type)(str(self.quant_role.uuid), 'curriculum')
self.assertIsNotNone(selected)
self.assertEqual(selected.uuid, quant_cfg.uuid)
self.assertEqual(selected.role_id, self.quant_role.id)
def test_get_config_by_type_falls_back_to_org_default(self):
AgentConfig.objects.filter(role=self.quant_role, agent_type='monitor').delete()
org_default = AgentConfig.objects.create(
organization=self.org,
role=None,
name='Org Monitor Default',
agent_type='monitor',
system_prompt='Organization-level monitor prompt',
)
selected = async_to_sync(self.consumer.get_config_by_type)(str(self.quant_role.uuid), 'monitor')
self.assertIsNotNone(selected)
self.assertEqual(selected.uuid, org_default.uuid)
self.assertIsNone(selected.role)
def test_extract_json_list_supports_wrapped_questions_payload(self):
payload = (
"Here is your quiz output:\n"
"```json\n"
'{"questions": [{"key": "q1", "label": "Question?", "field_type": "select", "options": ["A", "B"], "required": true, "validation": {"correct_option": "A", "explanation": "A"}}]}\n'
"```"
)
extracted = self.consumer._extract_json_list(payload)
self.assertIsInstance(extracted, list)
self.assertEqual(len(extracted), 1)
self.assertEqual(extracted[0]['key'], 'q1')
def test_build_fallback_quiz_fields_generates_eight_valid_questions(self):
fallback = self.consumer._build_fallback_quiz_fields(['Topic A', 'Topic B'])
self.assertEqual(len(fallback), 8)
2026-03-11 15:03:32 +00:00
select_items = [item for item in fallback if item.get('field_type') == 'select']
short_answer_items = [
item
for item in fallback
if item.get('field_type') in ('text', 'textarea')
]
self.assertGreaterEqual(len(select_items), 2)
self.assertGreaterEqual(len(short_answer_items), 2)
self.assertTrue(all(len(item.get('options', [])) >= 4 for item in select_items))
self.assertTrue(
all(
item.get('validation', {}).get('correct_option') in item.get('options', [])
for item in select_items
)
)
self.assertTrue(
all(
isinstance(item.get('validation', {}).get('accepted_answers', []), list)
and len(item.get('validation', {}).get('accepted_answers', [])) > 0
for item in short_answer_items
)
)