import asyncio
import sqlite3
import threading
import tempfile
import time
import smtplib
from pathlib import Path
from types import SimpleNamespace
import feedback_service
import pytest
from fastapi.testclient import TestClient
from feedback_service import Settings, SendFailure, UncertainFailure, SmtpSender, SubmissionStore, create_app
ID = "cbaaaace-60b2-4871-8a95-ae316444a2fb"
PNG = b"\x89PNG\r\n\x1a\n" + b"safe fixture"
HTML = (b'
'
b''
b'')
def test_real_client_generated_synthetic_html_is_accepted_as_attachment(service):
client, sender, _ = service
page = (Path(__file__).parent / 'fixtures/client-school-diagnostic.html').read_bytes()
fields = [('submission_id', (None, ID)), ('type', (None, 'problem')), ('message', (None, 'Cannot import'))]
response = client.post('/v1/feedback', files=fields + [('diagnostic_html', ('page.html', page, 'text/html'))])
assert response.status_code == 200
attachment = list(sender.messages[0].iter_attachments())[0]
assert attachment.get_payload(decode=True) == page
@pytest.mark.parametrize('fixture', ['client-graduate-timetable.html', 'client-graduate-exams.html'])
def test_real_graduate_client_html_is_mailed_without_changing_its_evidence(service, fixture):
client, sender, _ = service
page = (Path(__file__).parent / 'fixtures' / fixture).read_bytes()
fields = [('submission_id', (None, ID)), ('type', (None, 'problem')), ('message', (None, 'Graduate import failed'))]
response = client.post('/v1/feedback', files=fields + [('diagnostic_html', ('page.html', page, 'text/html'))])
assert response.status_code == 200
attachment = list(sender.messages[0].iter_attachments())[0]
assert attachment.get_filename() == 'TPSchedule-school-page.html'
assert attachment.get_payload(decode=True) == page
@pytest.mark.parametrize('extra', [
'',
'',
'',
'',
'',
'',
])
def test_graduate_diagnostics_reject_unrelated_or_active_controls(service, extra):
client, sender, _ = service
page = HTML.replace(b'