Files
clubber/test_organization_members.py
T
gurixandClaude d32dc99c66 feat: Update MCP server to support organization members
Implement organization member support in the TypeScript MCP server to align
with the GraphQL backend changes from support-organization-members.

Changes to src/mcp_server.ts:
- Update create_member tool definition:
  * Add memberType enum field (INDIVIDUAL, ORGANIZATION)
  * Add companyName field for organizations
  * Remove firstName from required fields
  * Update description to explain conditional requirements
- Update update_member tool definition:
  * Add memberType and companyName fields
  * Update description to mention type transitions
- Update all GraphQL queries and mutations:
  * Add memberType and companyName to listMembers query
  * Add memberType and companyName to getMember query
  * Add memberType and companyName to createMember mutation
  * Add memberType and companyName to updateMember mutation
- Update formatMember function:
  * Check memberType to determine formatting approach
  * Show "Type: Individual" or "Type: Organization"
  * For individuals: display "Name: firstName lastName"
  * For organizations: display "Company: companyName"
  * For organizations with contact: display "Contact Person: firstName lastName"
  * Maintain backward compatibility (defaults to INDIVIDUAL if missing)

Testing:
- All 11 implementation tasks completed
- Created test script test_organization_members.py
- Verified individual member creation with validation
- Verified organization member creation with companyName
- Verified organization with contact person
- Verified member listing with mixed types
- Verified GraphQL schema introspection includes MemberType enum
- Verified validation: INDIVIDUAL requires firstName, ORGANIZATION requires companyName

All tests passed successfully. MCP server now fully supports both individual
and organization members with proper formatting and validation.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 13:44:01 +01:00

171 lines
4.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""Test script for organization member support via GraphQL API."""
import httpx
import json
API_URL = "http://127.0.0.1:8000/graphql"
def execute_query(query: str, variables: dict = None):
"""Execute a GraphQL query."""
payload = {"query": query}
if variables:
payload["variables"] = variables
response = httpx.post(API_URL, json=payload)
response.raise_for_status()
result = response.json()
if "errors" in result:
print(f"GraphQL Errors: {result['errors']}")
raise Exception(f"GraphQL query failed: {result['errors']}")
return result["data"]
# Test 1: Create individual member
print("Test 1: Creating individual member...")
create_individual_query = """
mutation CreateMember($input: CreateMemberInput!) {
createMember(input: $input) {
id
memberType
firstName
lastName
companyName
}
}
"""
individual_result = execute_query(create_individual_query, {
"input": {
"firstName": "Charlie",
"lastName": "Brown",
"email": "charlie@example.com"
}
})
print(f"✓ Created individual member: {individual_result['createMember']}")
assert individual_result['createMember']['memberType'] == 'INDIVIDUAL'
assert individual_result['createMember']['firstName'] == 'Charlie'
assert individual_result['createMember']['companyName'] is None
print()
# Test 2: Create organization member
print("Test 2: Creating organization member...")
create_org_query = """
mutation CreateMember($input: CreateMemberInput!) {
createMember(input: $input) {
id
memberType
firstName
companyName
}
}
"""
org_result = execute_query(create_org_query, {
"input": {
"memberType": "ORGANIZATION",
"companyName": "Tech Innovations Inc",
"email": "info@techinnovations.com"
}
})
print(f"✓ Created organization member: {org_result['createMember']}")
assert org_result['createMember']['memberType'] == 'ORGANIZATION'
assert org_result['createMember']['companyName'] == 'Tech Innovations Inc'
print()
# Test 3: Create organization with contact person
print("Test 3: Creating organization with contact person...")
org_with_contact_result = execute_query(create_org_query, {
"input": {
"memberType": "ORGANIZATION",
"companyName": "Global Solutions Ltd",
"firstName": "Jane",
"lastName": "Doe",
"email": "contact@globalsolutions.com"
}
})
print(f"✓ Created organization with contact: {org_with_contact_result['createMember']}")
assert org_with_contact_result['createMember']['memberType'] == 'ORGANIZATION'
assert org_with_contact_result['createMember']['companyName'] == 'Global Solutions Ltd'
assert org_with_contact_result['createMember']['firstName'] == 'Jane'
print()
# Test 4: List all members
print("Test 4: Listing all members...")
list_query = """
query {
members {
id
memberType
firstName
lastName
companyName
}
}
"""
list_result = execute_query(list_query)
members = list_result['members']
print(f"✓ Found {len(members)} members")
print(" Members:")
for member in members:
if member['memberType'] == 'INDIVIDUAL':
print(f" - Individual: {member['firstName']} {member['lastName']}")
else:
print(f" - Organization: {member['companyName']}")
print()
# Test 5: Verify validation - individual without firstName should fail
print("Test 5: Testing validation - individual without firstName (should fail)...")
try:
execute_query(create_individual_query, {
"input": {
"memberType": "INDIVIDUAL",
"email": "nofirstname@example.com"
}
})
print("✗ Should have failed but didn't!")
exit(1)
except Exception as e:
print(f"✓ Correctly rejected: {str(e)[:100]}")
print()
# Test 6: Verify validation - organization without companyName should fail
print("Test 6: Testing validation - organization without companyName (should fail)...")
try:
execute_query(create_org_query, {
"input": {
"memberType": "ORGANIZATION",
"email": "nocompany@example.com"
}
})
print("✗ Should have failed but didn't!")
exit(1)
except Exception as e:
print(f"✓ Correctly rejected: {str(e)[:100]}")
print()
# Test 7: Check introspection for MemberType enum
print("Test 7: Verifying MemberType enum in schema...")
introspection_query = """
query {
__type(name: "MemberType") {
name
kind
enumValues {
name
}
}
}
"""
introspection_result = execute_query(introspection_query)
member_type_enum = introspection_result['__type']
print(f"✓ Found MemberType enum: {member_type_enum['name']}")
enum_values = [ev['name'] for ev in member_type_enum['enumValues']]
print(f" Enum values: {enum_values}")
assert 'INDIVIDUAL' in enum_values
assert 'ORGANIZATION' in enum_values
print()
print("=" * 50)
print("All tests passed! ✓")
print("=" * 50)