mirror of
https://github.com/arkorty/B.Tech-Project-III.git
synced 2026-04-19 12:41:48 +00:00
158 lines
6.1 KiB
Python
158 lines
6.1 KiB
Python
"""
|
|
Test Milestone 14: Meet extension backend endpoints.
|
|
Tests the /api/meet/start and /api/meet/ingest endpoints directly (no Chrome needed).
|
|
"""
|
|
import asyncio
|
|
import os
|
|
import sys
|
|
import json
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
|
|
async def test_manifest_valid():
|
|
"""Test extension manifest.json is valid."""
|
|
import json
|
|
manifest_path = os.path.join(
|
|
os.path.dirname(__file__), '..', 'meet_extension', 'manifest.json'
|
|
)
|
|
assert os.path.exists(manifest_path), "manifest.json not found at meet_extension/manifest.json"
|
|
with open(manifest_path) as f:
|
|
manifest = json.load(f)
|
|
|
|
assert manifest.get("manifest_version") == 3, "Must be Manifest V3"
|
|
assert "meet.google.com" in str(manifest.get("host_permissions", [])), \
|
|
"Missing meet.google.com host permission"
|
|
assert manifest.get("background", {}).get("service_worker"), "Missing service_worker"
|
|
assert manifest.get("action", {}).get("default_popup"), "Missing popup"
|
|
print(" ✅ manifest.json is valid MV3")
|
|
|
|
|
|
async def test_extension_files_exist():
|
|
"""Test all required extension files exist."""
|
|
base = os.path.join(os.path.dirname(__file__), '..', 'meet_extension')
|
|
required = ["manifest.json", "content.js", "popup.html", "popup.js", "background.js"]
|
|
for filename in required:
|
|
path = os.path.join(base, filename)
|
|
assert os.path.exists(path), f"Missing extension file: {filename}"
|
|
print(f" ✅ {filename} exists")
|
|
|
|
|
|
async def test_meet_start_endpoint():
|
|
"""Test /api/meet/start returns 200 with correct secret."""
|
|
import httpx
|
|
from backend.config import MEET_INGEST_SECRET
|
|
|
|
async with httpx.AsyncClient(base_url="http://localhost:8000") as client:
|
|
# Test with correct secret
|
|
resp = await client.post(
|
|
"/api/meet/start",
|
|
json={
|
|
"meeting_id": "bje-xogw-kcv",
|
|
"group_id": "bje_xogw_kcv",
|
|
"started_at": "2026-03-21T10:00:00Z",
|
|
"speaker": "Raj Bhattacharyya",
|
|
},
|
|
headers={"X-ThirdEye-Secret": MEET_INGEST_SECRET},
|
|
)
|
|
assert resp.status_code == 200, f"Expected 200, got {resp.status_code}: {resp.text}"
|
|
data = resp.json()
|
|
assert data.get("ok") is True
|
|
print(f" ✅ /api/meet/start returned ok=True for meeting bje-xogw-kcv")
|
|
|
|
# Test with wrong secret → should get 403
|
|
resp_bad = await client.post(
|
|
"/api/meet/start",
|
|
json={"meeting_id": "fake", "group_id": "fake", "started_at": "2026-03-21T10:00:00Z"},
|
|
headers={"X-ThirdEye-Secret": "wrong_secret"},
|
|
)
|
|
assert resp_bad.status_code == 403, f"Expected 403 for bad secret, got {resp_bad.status_code}"
|
|
print(" ✅ Bad secret correctly rejected with 403")
|
|
|
|
|
|
async def test_meet_ingest_endpoint():
|
|
"""Test /api/meet/ingest accepts a transcript chunk and queues processing."""
|
|
import httpx
|
|
from backend.config import MEET_INGEST_SECRET
|
|
|
|
async with httpx.AsyncClient(base_url="http://localhost:8000") as client:
|
|
resp = await client.post(
|
|
"/api/meet/ingest",
|
|
json={
|
|
"meeting_id": "bje-xogw-kcv",
|
|
"group_id": "bje_xogw_kcv",
|
|
"chunk_index": 0,
|
|
"text": "We decided to go with PostgreSQL for the primary database. "
|
|
"Alex will set up the schema by Thursday. "
|
|
"The migration scripts need to be reviewed before deployment.",
|
|
"speaker": "Raj Bhattacharyya",
|
|
"timestamp": "2026-03-21T10:01:00Z",
|
|
"is_final": False,
|
|
},
|
|
headers={"X-ThirdEye-Secret": MEET_INGEST_SECRET},
|
|
timeout=10.0,
|
|
)
|
|
assert resp.status_code == 200, f"Expected 200, got {resp.status_code}: {resp.text}"
|
|
data = resp.json()
|
|
assert data.get("ok") is True
|
|
assert data.get("queued") is True
|
|
print(f" ✅ /api/meet/ingest chunk accepted and queued")
|
|
|
|
# Wait briefly for background task to process
|
|
await asyncio.sleep(5)
|
|
|
|
# Verify the meeting appears in /api/meet/meetings
|
|
async with httpx.AsyncClient(base_url="http://localhost:8000") as client:
|
|
resp = await client.get("/api/meet/meetings")
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
meetings = data.get("meetings", [])
|
|
ids = [m["meeting_id"] for m in meetings]
|
|
assert "bje-xogw-kcv" in ids, f"Meeting bje-xogw-kcv not found in {ids}"
|
|
print(f" ✅ Meeting bje-xogw-kcv visible in /api/meet/meetings")
|
|
|
|
|
|
async def test_meet_skip_short_chunk():
|
|
"""Test that very short chunks are gracefully skipped."""
|
|
import httpx
|
|
from backend.config import MEET_INGEST_SECRET
|
|
|
|
async with httpx.AsyncClient(base_url="http://localhost:8000") as client:
|
|
resp = await client.post(
|
|
"/api/meet/ingest",
|
|
json={
|
|
"meeting_id": "bje-xogw-kcv",
|
|
"group_id": "bje_xogw_kcv",
|
|
"chunk_index": 99,
|
|
"text": "Uh", # Too short
|
|
"speaker": "Raj Bhattacharyya",
|
|
"timestamp": "2026-03-21T10:02:00Z",
|
|
"is_final": False,
|
|
},
|
|
headers={"X-ThirdEye-Secret": MEET_INGEST_SECRET},
|
|
)
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert data.get("skipped") is True, "Expected short chunk to be skipped"
|
|
print(f" ✅ Short chunk correctly skipped")
|
|
|
|
|
|
async def main():
|
|
print("Running Milestone 14 tests...\n")
|
|
print("NOTE: The FastAPI server must be running: python run_api.py\n")
|
|
|
|
await test_manifest_valid()
|
|
await test_extension_files_exist()
|
|
|
|
try:
|
|
await test_meet_start_endpoint()
|
|
await test_meet_ingest_endpoint()
|
|
await test_meet_skip_short_chunk()
|
|
print("\n🎉 MILESTONE 14 PASSED — Extension files valid, backend endpoints working")
|
|
except Exception as e:
|
|
print(f"\n💥 MILESTONE 14 FAILED: {e}")
|
|
print(" Make sure: python run_api.py is running before running this test")
|
|
raise
|
|
|
|
|
|
asyncio.run(main())
|