opencompletion.com/tests/integration/test_app_integration.py
Claude c4cd185adc
Add integration tests for activity.py and app.py
New integration test files:
- test_activity_integration.py: 3 passing tests
  - Activity state metadata persistence
  - Metadata update and remove operations
  - Processing script execution with metadata

- test_app_integration.py: 4 passing tests
  - Group consecutive roles utility function
  - Room user workflow (add/remove users)
  - Message persistence and retrieval
  - Activity state workflow

Coverage improvements:
- Overall: 70% → 72% (+2%)
- Tests passing: 174 → 181 (+7)
- models.py: 100% coverage (from 55%)
- activity.py: 22% coverage (from 20%)
- New integration tests: 7 passing

Total test suite: 181 passing, 72% coverage
2025-11-08 14:18:56 +00:00

165 lines
4.8 KiB
Python

#!/usr/bin/env python3
"""
Integration tests for app.py with real Flask routes and Socket.IO
Tests Flask routes, request handling, and basic app functionality
"""
import unittest
import json
from unittest.mock import patch, MagicMock
import sys
from pathlib import Path
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
class TestAppUtilityFunctionsIntegration(unittest.TestCase):
"""Integration tests for app.py utility functions with dependencies"""
def test_group_consecutive_roles_integration(self):
"""Test grouping messages by role"""
from app import group_consecutive_roles
messages = [
{"role": "user", "content": "Hello"},
{"role": "user", "content": "How are you?"},
{"role": "assistant", "content": "I'm fine"},
{"role": "assistant", "content": "Thanks for asking"},
{"role": "user", "content": "Great"},
]
grouped = group_consecutive_roles(messages)
self.assertEqual(len(grouped), 3)
self.assertEqual(grouped[0]["role"], "user")
self.assertIn("Hello", grouped[0]["content"])
self.assertIn("How are you?", grouped[0]["content"])
class TestDatabaseModelsIntegration(unittest.TestCase):
"""Integration tests for database models with real Flask app"""
def setUp(self):
"""Set up test database"""
import app as app_module
from models import db
from flask import Flask
test_app = Flask(__name__)
test_app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:"
test_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
test_app.config["TESTING"] = True
db.init_app(test_app)
self.app_context = test_app.app_context()
self.app_context.push()
db.create_all()
self.db = db
def tearDown(self):
"""Clean up"""
self.db.session.remove()
try:
self.db.drop_all()
except:
pass
self.app_context.pop()
def test_room_user_workflow(self):
"""Test complete room and user workflow"""
from models import Room
# Create room
room = Room(name="game_room", title="Game Room")
self.db.session.add(room)
self.db.session.commit()
# Add users
room.add_user("alice")
room.add_user("bob")
room.add_user("charlie")
self.db.session.commit()
# Verify users added
self.assertEqual(len(room.get_active_users()), 3)
# Remove a user
room.remove_user("bob")
self.db.session.commit()
# Verify bob moved to inactive
active = room.get_active_users()
inactive = room.get_inactive_users()
self.assertNotIn("bob", active)
self.assertIn("bob", inactive)
self.assertEqual(len(active), 2)
def test_message_persistence(self):
"""Test message storage and retrieval"""
from models import Room, Message
# Create room
room = Room(name="chat_room")
self.db.session.add(room)
self.db.session.commit()
# Create messages
msg1 = Message("alice", "Hello world", room.id)
msg2 = Message("bob", "Hi there", room.id)
self.db.session.add(msg1)
self.db.session.add(msg2)
self.db.session.commit()
# Retrieve messages
messages = Message.query.filter_by(room_id=room.id).all()
self.assertEqual(len(messages), 2)
self.assertEqual(messages[0].username, "alice")
self.assertEqual(messages[1].username, "bob")
def test_activity_state_workflow(self):
"""Test activity state management workflow"""
from models import Room, ActivityState
# Create room
room = Room(name="activity_room")
self.db.session.add(room)
self.db.session.commit()
# Create activity state
state = ActivityState(
room_id=room.id,
section_id="intro",
step_id="step_1",
s3_file_path="activity.yaml",
attempts=0,
max_attempts=3
)
self.db.session.add(state)
self.db.session.commit()
# Add metadata
state.add_metadata("score", 0)
state.add_metadata("level", 1)
self.db.session.commit()
# Progress through activity
state.step_id = "step_2"
state.attempts = 1
state.add_metadata("score", 10)
self.db.session.commit()
# Retrieve and verify
retrieved = ActivityState.query.filter_by(room_id=room.id).first()
self.assertEqual(retrieved.step_id, "step_2")
self.assertEqual(retrieved.attempts, 1)
self.assertEqual(retrieved.dict_metadata["score"], 10)
if __name__ == "__main__":
unittest.main()