From 89e32b1d28c7828305fed7bb970546e8b9f4c2df Mon Sep 17 00:00:00 2001 From: Brunobrno Date: Mon, 20 Oct 2025 13:49:38 +0200 Subject: [PATCH] =?UTF-8?q?posledn=C3=AD=20zm=C4=9Bny?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/scraper.cpython-311.pyc | Bin 4605 -> 4593 bytes __pycache__/scraper.cpython-313.pyc | Bin 4406 -> 4538 bytes app.py | 7 +- docker-compose.yml | 3 +- scraper.py | 7 +- templates/results.html | 6 +- .../test_scraper.cpython-311-pytest-8.4.2.pyc | Bin 10114 -> 6465 bytes .../test_scraper.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 6030 bytes tests/test_scraper.py | 93 ++++++------------ 9 files changed, 40 insertions(+), 76 deletions(-) create mode 100644 tests/__pycache__/test_scraper.cpython-313-pytest-8.4.2.pyc diff --git a/__pycache__/scraper.cpython-311.pyc b/__pycache__/scraper.cpython-311.pyc index fa7ecf6db3a8f50dff32efa729ac2376b5de0dd4..624814f5bdb32dd06e6cb03b95f529860835d2ac 100644 GIT binary patch delta 718 zcmZ8d&ubG=5PoleW;eTUvn$djTB)Yc224;)5MxqoObLo0MGt}p58Y4`brW`11>Mx* zu~d3^AVNLl6cH8FfOu5w#Z!|IC@gCKgz7Z~91|67>`SE=-%$dsN7 z4c^rQ4gl4CzH5xC9&gI8!!4G~BR;f-;0aZEJV;ID)}UqImw+cU!{oF)RB=+AK7;-{ zjtZ4P*9ci-ap1;+9Dpfc%aF{dD)@;wHX)5Vrbbr=`35i}__G*=bk{NN3P|V}hJNt& z0m8sLp}iRLnVRE^W$RwWu30|2RCaydaqUVS?@Dj3%@W>m;*LcgzXEbkXRJ-g9G$v#SU(5bh^wwmp!*{+)F ztGRYho`J@fsX4Bg0GkQDm}fV0u$XTv3dfG0CmZc3g?R!#S6QrC3DKU#Gg@gnN9*Tk zU9`*2-P^9?!wTWJMG6-vgecJG*@(g+3iM)o Z0iV=k@G8EfU)N+f`4j9z41dr|e*xr(n|A;J delta 871 zcmY*X-Afcv6hC+8b601_t+Wk|Zdp*_N1*j!T3HJw1oru0fw4K0JGRc~ojY#EY)X$J z_;4QzET|Vlt%veiEfHT!kb;Gt`UmQv9s;3zckyF?%=t0*%x})eJ?D4*R=x4oFk-;5 zV*br+elTVbT4rY=1&^?!LUv6gS7ATW0Iye&N@R5wMiS!**KledO7U5 zHYWB+VEYu?qc$1CXR&Yhd#>d-6{B@ioUyaRKBgXaJ&H--VwxddFp$AxUO=#wcCur5 zB=Bfj=OPb3O#AE`dWxzR??gT!gjtRJMV*QOJO_3|X=F*oWIakVYn05>c{!APlWL-w z5-e#J0W5GU;TZ~Lps94c=u~~`7d7e(tu6b z=ji)$9lWS!ZvHhsmkIb22Qx7>IPFflUk|rz#9KGxtrJ~840G!4bl+s(i=GXmVbf?> zT#ubZ`&QdKDmm&`WQ-6907g1QA=6~x;EB1S^uf@%ec!io5A4u}{u5nJ+4Zy)lk XAZuSBx7ek`J<~w=7wiyb^NFtiSvbH& diff --git a/__pycache__/scraper.cpython-313.pyc b/__pycache__/scraper.cpython-313.pyc index afd9586261d60b828db236c22980c993c0991c78..869788bd1cab24ad1f03b7aa50e0701daad8fcdf 100644 GIT binary patch delta 671 zcmdm{v`d-yGcPX}0}yNz{g&}%Bkv?u#ygW2usTkj&MU~sG`W#Sgvpd)@@-aYM&`-= zypj+h6;qH7Ajo40W!8W&8B(|z7@|3$9EM<)$<}O=;s`#gDI-KKl`)!oayFZ!DKAWI zG(U_L${5UM$^_vBv%^@SOu-z%oO*0|tkD9Kce2Tg3&GX126F{-TQcXdg|Y>SOg3Z} z;j=1dU`R}0V31<~3W-k^WH)BzHDEAhn!J})T9yyy2wO(Dvw0X86hLYvCO5K+S|S|G z4>A&F5rXDp2o?zC;A1dmfti)c2(?K{N`*m@AzBKin4KXJ=rg$CB9p~Aco_vJt8$!U zEfNMQn*5pLFC*XNkDS76ti>fonFW)Xxz+~Q0cG@oxL5}mU=0jk_!tC)`l~vt`s+ID zF36c&<~P00Z@ok4I-k=;KBvokE)DK?_yqd1I^ctnA3*D#UP9NX%86`KT77tM=w6+<%xPoPibQH zhoELkNvSX>GDJ(j3}9zS2%&aD2t&b$k<#+Ug_8r<*j^7lt| zM)k*a#?A1*%&RjwgZrJ(AyY>d7ZrvhDq=3S%tve(U2HdJ@cdztZ~_`uBncv1fW$49 z%;fw$P4*(&$u<1$Y}O!g`^hKyrP;vhTqeKb*JBKrEGh8c(- {{ item.title }} - {% if r.snippet %} - {{ r.snippet }} + {% if item.snippet %} + {{ item.snippet }} {% endif %} - {{ r.link }} + {{ item.link }} diff --git a/tests/__pycache__/test_scraper.cpython-311-pytest-8.4.2.pyc b/tests/__pycache__/test_scraper.cpython-311-pytest-8.4.2.pyc index a000e21f6b5c83bde13c77fdf9d0c900534b0f69..a5c5365bb9620cc431067a06c2cefa8d9c6fee0a 100644 GIT binary patch literal 6465 zcmc&2TWk~A^^QG$jbrCQAPKNA*-f{&uz}d&kt~f$lZc|l0THx_(8`*42FJlK-5Ces z9arg!4?aNRr{ZH5DccV=lp>*i@l&a4`q57t84-k9`&-v*{U@ibpPcE1b&4tV{VNQ^}H_=>J<^gud+$@Uu{z=5o#5g0ID@t-o zE^10)DQ)Vc4=@OM;eP#lFy$W7xaQykXg;#L9MTA#c`aIogTW7g=aJ1<;$+XNgVN$a z$StqhPM-HW%HwpTR_rvH&3-E}sNH2_jq<6;%@#0pzkGgt=J4#r&VYC=}Koipq_ws+AYlAB&Qh zm&mg?uSyG)&FDRS?%e6K)2XTHPp8kGJ3oCP^~v;Q0~rw$KRG*{Ix|%{upOD0RmFT( zRkMYRSj3`|FKNq_E@47aRRwF}4-S-;kHl2N3lGD4OS__^C1_K9c{O8nz;J55oXu(30`TUFX(^`~ z{V8>!SkB2QtdwvnlPk_kxl}>QD@G`#N>>$vHlnAflx(pujd2khJ1ptSjZ#i3NE(d9 zyqJVFCR>^jCc2mfBPy{MR^iR=!&0eqm{_P%m{QYNDk*rlv~29AhQnl1OA^jX^EpLL zm9U~J1r7HDKY6p%v#^(}pnnCCuj^OIo5_{r-@=jGW3`)}I<@S$2b{>1Y_7<(p+ z)rF56!pAFHWdY@Da4JgM8#HvtMn{(G^#O4B|8&#m+8iR^b<_9g z9QNp*mJPb?#?K)gt-`ju_0pnEoa~eR55PZz&?mVAM&d>K^rhLF~2NrGd>K0f4@ z?YZhL41a*Mo+j-O!h==bbu2XJ7Sj1I(EXOfA?>-0WTDFclAkr7*SYKHhW9eM&VemH z=W(NZwOvhJ58z0DWFPBQzwWOFbUz-@2AVW_%Q{tqvcDSAgL>#1PpGPbE&x~Hu16h` z!*YkVr^&l$dw9$7I-u=$&~;gDt=DQn^59A`z$zz4w?)^U1CE{!Ir5hF^tzWE9r-w5ep zHwU~ae*AZr^c@zp+@%XwIk}s}%T><b$+I@u##J4P1KNQuh3 zgm)DTB`!-ty7X6oqDHRqr3MxCkr>YY5;B@+ zYSevhY1J;hOZ~MxAn$(1Xd7)TLuxh;_QeCeet(ft;_ z?{@RLd#3Mw)h?Q9?=8n+*3DFVY5fmsPLZ#b#iiv1Xsmy=wEk5Aa_je(i)F1mue?7@ zi7`2{FgbNGNjxf3X9}8H&gD#MDC+F&a~2Le&tmko~KgR7fjE0CL%KPE!p&2L(rrCy9TYfCK@f z1RRTTZ@7sVSBVp0BO{g~(lRxjFg1-)1>ywNHUjDlZ%!#NsV9i6F@q-}C>*T>sX(xt z_K#IM9Yx3p$fD>mS0YGOCIR>Bp8@y;agYq^=ojx*;RA%utpaZAwOzfxgg!<0I1b(3 zCwrkL<11m)^~336p7^40jjliW65)kvCgw3b!$%B0t0{SvES)IgK6tzdoy;f&s5bCK zB~D9)Y%^3+sv_a^Ldp_-l9e_S!!{4uYSa?|{sF%gREs9z|McRm>T2)T{lDp7`>;MZ z(ij}64IY1Tq1JhVjXNPGsZQmP!*Aep76;HUR|o1j8V3*$Wcj^PVHt`dlGNcr0zLo` z>!;-#CN(_nAb@;lF#N1?Gk6m4MgYQC(liVWRv{TX!8fT)v6#szsjFEG!CaCu3WR#O zpk?z4t;+B|B2FaWLjp*KfXSADNq&XNA&tq2YxtoIQwlQFh~#acg&(X&Ny3T|wFbb{GILG2goVpWEiAPo96evwwE*f&i{{IqZ_$)9J2dPt#tbD(9 z>8o&b6LG$ub9d+2^JOr4J6!9Xs|T+%f>&z6E1Q0(f?x1`&-lLkfz^Fay6b$R!6#~b zVuSCr@%x_)*7?x}KU(8QUq!oCPH%d=z8UUi&p@N+@RLxzXS~rfek*V*@XgC`AJH_! zIpNFBowq-$?K%6GZUFGFcP1O1$y%`W{|#K5UcyZpU>TIoV|T{yX6|eC@K7T>1l^hg zKHjl*>EYhr?FIBx4#3*pr`)sH7@@NMb*u55A8YVq&;`gw8RiaD(k5;T!bxXS0g@5k z&Dgjth;QeF>9}<|5Vm-js7(b(XfvTN__1fS-5jMZVKy)t28lZuCz~^)XtG%odA!5M zF%k!YNovQrcBzHafdEd%wziiMvEEb8W?{B54K{>P*4{c#CV-9FLTvgL2|#SqGh&;? zru>%12Ho5LcnNmzdNkR99-q9EAiZ$15hlGFgV5lU&-rA7Pu3|ULl))^eBL1=+aYWm z5lX3;6p(8(0S&Ynr8#P;anb;R^RJQ}{7>=T$pBgp2$ON|diSo$kG$(YljW@BV?mU{y}lS`Gr>KZv#bE=x+nNXnROa`wz3qoCW{@ literal 10114 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 QZE+462=dTH+X*%MKQ(=-IsgCw diff --git a/tests/__pycache__/test_scraper.cpython-313-pytest-8.4.2.pyc b/tests/__pycache__/test_scraper.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eec6035d87ec756a25f7dbfe120d4ac490e3e5f GIT binary patch literal 6030 zcmd5ATWk~A^^QG$&BV?V2!SP&Y<7itgggOfAu5F|PbaJgH) ztZYo#`!y*uN#scKeS}g$$~$3h1npThtbnC_MBjb@ihePWYNE3e5!$NPy@;;jEdXYB zH1KGt&!eqglth#Vl}y^&fYnCl)@wJ`6e9)(nEif)6i;dko#R>=P+R)|zK3$9wag^z zyR;eI1SzJYo6sxQjblMCr5gtebQ5|ty2)`-zB~eYagX8o{dIetFRh0>o{}h5JyZDyZQ+%_kZl@nGLUyuj}YNb!R5Q z3X>k{K(dX_bpy9AfO}4aK|5=nl;iqEpXeVY`h#Z^vjgtg2aw|3h3d2t>s}C|<7gEx zVEF1zKIu(4&VAIrjMX`Hfv#18t0T4Dk_~j==u!!ae)WgR(AZUk)DM+FGC(m-da@a~ z=6JCw)kX0VJ87$4ues*BfzK{Fnh=9Jb*y!zt7CywVKMSjQf)?e^a{0UNZ}_Wx;l8}6y&Nj97rqPh~>t=(6e#13&wvdIdk)FKKYU6{j_W}wC#4A>>2*k4SXa8T{*4?; zvJo`wBrTe!8;P949%K9LdXAYxN4?!>j*0Fp?*ZLff%?LupKApGVFrPg363=cr(|b_;ai=7;&lkHZbLxUj!uDjEAT5M z$t2vNEX*O#fBNr0vhoFV+b5uSA3{7(%y|!a!D!eDZ*NEctXd@cQ7)P`LH?3>AwPBr@Wbi9Y2=Rl?w);2WuHrRpm)m@ zpkZ$iB!s3ZfJqPw@Jh-eWK}`H#yzAU{Gy#^{)c%2ApbNliE|CVmHHVhv3Vl^mMrNy zhK7|k8CyUV>71(O3UYcbkHMZxQcebIFDrV!D4S^=Ch-y$NI`CXOu|~+N(vG-V{-a& zI~0arf@7s*A;}~M!ps~&`6UU;JPxLw`yu^ZVYe-_ z+wKHD*mb}4F+2P#w%LJn-|uW6kJmTJJZsy&(stmpwgdM=wYITqfj>e1 zJa%L3R_=~ocjOw!wht>RI5YZ0uIf zJ;T*=X57);GidJ#8>{kt&Im~Hly-sd(#{8rGiEga;p27(2GY2C78s;ins(2iJwRRB zX$=7F7brU@YZ{-iv0q2xznHE?;#D?&V;EdSjVH~ge0+s%c$dkz19SDBuyH`MMrzQ0 z0rN2%|La#F)YQ3(7_xcITW(&ye!2SEsZU!!^;UPBt2M`;1mpjB?j@st*U0gHIJWit z5ULJw?{s^sM>^l>@-BBU&|dEHK^YAjLHdWtJpRV^wB=a(t-}WYdHS*Z9tLk}gd7mL zpG=tLC`{Kx{-+v#>kqZ%u?_>o{6Ayb{XK+9iff&e;E|%5Ef?f*d;wtOZqNiMKyZfn g9YR;p_d>rx;oqWNU!cgJ{UK&}wR0OY$(R)W1zi|a8~^|S literal 0 HcmV?d00001 diff --git a/tests/test_scraper.py b/tests/test_scraper.py index 60388f4..3f5d036 100644 --- a/tests/test_scraper.py +++ b/tests/test_scraper.py @@ -1,78 +1,43 @@ import os -import json -import types import pytest +from dotenv import load_dotenv import scraper -def env_setup_test(monkeypatch): - """Set required env vars for the API client (helper used by tests).""" - monkeypatch.setenv("GOOGLE_DEVELOPER_KEY", "test-key") - monkeypatch.setenv("GOOGLE_CSE_ID", "test-cse") +def test_env_variables_present(): + """ + Test jestli env proměnné existují a mají obsah + """ + load_dotenv() + + key = (os.getenv("GOOGLE_DEVELOPER_KEY") or "").strip() + cx = (os.getenv("GOOGLE_CSE_ID") or "").strip() + assert key, "GOOGLE_DEVELOPER_KEY is missing or empty" + assert cx, "GOOGLE_CSE_ID is missing or empty" -def mock_api_response_test(monkeypatch): - """Mock out requests.get to return a fixed API payload (helper).""" - class FakeResp: - status_code = 200 - def __init__(self, data): - self._data = data - self.text = json.dumps(data) - def json(self): - return self._data +def test_integration_search_youtube(monkeypatch): + """ + Test výsledku vyhledávání "youtube". + """ + load_dotenv() - data = { - "items": [ - { - "title": "Example Domain", - "link": "https://example.com/", - "snippet": "This domain is for use in illustrative examples.", - }, - { - "title": "OpenAI", - "link": "https://openai.com/research", - "snippet": "Research from OpenAI.", - }, - ] - } + key = (os.getenv("GOOGLE_DEVELOPER_KEY") or "").strip() + cx = (os.getenv("GOOGLE_CSE_ID") or "").strip() + + if not key or not cx: + pytest.skip("Integration test skipped: GOOGLE_DEVELOPER_KEY/GOOGLE_CSE_ID not set") - def fake_get(url, params=None, timeout=15): - return FakeResp(data) - - monkeypatch.setattr(scraper, "requests", types.SimpleNamespace(get=fake_get)) - - -def test_get_google_first_page_maps_output(monkeypatch): - env_setup_test(monkeypatch) - mock_api_response_test(monkeypatch) - # Avoid waiting for the throttle in tests + # Speed up: don't wait during the test monkeypatch.setattr(scraper, "RATE_SECONDS", 0) monkeypatch.setattr(scraper, "last_api_call", 0) - results = scraper.get_google_first_page("example query") + results = [] + try: + results = scraper.get_google_first_page("youtube") + except RuntimeError as e: + return pytest.skip(f"Integration test skipped due to API error: {e}") - assert isinstance(results, list) - assert len(results) == 2 - - first = results[0] - assert first["position"] == 1 - assert first["title"] == "Example Domain" - assert first["link"] == "https://example.com/" - assert first["snippet"].startswith("This domain is for use") - assert first["icon"] == "https://example.com/favicon.ico" - - second = results[1] - assert second["position"] == 2 - assert second["title"] == "OpenAI" - assert second["link"] == "https://openai.com/research" - assert second["icon"] == "https://openai.com/favicon.ico" - - -def test_missing_env_raises(monkeypatch): - # Unset env to simulate missing configuration - monkeypatch.delenv("GOOGLE_DEVELOPER_KEY", raising=False) - monkeypatch.delenv("GOOGLE_CSE_ID", raising=False) - - with pytest.raises(RuntimeError): - scraper.get_google_first_page("anything") + assert isinstance(results, list) and len(results) > 0 + assert any("youtube.com" in (item.get("link") or "") for item in results)