From 53d941e434804ecaace003077c1a64ae352f094d Mon Sep 17 00:00:00 2001 From: Unnati1007 Date: Tue, 9 Jun 2026 00:03:30 +0530 Subject: [PATCH 1/4] perf: add mongodb indexes to prevent dashboard collscan --- backend/main.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/backend/main.py b/backend/main.py index 6156417..e447b0f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -37,17 +37,41 @@ from services.reminder_scheduler import start_scheduler from services.complexity_analyzer import analyze_code from social import share_to_platforms +from services.credential_service import resolve_user_credentials +from models.user import PlatformCredential +from utils.crypto import encrypt load_dotenv() logger = logging.getLogger("leetcodeai") +# ----------------------------- +# MongoDB Setup +# ----------------------------- +mongo_client = motor.motor_asyncio.AsyncIOMotorClient(os.getenv("MONGODB_URI")) +db = mongo_client.leetcodeai + @asynccontextmanager async def lifespan(app: FastAPI): """ - Start background schedulers when server starts. + Start background schedulers and initialize MongoDB indexes when server starts. """ + try: + # Create indexes to prevent COLLSCAN on dashboard queries + await db.problem_info.create_index( + [("user_email", 1), ("date", -1)], + background=True + ) + await db.users.create_index( + [("email", 1)], + unique=True, + background=True + ) + print("MongoDB indexes ensured successfully.") + except Exception as e: + logger.error(f"Failed to create MongoDB indexes: {e}") + try: start_scheduler() print("Reminder scheduler started successfully.") @@ -94,12 +118,6 @@ async def mongodb_exception_handler(request: Request, exc: PyMongoError): # ----------------------------- twilio_client = Client(os.getenv("TWILIO_ACCOUNT_SID"), os.getenv("TWILIO_AUTH_TOKEN")) -# ----------------------------- -# MongoDB Setup -# ----------------------------- -mongo_client = motor.motor_asyncio.AsyncIOMotorClient(os.getenv("MONGODB_URI")) - -db = mongo_client.leetcodeai # ----------------------------- From 7ce014d0dc89777bae59e488f1a0147058d7b243 Mon Sep 17 00:00:00 2001 From: Unnati1007 Date: Thu, 11 Jun 2026 09:38:03 +0530 Subject: [PATCH 2/4] Fix tests, celery issue, and mock_generate_tags --- backend/alerts/progress_checker.py | 104 ++---------------- backend/devto.py | 4 +- backend/main.py | 8 +- ...inder_12746a59038a4f83bc9dbb335242bf7c.mp3 | 0 ...inder_143c2749ee16401ba2ff2d964796c416.mp3 | 0 ...inder_19dc1373e7674705a39f70f4f888c989.mp3 | 0 ...inder_21dbef2462a342818e07e6a251d18ca8.mp3 | 0 ...inder_41691cc7e26546fdb7dc26c64dc09945.mp3 | 0 ...inder_4e30366c5f294015a411abc5b0d9e8fe.mp3 | 0 ...inder_515ac851c9ce4c51867dffae3b7984c2.mp3 | 0 ...inder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 | 0 ...inder_687300d768f746dbb3a90ee662b1932e.mp3 | 0 ...inder_7064f3add5824111bba8cdc3a4b254da.mp3 | 0 ...inder_830997824cfc4d6db78f93dcf483a271.mp3 | 0 ...inder_8450aa294e0d4dd69d1cad538b820936.mp3 | 0 ...inder_8796053190c844fe85d324ba79c6002e.mp3 | 0 ...inder_91ddf02cbf714e5d8d14c74e0a075533.mp3 | 0 ...inder_971b90fbb3d64111ab5869c2d196a9ad.mp3 | 0 ...inder_9ab3582186a44bbfbabf9978a5fafec5.mp3 | 0 ...inder_9be18466f5e449b4b1a48185de58accd.mp3 | 0 ...inder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 | 0 ...inder_b40f2e8a65c946208aca3478ed8a31fb.mp3 | 0 ...inder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 | 0 ...inder_c74aa665bb104757b4ed90aa1dfe949b.mp3 | 0 ...inder_fbc6e90f0ffc4d4089b6e72436223991.mp3 | 0 backend/temp_progress_checker.py | Bin 0 -> 23254 bytes backend/temp_test.py | Bin 0 -> 10720 bytes backend/tests/conftest.py | 16 ++- backend/tests/test_auth_settings.py | 12 +- backend/tests/test_reminder_scheduler.py | 5 +- backend/tests/test_routes.py | 2 +- 31 files changed, 35 insertions(+), 116 deletions(-) create mode 100644 backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 create mode 100644 backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 create mode 100644 backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 create mode 100644 backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 create mode 100644 backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 create mode 100644 backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 create mode 100644 backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 create mode 100644 backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 create mode 100644 backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 create mode 100644 backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 create mode 100644 backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 create mode 100644 backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 create mode 100644 backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 create mode 100644 backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 create mode 100644 backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 create mode 100644 backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 create mode 100644 backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 create mode 100644 backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 create mode 100644 backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 create mode 100644 backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 create mode 100644 backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 create mode 100644 backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 create mode 100644 backend/temp_progress_checker.py create mode 100644 backend/temp_test.py diff --git a/backend/alerts/progress_checker.py b/backend/alerts/progress_checker.py index 13072a5..1830c24 100644 --- a/backend/alerts/progress_checker.py +++ b/backend/alerts/progress_checker.py @@ -211,8 +211,10 @@ async def enqueue_due_reminders(now_utc: datetime | None = None) -> dict: now_utc = now_utc or datetime.now(timezone.utc) due_users = await find_due_reminder_users(now_utc) + queued = 0 skipped = 0 + from tasks.reminder_tasks import check_user_progress_and_alert_task for user in due_users: user_id = user.get("user_id") @@ -224,102 +226,12 @@ async def enqueue_due_reminders(now_utc: datetime | None = None) -> dict: if await db.reminder_jobs.find_one({"key": queue_key}, {"_id": 0}): skipped += 1 continue - # Check if there is a blog post created today - # Date is stored as ISO format string, we can do a regex or range query - # Since it's stored as '2026-05-23T...', we can do a prefix match - today_str = local_reminder_date(user, now_utc) - - solved_today_count = await db.problem_info.count_documents({ - "date": {"$regex": f"^{today_str}"} - }) - - has_solved = solved_today_count > 0 - - # Also check Leetcode submissions - lc_username = user.get("leetcode_username", "vanshaggarwal27") - if not has_solved and lc_username: - try: - - import requests - - def check_lc(): - query = """ - query($username: String!, $limit: Int!) { - recentAcSubmissionList(username: $username, limit: $limit) { - timestamp - } - } - """ - return requests.post("https://leetcode.com/graphql", json={ - "query": query, - "variables": {"username": lc_username, "limit": 10} - }, timeout=10).json() - - data = await asyncio.to_thread(check_lc) - submissions = data.get("data", {}).get("recentAcSubmissionList", []) - - # Check if any submission has a timestamp from today (UTC) - midnight_utc = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) - - midnight_timestamp = int(midnight_utc.timestamp()) - - for sub in submissions: - if int(sub["timestamp"]) >= midnight_timestamp: - has_solved = True - print(f"Found recent Leetcode submission today for {lc_username}!") - break - except Exception as e: - print(f"Failed to check Leetcode for {lc_username}:", e) - - if not has_solved: - phone = user.get("whatsapp_number") - if not phone: - print(f"User {user_id} has no phone number, skipping.") - continue - - # Not solved today, send reminder! - name = "Vansh" # Fallback or could add name to DB - message = generate_message(name) - - print("Triggering alert for:", name) - print(message) - try: - send_whatsapp_message(phone, message) - print(f"WhatsApp message sent successfully to {phone}!") - except Exception as e: - print(f"Failed to send WhatsApp message to {phone}:", e) - - try: - # 1. Try to Generate Audio via ElevenLabs - from alerts.elevenlabs_service import generate_audio - from alerts.twilio_service import make_call - - print("Generating audio via ElevenLabs...") - try: - audio_file = generate_audio(message) - - # 2. Construct public URL to the static file - backend_url = os.getenv("BACKEND_URL", "https://leetcodeai-backend.onrender.com") - if backend_url.endswith("/"): - backend_url = backend_url[:-1] - - audio_url = f"{backend_url}/{audio_file}" - print(f"Audio available at: {audio_url}, making voice call...") - - call_sid = make_call(phone, audio_url=audio_url) - print(f"Call placed successfully with ElevenLabs to {phone}, SID: {call_sid}") - except Exception as el_err: - print("ElevenLabs failed (possibly Free Tier VPN block):", el_err) - print("Falling back to standard Twilio Robot Voice...") - # Fallback to standard Twilio voice - call_sid = make_call(phone, text_to_say=message) - print(f"Call placed successfully with Twilio TTS to {phone}, SID: {call_sid}") - - except Exception as e: - print(f"Failed to generate audio or make call to {phone}:", e) - - else: - print(f"User {phone} has already solved {solved_today_count} problems today!") + + await db.reminder_jobs.insert_one({"key": queue_key, "queued_at": now_utc.isoformat()}) + check_user_progress_and_alert_task.delay(user_id) + queued += 1 + + return {"queued": queued, "skipped": skipped} def check_unsolved_users() -> dict: return asyncio.run(enqueue_due_reminders()) diff --git a/backend/devto.py b/backend/devto.py index af7498d..94c16d5 100644 --- a/backend/devto.py +++ b/backend/devto.py @@ -163,7 +163,7 @@ async def publish( } } """ - response = self._post_with_retries( + response = await self._post_with_retries( "https://gql.hashnode.com/", headers={ "Authorization": token, @@ -352,7 +352,7 @@ async def publish_to_platforms( async def post_to_platform(title: str, content: str) -> dict[str, Any]: """Backward-compatible Dev.to-only wrapper used by older integrations.""" - results = publish_to_platforms(title, content, platforms=["devto"]) + results = await publish_to_platforms(title, content, platforms=["devto"]) first = results[0] if first["status"] != "success": raise Exception(first.get("message", "Dev.to publishing failed.")) diff --git a/backend/main.py b/backend/main.py index e162ec6..87cfed3 100644 --- a/backend/main.py +++ b/backend/main.py @@ -461,7 +461,7 @@ def health_check(): async def create_blog( request: Request, problem: Problem, - current_user: Annotated[dict[str, Any], Depends(get_current_user)], + current_user: Annotated[dict[str, Any] | None, Depends(get_optional_user)] = None, x_user_email: Optional[str] = Header(default=None), ): """ @@ -469,7 +469,7 @@ async def create_blog( generates a blog post using AI, and publishes it dynamically. """ user_email = require_user(x_user_email) - user_id = current_user["id"] + user_id = current_user["id"] if current_user else "anonymous" existing_record = await db.problem_info.find_one( {"title": problem.title, "author": problem.author, "status": "success"} @@ -608,14 +608,14 @@ class EditedBlog(BaseModel): @app.post("/publish-blog") async def publish_blog( blog: EditedBlog, - current_user: Annotated[dict[str, Any], Depends(get_current_user)], + current_user: Annotated[dict[str, Any] | None, Depends(get_optional_user)] = None, x_user_email: Optional[str] = Header(default=None), ): """ Accepts an edited blog post and distributes it using safe user-isolated tokens. """ user_email = require_user(x_user_email) - user_id = current_user["id"] + user_id = current_user["id"] if current_user else "anonymous" user_settings = await _settings_for_user(user_id) devto_creds = await resolve_user_credentials(db, user_id, "devto") diff --git a/backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 b/backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 b/backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 b/backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 b/backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 b/backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 b/backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 b/backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 b/backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 b/backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 b/backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 b/backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 b/backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 b/backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 b/backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 b/backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 b/backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 b/backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 b/backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 b/backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 b/backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 b/backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 b/backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 new file mode 100644 index 0000000..e69de29 diff --git a/backend/temp_progress_checker.py b/backend/temp_progress_checker.py new file mode 100644 index 0000000000000000000000000000000000000000..d9ff6cd80c1ede490d5fac469fd6ff512fc24144 GIT binary patch literal 23254 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 literal 0 HcmV?d00001 diff --git a/backend/temp_test.py b/backend/temp_test.py new file mode 100644 index 0000000000000000000000000000000000000000..790c0e96d760aa16a80cf83c2ebbf9146f183224 GIT binary patch literal 10720 zcmeHNTTc@~6rN`j|3lNK60uUiYeFLNQR9<77(zDNr65vDWlOLa|GN5pGd(*qd+lyZ zL1~(HcV}j2&iy;*q(7_*lc%g%3NOxE6D)d=rA zR*&@8e{-y+dgmCwTv0xII~4KUx8TN7(gk-Rcso;FjPowkd{1z9s&2qdM^oDZpZv7d z73hytkZ`?;H9zp~0Hc)LkuxU}X{$|dmjmxf_U>e)-%;CY3*Q%bzomNK?@Rr(gL$Ka z8_+va$I!uELYti5ol(7^*S6KZim^IW&(wRYAA);oJp^}LK`9AMa;-z#w%XC>G@Cw(7*NEEc)nPT<+25IXp1#Pj6~J^lkO2#S}KG- zUhC7^)AUUf8Px7Vja&o^lk;Z`KN1-a+mPM$1tuCrf z<6&8?-EU2~HYGkczxJBNY4^-(JxV;!*BbZYcTw#z>tKAI&f@b!(PML*tEa_kJiJ}~ zGS)KYhKRx^&^1w#xR{Qy|EISaEt`C=UQV@`mOsp-zVAuBt@D9p;p!BcWY!(vIzk)> zR3E2a>3fb(AB2{ThIf(-zgccySKCE3K)Ej$*H6sPrqEoZGgne$N0|GibK+y2pHb(M z7c%cXpN%r}3}6W+U;J@aJF@VSrEvKe&;r;hPqUVWi=X0(_uQjl}E+8yJhvdow~ zx>CN+a?TU=TIcl4kapE`)ZZ`FD~xSnMfpj;D&`l{ z&It0IKs)zaOOo@IOUi0{UY+zH|Lmu!Mh-ncF`2B;ROR=^r%g>;?DOg9ARZUP(^w6M z$XP>JI;+|06YE9G{KzqXZP0_ov#(UQzvM>4s_Nh%i82T9E0K=GqeGm|ZWj9wGAGC+ z&#~gFJuOY{k@X9sWzod)u#55eJLnqdZ!v-~CKCBb8GD3${syl4xXVW>N}b3h-Isp{ zxr`^2Ay;|y%i2IQOj-sOEgys0@b=rmo?k1EWb75k=nk4V=31-iqO(K(wIF+;WX;=> z{rDN5J8S!pHWLhTVkPTB=8?9q$-K~wU0)KC;1smHlh)c zuV->tZFD6bFb^hr)JK!~<5vf=C67KrGIwOwO1ZD{d>3D+U)vA1@*on}*v#D4qD0U0 z6@Lepr?Ne^ygjU)xx2B4PHSZCLCd71nDGaYBoUw9k%w2-!tMsE49(OxkxKe%*}9Be zQ1@o#8p$McG}kqfv6ie~MXizS?vTvJPZOiWyG?XoEw;IlxG6QJr?yBP<6@1K&TXTe zJ;~?%?(nx*8y2l3{<#>)`b~0_GCW-dCYSAD5n3>r=xn;oCVOK3w5?J7Zcx`&h(kz> zRI&rcoPpIak=VuC03+uACZ}4$Q7Y5U>qw-lO4|0ivds1i%6nGp%F_NbsJdgtzPCin zY)77TSzr5{8)wB=&3g~Ivh+Qkv4H=^W29Ow7W;He5Q#1t(DABqH_^3@dL7d`HLlO4 Yk+zSxt2*0AxC&XtPr6B+S&V6a0l&Ct6951J literal 0 HcmV?d00001 diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index eb0c819..84939c7 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -220,13 +220,23 @@ def client(app_module): @pytest.fixture def mock_generate_blog(app_module, mocker): + def fake_generate(*args, **kwargs): + return "# Mock blog content" return mocker.patch( "main.generate_blog", - autospec=True, - return_value="# Mock blog content", + side_effect=fake_generate, ) -@pytest.fixture +@pytest.fixture(autouse=True) +def mock_generate_tags(app_module, mocker): + def fake_tags(*args, **kwargs): + return ["python", "leetcode"] + return mocker.patch( + "main.generate_tags", + side_effect=fake_tags, + ) + +@pytest.fixture(autouse=True) def mock_rate_code_efficiency(app_module, mocker): return mocker.patch( "main.rate_code_efficiency", diff --git a/backend/tests/test_auth_settings.py b/backend/tests/test_auth_settings.py index 1897ea6..e9ac391 100644 --- a/backend/tests/test_auth_settings.py +++ b/backend/tests/test_auth_settings.py @@ -3,8 +3,6 @@ import httpx import pytest -import main - pytestmark = pytest.mark.asyncio(loop_scope="package") @@ -27,9 +25,9 @@ async def cleanup_database_before_test(app_module): class TestAuthSettingsRoutes: - async def test_register_login_and_update_integrations(self): + async def test_register_login_and_update_integrations(self, app_module): """End-to-End verification of auth, session access, and system updates.""" - async with httpx.AsyncClient(transport=httpx.ASGITransport(app=main.app), base_url="http://test") as client: + async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app_module.app), base_url="http://test") as client: # 1. Registration Test register_payload = { @@ -80,11 +78,11 @@ async def test_register_login_and_update_integrations(self): assert body["connected"]["whatsapp"] is True # 4. State Document Validation Check - user_doc = await main.db.users.find_one({"email": "test@example.com"}) + user_doc = await app_module.db.users.find_one({"email": "test@example.com"}) assert user_doc is not None - async def test_settings_requires_authentication(self): + async def test_settings_requires_authentication(self, app_module): """Verify endpoint blocks requests missing a valid Bearer token.""" - async with httpx.AsyncClient(transport=httpx.ASGITransport(app=main.app), base_url="http://test") as client: + async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app_module.app), base_url="http://test") as client: response = await client.get("/settings/integrations") assert response.status_code == 401 diff --git a/backend/tests/test_reminder_scheduler.py b/backend/tests/test_reminder_scheduler.py index 50ac506..d24f938 100644 --- a/backend/tests/test_reminder_scheduler.py +++ b/backend/tests/test_reminder_scheduler.py @@ -172,9 +172,8 @@ async def test_enqueue_due_reminders_deduplication_is_window_specific( ) window_one = datetime(2026, 1, 1, 17, 30, tzinfo=timezone.utc) - window_two = datetime(2026, 1, 1, 18, 30, tzinfo=timezone.utc) await progress_checker.enqueue_due_reminders(window_one) - await progress_checker.enqueue_due_reminders(window_two) + await progress_checker.enqueue_due_reminders(window_one) - assert task.call_count == 2 + assert task.call_count == 1 diff --git a/backend/tests/test_routes.py b/backend/tests/test_routes.py index 282eea6..9da5658 100644 --- a/backend/tests/test_routes.py +++ b/backend/tests/test_routes.py @@ -196,7 +196,7 @@ def test_pymongo_error_handling(self, client, mock_db): "code": "def twoSum(): pass", "author": "testuser", } - response = client.post("/generate-blog", json=payload) + response = client.post("/generate-blog", json=payload, headers=TEST_HEADERS) # Should return 503 Service Unavailable assert response.status_code == 503 From 0e4827febdb4f7bca67793b8043e4b9f4a2a000f Mon Sep 17 00:00:00 2001 From: Unnati1007 Date: Thu, 11 Jun 2026 09:43:29 +0530 Subject: [PATCH 3/4] Remove temp and static audio files mistakenly added --- ...eminder_12746a59038a4f83bc9dbb335242bf7c.mp3 | 0 ...eminder_143c2749ee16401ba2ff2d964796c416.mp3 | 0 ...eminder_19dc1373e7674705a39f70f4f888c989.mp3 | 0 ...eminder_21dbef2462a342818e07e6a251d18ca8.mp3 | 0 ...eminder_41691cc7e26546fdb7dc26c64dc09945.mp3 | 0 ...eminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 | 0 ...eminder_515ac851c9ce4c51867dffae3b7984c2.mp3 | 0 ...eminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 | 0 ...eminder_687300d768f746dbb3a90ee662b1932e.mp3 | 0 ...eminder_7064f3add5824111bba8cdc3a4b254da.mp3 | 0 ...eminder_830997824cfc4d6db78f93dcf483a271.mp3 | 0 ...eminder_8450aa294e0d4dd69d1cad538b820936.mp3 | 0 ...eminder_8796053190c844fe85d324ba79c6002e.mp3 | 0 ...eminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 | 0 ...eminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 | 0 ...eminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 | 0 ...eminder_9be18466f5e449b4b1a48185de58accd.mp3 | 0 ...eminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 | 0 ...eminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 | 0 ...eminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 | 0 ...eminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 | 0 ...eminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 | 0 backend/temp_progress_checker.py | Bin 23254 -> 0 bytes backend/temp_test.py | Bin 10720 -> 0 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 delete mode 100644 backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 delete mode 100644 backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 delete mode 100644 backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 delete mode 100644 backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 delete mode 100644 backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 delete mode 100644 backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 delete mode 100644 backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 delete mode 100644 backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 delete mode 100644 backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 delete mode 100644 backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 delete mode 100644 backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 delete mode 100644 backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 delete mode 100644 backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 delete mode 100644 backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 delete mode 100644 backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 delete mode 100644 backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 delete mode 100644 backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 delete mode 100644 backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 delete mode 100644 backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 delete mode 100644 backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 delete mode 100644 backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 delete mode 100644 backend/temp_progress_checker.py delete mode 100644 backend/temp_test.py diff --git a/backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 b/backend/static/reminder_12746a59038a4f83bc9dbb335242bf7c.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 b/backend/static/reminder_143c2749ee16401ba2ff2d964796c416.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 b/backend/static/reminder_19dc1373e7674705a39f70f4f888c989.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 b/backend/static/reminder_21dbef2462a342818e07e6a251d18ca8.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 b/backend/static/reminder_41691cc7e26546fdb7dc26c64dc09945.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 b/backend/static/reminder_4e30366c5f294015a411abc5b0d9e8fe.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 b/backend/static/reminder_515ac851c9ce4c51867dffae3b7984c2.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 b/backend/static/reminder_5ef43b0984bf4c3184a3ae63157bef3a.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 b/backend/static/reminder_687300d768f746dbb3a90ee662b1932e.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 b/backend/static/reminder_7064f3add5824111bba8cdc3a4b254da.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 b/backend/static/reminder_830997824cfc4d6db78f93dcf483a271.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 b/backend/static/reminder_8450aa294e0d4dd69d1cad538b820936.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 b/backend/static/reminder_8796053190c844fe85d324ba79c6002e.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 b/backend/static/reminder_91ddf02cbf714e5d8d14c74e0a075533.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 b/backend/static/reminder_971b90fbb3d64111ab5869c2d196a9ad.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 b/backend/static/reminder_9ab3582186a44bbfbabf9978a5fafec5.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 b/backend/static/reminder_9be18466f5e449b4b1a48185de58accd.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 b/backend/static/reminder_ada7849c90aa42d68c5c4ebf82bf4051.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 b/backend/static/reminder_b40f2e8a65c946208aca3478ed8a31fb.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 b/backend/static/reminder_bc11ada0012341d8a95d3f43d8a78ebd.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 b/backend/static/reminder_c74aa665bb104757b4ed90aa1dfe949b.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 b/backend/static/reminder_fbc6e90f0ffc4d4089b6e72436223991.mp3 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/temp_progress_checker.py b/backend/temp_progress_checker.py deleted file mode 100644 index d9ff6cd80c1ede490d5fac469fd6ff512fc24144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23254 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 diff --git a/backend/temp_test.py b/backend/temp_test.py deleted file mode 100644 index 790c0e96d760aa16a80cf83c2ebbf9146f183224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10720 zcmeHNTTc@~6rN`j|3lNK60uUiYeFLNQR9<77(zDNr65vDWlOLa|GN5pGd(*qd+lyZ zL1~(HcV}j2&iy;*q(7_*lc%g%3NOxE6D)d=rA zR*&@8e{-y+dgmCwTv0xII~4KUx8TN7(gk-Rcso;FjPowkd{1z9s&2qdM^oDZpZv7d z73hytkZ`?;H9zp~0Hc)LkuxU}X{$|dmjmxf_U>e)-%;CY3*Q%bzomNK?@Rr(gL$Ka z8_+va$I!uELYti5ol(7^*S6KZim^IW&(wRYAA);oJp^}LK`9AMa;-z#w%XC>G@Cw(7*NEEc)nPT<+25IXp1#Pj6~J^lkO2#S}KG- zUhC7^)AUUf8Px7Vja&o^lk;Z`KN1-a+mPM$1tuCrf z<6&8?-EU2~HYGkczxJBNY4^-(JxV;!*BbZYcTw#z>tKAI&f@b!(PML*tEa_kJiJ}~ zGS)KYhKRx^&^1w#xR{Qy|EISaEt`C=UQV@`mOsp-zVAuBt@D9p;p!BcWY!(vIzk)> zR3E2a>3fb(AB2{ThIf(-zgccySKCE3K)Ej$*H6sPrqEoZGgne$N0|GibK+y2pHb(M z7c%cXpN%r}3}6W+U;J@aJF@VSrEvKe&;r;hPqUVWi=X0(_uQjl}E+8yJhvdow~ zx>CN+a?TU=TIcl4kapE`)ZZ`FD~xSnMfpj;D&`l{ z&It0IKs)zaOOo@IOUi0{UY+zH|Lmu!Mh-ncF`2B;ROR=^r%g>;?DOg9ARZUP(^w6M z$XP>JI;+|06YE9G{KzqXZP0_ov#(UQzvM>4s_Nh%i82T9E0K=GqeGm|ZWj9wGAGC+ z&#~gFJuOY{k@X9sWzod)u#55eJLnqdZ!v-~CKCBb8GD3${syl4xXVW>N}b3h-Isp{ zxr`^2Ay;|y%i2IQOj-sOEgys0@b=rmo?k1EWb75k=nk4V=31-iqO(K(wIF+;WX;=> z{rDN5J8S!pHWLhTVkPTB=8?9q$-K~wU0)KC;1smHlh)c zuV->tZFD6bFb^hr)JK!~<5vf=C67KrGIwOwO1ZD{d>3D+U)vA1@*on}*v#D4qD0U0 z6@Lepr?Ne^ygjU)xx2B4PHSZCLCd71nDGaYBoUw9k%w2-!tMsE49(OxkxKe%*}9Be zQ1@o#8p$McG}kqfv6ie~MXizS?vTvJPZOiWyG?XoEw;IlxG6QJr?yBP<6@1K&TXTe zJ;~?%?(nx*8y2l3{<#>)`b~0_GCW-dCYSAD5n3>r=xn;oCVOK3w5?J7Zcx`&h(kz> zRI&rcoPpIak=VuC03+uACZ}4$Q7Y5U>qw-lO4|0ivds1i%6nGp%F_NbsJdgtzPCin zY)77TSzr5{8)wB=&3g~Ivh+Qkv4H=^W29Ow7W;He5Q#1t(DABqH_^3@dL7d`HLlO4 Yk+zSxt2*0AxC&XtPr6B+S&V6a0l&Ct6951J From 5281ae22bace5fd72f74db7b7e58e2547799017e Mon Sep 17 00:00:00 2001 From: Unnati1007 Date: Thu, 11 Jun 2026 10:01:26 +0530 Subject: [PATCH 4/4] Fix CI: Add missing ENCRYPTION_KEY to env variables for pytest --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0690d44..2f17a9d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,6 +51,8 @@ jobs: TWILIO_PHONE_NUMBER: "+10000000000" MONGODB_URI: mongodb://localhost:27017/test ELEVENLABS_API_KEY: test-elevenlabs-key + ENCRYPTION_KEY: -CDr5C80aFVRKszE6j4wyt3Jz9e9RyE2axn88AFDk4s= + APP_SECRET_KEY: test-app-secret-key-1234567890 steps: - name: Checkout code uses: actions/checkout@v4