"""Integration tests for participant list functionality.""" from datetime import UTC, datetime from flask import url_for def test_participant_list_shows_all_active( client, auth_participant, participant_factory ): """Test participant list shows all active participants.""" # auth_participant fixture creates session and one participant exchange = auth_participant.exchange # Create 2 more active participants participant_factory(exchange=exchange, name="Bob") participant_factory(exchange=exchange, name="Charlie") response = client.get(url_for("participant.dashboard", id=exchange.id)) assert response.status_code == 200 assert b"Bob" in response.data assert b"Charlie" in response.data assert b"Participants (3)" in response.data def test_participant_list_excludes_withdrawn( client, auth_participant, participant_factory ): """Test withdrawn participants are not shown.""" exchange = auth_participant.exchange # Create active and withdrawn participants participant_factory(exchange=exchange, name="Active") participant_factory( exchange=exchange, name="Withdrawn", withdrawn_at=datetime.now(UTC) ) response = client.get(url_for("participant.dashboard", id=exchange.id)) assert response.status_code == 200 assert b"Active" in response.data assert b"Withdrawn" not in response.data # Count should be 2 (auth_participant + Active) assert b"Participants (2)" in response.data def test_participant_list_shows_self_badge(client, auth_participant): """Test participant list marks current user with badge.""" exchange = auth_participant.exchange response = client.get(url_for("participant.dashboard", id=exchange.id)) assert response.status_code == 200 # Should show the participant's name assert auth_participant.name.encode() in response.data # Should show "You" badge assert b"You" in response.data def test_participant_list_ordered_by_name( client, auth_participant, participant_factory ): """Test participants are shown in alphabetical order.""" exchange = auth_participant.exchange # Create participants with names that should be sorted participant_factory(exchange=exchange, name="Zoe") participant_factory(exchange=exchange, name="Alice") participant_factory(exchange=exchange, name="Bob") response = client.get(url_for("participant.dashboard", id=exchange.id)) assert response.status_code == 200 # Check order by finding positions in response data = response.data.decode() alice_pos = data.find("Alice") bob_pos = data.find("Bob") zoe_pos = data.find("Zoe") # All should be present assert alice_pos > 0 assert bob_pos > 0 assert zoe_pos > 0 # Should be in alphabetical order assert alice_pos < bob_pos < zoe_pos def test_participant_list_empty_state(client, exchange_factory, participant_factory): """Test message shown when only one participant.""" exchange = exchange_factory(state="registration_open") participant = participant_factory(exchange=exchange) # Create session for the only participant with client.session_transaction() as session: session["user_id"] = participant.id session["user_type"] = "participant" session["exchange_id"] = exchange.id response = client.get(url_for("participant.dashboard", id=exchange.id)) assert response.status_code == 200 assert b"Participants (1)" in response.data # Should show participant's own name assert participant.name.encode() in response.data def test_participant_list_requires_auth(client, exchange_factory): """Test participant list requires authentication.""" exchange = exchange_factory() response = client.get( url_for("participant.dashboard", id=exchange.id), follow_redirects=False ) # Should redirect to login (or show error) assert response.status_code in [302, 403] def test_participant_list_different_exchange( client, auth_participant, exchange_factory, participant_factory ): """Test participants filtered by exchange.""" exchange1 = auth_participant.exchange exchange2 = exchange_factory(state="registration_open") # Create participant in different exchange participant_factory(exchange=exchange2, name="Other Exchange") response = client.get(url_for("participant.dashboard", id=exchange1.id)) assert response.status_code == 200 # Should not show participant from other exchange assert b"Other Exchange" not in response.data