2025-11-21 19:56:03 +01:00
|
|
|
"""Integration tests for GraphQL query resolvers."""
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from sqlalchemy import select
|
|
|
|
|
|
2025-12-04 16:28:05 +01:00
|
|
|
from src.models.member import Member, MemberType
|
2025-11-21 19:56:03 +01:00
|
|
|
from src.resolvers.member import Query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestMemberQueries:
|
|
|
|
|
"""Tests for GraphQL query resolvers."""
|
|
|
|
|
|
|
|
|
|
async def test_query_single_member_by_id(self, async_session, patched_session_maker):
|
|
|
|
|
"""Test querying a single member by ID."""
|
|
|
|
|
# Create a member
|
|
|
|
|
member = Member(
|
|
|
|
|
first_name="Alice",
|
|
|
|
|
last_name="Smith",
|
|
|
|
|
email="alice@example.com"
|
|
|
|
|
)
|
|
|
|
|
async_session.add(member)
|
|
|
|
|
await async_session.commit()
|
|
|
|
|
await async_session.refresh(member)
|
|
|
|
|
|
|
|
|
|
# Query the member
|
|
|
|
|
query = Query()
|
|
|
|
|
result = await query.member(id=member.id)
|
|
|
|
|
|
|
|
|
|
assert result is not None
|
|
|
|
|
assert result.id == member.id
|
|
|
|
|
assert result.first_name == "Alice"
|
|
|
|
|
assert result.last_name == "Smith"
|
|
|
|
|
assert result.email == "alice@example.com"
|
|
|
|
|
|
|
|
|
|
async def test_query_member_with_nonexistent_id(self, patched_session_maker):
|
|
|
|
|
"""Test querying a member with non-existent ID returns None."""
|
|
|
|
|
query = Query()
|
|
|
|
|
result = await query.member(id=999)
|
|
|
|
|
|
|
|
|
|
assert result is None
|
|
|
|
|
|
|
|
|
|
async def test_query_all_members(self, async_session, patched_session_maker):
|
|
|
|
|
"""Test querying all members."""
|
|
|
|
|
# Create multiple members
|
|
|
|
|
members = [
|
|
|
|
|
Member(first_name="Alice", last_name="Smith"),
|
|
|
|
|
Member(first_name="Bob", last_name="Johnson"),
|
|
|
|
|
Member(first_name="Charlie", last_name="Brown"),
|
|
|
|
|
]
|
|
|
|
|
for m in members:
|
|
|
|
|
async_session.add(m)
|
|
|
|
|
await async_session.commit()
|
|
|
|
|
|
|
|
|
|
# Query all members
|
|
|
|
|
query = Query()
|
|
|
|
|
results = await query.members()
|
|
|
|
|
|
|
|
|
|
assert len(results) == 3
|
|
|
|
|
assert results[0].first_name == "Charlie" # Brown comes first
|
|
|
|
|
assert results[1].first_name == "Bob" # Johnson
|
|
|
|
|
assert results[2].first_name == "Alice" # Smith
|
|
|
|
|
|
|
|
|
|
async def test_query_members_empty_database(self, patched_session_maker):
|
|
|
|
|
"""Test querying members when database is empty returns empty array."""
|
|
|
|
|
query = Query()
|
|
|
|
|
results = await query.members()
|
|
|
|
|
|
|
|
|
|
assert results == []
|
|
|
|
|
|
|
|
|
|
async def test_members_sorting_nulls_last(self, async_session, patched_session_maker):
|
|
|
|
|
"""Test that members query sorts by last_name (nulls last), then first_name."""
|
|
|
|
|
# Create members with some having null last names
|
|
|
|
|
members = [
|
|
|
|
|
Member(first_name="Zoe", last_name="Anderson"),
|
|
|
|
|
Member(first_name="Alice", last_name=None),
|
|
|
|
|
Member(first_name="Bob", last_name=None),
|
|
|
|
|
Member(first_name="Charlie", last_name="Baker"),
|
|
|
|
|
]
|
|
|
|
|
for m in members:
|
|
|
|
|
async_session.add(m)
|
|
|
|
|
await async_session.commit()
|
|
|
|
|
|
|
|
|
|
# Query all members
|
|
|
|
|
query = Query()
|
|
|
|
|
results = await query.members()
|
|
|
|
|
|
|
|
|
|
# Expected order: Anderson, Baker, then nulls (Alice, Bob)
|
|
|
|
|
assert len(results) == 4
|
|
|
|
|
assert results[0].last_name == "Anderson"
|
|
|
|
|
assert results[1].last_name == "Baker"
|
|
|
|
|
assert results[2].first_name == "Alice"
|
|
|
|
|
assert results[2].last_name is None
|
|
|
|
|
assert results[3].first_name == "Bob"
|
|
|
|
|
assert results[3].last_name is None
|
2025-12-04 16:28:05 +01:00
|
|
|
|
|
|
|
|
async def test_query_mixed_member_types(self, async_session, patched_session_maker):
|
|
|
|
|
"""Test querying returns both individual and organization members."""
|
|
|
|
|
# Create individual member
|
|
|
|
|
individual = Member(
|
|
|
|
|
member_type=MemberType.INDIVIDUAL,
|
|
|
|
|
first_name="Alice",
|
|
|
|
|
last_name="Smith"
|
|
|
|
|
)
|
|
|
|
|
async_session.add(individual)
|
|
|
|
|
|
|
|
|
|
# Create organization member
|
|
|
|
|
organization = Member(
|
|
|
|
|
member_type=MemberType.ORGANIZATION,
|
|
|
|
|
company_name="Acme Corp",
|
|
|
|
|
email="info@acme.com"
|
|
|
|
|
)
|
|
|
|
|
async_session.add(organization)
|
|
|
|
|
await async_session.commit()
|
|
|
|
|
|
|
|
|
|
# Query all members
|
|
|
|
|
query = Query()
|
|
|
|
|
result = await query.members()
|
|
|
|
|
|
|
|
|
|
assert len(result) == 2
|
|
|
|
|
types = {m.member_type for m in result}
|
|
|
|
|
assert MemberType.INDIVIDUAL in types
|
|
|
|
|
assert MemberType.ORGANIZATION in types
|
|
|
|
|
|
|
|
|
|
# Verify individual member data
|
|
|
|
|
individual_result = next(m for m in result if m.member_type == MemberType.INDIVIDUAL)
|
|
|
|
|
assert individual_result.first_name == "Alice"
|
|
|
|
|
assert individual_result.last_name == "Smith"
|
|
|
|
|
|
|
|
|
|
# Verify organization member data
|
|
|
|
|
org_result = next(m for m in result if m.member_type == MemberType.ORGANIZATION)
|
|
|
|
|
assert org_result.company_name == "Acme Corp"
|