Newer
Older
geekbrain_io_web / tests / test_integration / test_contact_flow.py
import pytest
from fastapi.testclient import TestClient
from app.main import app
from unittest.mock import patch, AsyncMock

client = TestClient(app)

@patch("app.routes.contact.fetch_repos", return_value=[])
@patch("app.routes.contact.send_contact_email", new_callable=AsyncMock)
@patch("app.routes.contact.create_contact", new_callable=AsyncMock)
@patch("app.routes.contact.httpx.AsyncClient.post")
def test_full_contact_submission(mock_recaptcha, mock_create, mock_send, mock_fetch):
    # Mock reCAPTCHA verification
    mock_resp = AsyncMock()
    mock_resp.json.return_value = {"success": True}
    mock_recaptcha.return_value = mock_resp

    response = client.post("/contact", json={
        "name": "Jean Dupont",
        "email": "[email protected]",
        "subject": "Test contact",
        "message": "Hello, I'd like to discuss a project.",
        "recaptcha_token": "valid-token"
    })

    assert response.status_code == 200
    assert response.json()["success"] is True
    mock_create.assert_awaited_once()
    mock_send.assert_awaited_once()

@patch("app.routes.contact.fetch_repos", return_value=[])
def test_contact_page_contains_form_elements(_):
    response = client.get("/contact")
    assert response.status_code == 200
    assert '<form' in response.text
    assert 'g-recaptcha' in response.text
    assert 'name="name"' in response.text
    assert 'name="email"' in response.text