test_pagure_flask_ui_app.py 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015-2018 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. from __future__ import unicode_literals, absolute_import
  8. import datetime
  9. import unittest
  10. import shutil
  11. import sys
  12. import tempfile
  13. import os
  14. import six
  15. import json
  16. import pygit2
  17. from mock import patch, MagicMock
  18. sys.path.insert(
  19. 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
  20. )
  21. import pagure.lib.query
  22. import tests
  23. class PagureFlaskApptests(tests.Modeltests):
  24. """ Tests for flask app controller of pagure """
  25. def test_watch_list(self):
  26. """ Test for watch list of a user """
  27. user = tests.FakeUser(username="pingou")
  28. with tests.user_set(self.app.application, user):
  29. output = self.app.get("/", follow_redirects=True)
  30. output_text = output.get_data(as_text=True)
  31. self.assertIn(
  32. '<div class="text-center">You have no Projects</div>',
  33. output_text,
  34. )
  35. tests.create_projects(self.session)
  36. output = self.app.get("/", follow_redirects=True)
  37. output_text = output.get_data(as_text=True)
  38. self.assertIn(
  39. '<h4 class="font-weight-bold mb-0">My Projects</h4>',
  40. output_text,
  41. )
  42. def test_view_users(self):
  43. """ Test the view_users endpoint. """
  44. output = self.app.get("/users/?page=abc")
  45. self.assertEqual(output.status_code, 200)
  46. output_text = output.get_data(as_text=True)
  47. self.assertIn(
  48. '<h3 class="mb-3 font-weight-bold">\n Users '
  49. '<span class="badge badge-secondary">2</span>',
  50. output_text,
  51. )
  52. self.assertIn(
  53. '<a href="/user/pingou">\n '
  54. '<div class="nowrap"><strong>pingou</strong>',
  55. output_text,
  56. )
  57. self.assertIn(
  58. '<a href="/user/foo">\n '
  59. '<div class="nowrap"><strong>foo</strong>',
  60. output_text,
  61. )
  62. @patch.dict("pagure.config.config", {"ITEM_PER_PAGE": 2})
  63. def test_view_user_repo_cnt(self):
  64. """ Test the repo counts on the view_user endpoint. """
  65. tests.create_projects(self.session)
  66. self.gitrepos = tests.create_projects_git(
  67. pagure.config.config["GIT_FOLDER"]
  68. )
  69. output = self.app.get("/user/pingou")
  70. self.assertEqual(output.status_code, 200)
  71. output_text = output.get_data(as_text=True)
  72. self.assertIn(
  73. """<span>
  74. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  75. <span class="d-none d-md-inline">Projects&nbsp;</span>
  76. </span>
  77. <div class="ml-auto">
  78. <span class="badge badge-secondary">
  79. 3
  80. </span>
  81. </div>""",
  82. output_text,
  83. )
  84. self.assertIn(
  85. """<span>
  86. <i class="fa fa-fw text-muted fa-code-fork"></i>
  87. <span class="d-none d-md-inline">Forks&nbsp;</span>
  88. </span>
  89. <div class="ml-auto">
  90. <span class="badge badge-secondary">
  91. 0
  92. </span>
  93. </div>""",
  94. output_text,
  95. )
  96. def test_view_user(self):
  97. """ Test the view_user endpoint. """
  98. output = self.app.get("/user/pingou?repopage=abc&forkpage=def")
  99. self.assertEqual(output.status_code, 200)
  100. output_text = output.get_data(as_text=True)
  101. self.assertIn(
  102. """<span>
  103. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  104. <span class="d-none d-md-inline">Projects&nbsp;</span>
  105. </span>
  106. <div class="ml-auto">
  107. <span class="badge badge-secondary">
  108. 0
  109. </span>
  110. </div>""",
  111. output_text,
  112. )
  113. self.assertIn(
  114. """<span>
  115. <i class="fa fa-fw text-muted fa-code-fork"></i>
  116. <span class="d-none d-md-inline">Forks&nbsp;</span>
  117. </span>
  118. <div class="ml-auto">
  119. <span class="badge badge-secondary">
  120. 0
  121. </span>
  122. </div>""",
  123. output_text,
  124. )
  125. tests.create_projects(self.session)
  126. self.gitrepos = tests.create_projects_git(
  127. pagure.config.config["GIT_FOLDER"]
  128. )
  129. output = self.app.get("/user/pingou?repopage=abc&forkpage=def")
  130. self.assertEqual(output.status_code, 200)
  131. output_text = output.get_data(as_text=True)
  132. self.assertIn(
  133. """<span>
  134. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  135. <span class="d-none d-md-inline">Projects&nbsp;</span>
  136. </span>
  137. <div class="ml-auto">
  138. <span class="badge badge-secondary">
  139. 3
  140. </span>
  141. </div>""",
  142. output_text,
  143. )
  144. self.assertIn(
  145. """<span>
  146. <i class="fa fa-fw text-muted fa-code-fork"></i>
  147. <span class="d-none d-md-inline">Forks&nbsp;</span>
  148. </span>
  149. <div class="ml-auto">
  150. <span class="badge badge-secondary">
  151. 0
  152. </span>
  153. </div>""",
  154. output_text,
  155. )
  156. self.assertNotIn(
  157. '<a class="page-link" href="#" tabindex="-1">page 1 of 2</a>',
  158. output_text,
  159. )
  160. @patch.dict("pagure.config.config", {"ENABLE_UI_NEW_PROJECTS": False})
  161. def test_new_project_when_turned_off_in_the_ui(self):
  162. """ Test the new_project endpoint when new project creation is
  163. not allowed in the UI of this pagure instance. """
  164. user = tests.FakeUser(username="foo")
  165. with tests.user_set(self.app.application, user):
  166. output = self.app.get("/new/")
  167. self.assertEqual(output.status_code, 404)
  168. data = {"description": "Project #1", "name": "project-1"}
  169. output = self.app.post("/new/", data=data, follow_redirects=True)
  170. self.assertEqual(output.status_code, 404)
  171. @patch.dict("pagure.config.config", {"ENABLE_UI_NEW_PROJECTS": False})
  172. def test_new_project_button_when_turned_off_in_the_ui_no_project(self):
  173. """ Test the index endpoint when new project creation is
  174. not allowed in the UI of this pagure instance. """
  175. user = tests.FakeUser(username="foo")
  176. with tests.user_set(self.app.application, user):
  177. output = self.app.get("/", follow_redirects=True)
  178. self.assertEqual(output.status_code, 200)
  179. output_text = output.get_data(as_text=True)
  180. self.assertIn(
  181. '<h4 class="font-weight-bold mb-0">My Projects</h4>',
  182. output_text,
  183. )
  184. # master template
  185. self.assertNotIn(
  186. '<span class="oi" data-glyph="plus" title="Create New"',
  187. output_text,
  188. )
  189. # index_auth template
  190. self.assertNotIn(
  191. 'title="Create New Project" aria-hidden="true">', output_text
  192. )
  193. @patch.dict("pagure.config.config", {"ENABLE_UI_NEW_PROJECTS": False})
  194. def test_new_project_button_when_turned_off_in_the_ui_w_project(self):
  195. """ Test the index endpoint when new project creation is
  196. not allowed in the UI of this pagure instance. """
  197. tests.create_projects(self.session)
  198. user = tests.FakeUser(username="pingou")
  199. with tests.user_set(self.app.application, user):
  200. output = self.app.get("/", follow_redirects=True)
  201. self.assertEqual(output.status_code, 200)
  202. output_text = output.get_data(as_text=True)
  203. self.assertIn(
  204. '<h4 class="font-weight-bold mb-0">My Projects</h4>',
  205. output_text,
  206. )
  207. # master template
  208. self.assertNotIn(
  209. '<span class="oi" data-glyph="plus" title="Create New"',
  210. output_text,
  211. )
  212. # index_auth template
  213. self.assertNotIn(
  214. 'title="Create New Project" aria-hidden="true">', output_text
  215. )
  216. def test_new_project_with_dot(self):
  217. """ Test the new_project endpoint when new project contains a dot.
  218. """
  219. # Before
  220. projects = pagure.lib.query.search_projects(self.session)
  221. self.assertEqual(len(projects), 0)
  222. user = tests.FakeUser(username="foo")
  223. with tests.user_set(self.app.application, user):
  224. csrf_token = self.get_csrf()
  225. data = {
  226. "description": "Project #1.",
  227. "name": "project.1",
  228. "csrf_token": csrf_token,
  229. }
  230. output = self.app.post("/new/", data=data, follow_redirects=True)
  231. self.assertEqual(output.status_code, 200)
  232. output_text = output.get_data(as_text=True)
  233. self.assertIn(
  234. "<title>Overview - project.1 - Pagure</title>", output_text
  235. )
  236. self.assertIn(
  237. '<a href="/project.1"><strong>project.1</strong></a>',
  238. output_text,
  239. )
  240. # After
  241. projects = pagure.lib.query.search_projects(self.session)
  242. self.assertEqual(len(projects), 1)
  243. def test_new_project_with_plus(self):
  244. """ Test the new_project endpoint when new project contains a plus sign.
  245. """
  246. # Before
  247. projects = pagure.lib.query.search_projects(self.session)
  248. self.assertEqual(len(projects), 0)
  249. user = tests.FakeUser(username="foo")
  250. with tests.user_set(self.app.application, user):
  251. csrf_token = self.get_csrf()
  252. data = {
  253. "description": "Project #1.",
  254. "name": "project+1",
  255. "csrf_token": csrf_token,
  256. }
  257. output = self.app.post("/new/", data=data, follow_redirects=True)
  258. self.assertEqual(output.status_code, 200)
  259. output_text = output.get_data(as_text=True)
  260. self.assertIn(
  261. "<title>Overview - project+1 - Pagure</title>", output_text
  262. )
  263. self.assertTrue(
  264. '<a href="/project+1"><strong>project+1</strong></a>'
  265. in output_text
  266. or '<a href="/project%2B1"><strong>project+1</strong></a>'
  267. in output_text
  268. )
  269. # After
  270. projects = pagure.lib.query.search_projects(self.session)
  271. self.assertEqual(len(projects), 1)
  272. def test_new_project_when_turned_off(self):
  273. """ Test the new_project endpoint when new project creation is
  274. not allowed in the pagure instance. """
  275. # turn the project creation off
  276. pagure.config.config["ENABLE_NEW_PROJECTS"] = False
  277. # Before
  278. projects = pagure.lib.query.search_projects(self.session)
  279. self.assertEqual(len(projects), 0)
  280. self.assertFalse(
  281. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  282. )
  283. self.assertFalse(
  284. os.path.exists(
  285. os.path.join(self.path, "repos", "tickets", "project-1.git")
  286. )
  287. )
  288. self.assertFalse(
  289. os.path.exists(
  290. os.path.join(self.path, "repos", "docs", "project-1.git")
  291. )
  292. )
  293. self.assertFalse(
  294. os.path.exists(
  295. os.path.join(self.path, "repos", "requests", "project-1.git")
  296. )
  297. )
  298. user = tests.FakeUser()
  299. with tests.user_set(self.app.application, user):
  300. output = self.app.get("/new/")
  301. self.assertEqual(output.status_code, 404)
  302. # just get the csrf token
  303. pagure.config.config["ENABLE_NEW_PROJECTS"] = True
  304. output = self.app.get("/new/")
  305. pagure.config.config["ENABLE_NEW_PROJECTS"] = False
  306. csrf_token = (
  307. output.get_data(as_text=True)
  308. .split('name="csrf_token" type="hidden" value="')[1]
  309. .split('">')[0]
  310. )
  311. data = {"description": "Project #1", "name": "project-1"}
  312. user.username = "foo"
  313. with tests.user_set(self.app.application, user):
  314. data["csrf_token"] = csrf_token
  315. output = self.app.post("/new/", data=data, follow_redirects=True)
  316. self.assertEqual(output.status_code, 404)
  317. # After
  318. projects = pagure.lib.query.search_projects(self.session)
  319. self.assertEqual(len(projects), 0)
  320. self.assertFalse(
  321. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  322. )
  323. self.assertFalse(
  324. os.path.exists(
  325. os.path.join(self.path, "repos", "tickets", "project-1.git")
  326. )
  327. )
  328. self.assertFalse(
  329. os.path.exists(
  330. os.path.join(self.path, "repos", "docs", "project-1.git")
  331. )
  332. )
  333. self.assertFalse(
  334. os.path.exists(
  335. os.path.join(self.path, "repos", "requests", "project-1.git")
  336. )
  337. )
  338. pagure.config.config["ENABLE_NEW_PROJECTS"] = True
  339. def test_new_project_mirrored_invalid_url(self):
  340. """ Test the new_project with a mirrored repo but an invalid URL. """
  341. user = tests.FakeUser(username="foo")
  342. with tests.user_set(self.app.application, user):
  343. output = self.app.get("/new/")
  344. self.assertEqual(output.status_code, 200)
  345. csrf_token = self.get_csrf(output=output)
  346. data = {
  347. "description": "Project #1",
  348. "name": "project-1",
  349. "mirrored_from": "abcd",
  350. "csrf_token": csrf_token,
  351. }
  352. output = self.app.post("/new/", data=data, follow_redirects=True)
  353. self.assertEqual(output.status_code, 200)
  354. output_text = output.get_data(as_text=True)
  355. self.assertIn("<title>New project - Pagure</title>", output_text)
  356. self.assertIn("Invalid input.&nbsp;", output_text)
  357. def test_new_project_mirrored_invalid_sshurl(self):
  358. """ Test the new_project with a mirrored repo but an invalid
  359. SSH-like url.
  360. """
  361. user = tests.FakeUser(username="foo")
  362. with tests.user_set(self.app.application, user):
  363. output = self.app.get("/new/")
  364. self.assertEqual(output.status_code, 200)
  365. csrf_token = self.get_csrf(output=output)
  366. data = {
  367. "description": "Project #1",
  368. "name": "project-1",
  369. "mirrored_from": "ssh://git@server.org/foo/bar.git",
  370. "csrf_token": csrf_token,
  371. }
  372. output = self.app.post("/new/", data=data, follow_redirects=True)
  373. self.assertEqual(output.status_code, 200)
  374. output_text = output.get_data(as_text=True)
  375. self.assertIn("<title>New project - Pagure</title>", output_text)
  376. self.assertIn("Invalid input.&nbsp;", output_text)
  377. def test_new_project_mirrored_valid_url(self):
  378. """ Test the new_project with a mirrored repo with a valid url. """
  379. user = tests.FakeUser(username="foo")
  380. with tests.user_set(self.app.application, user):
  381. output = self.app.get("/new/")
  382. self.assertEqual(output.status_code, 200)
  383. output_text = output.get_data(as_text=True)
  384. self.assertIn(
  385. '<strong><label for="mirrored_from">Mirror from URL'
  386. "</label></strong>",
  387. output_text,
  388. )
  389. csrf_token = self.get_csrf(output=output)
  390. data = {
  391. "description": "Project #1",
  392. "name": "project-1",
  393. "mirrored_from": "https://example.com/foo/bar.git",
  394. "csrf_token": csrf_token,
  395. }
  396. output = self.app.post("/new/", data=data, follow_redirects=True)
  397. self.assertEqual(output.status_code, 200)
  398. output_text = output.get_data(as_text=True)
  399. self.assertIn(
  400. "<title>Overview - project-1 - Pagure</title>", output_text
  401. )
  402. self.assertIn(
  403. "<p>This repo is brand new and meant to be mirrored from "
  404. "https://example.com/foo/bar.git !</p>",
  405. output_text,
  406. )
  407. @patch.dict("pagure.config.config", {"DISABLE_MIRROR_IN": True})
  408. def test_new_project_mirrored_mirror_disabled(self):
  409. """ Test the new_project with a mirrored repo when that feature is
  410. disabled.
  411. """
  412. user = tests.FakeUser(username="foo")
  413. with tests.user_set(self.app.application, user):
  414. output = self.app.get("/new/")
  415. self.assertEqual(output.status_code, 200)
  416. output_text = output.get_data(as_text=True)
  417. self.assertNotIn(
  418. '<strong><label for="mirrored_from">Mirror from URL'
  419. "</label></strong>",
  420. output_text,
  421. )
  422. csrf_token = self.get_csrf(output=output)
  423. data = {
  424. "description": "Project #1",
  425. "name": "project-1",
  426. "mirrored_from": "https://example.com/foo/bar.git",
  427. "csrf_token": csrf_token,
  428. }
  429. output = self.app.post("/new/", data=data, follow_redirects=True)
  430. self.assertEqual(output.status_code, 200)
  431. output_text = output.get_data(as_text=True)
  432. self.assertIn("<title>New project - Pagure</title>", output_text)
  433. self.assertIn(
  434. "</i> Mirroring in projects has been disabled in "
  435. "this instance</div>",
  436. output_text,
  437. )
  438. def test_new_project(self):
  439. """ Test the new_project endpoint. """
  440. # Before
  441. projects = pagure.lib.query.search_projects(self.session)
  442. self.assertEqual(len(projects), 0)
  443. self.assertFalse(
  444. os.path.exists(os.path.join(self.path, "repos", "project#1.git"))
  445. )
  446. self.assertFalse(
  447. os.path.exists(
  448. os.path.join(self.path, "repos", "tickets", "project#1.git")
  449. )
  450. )
  451. self.assertFalse(
  452. os.path.exists(
  453. os.path.join(self.path, "repos", "docs", "project#1.git")
  454. )
  455. )
  456. self.assertFalse(
  457. os.path.exists(
  458. os.path.join(self.path, "repos", "requests", "project#1.git")
  459. )
  460. )
  461. user = tests.FakeUser()
  462. with tests.user_set(self.app.application, user):
  463. output = self.app.get("/new/")
  464. self.assertEqual(output.status_code, 200)
  465. output_text = output.get_data(as_text=True)
  466. self.assertIn("<strong>Create new Project</strong>", output_text)
  467. csrf_token = output_text.split(
  468. 'name="csrf_token" type="hidden" value="'
  469. )[1].split('">')[0]
  470. data = {"description": "Project #1"}
  471. output = self.app.post("/new/", data=data)
  472. self.assertEqual(output.status_code, 200)
  473. output_text = output.get_data(as_text=True)
  474. self.assertIn("<strong>Create new Project</strong>", output_text)
  475. self.assertIn(
  476. "<small>\n This field is required.&nbsp;\n"
  477. " </small>",
  478. output_text,
  479. )
  480. data["name"] = "project-1"
  481. output = self.app.post("/new/", data=data)
  482. self.assertEqual(output.status_code, 200)
  483. output_text = output.get_data(as_text=True)
  484. self.assertIn("<strong>Create new Project</strong>", output_text)
  485. self.assertNotIn(
  486. "<small>\n This field is required.&nbsp;\n"
  487. " </small>",
  488. output_text,
  489. )
  490. data["csrf_token"] = csrf_token
  491. output = self.app.post("/new/", data=data)
  492. self.assertEqual(output.status_code, 200)
  493. output_text = output.get_data(as_text=True)
  494. self.assertIn("<strong>Create new Project</strong>", output_text)
  495. self.assertIn("No user " "&#34;username&#34; found", output_text)
  496. user.username = "foo"
  497. with tests.user_set(self.app.application, user):
  498. data["csrf_token"] = csrf_token
  499. output = self.app.post("/new/", data=data, follow_redirects=True)
  500. self.assertEqual(output.status_code, 200)
  501. output_text = output.get_data(as_text=True)
  502. self.assertIn(
  503. '<div class="projectinfo my-3">\nProject #1', output_text
  504. )
  505. self.assertIn("<p>This repo is brand new!</p>", output_text)
  506. self.assertIn(
  507. "<title>Overview - project-1 - Pagure</title>", output_text
  508. )
  509. # After
  510. projects = pagure.lib.query.search_projects(self.session)
  511. self.assertEqual(len(projects), 1)
  512. self.assertTrue(
  513. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  514. )
  515. self.assertTrue(
  516. os.path.exists(
  517. os.path.join(self.path, "repos", "tickets", "project-1.git")
  518. )
  519. )
  520. self.assertTrue(
  521. os.path.exists(
  522. os.path.join(self.path, "repos", "docs", "project-1.git")
  523. )
  524. )
  525. self.assertTrue(
  526. os.path.exists(
  527. os.path.join(self.path, "repos", "requests", "project-1.git")
  528. )
  529. )
  530. @patch.dict(
  531. "pagure.config.config",
  532. {
  533. "PAGURE_ADMIN_USERS": ["pingou"],
  534. "ALLOW_ADMIN_IGNORE_EXISTING_REPOS": True,
  535. },
  536. )
  537. def test_adopt_repos(self):
  538. """ Test the new_project endpoint with existing git repo. """
  539. # Before
  540. projects = pagure.lib.query.search_projects(self.session)
  541. self.assertEqual(len(projects), 0)
  542. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  543. tests.add_content_git_repo(
  544. os.path.join(self.path, "repos", "test.git")
  545. )
  546. user = tests.FakeUser(username="pingou")
  547. with tests.user_set(self.app.application, user):
  548. data = {
  549. "csrf_token": self.get_csrf(),
  550. "name": "test",
  551. "description": "Project #1",
  552. }
  553. output = self.app.post("/new/", data=data, follow_redirects=True)
  554. self.assertEqual(output.status_code, 200)
  555. output_text = output.get_data(as_text=True)
  556. self.assertIn("The main repo test.git already exists", output_text)
  557. data["ignore_existing_repos"] = "y"
  558. output = self.app.post("/new/", data=data, follow_redirects=True)
  559. self.assertEqual(output.status_code, 200)
  560. output_text = output.get_data(as_text=True)
  561. self.assertIn("Alice Author", output_text)
  562. @patch.dict(
  563. "pagure.config.config",
  564. {"PAGURE_ADMIN_USERS": [], "USERS_IGNORE_EXISTING_REPOS": ["pingou"]},
  565. )
  566. def test_adopt_repos_non_admin(self):
  567. """ Test the new_project endpoint with existing git repo for non-admins. """
  568. # Before
  569. projects = pagure.lib.query.search_projects(self.session)
  570. self.assertEqual(len(projects), 0)
  571. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  572. tests.add_content_git_repo(
  573. os.path.join(self.path, "repos", "test.git")
  574. )
  575. user = tests.FakeUser(username="pingou")
  576. with tests.user_set(self.app.application, user):
  577. data = {
  578. "csrf_token": self.get_csrf(),
  579. "name": "test",
  580. "description": "Project #1",
  581. }
  582. output = self.app.post("/new/", data=data, follow_redirects=True)
  583. self.assertEqual(output.status_code, 200)
  584. output_text = output.get_data(as_text=True)
  585. self.assertIn("The main repo test.git already exists", output_text)
  586. data["ignore_existing_repos"] = "y"
  587. output = self.app.post("/new/", data=data, follow_redirects=True)
  588. self.assertEqual(output.status_code, 200)
  589. output_text = output.get_data(as_text=True)
  590. self.assertIn("Alice Author", output_text)
  591. @patch.dict(
  592. "pagure.config.config",
  593. {"PAGURE_ADMIN_USERS": [], "USERS_IGNORE_EXISTING_REPOS": []},
  594. )
  595. def test_adopt_repos_not_allowed(self):
  596. """ Test the new_project endpoint with existing git repo for no access. """
  597. # Before
  598. projects = pagure.lib.query.search_projects(self.session)
  599. self.assertEqual(len(projects), 0)
  600. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  601. tests.add_content_git_repo(
  602. os.path.join(self.path, "repos", "test.git")
  603. )
  604. user = tests.FakeUser(username="pingou")
  605. with tests.user_set(self.app.application, user):
  606. data = {
  607. "csrf_token": self.get_csrf(),
  608. "name": "test",
  609. "description": "Project #1",
  610. }
  611. output = self.app.post("/new/", data=data, follow_redirects=True)
  612. self.assertEqual(output.status_code, 200)
  613. output_text = output.get_data(as_text=True)
  614. self.assertIn("The main repo test.git already exists", output_text)
  615. data["ignore_existing_repos"] = "y"
  616. output = self.app.post("/new/", data=data, follow_redirects=True)
  617. self.assertEqual(output.status_code, 200)
  618. output_text = output.get_data(as_text=True)
  619. self.assertIn("The main repo test.git already exists", output_text)
  620. @patch.dict("pagure.config.config", {"PROJECT_NAME_REGEX": "^1[a-z]*$"})
  621. def test_new_project_diff_regex(self):
  622. """ Test the new_project endpoint with a different regex. """
  623. # Before
  624. projects = pagure.lib.query.search_projects(self.session)
  625. self.assertEqual(len(projects), 0)
  626. user = tests.FakeUser(username="foo")
  627. with tests.user_set(self.app.application, user):
  628. output = self.app.get("/new/")
  629. self.assertEqual(output.status_code, 200)
  630. output_text = output.get_data(as_text=True)
  631. self.assertIn("<strong>Create new Project</strong>", output_text)
  632. csrf_token = self.get_csrf(output=output)
  633. data = {
  634. "description": "Project #1",
  635. "name": "project-1",
  636. "csrf_token": csrf_token,
  637. }
  638. output = self.app.post("/new/", data=data, follow_redirects=True)
  639. self.assertEqual(output.status_code, 200)
  640. output_text = output.get_data(as_text=True)
  641. self.assertIn("<title>New project - Pagure</title>", output_text)
  642. self.assertIn("<strong>Create new Project</strong>", output_text)
  643. self.assertIn(
  644. "<small>\n Invalid input.&nbsp;\n"
  645. " </small>",
  646. output_text,
  647. )
  648. @patch.dict("pagure.config.config", {"PRIVATE_PROJECTS": True})
  649. def test_new_project_private(self):
  650. """ Test the new_project endpoint for a private project. """
  651. # Before
  652. projects = pagure.lib.query.search_projects(self.session)
  653. self.assertEqual(len(projects), 0)
  654. self.assertFalse(
  655. os.path.exists(
  656. os.path.join(self.path, "repos", "foo", "project#1.git")
  657. )
  658. )
  659. self.assertFalse(
  660. os.path.exists(
  661. os.path.join(
  662. self.path, "repos", "tickets", "foo", "project#1.git"
  663. )
  664. )
  665. )
  666. self.assertFalse(
  667. os.path.exists(
  668. os.path.join(
  669. self.path, "repos", "docs", "foo", "project#1.git"
  670. )
  671. )
  672. )
  673. self.assertFalse(
  674. os.path.exists(
  675. os.path.join(
  676. self.path, "repos", "requests", "foo", "project#1.git"
  677. )
  678. )
  679. )
  680. user = tests.FakeUser()
  681. with tests.user_set(self.app.application, user):
  682. output = self.app.get("/new/")
  683. self.assertEqual(output.status_code, 200)
  684. self.assertIn(
  685. "<strong>Create new Project</strong>",
  686. output.get_data(as_text=True),
  687. )
  688. csrf_token = self.get_csrf(output=output)
  689. data = {"description": "Project #1", "private": True}
  690. output = self.app.post("/new/", data=data)
  691. self.assertEqual(output.status_code, 200)
  692. output_text = output.get_data(as_text=True)
  693. self.assertIn("<strong>Create new Project</strong>", output_text)
  694. self.assertIn(
  695. "<small>\n This field is required.&nbsp;\n"
  696. " </small>",
  697. output_text,
  698. )
  699. data["name"] = "project-1"
  700. output = self.app.post("/new/", data=data)
  701. self.assertEqual(output.status_code, 200)
  702. output_text = output.get_data(as_text=True)
  703. self.assertIn("<strong>Create new Project</strong>", output_text)
  704. self.assertNotIn(
  705. "<small>\n This field is required.&nbsp;\n"
  706. " </small>",
  707. output_text,
  708. )
  709. data["csrf_token"] = csrf_token
  710. output = self.app.post("/new/", data=data)
  711. self.assertEqual(output.status_code, 200)
  712. output_text = output.get_data(as_text=True)
  713. self.assertIn("<strong>Create new Project</strong>", output_text)
  714. self.assertIn("No user " "&#34;username&#34; found", output_text)
  715. user.username = "foo"
  716. with tests.user_set(self.app.application, user):
  717. data["csrf_token"] = csrf_token
  718. output = self.app.post("/new/", data=data, follow_redirects=True)
  719. self.assertEqual(output.status_code, 200)
  720. output_text = output.get_data(as_text=True)
  721. self.assertIn(
  722. '<div class="projectinfo my-3">\nProject #1', output_text
  723. )
  724. self.assertIn("<p>This repo is brand new!</p>", output_text)
  725. self.assertIn(
  726. "<title>Overview - foo/project-1 - Pagure</title>", output_text
  727. )
  728. # After
  729. projects = pagure.lib.query.search_projects(self.session)
  730. self.assertEqual(len(projects), 0)
  731. projects = pagure.lib.query.search_projects(self.session, private=True)
  732. self.assertEqual(len(projects), 1)
  733. self.assertTrue(
  734. os.path.exists(
  735. os.path.join(self.path, "repos", "foo", "project-1.git")
  736. )
  737. )
  738. self.assertTrue(
  739. os.path.exists(
  740. os.path.join(
  741. self.path, "repos", "tickets", "foo", "project-1.git"
  742. )
  743. )
  744. )
  745. self.assertTrue(
  746. os.path.exists(
  747. os.path.join(
  748. self.path, "repos", "docs", "foo", "project-1.git"
  749. )
  750. )
  751. )
  752. self.assertTrue(
  753. os.path.exists(
  754. os.path.join(
  755. self.path, "repos", "requests", "foo", "project-1.git"
  756. )
  757. )
  758. )
  759. def test_non_ascii_new_project(self):
  760. """ Test the new_project endpoint with a non-ascii project. """
  761. # Before
  762. projects = pagure.lib.query.search_projects(self.session)
  763. self.assertEqual(len(projects), 0)
  764. self.assertFalse(
  765. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  766. )
  767. self.assertFalse(
  768. os.path.exists(
  769. os.path.join(self.path, "repos", "tickets", "project-1.git")
  770. )
  771. )
  772. self.assertFalse(
  773. os.path.exists(
  774. os.path.join(self.path, "repos", "docs", "project-1.git")
  775. )
  776. )
  777. self.assertFalse(
  778. os.path.exists(
  779. os.path.join(self.path, "repos", "requests", "project-1.git")
  780. )
  781. )
  782. user = tests.FakeUser()
  783. user.username = "foo"
  784. with tests.user_set(self.app.application, user):
  785. output = self.app.get("/new/")
  786. self.assertEqual(output.status_code, 200)
  787. output_text = output.get_data(as_text=True)
  788. self.assertIn("<strong>Create new Project</strong>", output_text)
  789. csrf_token = output_text.split(
  790. 'name="csrf_token" type="hidden" value="'
  791. )[1].split('">')[0]
  792. data = {
  793. "description": "Prõjéctö #1",
  794. "name": "project-1",
  795. "csrf_token": csrf_token,
  796. "create_readme": True,
  797. }
  798. output = self.app.post("/new/", data=data, follow_redirects=True)
  799. self.assertEqual(output.status_code, 200)
  800. output_text = output.get_data(as_text=True)
  801. self.assertIn(
  802. '<div class="projectinfo my-3">\nPrõjéctö #1', output_text
  803. )
  804. self.assertIn(
  805. """<section class="readme">
  806. <div class="markdown"><h1>project-1</h1>
  807. <p>Prõjéctö #1</p></div>
  808. </section>""",
  809. output_text,
  810. )
  811. data = {
  812. "description": "Мой первый суперский репозиторий",
  813. "name": "project-2",
  814. "csrf_token": csrf_token,
  815. "create_readme": True,
  816. }
  817. output = self.app.post("/new/", data=data, follow_redirects=True)
  818. self.assertEqual(output.status_code, 200)
  819. output_text = output.get_data(as_text=True)
  820. self.assertIn(
  821. '<div class="projectinfo my-3">\nМой первый суперский репозиторий',
  822. output_text,
  823. )
  824. self.assertIn(
  825. """<section class="readme">
  826. <div class="markdown"><h1>project-2</h1>
  827. <p>Мой первый суперский репозиторий</p></div>
  828. </section>""",
  829. output_text,
  830. )
  831. # After
  832. projects = pagure.lib.query.search_projects(self.session)
  833. self.assertEqual(len(projects), 2)
  834. for project in ["project-1", "project-2"]:
  835. self.assertTrue(
  836. os.path.exists(
  837. os.path.join(self.path, "repos", "%s.git" % project)
  838. )
  839. )
  840. self.assertTrue(
  841. os.path.exists(
  842. os.path.join(
  843. self.path, "repos", "tickets", "%s.git" % project
  844. )
  845. )
  846. )
  847. self.assertTrue(
  848. os.path.exists(
  849. os.path.join(
  850. self.path, "repos", "docs", "%s.git" % project
  851. )
  852. )
  853. )
  854. self.assertTrue(
  855. os.path.exists(
  856. os.path.join(
  857. self.path, "repos", "requests", "%s.git" % project
  858. )
  859. )
  860. )
  861. @patch("pygit2.init_repository", wraps=pygit2.init_repository)
  862. def test_new_project_with_template(self, pygit2init):
  863. """ Test the new_project endpoint for a new project with a template set.
  864. """
  865. # Before
  866. projects = pagure.lib.query.search_projects(self.session)
  867. self.assertEqual(len(projects), 0)
  868. self.assertFalse(
  869. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  870. )
  871. self.assertFalse(
  872. os.path.exists(
  873. os.path.join(self.path, "repos", "tickets", "project-1.git")
  874. )
  875. )
  876. self.assertFalse(
  877. os.path.exists(
  878. os.path.join(self.path, "repos", "docs", "project-1.git")
  879. )
  880. )
  881. self.assertFalse(
  882. os.path.exists(
  883. os.path.join(self.path, "repos", "requests", "project-1.git")
  884. )
  885. )
  886. user = tests.FakeUser()
  887. user.username = "foo"
  888. with tests.user_set(self.app.application, user):
  889. output = self.app.get("/new/")
  890. self.assertEqual(output.status_code, 200)
  891. self.assertIn(
  892. "<strong>Create new Project</strong>",
  893. output.get_data(as_text=True),
  894. )
  895. csrf_token = self.get_csrf(output=output)
  896. data = {
  897. "description": "test",
  898. "name": "project-1",
  899. "csrf_token": csrf_token,
  900. "create_readme": True,
  901. }
  902. output = self.app.post("/new/", data=data, follow_redirects=True)
  903. self.assertEqual(output.status_code, 200)
  904. self.assertIn(
  905. '<div class="projectinfo my-3">\ntest',
  906. output.get_data(as_text=True),
  907. )
  908. self.assertEqual(pygit2init.call_count, 4)
  909. pygit2init.assert_any_call(
  910. "%s/repos/project-1.git" % self.path,
  911. bare=True,
  912. template_path=None,
  913. )
  914. path = os.path.join(self.path, "repos", "project-1.git")
  915. with patch.dict(
  916. "pagure.config.config", {"PROJECT_TEMPLATE_PATH": path}
  917. ):
  918. data = {
  919. "description": "test2",
  920. "name": "project-2",
  921. "csrf_token": csrf_token,
  922. "create_readme": True,
  923. }
  924. output = self.app.post(
  925. "/new/", data=data, follow_redirects=True
  926. )
  927. self.assertEqual(output.status_code, 200)
  928. self.assertIn(
  929. '<div class="projectinfo my-3">\ntest2',
  930. output.get_data(as_text=True),
  931. )
  932. self.assertEqual(pygit2init.call_count, 8)
  933. pygit2init.assert_any_call(
  934. "%s/repos/project-2.git" % self.path,
  935. bare=True,
  936. template_path="%s/repos/project-1.git" % self.path,
  937. )
  938. # After
  939. projects = pagure.lib.query.search_projects(self.session)
  940. self.assertEqual(len(projects), 2)
  941. for project in ["project-1", "project-2"]:
  942. self.assertTrue(
  943. os.path.exists(
  944. os.path.join(self.path, "repos", "%s.git" % project)
  945. )
  946. )
  947. self.assertTrue(
  948. os.path.exists(
  949. os.path.join(
  950. self.path, "repos", "tickets", "%s.git" % project
  951. )
  952. )
  953. )
  954. self.assertTrue(
  955. os.path.exists(
  956. os.path.join(
  957. self.path, "repos", "docs", "%s.git" % project
  958. )
  959. )
  960. )
  961. self.assertTrue(
  962. os.path.exists(
  963. os.path.join(
  964. self.path, "repos", "requests", "%s.git" % project
  965. )
  966. )
  967. )
  968. @patch.dict("pagure.config.config", {"CASE_SENSITIVE": True})
  969. def test_new_project_case_sensitive(self):
  970. tests.create_projects(self.session)
  971. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  972. output = self.app.get("/test")
  973. self.assertEqual(output.status_code, 200)
  974. output = self.app.get("/TEST")
  975. self.assertEqual(output.status_code, 404)
  976. user = tests.FakeUser()
  977. user.username = "foo"
  978. with tests.user_set(self.app.application, user):
  979. output = self.app.get("/new/")
  980. self.assertEqual(output.status_code, 200)
  981. csrf_token = self.get_csrf(output=output)
  982. data = {
  983. "description": "TEST",
  984. "name": "TEST",
  985. "csrf_token": csrf_token,
  986. "create_readme": True,
  987. }
  988. self.app.post("/new/", data=data, follow_redirects=True)
  989. output = self.app.get("/TEST")
  990. self.assertEqual(output.status_code, 200)
  991. @patch("pagure.ui.app.admin_session_timedout")
  992. def test_user_settings(self, ast):
  993. """ Test the user_settings endpoint. """
  994. ast.return_value = False
  995. self.test_new_project()
  996. user = tests.FakeUser()
  997. with tests.user_set(self.app.application, user):
  998. output = self.app.get("/settings/")
  999. self.assertEqual(output.status_code, 404)
  1000. self.assertIn(
  1001. "<h2>Page not found (404)</h2>", output.get_data(as_text=True)
  1002. )
  1003. user.username = "foo"
  1004. with tests.user_set(self.app.application, user):
  1005. output = self.app.get("/settings/")
  1006. self.assertEqual(output.status_code, 200)
  1007. output_text = output.get_data(as_text=True)
  1008. self.assertIn(
  1009. "<title>foo's settings - Pagure</title>", output_text
  1010. )
  1011. ast.return_value = True
  1012. output = self.app.get("/settings/")
  1013. self.assertEqual(output.status_code, 302)
  1014. @patch("pagure.decorators.admin_session_timedout")
  1015. def test_add_user_sshkey(self, ast):
  1016. """ Test the add_user_sshkey endpoint. """
  1017. ast.return_value = False
  1018. # User not logged in
  1019. output = self.app.get("/settings/")
  1020. self.assertEqual(output.status_code, 302)
  1021. ast.return_value = False
  1022. user = tests.FakeUser(username="pingou")
  1023. with tests.user_set(self.app.application, user):
  1024. output = self.app.get("/settings", follow_redirects=True)
  1025. self.assertEqual(output.status_code, 200)
  1026. output_text = output.get_data(as_text=True)
  1027. self.assertIn("<strong>Add SSH key", output_text)
  1028. csrf_token = self.get_csrf(output=output)
  1029. data = {"ssh_key": "asdf"}
  1030. # No CSRF token
  1031. output = self.app.post(
  1032. "/settings/usersettings/addkey",
  1033. data=data,
  1034. follow_redirects=True,
  1035. )
  1036. self.assertEqual(output.status_code, 200)
  1037. output_text = output.get_data(as_text=True)
  1038. self.assertIn("<strong>Add SSH key", output_text)
  1039. data["csrf_token"] = csrf_token
  1040. # First, invalid SSH key
  1041. output = self.app.post(
  1042. "/settings/usersettings/addkey",
  1043. data=data,
  1044. follow_redirects=True,
  1045. )
  1046. self.assertEqual(output.status_code, 200)
  1047. output_text = output.get_data(as_text=True)
  1048. self.assertIn("<strong>Add SSH key", output_text)
  1049. self.assertIn("SSH key invalid", output_text)
  1050. # Next up, multiple SSH keys
  1051. data[
  1052. "ssh_key"
  1053. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q=="
  1054. output = self.app.post(
  1055. "/settings/usersettings/addkey",
  1056. data=data,
  1057. follow_redirects=True,
  1058. )
  1059. self.assertEqual(output.status_code, 200)
  1060. output_text = output.get_data(as_text=True)
  1061. self.assertIn("Please add single SSH keys.", output_text)
  1062. # Now, a valid SSH key
  1063. data[
  1064. "ssh_key"
  1065. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q=="
  1066. output = self.app.post(
  1067. "/settings/usersettings/addkey",
  1068. data=data,
  1069. follow_redirects=True,
  1070. )
  1071. self.assertEqual(output.status_code, 200)
  1072. output_text = output.get_data(as_text=True)
  1073. self.assertIn(
  1074. "<title>pingou's settings - Pagure</title>", output_text
  1075. )
  1076. self.assertIn("SSH key added", output_text)
  1077. self.assertNotIn("Push Access", output_text)
  1078. # And now, adding the same key
  1079. output = self.app.post(
  1080. "/settings/usersettings/addkey",
  1081. data=data,
  1082. follow_redirects=True,
  1083. )
  1084. self.assertEqual(output.status_code, 200)
  1085. output_text = output.get_data(as_text=True)
  1086. self.assertIn("SSH key already exists", output_text)
  1087. # And next, a key with push access
  1088. data[
  1089. "ssh_key"
  1090. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9Xwc2RDzPBhlEDARfHldGjudIVoa04tqT1JVKGQmyllTFz7Rb8CngQL3e7zyNzotnhwYKHdoiLlPkVEiDee4dWMUe48ilqId+FJZQGhyv8fu4BoFdE1AJUVylzmltbLg14VqG5gjTpXgtlrEva9arKwBMHJjRYc8ScaSn3OgyQw=="
  1091. output = self.app.post(
  1092. "/settings/usersettings/addkey",
  1093. data=data,
  1094. follow_redirects=True,
  1095. )
  1096. self.assertEqual(output.status_code, 200)
  1097. output_text = output.get_data(as_text=True)
  1098. self.assertIn(
  1099. "<title>pingou's settings - Pagure</title>", output_text
  1100. )
  1101. self.assertIn("SSH key added", output_text)
  1102. @patch("pagure.decorators.admin_session_timedout")
  1103. def test_remove_user_sshkey(self, ast):
  1104. """ Test the remove_sshkey endpoint. """
  1105. ast.return_value = False
  1106. user = tests.FakeUser()
  1107. # User not logged in
  1108. output = self.app.post("/settings/usersettings/removekey/1")
  1109. self.assertEqual(output.status_code, 302)
  1110. user.username = "pingou"
  1111. with tests.user_set(self.app.application, user):
  1112. data = {"csrf_token": self.get_csrf()}
  1113. output = self.app.post(
  1114. "/settings/usersettings/removekey/1",
  1115. data=data,
  1116. follow_redirects=True,
  1117. )
  1118. self.assertEqual(output.status_code, 200)
  1119. output_text = output.get_data(as_text=True)
  1120. self.assertIn(
  1121. "<title>pingou's settings - Pagure</title>", output_text
  1122. )
  1123. self.assertIn("SSH key does not exist", output_text)
  1124. # Add a deploy key to a project
  1125. pingou = pagure.lib.query.get_user(self.session, "pingou")
  1126. msg = pagure.lib.query.add_sshkey_to_project_or_user(
  1127. session=self.session,
  1128. ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==",
  1129. user=pingou,
  1130. pushaccess=True,
  1131. creator=pingou,
  1132. )
  1133. self.session.commit()
  1134. self.assertEqual(msg, "SSH key added")
  1135. with tests.user_set(self.app.application, user):
  1136. output = self.app.post(
  1137. "/settings/usersettings/removekey/1", follow_redirects=True
  1138. )
  1139. self.assertEqual(output.status_code, 200)
  1140. output_text = output.get_data(as_text=True)
  1141. self.assertIn(
  1142. "<title>pingou's settings - Pagure</title>", output_text
  1143. )
  1144. self.assertNotIn("SSH key removed", output_text)
  1145. data = {"csrf_token": self.get_csrf()}
  1146. output = self.app.post(
  1147. "/settings/usersettings/removekey/1",
  1148. data=data,
  1149. follow_redirects=True,
  1150. )
  1151. self.assertEqual(output.status_code, 200)
  1152. output_text = output.get_data(as_text=True)
  1153. self.assertIn(
  1154. "<title>pingou's settings - Pagure</title>", output_text
  1155. )
  1156. self.assertIn("SSH key removed", output_text)
  1157. def patched_commit_exists(user, namespace, repo, githash):
  1158. """ Patched version of pagure.pfmarkdown._commit_exists to enforce
  1159. returning true on some given hash without having us actually check
  1160. the git repos.
  1161. """
  1162. if githash in [
  1163. "9364354",
  1164. "9364354a",
  1165. "9364354a4555ba17aa60f0dc844d70b74eb1aecd",
  1166. ]:
  1167. return True
  1168. else:
  1169. return False
  1170. @patch(
  1171. "pagure.pfmarkdown._commit_exists",
  1172. MagicMock(side_effect=patched_commit_exists),
  1173. )
  1174. def test_patched_markdown_preview(self):
  1175. """ Test the markdown_preview endpoint. """
  1176. data = {"content": "test\n----\n\n * 1\n * item 2"}
  1177. # CSRF missing
  1178. output = self.app.post("/markdown/", data=data)
  1179. self.assertEqual(output.status_code, 400)
  1180. user = tests.FakeUser()
  1181. user.username = "foo"
  1182. with tests.user_set(self.app.application, user):
  1183. output = self.app.get("/settings/")
  1184. self.assertEqual(output.status_code, 200)
  1185. output_text = output.get_data(as_text=True)
  1186. self.assertIn(
  1187. "<title>foo's settings - Pagure</title>", output_text
  1188. )
  1189. csrf_token = self.get_csrf(output=output)
  1190. # With CSRF
  1191. data["csrf_token"] = csrf_token
  1192. output = self.app.post("/markdown/", data=data)
  1193. self.assertEqual(output.status_code, 200)
  1194. exp = """<div class="markdown"><h2>test</h2>
  1195. <ul>
  1196. <li>1</li>
  1197. <li>item 2</li>
  1198. </ul></div>"""
  1199. self.assertEqual(output.get_data(as_text=True), exp)
  1200. tests.create_projects(self.session)
  1201. texts = [
  1202. "pingou committed on test#9364354a4555ba17aa60f0dc844d70b74eb1aecd",
  1203. "Cf commit 936435", # 6 chars - not long enough
  1204. "Cf commit 9364354", # 7 chars - long enough
  1205. "Cf commit 9364354a", # 8 chars - still long enough
  1206. "Cf commit 9364354a4555ba17aa60f0dc844d70b74eb1aecd", # 40 chars
  1207. ]
  1208. expected = [
  1209. # 'pingou committed on test#9364354a4555ba17aa60f0dc844d70b74eb1aecd',
  1210. '<div class="markdown"><p>pingou committed on <a href="/test/c/9364354a4555ba17aa60f0dc844d70b74eb1aecd" '
  1211. 'title="Commit 9364354a4555ba17aa60f0dc844d70b74eb1aecd"'
  1212. ">test#9364354a4555ba17aa60f0dc844d70b74eb1aecd</a></p></div>",
  1213. # 'Cf commit 936435',
  1214. '<div class="markdown"><p>Cf commit 936435</p></div>',
  1215. # 'Cf commit 9364354',
  1216. #'<p>Cf commit 9364354</p>',
  1217. '<div class="markdown"><p>Cf commit <a href="/test/c/9364354" '
  1218. 'title="Commit 9364354">9364354</a></p></div>',
  1219. # 'Cf commit 9364354a',
  1220. '<div class="markdown"><p>Cf commit <a href="/test/c/9364354a" '
  1221. 'title="Commit 9364354a">9364354</a></p></div>',
  1222. # 'Cf commit 9364354a4555ba17aa60f0dc844d70b74eb1aecd',
  1223. '<div class="markdown"><p>Cf commit <a href="/test/c/9364354a4555ba17aa60f0dc844d70b74eb1aecd" '
  1224. 'title="Commit 9364354a4555ba17aa60f0dc844d70b74eb1aecd"'
  1225. ">9364354</a></p></div>",
  1226. ]
  1227. with self.app.application.app_context():
  1228. for idx, text in enumerate(texts):
  1229. data = {"content": text, "csrf_token": csrf_token}
  1230. output = self.app.post("/markdown/?repo=test", data=data)
  1231. self.assertEqual(output.status_code, 200)
  1232. self.assertEqual(expected[idx], output.get_data(as_text=True))
  1233. def test_markdown_preview(self):
  1234. """ Test the markdown_preview endpoint with a non-existing commit.
  1235. """
  1236. user = tests.FakeUser()
  1237. user.username = "foo"
  1238. with tests.user_set(self.app.application, user):
  1239. output = self.app.get("/settings/")
  1240. self.assertEqual(output.status_code, 200)
  1241. output_text = output.get_data(as_text=True)
  1242. self.assertIn(
  1243. "<title>foo's settings - Pagure</title>", output_text
  1244. )
  1245. csrf_token = self.get_csrf(output=output)
  1246. tests.create_projects(self.session)
  1247. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1248. text = "Cf commit 9364354a4555ba17aa60f0d"
  1249. exp = '<div class="markdown"><p>Cf commit 9364354a4555ba17aa60f0d</p></div>'
  1250. with self.app.application.app_context():
  1251. data = {"content": text, "csrf_token": csrf_token}
  1252. output = self.app.post("/markdown/?repo=test", data=data)
  1253. self.assertEqual(output.status_code, 200)
  1254. self.assertEqual(exp, output.get_data(as_text=True))
  1255. def test_markdown_preview_valid_commit(self):
  1256. """ Test the markdown_preview endpoint with an existing commit. """
  1257. user = tests.FakeUser()
  1258. user.username = "foo"
  1259. with tests.user_set(self.app.application, user):
  1260. output = self.app.get("/settings/")
  1261. self.assertEqual(output.status_code, 200)
  1262. output_text = output.get_data(as_text=True)
  1263. self.assertIn(
  1264. "<title>foo's settings - Pagure</title>", output_text
  1265. )
  1266. csrf_token = self.get_csrf(output=output)
  1267. tests.create_projects(self.session)
  1268. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1269. repopath = os.path.join(self.path, "repos", "test.git")
  1270. tests.add_content_git_repo(repopath)
  1271. repo = pygit2.Repository(repopath)
  1272. first_commit = repo.revparse_single("HEAD")
  1273. text = "Cf commit %s" % first_commit.oid.hex
  1274. exp = (
  1275. '<div class="markdown"><p>Cf commit <a href="/test/c/{0}" title="Commit {0}">{1}'
  1276. "</a></p></div>".format(
  1277. first_commit.oid.hex, first_commit.oid.hex[:7]
  1278. )
  1279. )
  1280. with self.app.application.app_context():
  1281. data = {"content": text, "csrf_token": csrf_token}
  1282. output = self.app.post("/markdown/?repo=test", data=data)
  1283. self.assertEqual(output.status_code, 200)
  1284. self.assertEqual(exp, output.get_data(as_text=True))
  1285. @patch("pagure.ui.app.admin_session_timedout")
  1286. def test_remove_user_email(self, ast):
  1287. """ Test the remove_user_email endpoint. """
  1288. ast.return_value = False
  1289. self.test_new_project()
  1290. user = tests.FakeUser()
  1291. with tests.user_set(self.app.application, user):
  1292. output = self.app.post("/settings/email/drop")
  1293. self.assertEqual(output.status_code, 404)
  1294. self.assertIn(
  1295. "<h2>Page not found (404)</h2>", output.get_data(as_text=True)
  1296. )
  1297. user.username = "foo"
  1298. with tests.user_set(self.app.application, user):
  1299. output = self.app.get("/settings/")
  1300. self.assertEqual(output.status_code, 200)
  1301. output_text = output.get_data(as_text=True)
  1302. self.assertIn(
  1303. "<title>foo's settings - Pagure</title>", output_text
  1304. )
  1305. csrf_token = self.get_csrf(output=output)
  1306. data = {"email": "foo@pingou.com"}
  1307. output = self.app.post(
  1308. "/settings/email/drop", data=data, follow_redirects=True
  1309. )
  1310. self.assertEqual(output.status_code, 200)
  1311. output_text = output.get_data(as_text=True)
  1312. self.assertIn(
  1313. "<title>foo's settings - Pagure</title>", output_text
  1314. )
  1315. self.assertIn(
  1316. "You must always have at " "least one email", output_text
  1317. )
  1318. user.username = "pingou"
  1319. with tests.user_set(self.app.application, user):
  1320. output = self.app.get("/settings/")
  1321. self.assertEqual(output.status_code, 200)
  1322. output_text = output.get_data(as_text=True)
  1323. self.assertIn(
  1324. "<title>pingou's settings - Pagure</title>", output_text
  1325. )
  1326. csrf_token = self.get_csrf(output=output)
  1327. data = {"email": "foo@pingou.com"}
  1328. output = self.app.post(
  1329. "/settings/email/drop", data=data, follow_redirects=True
  1330. )
  1331. self.assertEqual(output.status_code, 200)
  1332. output_text = output.get_data(as_text=True)
  1333. self.assertIn(
  1334. "<title>pingou's settings - Pagure</title>", output_text
  1335. )
  1336. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1337. data = {"csrf_token": csrf_token, "email": "foobar@pingou.com"}
  1338. output = self.app.post(
  1339. "/settings/email/drop", data=data, follow_redirects=True
  1340. )
  1341. self.assertEqual(output.status_code, 200)
  1342. output_text = output.get_data(as_text=True)
  1343. self.assertIn(
  1344. "<title>pingou's settings - Pagure</title>", output_text
  1345. )
  1346. self.assertIn(
  1347. "You do not have the "
  1348. "email: foobar@pingou.com, nothing to remove",
  1349. output_text,
  1350. )
  1351. data = {"csrf_token": csrf_token, "email": "foo@pingou.com"}
  1352. output = self.app.post(
  1353. "/settings/email/drop", data=data, follow_redirects=True
  1354. )
  1355. self.assertEqual(output.status_code, 200)
  1356. output_text = output.get_data(as_text=True)
  1357. self.assertEqual(output_text.count("foo@pingou.com"), 0)
  1358. self.assertEqual(output_text.count("bar@pingou.com"), 3)
  1359. output = self.app.post(
  1360. "/settings/email/drop", data=data, follow_redirects=True
  1361. )
  1362. self.assertEqual(output.status_code, 200)
  1363. output_text = output.get_data(as_text=True)
  1364. self.assertEqual(output_text.count("foo@pingou.com"), 0)
  1365. self.assertEqual(output_text.count("bar@pingou.com"), 3)
  1366. ast.return_value = True
  1367. output = self.app.post("/settings/email/drop", data=data)
  1368. self.assertEqual(output.status_code, 302)
  1369. @patch("pagure.lib.notify.send_email")
  1370. @patch("pagure.ui.app.admin_session_timedout")
  1371. def test_add_api_user_email(self, ast, send_email):
  1372. """ Test the add_api_user_email endpoint. """
  1373. send_email.return_value = True
  1374. ast.return_value = False
  1375. self.test_new_project()
  1376. user = tests.FakeUser()
  1377. with tests.user_set(self.app.application, user):
  1378. output = self.app.post("/settings/email/add")
  1379. self.assertEqual(output.status_code, 404)
  1380. self.assertIn(
  1381. "<h2>Page not found (404)</h2>", output.get_data(as_text=True)
  1382. )
  1383. user.username = "foo"
  1384. with tests.user_set(self.app.application, user):
  1385. output = self.app.post("/settings/email/add")
  1386. self.assertEqual(output.status_code, 200)
  1387. output_text = output.get_data(as_text=True)
  1388. self.assertIn("<strong>Add new email</strong>", output_text)
  1389. if self.get_wtforms_version() >= (2, 2):
  1390. self.assertIn(
  1391. '<input class="form-control form-control-error" id="email" '
  1392. 'name="email" required type="text" value="">',
  1393. output_text,
  1394. )
  1395. else:
  1396. self.assertIn(
  1397. '<input class="form-control form-control-error" id="email" '
  1398. 'name="email" type="text" value="">',
  1399. output_text,
  1400. )
  1401. user.username = "pingou"
  1402. with tests.user_set(self.app.application, user):
  1403. output = self.app.post("/settings/email/add")
  1404. self.assertEqual(output.status_code, 200)
  1405. output_text = output.get_data(as_text=True)
  1406. self.assertIn("<strong>Add new email</strong>", output_text)
  1407. if self.get_wtforms_version() >= (2, 2):
  1408. self.assertIn(
  1409. '<input class="form-control form-control-error" id="email" '
  1410. 'name="email" required type="text" value="">',
  1411. output_text,
  1412. )
  1413. else:
  1414. self.assertIn(
  1415. '<input class="form-control form-control-error" id="email" '
  1416. 'name="email" type="text" value="">',
  1417. output_text,
  1418. )
  1419. csrf_token = output_text.split(
  1420. 'name="csrf_token" type="hidden" value="'
  1421. )[1].split('">')[0]
  1422. data = {"email": "foo2@pingou.com"}
  1423. output = self.app.post(
  1424. "/settings/email/add", data=data, follow_redirects=True
  1425. )
  1426. self.assertEqual(output.status_code, 200)
  1427. output_text = output.get_data(as_text=True)
  1428. self.assertIn("<strong>Add new email</strong>", output_text)
  1429. self.assertEqual(output_text.count("foo2@pingou.com"), 1)
  1430. # New email
  1431. data = {"csrf_token": csrf_token, "email": "foðbar@pingou.com"}
  1432. output = self.app.post(
  1433. "/settings/email/add", data=data, follow_redirects=True
  1434. )
  1435. self.assertEqual(output.status_code, 200)
  1436. output_text = output.get_data(as_text=True)
  1437. self.assertIn(
  1438. "<title>pingou's settings - Pagure</title>", output_text
  1439. )
  1440. self.assertIn("Email pending validation", output_text)
  1441. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1442. self.assertEqual(output_text.count("bar@pingou.com"), 5)
  1443. self.assertEqual(output_text.count("foðbar@pingou.com"), 2)
  1444. # Email already pending
  1445. output = self.app.post(
  1446. "/settings/email/add", data=data, follow_redirects=True
  1447. )
  1448. self.assertEqual(output.status_code, 200)
  1449. output_text = output.get_data(as_text=True)
  1450. self.assertIn(
  1451. '<div class="card-header">\n '
  1452. "<strong>Add new email</strong>",
  1453. output_text,
  1454. )
  1455. self.assertIn(
  1456. "This email is already " "pending confirmation", output_text
  1457. )
  1458. # User already has this email
  1459. data = {"csrf_token": csrf_token, "email": "foo@pingou.com"}
  1460. output = self.app.post(
  1461. "/settings/email/add", data=data, follow_redirects=True
  1462. )
  1463. self.assertEqual(output.status_code, 200)
  1464. output_text = output.get_data(as_text=True)
  1465. self.assertTrue("<strong>Add new email</strong>" in output_text)
  1466. self.assertTrue(
  1467. "Invalid value, can&#39;t be any of: bar@pingou.com, "
  1468. "foo@pingou.com.&nbsp;" in output_text
  1469. or "Invalid value, can&#39;t be any of: foo@pingou.com, "
  1470. "bar@pingou.com.&nbsp;" in output_text
  1471. )
  1472. self.assertEqual(output_text.count("foo@pingou.com"), 6)
  1473. self.assertEqual(output_text.count("bar@pingou.com"), 5)
  1474. self.assertEqual(output_text.count("foðbar@pingou.com"), 0)
  1475. # Email registered by someone else
  1476. data = {"csrf_token": csrf_token, "email": "foo@bar.com"}
  1477. output = self.app.post(
  1478. "/settings/email/add", data=data, follow_redirects=True
  1479. )
  1480. self.assertEqual(output.status_code, 200)
  1481. output_text = output.get_data(as_text=True)
  1482. self.assertTrue("<strong>Add new email</strong>" in output_text)
  1483. self.assertIn(
  1484. "Invalid value, can&#39;t be any of: foo@bar.com.&nbsp;",
  1485. output_text,
  1486. )
  1487. ast.return_value = True
  1488. output = self.app.post("/settings/email/add", data=data)
  1489. self.assertEqual(output.status_code, 302)
  1490. @patch("pagure.lib.notify.send_email")
  1491. @patch("pagure.ui.app.admin_session_timedout")
  1492. def test_set_default_email(self, ast, send_email):
  1493. """ Test the set_default_email endpoint. """
  1494. send_email.return_value = True
  1495. ast.return_value = False
  1496. self.test_new_project()
  1497. user = tests.FakeUser()
  1498. with tests.user_set(self.app.application, user):
  1499. output = self.app.post("/settings/email/default")
  1500. self.assertEqual(output.status_code, 404)
  1501. self.assertTrue(
  1502. "<h2>Page not found (404)</h2>"
  1503. in output.get_data(as_text=True)
  1504. )
  1505. user.username = "pingou"
  1506. with tests.user_set(self.app.application, user):
  1507. output = self.app.get("/settings/")
  1508. self.assertEqual(output.status_code, 200)
  1509. output_text = output.get_data(as_text=True)
  1510. self.assertIn(
  1511. "<title>pingou's settings - Pagure</title>", output_text
  1512. )
  1513. csrf_token = self.get_csrf(output=output)
  1514. data = {"email": "foo@pingou.com"}
  1515. output = self.app.post(
  1516. "/settings/email/default", data=data, follow_redirects=True
  1517. )
  1518. self.assertEqual(output.status_code, 200)
  1519. output_text = output.get_data(as_text=True)
  1520. self.assertIn(
  1521. "<title>pingou's settings - Pagure</title>", output_text
  1522. )
  1523. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1524. # Set invalid default email
  1525. data = {"csrf_token": csrf_token, "email": "foobar@pingou.com"}
  1526. output = self.app.post(
  1527. "/settings/email/default", data=data, follow_redirects=True
  1528. )
  1529. self.assertEqual(output.status_code, 200)
  1530. output_text = output.get_data(as_text=True)
  1531. self.assertIn(
  1532. "<title>pingou's settings - Pagure</title>", output_text
  1533. )
  1534. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1535. self.assertIn(
  1536. "You do not have the "
  1537. "email: foobar@pingou.com, nothing to set",
  1538. output_text,
  1539. )
  1540. # Set default email
  1541. data = {"csrf_token": csrf_token, "email": "foo@pingou.com"}
  1542. output = self.app.post(
  1543. "/settings/email/default", data=data, follow_redirects=True
  1544. )
  1545. self.assertEqual(output.status_code, 200)
  1546. output_text = output.get_data(as_text=True)
  1547. self.assertIn(
  1548. "<title>pingou's settings - Pagure</title>", output_text
  1549. )
  1550. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1551. self.assertIn(
  1552. "Default email set to: " "foo@pingou.com", output_text
  1553. )
  1554. ast.return_value = True
  1555. output = self.app.post("/settings/email/default", data=data)
  1556. self.assertEqual(output.status_code, 302)
  1557. @patch("pagure.lib.notify.send_email")
  1558. @patch("pagure.ui.app.admin_session_timedout")
  1559. def test_reconfirm_email(self, ast, send_email):
  1560. """ Test the reconfirm_email endpoint. """
  1561. send_email.return_value = True
  1562. ast.return_value = False
  1563. self.test_new_project()
  1564. # Add a pending email to pingou
  1565. userobj = pagure.lib.query.search_user(self.session, username="pingou")
  1566. self.assertEqual(len(userobj.emails), 2)
  1567. email_pend = pagure.lib.model.UserEmailPending(
  1568. user_id=userobj.id, email="foo@fp.o", token="abcdef"
  1569. )
  1570. self.session.add(email_pend)
  1571. self.session.commit()
  1572. user = tests.FakeUser()
  1573. with tests.user_set(self.app.application, user):
  1574. output = self.app.post("/settings/email/resend")
  1575. self.assertEqual(output.status_code, 404)
  1576. self.assertTrue(
  1577. "<h2>Page not found (404)</h2>"
  1578. in output.get_data(as_text=True)
  1579. )
  1580. user.username = "pingou"
  1581. with tests.user_set(self.app.application, user):
  1582. output = self.app.get("/settings/")
  1583. self.assertEqual(output.status_code, 200)
  1584. output_text = output.get_data(as_text=True)
  1585. self.assertIn(
  1586. "<title>pingou's settings - Pagure</title>", output_text
  1587. )
  1588. csrf_token = self.get_csrf(output=output)
  1589. data = {"email": "foo@pingou.com"}
  1590. output = self.app.post(
  1591. "/settings/email/resend", data=data, follow_redirects=True
  1592. )
  1593. self.assertEqual(output.status_code, 200)
  1594. output_text = output.get_data(as_text=True)
  1595. self.assertIn(
  1596. "<title>pingou's settings - Pagure</title>", output_text
  1597. )
  1598. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1599. # Set invalid default email
  1600. data = {"csrf_token": csrf_token, "email": "foobar@pingou.com"}
  1601. output = self.app.post(
  1602. "/settings/email/resend", data=data, follow_redirects=True
  1603. )
  1604. self.assertEqual(output.status_code, 200)
  1605. output_text = output.get_data(as_text=True)
  1606. self.assertIn(
  1607. "<title>pingou's settings - Pagure</title>", output_text
  1608. )
  1609. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1610. self.assertIn(
  1611. "This email address has " "already been confirmed", output_text
  1612. )
  1613. # Validate a non-validated email
  1614. data = {"csrf_token": csrf_token, "email": "foo@fp.o"}
  1615. output = self.app.post(
  1616. "/settings/email/resend", data=data, follow_redirects=True
  1617. )
  1618. self.assertEqual(output.status_code, 200)
  1619. output_text = output.get_data(as_text=True)
  1620. self.assertIn(
  1621. "<title>pingou's settings - Pagure</title>", output_text
  1622. )
  1623. self.assertEqual(output_text.count("foo@pingou.com"), 4)
  1624. self.assertIn("Confirmation email re-sent", output_text)
  1625. ast.return_value = True
  1626. output = self.app.post("/settings/email/resend", data=data)
  1627. self.assertEqual(output.status_code, 302)
  1628. @patch("pagure.ui.app.admin_session_timedout")
  1629. def test_confirm_email(self, ast):
  1630. """ Test the confirm_email endpoint. """
  1631. output = self.app.get("/settings/email/confirm/foobar")
  1632. self.assertEqual(output.status_code, 302)
  1633. ast.return_value = False
  1634. # Add a pending email to pingou
  1635. userobj = pagure.lib.query.search_user(self.session, username="pingou")
  1636. self.assertEqual(len(userobj.emails), 2)
  1637. email_pend = pagure.lib.model.UserEmailPending(
  1638. user_id=userobj.id, email="foo@fp.o", token="abcdef"
  1639. )
  1640. self.session.add(email_pend)
  1641. self.session.commit()
  1642. user = tests.FakeUser()
  1643. user.username = "pingou"
  1644. with tests.user_set(self.app.application, user):
  1645. # Wrong token
  1646. output = self.app.get(
  1647. "/settings/email/confirm/foobar", follow_redirects=True
  1648. )
  1649. self.assertEqual(output.status_code, 200)
  1650. output_text = output.get_data(as_text=True)
  1651. self.assertIn(
  1652. "<title>pingou's settings - Pagure</title>", output_text
  1653. )
  1654. self.assertIn("No email associated with this token.", output_text)
  1655. # Confirm email
  1656. output = self.app.get(
  1657. "/settings/email/confirm/abcdef", follow_redirects=True
  1658. )
  1659. self.assertEqual(output.status_code, 200)
  1660. output_text = output.get_data(as_text=True)
  1661. self.assertIn(
  1662. "<title>pingou's settings - Pagure</title>", output_text
  1663. )
  1664. self.assertIn("Email validated", output_text)
  1665. userobj = pagure.lib.query.search_user(self.session, username="pingou")
  1666. self.assertEqual(len(userobj.emails), 3)
  1667. ast.return_value = True
  1668. output = self.app.get("/settings/email/confirm/foobar")
  1669. self.assertEqual(output.status_code, 302)
  1670. def test_view_my_requests_no_user(self):
  1671. """Test the view_user_requests endpoint."""
  1672. output = self.app.get("/user/somenonexistentuser/requests")
  1673. self.assertEqual(output.status_code, 404)
  1674. @patch("pagure.lib.git.update_git", MagicMock(return_value=True))
  1675. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  1676. def test_view_my_requests(self):
  1677. """Test the view_user_requests endpoint. """
  1678. # Create the PR
  1679. tests.create_projects(self.session)
  1680. repo = pagure.lib.query._get_project(self.session, "test")
  1681. req = pagure.lib.query.new_pull_request(
  1682. session=self.session,
  1683. repo_from=repo,
  1684. branch_from="dev",
  1685. repo_to=repo,
  1686. branch_to="master",
  1687. title="test pull-request #1",
  1688. user="pingou",
  1689. )
  1690. self.session.commit()
  1691. self.assertEqual(req.id, 1)
  1692. self.assertEqual(req.title, "test pull-request #1")
  1693. output = self.app.get("/user/pingou/requests")
  1694. self.assertEqual(output.status_code, 200)
  1695. output_text = output.get_data(as_text=True)
  1696. self.assertIn("test pull-request #1", output_text)
  1697. self.assertEqual(output_text.count('pr-status pr-status-open"'), 1)
  1698. # Add a PR in a fork
  1699. item = pagure.lib.model.Project(
  1700. user_id=1, # pingou
  1701. name="test_fork",
  1702. description="test project #1",
  1703. is_fork=True,
  1704. parent_id=1,
  1705. hook_token="aaabbbttt",
  1706. )
  1707. self.session.add(item)
  1708. repo = pagure.lib.query._get_project(
  1709. self.session, "test_fork", user="pingou"
  1710. )
  1711. req = pagure.lib.query.new_pull_request(
  1712. session=self.session,
  1713. repo_from=repo,
  1714. branch_from="dev",
  1715. repo_to=repo,
  1716. branch_to="master",
  1717. title="tést pull-request #2",
  1718. user="pingou",
  1719. )
  1720. self.session.commit()
  1721. self.assertEqual(req.id, 1)
  1722. self.assertEqual(req.title, "tést pull-request #2")
  1723. output = self.app.get("/user/pingou/requests")
  1724. self.assertEqual(output.status_code, 200)
  1725. output_text = output.get_data(as_text=True)
  1726. self.assertIn("test pull-request #1", output_text)
  1727. self.assertIn("tést pull-request #2", output_text)
  1728. self.assertEqual(output_text.count('pr-status pr-status-open"'), 2)
  1729. @patch("pagure.lib.git.update_git", MagicMock(return_value=True))
  1730. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  1731. def test_view_my_requests_pr_in_another_project(self):
  1732. """Test the view_user_requests endpoint when the user opened a PR
  1733. in another project. """
  1734. # Pingou creates the PR on test
  1735. tests.create_projects(self.session)
  1736. repo = pagure.lib.query._get_project(self.session, "test")
  1737. req = pagure.lib.query.new_pull_request(
  1738. session=self.session,
  1739. repo_from=repo,
  1740. branch_from="dev",
  1741. repo_to=repo,
  1742. branch_to="master",
  1743. title="test pull-request #1",
  1744. user="pingou",
  1745. )
  1746. self.session.commit()
  1747. self.assertEqual(req.id, 1)
  1748. self.assertEqual(req.title, "test pull-request #1")
  1749. # foo creates the PR on test
  1750. repo = pagure.lib.query._get_project(self.session, "test")
  1751. req = pagure.lib.query.new_pull_request(
  1752. session=self.session,
  1753. repo_from=repo,
  1754. branch_from="dev",
  1755. repo_to=repo,
  1756. branch_to="master",
  1757. title="test pull-request #2",
  1758. user="foo",
  1759. )
  1760. self.session.commit()
  1761. self.assertEqual(req.id, 2)
  1762. self.assertEqual(req.title, "test pull-request #2")
  1763. # Check pingou's PR list
  1764. output = self.app.get("/user/pingou/requests")
  1765. self.assertEqual(output.status_code, 200)
  1766. output_text = output.get_data(as_text=True)
  1767. self.assertIn("test pull-request #1", output_text)
  1768. self.assertIn("test pull-request #2", output_text)
  1769. self.assertEqual(output_text.count('pr-status pr-status-open"'), 2)
  1770. # Check foo's PR list
  1771. output = self.app.get("/user/foo/requests")
  1772. self.assertEqual(output.status_code, 200)
  1773. output_text = output.get_data(as_text=True)
  1774. self.assertNotIn("test pull-request #1", output_text)
  1775. self.assertIn("test pull-request #2", output_text)
  1776. self.assertEqual(output_text.count('pr-status pr-status-open"'), 1)
  1777. @patch("pagure.lib.git.update_git", MagicMock(return_value=True))
  1778. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  1779. def test_view_my_requests_against_another_project(self):
  1780. """Test the view_user_requests endpoint when there is a PR opened
  1781. by me against a project I do not have rights on. """
  1782. # Create the PR
  1783. tests.create_projects(self.session)
  1784. repo = pagure.lib.query._get_project(self.session, "test")
  1785. req = pagure.lib.query.new_pull_request(
  1786. session=self.session,
  1787. repo_from=repo,
  1788. branch_from="dev",
  1789. repo_to=repo,
  1790. branch_to="master",
  1791. title="test pull-request #1",
  1792. user="foo",
  1793. )
  1794. self.session.commit()
  1795. self.assertEqual(req.id, 1)
  1796. self.assertEqual(req.title, "test pull-request #1")
  1797. output = self.app.get("/user/foo/requests")
  1798. self.assertEqual(output.status_code, 200)
  1799. output_text = output.get_data(as_text=True)
  1800. self.assertIn("test pull-request #1", output_text)
  1801. self.assertEqual(output_text.count('pr-status pr-status-open"'), 1)
  1802. def test_view_my_issues_no_user(self):
  1803. """Test the view_user_issues endpoint with a missing user."""
  1804. output = self.app.get("/user/somenonexistentuser/issues")
  1805. self.assertEqual(output.status_code, 404)
  1806. @patch("pagure.lib.git.update_git", MagicMock(return_value=True))
  1807. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  1808. def test_view_my_issues(self):
  1809. """Test the view_user_issues endpoint when the user exists."""
  1810. # Create the issue
  1811. tests.create_projects(self.session)
  1812. repo = pagure.lib.query._get_project(self.session, "test")
  1813. msg = pagure.lib.query.new_issue(
  1814. session=self.session,
  1815. repo=repo,
  1816. title="Test issue #1",
  1817. content="We should work on this for the second time",
  1818. user="pingou",
  1819. status="Open",
  1820. )
  1821. self.session.commit()
  1822. self.assertEqual(msg.title, "Test issue #1")
  1823. output = self.app.get("/user/pingou/issues")
  1824. self.assertEqual(output.status_code, 200)
  1825. output_text = output.get_data(as_text=True)
  1826. self.assertIn("Test issue #1", output_text)
  1827. self.assertEqual(
  1828. output_text.count("issue-status issue-status-open"), 1
  1829. )
  1830. # Add an issue in a fork
  1831. item = pagure.lib.model.Project(
  1832. user_id=2, # foo
  1833. name="test_fork",
  1834. description="test project #1",
  1835. is_fork=True,
  1836. parent_id=1,
  1837. hook_token="aaabbbttt",
  1838. )
  1839. self.session.add(item)
  1840. repo = pagure.lib.query._get_project(
  1841. self.session, "test_fork", user="foo"
  1842. )
  1843. msg = pagure.lib.query.new_issue(
  1844. session=self.session,
  1845. repo=repo,
  1846. title="Test issue #2",
  1847. content="We should work on this for the second time",
  1848. user="pingou",
  1849. status="Open",
  1850. )
  1851. self.session.commit()
  1852. self.assertEqual(msg.title, "Test issue #2")
  1853. # Test the assigned issue table. Create issue then set the assignee
  1854. msg = pagure.lib.query.new_issue(
  1855. session=self.session,
  1856. repo=repo,
  1857. title="Test issue #3",
  1858. content="This issue created by foo, but assigned to pingou",
  1859. user="foo",
  1860. status="Open",
  1861. )
  1862. self.session.commit()
  1863. self.assertEqual(msg.title, "Test issue #3")
  1864. msg = pagure.lib.query.add_issue_assignee(
  1865. session=self.session, issue=msg, assignee="pingou", user="foo"
  1866. )
  1867. self.session.commit()
  1868. self.assertEqual(msg, "Issue assigned to pingou")
  1869. output = self.app.get("/user/pingou/issues")
  1870. self.assertEqual(output.status_code, 200)
  1871. output_text = output.get_data(as_text=True)
  1872. self.assertIn("Test issue #1", output_text)
  1873. self.assertIn("Test issue #2", output_text)
  1874. self.assertIn("Test issue #3", output_text)
  1875. self.assertEqual(
  1876. output_text.count("issue-status issue-status-open"), 3
  1877. )
  1878. @patch("pagure.lib.git.update_git", MagicMock(return_value=True))
  1879. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  1880. def test_view_my_issues_disabled(self):
  1881. """Test the view_user_issues endpoint when the project disabled issue
  1882. tracking."""
  1883. # Create the issue
  1884. tests.create_projects(self.session)
  1885. repo = pagure.lib.query._get_project(self.session, "test")
  1886. msg = pagure.lib.query.new_issue(
  1887. session=self.session,
  1888. repo=repo,
  1889. title="Test issue #1",
  1890. content="We should work on this for the second time",
  1891. user="pingou",
  1892. status="Open",
  1893. )
  1894. self.session.commit()
  1895. self.assertEqual(msg.title, "Test issue #1")
  1896. # Before
  1897. output = self.app.get("/user/pingou/issues")
  1898. self.assertEqual(output.status_code, 200)
  1899. output_text = output.get_data(as_text=True)
  1900. self.assertIn("Test issue #1", output_text)
  1901. self.assertEqual(
  1902. output_text.count("issue-status issue-status-open"), 1
  1903. )
  1904. # Disable issue tracking
  1905. repo = pagure.lib.query._get_project(self.session, "test")
  1906. settings = repo.settings
  1907. settings["issue_tracker"] = False
  1908. repo.settings = settings
  1909. self.session.add(repo)
  1910. self.session.commit()
  1911. # After
  1912. output = self.app.get("/user/pingou/issues")
  1913. self.assertEqual(output.status_code, 200)
  1914. output_text = output.get_data(as_text=True)
  1915. self.assertNotIn("Test issue #1", output_text)
  1916. self.assertEqual(
  1917. output_text.count("issue-status issue-status-open"), 0
  1918. )
  1919. def test_view_my_issues_tickets_turned_off(self):
  1920. """Test the view_user_issues endpoint when the user exists and
  1921. and ENABLE_TICKETS is False """
  1922. # Turn off the tickets instance wide
  1923. pagure.config.config["ENABLE_TICKETS"] = False
  1924. output = self.app.get("/user/pingou/issues")
  1925. self.assertEqual(output.status_code, 404)
  1926. pagure.config.config["ENABLE_TICKETS"] = True
  1927. @patch("pagure.ui.app.admin_session_timedout")
  1928. def test_add_user_token(self, ast):
  1929. """ Test the add_user_token endpoint. """
  1930. ast.return_value = False
  1931. self.test_new_project()
  1932. user = tests.FakeUser()
  1933. with tests.user_set(self.app.application, user):
  1934. output = self.app.get("/settings/token/new/")
  1935. self.assertEqual(output.status_code, 404)
  1936. self.assertIn(
  1937. "<h2>Page not found (404)</h2>", output.get_data(as_text=True)
  1938. )
  1939. user.username = "foo"
  1940. with tests.user_set(self.app.application, user):
  1941. output = self.app.get("/settings/token/new")
  1942. self.assertEqual(output.status_code, 200)
  1943. output_text = output.get_data(as_text=True)
  1944. self.assertIn(
  1945. '<div class="card-header">\n <strong>'
  1946. "Create a new token</strong>\n",
  1947. output_text,
  1948. )
  1949. self.assertIn(
  1950. '<input type="checkbox" name="acls" value="create_project">',
  1951. output_text,
  1952. )
  1953. csrf_token = output_text.split(
  1954. 'name="csrf_token" type="hidden" value="'
  1955. )[1].split('">')[0]
  1956. data = {"acls": ["create_project", "fork_project"]}
  1957. # missing CSRF
  1958. output = self.app.post("/settings/token/new", data=data)
  1959. self.assertEqual(output.status_code, 200)
  1960. output_text = output.get_data(as_text=True)
  1961. self.assertIn("<title>Create token - Pagure</title>", output_text)
  1962. self.assertIn(
  1963. '<div class="card-header">\n <strong>'
  1964. "Create a new token</strong>\n",
  1965. output_text,
  1966. )
  1967. self.assertIn(
  1968. '<input type="checkbox" name="acls" value="create_project">',
  1969. output_text,
  1970. )
  1971. data = {"acls": ["new_project"], "csrf_token": csrf_token}
  1972. # Invalid ACLs
  1973. output = self.app.post("/settings/token/new", data=data)
  1974. self.assertEqual(output.status_code, 200)
  1975. output_text = output.get_data(as_text=True)
  1976. self.assertIn("<title>Create token - Pagure</title>", output_text)
  1977. self.assertIn(
  1978. '<div class="card-header">\n <strong>'
  1979. "Create a new token</strong>\n",
  1980. output_text,
  1981. )
  1982. self.assertIn(
  1983. '<input type="checkbox" name="acls" value="create_project">',
  1984. output_text,
  1985. )
  1986. data = {
  1987. "acls": ["create_project", "fork_project"],
  1988. "csrf_token": csrf_token,
  1989. }
  1990. # All good
  1991. output = self.app.post(
  1992. "/settings/token/new", data=data, follow_redirects=True
  1993. )
  1994. self.assertEqual(output.status_code, 200)
  1995. output_text = output.get_data(as_text=True)
  1996. self.assertIn(
  1997. "<title>foo's settings - Pagure</title>", output_text
  1998. )
  1999. self.assertIn("Token created", output_text)
  2000. self.assertEqual(
  2001. output_text.count(
  2002. '<small class="font-weight-bold text-success input-group-text">Active until'
  2003. ),
  2004. 1,
  2005. )
  2006. ast.return_value = True
  2007. output = self.app.get("/settings/token/new")
  2008. self.assertEqual(output.status_code, 302)
  2009. @patch("pagure.ui.app.admin_session_timedout")
  2010. def test_revoke_api_user_token(self, ast):
  2011. """ Test the revoke_api_user_token endpoint. """
  2012. ast.return_value = False
  2013. self.test_new_project()
  2014. user = tests.FakeUser()
  2015. with tests.user_set(self.app.application, user):
  2016. # Token doesn't exist
  2017. output = self.app.post("/settings/token/revoke/foobar")
  2018. self.assertEqual(output.status_code, 404)
  2019. self.assertTrue(
  2020. "<h2>Page not found (404)</h2>"
  2021. in output.get_data(as_text=True)
  2022. )
  2023. # Create the foobar API token but associated w/ the user 'foo'
  2024. item = pagure.lib.model.Token(
  2025. id="foobar",
  2026. user_id=2, # foo
  2027. expiration=datetime.datetime.utcnow()
  2028. + datetime.timedelta(days=30),
  2029. )
  2030. self.session.add(item)
  2031. self.session.commit()
  2032. # Token not associated w/ this user
  2033. output = self.app.post("/settings/token/revoke/foobar")
  2034. self.assertEqual(output.status_code, 404)
  2035. self.assertTrue(
  2036. "<h2>Page not found (404)</h2>"
  2037. in output.get_data(as_text=True)
  2038. )
  2039. user.username = "foo"
  2040. with tests.user_set(self.app.application, user):
  2041. # Missing CSRF token
  2042. output = self.app.post(
  2043. "/settings/token/revoke/foobar", follow_redirects=True
  2044. )
  2045. self.assertEqual(output.status_code, 200)
  2046. output_text = output.get_data(as_text=True)
  2047. self.assertIn(
  2048. "<title>foo's settings - Pagure</title>", output_text
  2049. )
  2050. self.assertEqual(
  2051. output_text.count(
  2052. '<small class="font-weight-bold text-success input-group-text">Active until'
  2053. ),
  2054. 1,
  2055. )
  2056. csrf_token = output_text.split(
  2057. 'name="csrf_token" type="hidden" value="'
  2058. )[1].split('">')[0]
  2059. data = {"csrf_token": csrf_token}
  2060. # All good - token is deleted
  2061. output = self.app.post(
  2062. "/settings/token/revoke/foobar",
  2063. data=data,
  2064. follow_redirects=True,
  2065. )
  2066. self.assertEqual(output.status_code, 200)
  2067. output_text = output.get_data(as_text=True)
  2068. self.assertIn(
  2069. "<title>foo's settings - Pagure</title>", output_text
  2070. )
  2071. self.assertEqual(
  2072. output_text.count(
  2073. '<small class="font-weight-bold text-success input-group-text">Active until'
  2074. ),
  2075. 0,
  2076. )
  2077. user = pagure.lib.query.get_user(self.session, key="foo")
  2078. self.assertEqual(len(user.tokens), 1)
  2079. expiration_dt = user.tokens[0].expiration
  2080. # Token was already deleted - no changes
  2081. output = self.app.post(
  2082. "/settings/token/revoke/foobar",
  2083. data=data,
  2084. follow_redirects=True,
  2085. )
  2086. self.assertEqual(output.status_code, 200)
  2087. output_text = output.get_data(as_text=True)
  2088. self.assertIn(
  2089. "<title>foo's settings - Pagure</title>", output_text
  2090. )
  2091. self.assertEqual(
  2092. output_text.count(
  2093. '<small class="font-weight-bold text-success input-group-text">Active until'
  2094. ),
  2095. 0,
  2096. )
  2097. # Ensure the expiration date did not change
  2098. user = pagure.lib.query.get_user(self.session, key="foo")
  2099. self.assertEqual(len(user.tokens), 1)
  2100. self.assertEqual(expiration_dt, user.tokens[0].expiration)
  2101. ast.return_value = True
  2102. output = self.app.get("/settings/token/new")
  2103. self.assertEqual(output.status_code, 302)
  2104. @patch.dict("pagure.config.config", {"PAGURE_AUTH": "fas"})
  2105. @patch.dict("pagure.utils.pagure_config", {"PAGURE_AUTH": "fas"})
  2106. def test_create_project_auth_FAS_no_FPCA(self):
  2107. """ Test creating a project when auth is FAS and the user did not
  2108. sign the FPCA. """
  2109. user = tests.FakeUser(username="foo", cla_done=False)
  2110. with tests.user_set(self.app.application, user):
  2111. output = self.app.get("/new/", follow_redirects=True)
  2112. self.assertEqual(output.status_code, 200)
  2113. output_text = output.get_data(as_text=True)
  2114. self.assertIn("<title>Home - Pagure</title>", output_text)
  2115. self.assertIn(
  2116. '</i> You must <a href="https://admin.fedoraproject.org/accounts/'
  2117. '">sign the FPCA</a> (Fedora Project Contributor Agreement) '
  2118. "to use pagure</div>",
  2119. output_text,
  2120. )
  2121. class PagureFlaskAppAboutPagetests(tests.Modeltests):
  2122. """ Unit-tests for the about page. """
  2123. def test_about_page(self):
  2124. """ Test the about page when an admin_email is set. """
  2125. output = self.app.get("/about/")
  2126. self.assertEqual(output.status_code, 200)
  2127. output_text = output.get_data(as_text=True)
  2128. self.assertIn("<title>About - Pagure</title>", output_text)
  2129. self.assertIn(
  2130. "by emailing:\n "
  2131. '<a href="mailto:root@localhost.localdomain">',
  2132. output_text,
  2133. )
  2134. self.assertIn(
  2135. 'href="https://pagure.io/pagure/issues">open a ticket</a>',
  2136. output_text,
  2137. )
  2138. @patch.dict("pagure.config.config", {"ADMIN_EMAIL": "admin@fp.o"})
  2139. def test_about_page_admin_email(self):
  2140. """ Test the about page when an admin_email is set. """
  2141. output = self.app.get("/about/")
  2142. self.assertEqual(output.status_code, 200)
  2143. output_text = output.get_data(as_text=True)
  2144. self.assertIn("<title>About - Pagure</title>", output_text)
  2145. self.assertIn(
  2146. 'by emailing:\n <a href="mailto:admin@fp.o">', output_text
  2147. )
  2148. self.assertIn(
  2149. 'href="https://pagure.io/pagure/issues">open a ticket</a>',
  2150. output_text,
  2151. )
  2152. class PagureFlaskAppNoDocstests(tests.Modeltests):
  2153. """ Tests for flask app controller of pagure """
  2154. config_values = {"enable_docs": False, "docs_folder": None}
  2155. def test_new_project_no_docs_folder(self):
  2156. """ Test the new_project endpoint with DOCS_FOLDER is None. """
  2157. # Before
  2158. projects = pagure.lib.query.search_projects(self.session)
  2159. self.assertEqual(len(projects), 0)
  2160. self.assertFalse(
  2161. os.path.exists(os.path.join(self.path, "repos", "project#1.git"))
  2162. )
  2163. self.assertFalse(
  2164. os.path.exists(
  2165. os.path.join(self.path, "repos", "tickets", "project#1.git")
  2166. )
  2167. )
  2168. self.assertFalse(
  2169. os.path.exists(
  2170. os.path.join(self.path, "repos", "docs", "project#1.git")
  2171. )
  2172. )
  2173. self.assertFalse(
  2174. os.path.exists(
  2175. os.path.join(self.path, "repos", "requests", "project#1.git")
  2176. )
  2177. )
  2178. user = tests.FakeUser(username="foo")
  2179. with tests.user_set(self.app.application, user):
  2180. csrf_token = self.get_csrf()
  2181. data = {
  2182. "description": "Project #1",
  2183. "name": "project-1",
  2184. "csrf_token": csrf_token,
  2185. }
  2186. output = self.app.post("/new/", data=data, follow_redirects=True)
  2187. self.assertEqual(output.status_code, 200)
  2188. output_text = output.get_data(as_text=True)
  2189. self.assertIn(
  2190. '<div class="projectinfo my-3">\nProject #1', output_text
  2191. )
  2192. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2193. self.assertIn(
  2194. "<title>Overview - project-1 - Pagure</title>", output_text
  2195. )
  2196. # After
  2197. projects = pagure.lib.query.search_projects(self.session)
  2198. self.assertEqual(len(projects), 1)
  2199. self.assertTrue(
  2200. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  2201. )
  2202. self.assertTrue(
  2203. os.path.exists(
  2204. os.path.join(self.path, "repos", "tickets", "project-1.git")
  2205. )
  2206. )
  2207. self.assertFalse(
  2208. os.path.exists(
  2209. os.path.join(self.path, "repos", "docs", "project-1.git")
  2210. )
  2211. )
  2212. self.assertTrue(
  2213. os.path.exists(
  2214. os.path.join(self.path, "repos", "requests", "project-1.git")
  2215. )
  2216. )
  2217. class PagureFlaskAppNoTicketstests(tests.Modeltests):
  2218. """ Tests for flask app controller of pagure """
  2219. config_values = {"enable_tickets": False, "tickets_folder": None}
  2220. def test_new_project_no_tickets_folder(self):
  2221. """ Test the new_project endpoint with TICKETS_FOLDER is None. """
  2222. # Before
  2223. projects = pagure.lib.query.search_projects(self.session)
  2224. self.assertEqual(len(projects), 0)
  2225. self.assertFalse(
  2226. os.path.exists(os.path.join(self.path, "repos", "project#1.git"))
  2227. )
  2228. self.assertFalse(
  2229. os.path.exists(
  2230. os.path.join(self.path, "repos", "tickets", "project#1.git")
  2231. )
  2232. )
  2233. self.assertFalse(
  2234. os.path.exists(
  2235. os.path.join(self.path, "repos", "docs", "project#1.git")
  2236. )
  2237. )
  2238. self.assertFalse(
  2239. os.path.exists(
  2240. os.path.join(self.path, "repos", "requests", "project#1.git")
  2241. )
  2242. )
  2243. user = tests.FakeUser(username="foo")
  2244. with tests.user_set(self.app.application, user):
  2245. csrf_token = self.get_csrf()
  2246. data = {
  2247. "description": "Project #1",
  2248. "name": "project-1",
  2249. "csrf_token": csrf_token,
  2250. }
  2251. output = self.app.post("/new/", data=data, follow_redirects=True)
  2252. self.assertEqual(output.status_code, 200)
  2253. output_text = output.get_data(as_text=True)
  2254. self.assertIn(
  2255. '<div class="projectinfo my-3">\nProject #1', output_text
  2256. )
  2257. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2258. self.assertIn(
  2259. "<title>Overview - project-1 - Pagure</title>", output_text
  2260. )
  2261. # After
  2262. projects = pagure.lib.query.search_projects(self.session)
  2263. self.assertEqual(len(projects), 1)
  2264. self.assertTrue(
  2265. os.path.exists(os.path.join(self.path, "repos", "project-1.git"))
  2266. )
  2267. self.assertFalse(
  2268. os.path.exists(
  2269. os.path.join(self.path, "repos", "tickets", "project-1.git")
  2270. )
  2271. )
  2272. self.assertTrue(
  2273. os.path.exists(
  2274. os.path.join(self.path, "repos", "docs", "project-1.git")
  2275. )
  2276. )
  2277. self.assertTrue(
  2278. os.path.exists(
  2279. os.path.join(self.path, "repos", "requests", "project-1.git")
  2280. )
  2281. )
  2282. if __name__ == "__main__":
  2283. unittest.main(verbosity=2)