Files
executor/test_callback.py

160 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python
"""콜백 기능 테스트 스크립트"""
import os
import django
import json
import time
from http.server import HTTPServer, BaseHTTPRequestHandler
import threading
# Django 설정
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'executor.settings')
django.setup()
from strategies.models import StrategyExecution
import requests
class CallbackHandler(BaseHTTPRequestHandler):
"""콜백 수신용 간단한 HTTP 서버"""
received_data = None
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
# 수신한 데이터 저장
CallbackHandler.received_data = json.loads(post_data.decode('utf-8'))
print("\n" + "="*80)
print("콜백 수신!")
print("="*80)
print(json.dumps(CallbackHandler.received_data, indent=2, ensure_ascii=False))
print("="*80 + "\n")
# 200 OK 응답
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({'status': 'received'}).encode('utf-8'))
def log_message(self, format, *args):
# 기본 로그 메시지 비활성화
pass
def start_callback_server(port=8888):
"""콜백 수신 서버 시작"""
server = HTTPServer(('localhost', port), CallbackHandler)
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
print(f"✓ 콜백 서버 시작: http://localhost:{port}")
return server
def test_callback():
"""콜백 기능 테스트"""
print("\n" + "="*80)
print("콜백 기능 테스트")
print("="*80 + "\n")
# 1. 콜백 서버 시작
callback_port = 8888
callback_url = f"http://localhost:{callback_port}/callback"
server = start_callback_server(callback_port)
time.sleep(1)
# 2. 전략 실행 요청 (콜백 URL 포함)
print("전략 실행 요청 중...")
request_data = {
"strategy_name": "MovingAverageCrossover",
"parameters": {
"short_window": 10,
"long_window": 30,
"initial_capital": 50000
},
"callback_url": callback_url
}
response = requests.post(
'http://localhost:8000/strategies/execute/',
json=request_data
)
if response.status_code != 200:
print(f"✗ 실행 요청 실패: {response.text}")
server.shutdown()
return
result = response.json()
execution_id = result['execution_id']
print(f"✓ 실행 시작됨 (ID: {execution_id})")
print(f" 콜백 URL: {result.get('callback_url', 'N/A')}")
# 3. 전략 실행 완료 대기
print("\n전략 실행 완료 대기 중...")
max_wait = 30
waited = 0
while waited < max_wait:
time.sleep(2)
waited += 2
# 상태 확인
status_response = requests.get(f'http://localhost:8000/executions/{execution_id}/')
status_data = status_response.json()
print(f" 상태: {status_data['status']} ({waited}초 경과)")
if status_data['status'] in ['completed', 'failed']:
break
# 4. 콜백 수신 대기
print("\n콜백 수신 대기 중...")
time.sleep(3)
# 5. 결과 확인
status_response = requests.get(f'http://localhost:8000/executions/{execution_id}/')
final_status = status_response.json()
print("\n" + "="*80)
print("최종 결과")
print("="*80)
print(f"실행 상태: {final_status['status']}")
if 'callback' in final_status:
callback_info = final_status['callback']
print(f"\n콜백 정보:")
print(f" URL: {callback_info['url']}")
print(f" 전송 완료: {callback_info['sent']}")
print(f" 전송 시각: {callback_info['sent_at']}")
print(f" 응답 코드: {callback_info['response'].get('status_code', 'N/A')}")
if CallbackHandler.received_data:
print(f"\n✓ 콜백 데이터 수신 성공!")
print(f" 실행 ID: {CallbackHandler.received_data.get('execution_id')}")
print(f" 전략: {CallbackHandler.received_data.get('strategy')}")
print(f" 상태: {CallbackHandler.received_data.get('status')}")
else:
print(f"\n✗ 콜백 데이터 수신 실패")
print("="*80 + "\n")
# 6. 서버 종료
server.shutdown()
if __name__ == '__main__':
try:
test_callback()
except KeyboardInterrupt:
print("\n\n테스트 중단됨")
except Exception as e:
print(f"\n\n✗ 오류 발생: {e}")
import traceback
traceback.print_exc()