#!/usr/bin/env python3 import re def test_parse_markdown_questions(): with open('data/balotario_clase_a_cat_I.md', 'r', encoding='utf-8') as file: content = file.read() questions = [] # Dividir el contenido por preguntas usando ### como separador question_blocks = re.split(r'\n### (\d+)\n', content)[1:] # Ignorar el primer elemento vacío for i in range(0, len(question_blocks), 2): if i + 1 >= len(question_blocks): break question_num = int(question_blocks[i]) question_content = question_blocks[i + 1].strip() # Solo procesar las primeras 3 preguntas para prueba if question_num > 3: break # Verificar si hay imagen al inicio (ahora soporta imágenes locales) has_image = ('![](https://sierdgtt.mtc.gob.pe/Content/img-data/' in question_content or '![](/static/images/' in question_content) image_url = "" if has_image: # Intentar primero imágenes locales, luego remotas img_match = re.search(r'!\[\]\((/static/images/[^)]+)\)', question_content) if not img_match: img_match = re.search(r'!\[\]\((https://sierdgtt\.mtc\.gob\.pe/Content/img-data/[^)]+)\)', question_content) if img_match: image_url = img_match.group(1) question_content = re.sub(r'!\[\]\([^)]+\)\n*', '', question_content).strip() # Separar pregunta de opciones lines = question_content.split('\n') question_lines = [] option_lines = [] in_options = False for line in lines: line = line.strip() if not line: continue if re.match(r'^✅?\s*[a-d]\)', line): in_options = True option_lines.append(line) elif not in_options: question_lines.append(line) question_text = ' '.join(question_lines).strip() # Extraer opciones y respuesta correcta options = [] correct_option = "" for line in option_lines: original_line = line.strip() # Verificar si esta línea tiene el ✅ if '✅' in original_line: # Extraer la letra de la opción correcta match = re.search(r'✅\s*([a-d])\)', original_line) if match: correct_option = match.group(1) # Limpiar la línea removiendo el ✅ completamente clean_line = re.sub(r'✅\s*', '', original_line).strip() options.append(clean_line) if len(options) >= 2 and correct_option and question_text: # Validar que tenemos datos completos questions.append({ 'id': question_num, 'question': question_text, 'options': options, 'correct': correct_option, 'image': image_url, 'has_image': has_image }) # Assertions para validar que el parsing funciona correctamente assert len(questions) > 0, "No se parsearon preguntas" assert len(questions) <= 3, "Se parsearon más preguntas de las esperadas" for q in questions: assert 'id' in q, "Falta el ID de la pregunta" assert 'question' in q, "Falta el texto de la pregunta" assert 'options' in q, "Faltan las opciones" assert 'correct' in q, "Falta la respuesta correcta" assert len(q['options']) >= 2, f"Pregunta {q['id']} tiene menos de 2 opciones" assert q['correct'] in ['a', 'b', 'c', 'd'], f"Respuesta correcta inválida en pregunta {q['id']}" assert len(q['question']) > 0, f"Pregunta {q['id']} está vacía" # Ejecutar prueba if __name__ == "__main__": questions = test_parse_markdown_questions() print(f"✅ Se parsearon {len(questions)} preguntas correctamente") print("=" * 60) for q in questions: print(f"Pregunta {q['id']}: {q['question'][:50]}...") print(f"Respuesta correcta: {q['correct']}") print("Opciones:") for i, option in enumerate(q['options']): letter = chr(97 + i) # a, b, c, d marker = "✅" if letter == q['correct'] else " " print(f" {marker} {option}") print("-" * 40)