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>
This commit is contained in:
@@ -3,9 +3,9 @@
|
||||
import pytest
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.models.member import Member
|
||||
from src.models.member import Member, MemberType
|
||||
from src.resolvers.member import MemberNotFoundError, Mutation
|
||||
from src.schemas.member import CreateMemberInput, UpdateMemberInput
|
||||
from src.schemas.member import CreateMemberInput, MemberType as SchemaMemberType, UpdateMemberInput
|
||||
from src.validation import ValidationError
|
||||
|
||||
|
||||
@@ -89,6 +89,57 @@ class TestCreateMemberMutation:
|
||||
with pytest.raises(ValidationError, match="firstName is required for individual members"):
|
||||
await mutation.create_member(input=input_data)
|
||||
|
||||
async def test_create_organization_member(self, async_session, patched_session_maker):
|
||||
"""Test creating an organization member with companyName."""
|
||||
mutation = Mutation()
|
||||
input_data = CreateMemberInput(
|
||||
member_type=SchemaMemberType.ORGANIZATION,
|
||||
company_name="Tech Innovations Inc",
|
||||
email="info@techinnovations.com"
|
||||
)
|
||||
|
||||
result = await mutation.create_member(input=input_data)
|
||||
|
||||
assert result.id is not None
|
||||
assert result.member_type == SchemaMemberType.ORGANIZATION
|
||||
assert result.company_name == "Tech Innovations Inc"
|
||||
assert result.first_name is None
|
||||
|
||||
# Verify in database
|
||||
db_result = await async_session.execute(
|
||||
select(Member).where(Member.id == result.id)
|
||||
)
|
||||
db_member = db_result.scalar_one()
|
||||
assert db_member.member_type.value == "ORGANIZATION"
|
||||
assert db_member.company_name == "Tech Innovations Inc"
|
||||
|
||||
async def test_create_organization_with_contact_person(self, async_session, patched_session_maker):
|
||||
"""Test creating an organization with contact person."""
|
||||
mutation = Mutation()
|
||||
input_data = CreateMemberInput(
|
||||
member_type=SchemaMemberType.ORGANIZATION,
|
||||
company_name="Global Solutions Ltd",
|
||||
first_name="Jane",
|
||||
last_name="Doe",
|
||||
email="contact@globalsolutions.com"
|
||||
)
|
||||
|
||||
result = await mutation.create_member(input=input_data)
|
||||
|
||||
assert result.member_type == SchemaMemberType.ORGANIZATION
|
||||
assert result.company_name == "Global Solutions Ltd"
|
||||
assert result.first_name == "Jane"
|
||||
assert result.last_name == "Doe"
|
||||
|
||||
# Verify in database
|
||||
db_result = await async_session.execute(
|
||||
select(Member).where(Member.id == result.id)
|
||||
)
|
||||
db_member = db_result.scalar_one()
|
||||
assert db_member.member_type.value == "ORGANIZATION"
|
||||
assert db_member.company_name == "Global Solutions Ltd"
|
||||
assert db_member.first_name == "Jane"
|
||||
|
||||
|
||||
class TestUpdateMemberMutation:
|
||||
"""Tests for updateMember mutation."""
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import pytest
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.models.member import Member
|
||||
from src.models.member import Member, MemberType
|
||||
from src.resolvers.member import Query
|
||||
|
||||
|
||||
@@ -92,3 +92,40 @@ class TestMemberQueries:
|
||||
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"
|
||||
|
||||
Reference in New Issue
Block a user