From a7d2c50097572090cb63bb4fb6a9c7a7434efb68 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 00:07:18 +0000 Subject: [PATCH] Add error path tests for solve API endpoint Added tests using TestClient and mocked inference to verify error path and ensure 100% test coverage. Co-authored-by: dhanush342 <187305764+dhanush342@users.noreply.github.com> --- tests/__init__.py | 0 tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 119 bytes .../test_app.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 3697 bytes tests/test_app.py | 55 ++++++++++++++++++ web/__pycache__/app.cpython-312.pyc | Bin 0 -> 2762 bytes 5 files changed, 55 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/test_app.cpython-312-pytest-9.0.2.pyc create mode 100644 tests/test_app.py create mode 100644 web/__pycache__/app.cpython-312.pyc diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..227e5fd59df3c22266cea901f1a298346ebeff36 GIT binary patch literal 119 zcmX@j%ge<81Z!XK%mmSoK?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^OH4nppg_MQwYa2M sKR!M)FS8^*Uaz3?7Kcr4eoARhs$CH)P#Gf-7lRldnHd=wi7fK6rS~Z?Xex_&k&MQnib(k4#I(?6x5&sq6jEWg4)nZ?$2VplVn|c?ar z=b1Ne-tNBddvD(F;c$?^u>StZ_|;FyU0k?BDNhz}!eol*M3>SeE{T6nMoxMplJUkB zskGyZ`(VeD_Gf6EW&-hmL_CDi>t!d*ms;aGuKw%tURVf^p?C=Xz3GNbI35;0m2_jK zDc)4}-yCoDki$gxohQ1Vg;E=m^PSc!%9x%a!J=A{!8V>;trTh5hfxK_vq4j5|?!kNUtt~ zRCF&$pRR!P<6Fk*gg;6hKe|5vPF+Xn4__32i$8;yB6elZ_JBf+>t)?pqE&RZ&)rQ? zcUJvRg{pIR=7t}GxcX_W;`^zVK$Oy$AW>;BN;w|osC9fv5lD{Qaau;1$#}wMnw3rG zZ6j+sLC!2@YZ(M1WEncs*vJS=+D-#!cAlHs=|nn@sCX@w9QY+|fYM__94#R= zSjKV_jsmVu=J=6%Yy~ECvV*U4J@Kwjz~N5D6^eV!m=2*4}F|Zq#>eq!p>V-GOM#| z9^Q;r6e6C>nijLrpQ`c})P^ydTHeqMQ)g!iYuymms4-!!ZV>0ld}Q5J|Hb~PeHZs# z*)`Y5S%2xsL7A9ow&3v$T&#z`Q1M_{Ab}KfvU_j@%O?9)Opr8*ZxT zvhFpcn&>Noj?}}~!U4yhVV0E`WrhBs95V+J_LzF$_|cepeCX|AwFh{9nyKRkXcKCV zXHTVBMzymlAO#9H3t~}4AjsRmBVUK29esOKR@USlFs;EVAVA^StX*iS!3kA((0T(z zEk=Dak*zCYbc^;?kehE<^VPr?178l!hueznCyEX4JW}L9a1{)Hfd@SwhPp?W4e5s0 zjpuV_f#RN%Fy~gzp4G7Q>Haz_>EM#Dgp=bhBUJFH>NSaX!p9k3L&I1iUEpd*4)lAIeS92Y;KsNWiTCYE(?kZn!?@VV7?^46g<&{7p?pVjd7mk zg)KD*KhaKwceUOEQGtCf(ls6Fx^m>^(I4$%-|NLl*G%NlQz>w%{ksj{Zn)febx(2E zd&TbeXXyv4z~2hN!A8J_2bV^wayPjevh2RnrKeb8VGskrea0IN355xIqe2ZqDJ=VS z0}5+noeGw^uZB`9pTiniH!9`9uS<_ns?a(-#wz)(8kX7{;~T*P?*g%;>{Pd@JNYJ5 zh$=$eQVMp>; z?ga>!<6ot6zl>Ak#lFLWQ%9biQ?C|xA1ijhIZFpt;nWhm%<>MXdSO<3p_CVl>W22e z;Z7U2rc75WO{pqML6tu|3g0f+V?2ZmB6R4;hzpD$vVF5>iJF+!l zIpMr%*unw!%Nz;MF%zH(5g%hTG(Yrila5Q1V{?t2(~X^v2(H8<{srKY?Lhzl literal 0 HcmV?d00001 diff --git a/tests/test_app.py b/tests/test_app.py new file mode 100644 index 0000000..146c0bf --- /dev/null +++ b/tests/test_app.py @@ -0,0 +1,55 @@ +import sys +from unittest.mock import MagicMock, patch + +# Mock inference module before importing app +sys.modules['inference'] = MagicMock() + +import unittest +from fastapi.testclient import TestClient +from web.app import app +import inference + +class TestApp(unittest.TestCase): + def setUp(self): + self.client = TestClient(app) + # Reset the mock before each test + inference.generate_solution.reset_mock() + inference.generate_solution.side_effect = None + inference.generate_solution.return_value = None + + def test_ui_index(self): + response = self.client.get("/ui") + self.assertEqual(response.status_code, 200) + + def test_root(self): + response = self.client.get("/") + self.assertEqual(response.status_code, 200) + self.assertEqual( + response.json(), + {"message": "OpenMath API. POST /solve with a problem to get a solution."} + ) + + def test_solve_empty_problem_error(self): + response = self.client.post("/solve", json={"problem": " "}) + self.assertEqual(response.status_code, 400) + self.assertEqual(response.json(), {"detail": "`problem` must be a non-empty string"}) + + def test_solve_success(self): + inference.generate_solution.side_effect = None + inference.generate_solution.return_value = "The solution is 2." + + response = self.client.post("/solve", json={"problem": "1 + 1"}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.json(), {"solution": "The solution is 2."}) + + def test_solve_error_path(self): + # Configure the mock to raise an exception + inference.generate_solution.side_effect = Exception("Mocked inference error") + + response = self.client.post( + "/solve", + json={"problem": "1 + 1"}, + ) + + self.assertEqual(response.status_code, 500) + self.assertEqual(response.json(), {"detail": "Mocked inference error"}) diff --git a/web/__pycache__/app.cpython-312.pyc b/web/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0980cc43953c4670fa400519f7559898f390124 GIT binary patch literal 2762 zcmZ`)O>7&-6`t8$lFNTe6fN3HHz!Z?KkhenK$oeK1(KJ1jfwQe>Q#>BIHZ_>5Xug*;FYZ%S0zSHA$7Kv?{0q#ecyR ztCA}Dyl951VKwaYk{PMWs_gS2Gg^(QF`o~caWyUwM)im;uSQpdUgjFi%zd)bT~gBm`5Dm%?h}2G$vqot#z(V& z4)vh}|HpEU4X*C%omwC6vz`TwLjNfOUeB|EK8^h>Gb88+?n~RJ$}NNoBVVC#LEw=y zW!HQC;+s5qc6$2a>G=w)d4_EjD34EhWzVRbF-+!uOnCyCUof|3TP}m;=tS9N=WU&t z@FQRFwaVsXBXOa|tn+2>ssdIU;)&uI>=N<}&tyDulQ}L}Z$wJ2Z@dwkV^_L7+SCn) zRXp2S;Nd_3K*=gsSwk$7?FGMZ7M*{5enJjbt48bqrG@ck>87Rv>;42aywg< z3`=M8#j9S`bTH#SCYwOXztW|0tyV%gn2WUqF4qmsmvyqRo`%mI1o98^U6cGhKHSci z*5W7H(use%62Ny8Df&NW1e|PM1+q*SQK?Q;;SymY7G{zCzyl`wn54>p zMY~wY$HHo?4~zJiti}OLbmgLmEyN0Oo|v-Dn-HuUb>@0JQgiGpCaa#|V#W4mLC7CG z?y+i(Ic2Zzur9iB3PNSqwAxpnf(%bp%k!GW<}}Z~&MbGbkmRzaVLUXA$26^K>va?P zgr?o7m(A{q=z0!MYg*Z|Yz#AGjHWrmV9|-9S?P*xn@%3t(2Qx9JqJB-uo}5&Se}!? z-vK0e+fJ@WhJbNT0r@rQBs2GZ-Z^lv`Nm?tb@;u}HR)jI(2?f3R{p^YO9$7aBc11! z=IO=PTBqMTwI(T@!!I@`TW23kEuCMNUJPub*}cPsN83AG3qnEU$?o+AwZLW9HtXo+ zWFh1{2dWNs2xk<@K_m*2T|T{l7!p))BS65X)WH4o!P#(y(-NeA%IVe|-ZnFzIWYDz zzXtG{f*R1NE*P|%_2MLtRGI6RXIW#szb=c)#S2r@N(oMWlPPlsRBKu3ritR&$}IB$ z==oI)4*#qNTykvNbB@8z3Vb_t@kJun9-eN;FSVsh-MR=xXd@hK#zlwSsB9N1Xrk}F z6E#2sCvK5z0PY^nfxYo-;%-T@-Gbeu2Tx2e@M>1YUMsyzqr}6#{c%n1aXa(gy8-Gy zUpsQh0h)Lg>7uDUQM}4sV^vz|p7b{LuvYwWi>`)uTG=7uVWj!P zXv3O?P9Dd;Tz9n!BqI;&%qtrvr2RhFH>hx|ot=6%w!nCSI!6F4Bz!R*LSr=tJ0_1B z)(mr)RbhN!mRZ=1nAXd?y$tf`_8S!x7gkC^bY8-3aTiXRiwU79ir+n8J4|xt2Y{ih z`#uoAfqxNC{dW8};}0qyUjN|wlhM-S(bD?p*ypK{hhqCxbv<>tEnnV{qM?(YXP@=6MSPUsH&GNH6+_6sA_896$0IZFa+hm{gWd+Wne9Tw;PITnr`y4-;sd>v zUN>Lz{B1`4dU##X=e-(5ne(bs@iqS<07;L{~-)IGTtVabfXe< z0WQ^Sh%Daou4c#Olfg^z6X&O}ipB5#1qe7!>0inBpORxwk&ZqkBVUrt-@?h(!;|Z|*FKqVM%T$%SP(+*4&NDG%-tLPMxb