Files
clubber/tests/integration/test_member_queries.py
gurixandClaude da9286be73 test: Reorganize organization member tests into proper pytest structure
Fix test organization by moving ad-hoc test scripts into proper pytest tests
following project conventions. Added 4 new tests to integration and e2e layers
to provide comprehensive coverage for organization members.

Changes:
- tests/integration/test_member_mutations.py:
  * Add test_create_organization_member - Tests creating organizations with companyName
  * Add test_create_organization_with_contact_person - Tests organizations with contact info
  * Import MemberType from models and schemas

- tests/integration/test_member_queries.py:
  * Add test_query_mixed_member_types - Tests querying both individual and organization members
  * Import MemberType from models

- tests/e2e/test_graphql_api.py:
  * Add test_introspect_member_type_enum - Tests GraphQL introspection for MemberType enum
  * Verifies INDIVIDUAL and ORGANIZATION enum values

Deleted improper test files:
- test_organization_members.py (root) - Ad-hoc script using httpx directly
- test_mcp_changes.sh (root) - Shell script for MCP server testing

Test results:
- All 57 tests pass (up from 53)
- Organization members now tested at all layers: unit, integration, and e2e
- Tests follow pytest conventions with async patterns and shared fixtures
- Integrated with CI/CD pipeline (proper test/ directory structure)

The proper test structure ensures:
1. Unit tests validate business logic (validation layer)
2. Integration tests verify GraphQL resolvers and database persistence
3. E2E tests confirm full HTTP request/response flows
4. All tests use shared fixtures from conftest.py

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 16:28:05 +01:00

132 lines
4.6 KiB
Python

"""Integration tests for GraphQL query resolvers."""
import pytest
from sqlalchemy import select
from src.models.member import Member, MemberType
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
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"