test_pagure_flask_ui_repo.py 276 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015-2017 - 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 json
  10. import unittest
  11. import re
  12. import shutil
  13. import sys
  14. import tempfile
  15. import time
  16. import os
  17. cchardet = None
  18. try:
  19. import cchardet
  20. except ImportError:
  21. pass
  22. import pagure_messages
  23. import pygit2
  24. import six
  25. from fedora_messaging import testing
  26. from mock import ANY, patch, MagicMock
  27. sys.path.insert(
  28. 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
  29. )
  30. import pagure.lib.query
  31. import tests
  32. from pagure.lib.repo import PagureRepo
  33. from pagure.utils import __get_file_in_tree as get_file_in_tree
  34. class PagureFlaskRepotests(tests.Modeltests):
  35. """Tests for flask app controller of pagure"""
  36. def setUp(self):
  37. """Set up the environnment, ran before every tests."""
  38. super(PagureFlaskRepotests, self).setUp()
  39. pagure.config.config["VIRUS_SCAN_ATTACHMENTS"] = False
  40. pagure.config.config["UPLOAD_FOLDER_URL"] = "/releases/"
  41. pagure.config.config["UPLOAD_FOLDER_PATH"] = os.path.join(
  42. self.path, "releases"
  43. )
  44. @patch("pagure.decorators.admin_session_timedout")
  45. def test_add_user_when_user_mngt_off(self, ast):
  46. """Test the add_user endpoint when user management is turned off
  47. in the pagure instance"""
  48. pagure.config.config["ENABLE_USER_MNGT"] = False
  49. ast.return_value = False
  50. # No Git repo
  51. output = self.app.get("/foo/adduser")
  52. self.assertEqual(output.status_code, 404)
  53. tests.create_projects(self.session)
  54. tests.create_projects_git(os.path.join(self.path, "repos"))
  55. # User not logged in
  56. output = self.app.get("/test/adduser")
  57. self.assertEqual(output.status_code, 302)
  58. user = tests.FakeUser(username="pingou")
  59. with tests.user_set(self.app.application, user):
  60. output = self.app.get("/test/adduser")
  61. self.assertEqual(output.status_code, 404)
  62. # just get the csrf token
  63. pagure.config.config["ENABLE_USER_MNGT"] = True
  64. output = self.app.get("/test/adduser")
  65. output_text = output.get_data(as_text=True)
  66. csrf_token = output_text.split(
  67. 'name="csrf_token" type="hidden" value="'
  68. )[1].split('">')[0]
  69. pagure.config.config["ENABLE_USER_MNGT"] = False
  70. data = {"user": "ralph"}
  71. output = self.app.post("/test/adduser", data=data)
  72. self.assertEqual(output.status_code, 404)
  73. data["csrf_token"] = csrf_token
  74. output = self.app.post("/test/adduser", data=data)
  75. self.assertEqual(output.status_code, 404)
  76. data["user"] = "foo"
  77. tests.create_projects_git(os.path.join(self.path, "repos"))
  78. output = self.app.post(
  79. "/test/adduser", data=data, follow_redirects=True
  80. )
  81. self.assertEqual(output.status_code, 404)
  82. pagure.config.config["ENABLE_USER_MNGT"] = True
  83. @patch("pagure.decorators.admin_session_timedout")
  84. def test_add_deploykey(self, ast):
  85. """Test the add_deploykey endpoint."""
  86. ast.return_value = False
  87. # No git repo
  88. output = self.app.get("/foo/adddeploykey")
  89. self.assertEqual(output.status_code, 404)
  90. tests.create_projects(self.session)
  91. tests.create_projects_git(os.path.join(self.path, "repos"))
  92. # User not logged in
  93. output = self.app.get("/test/adddeploykey")
  94. self.assertEqual(output.status_code, 302)
  95. user = tests.FakeUser()
  96. with tests.user_set(self.app.application, user):
  97. output = self.app.get("/test/adddeploykey")
  98. self.assertEqual(output.status_code, 403)
  99. ast.return_value = True
  100. output = self.app.get("/test/adddeploykey")
  101. self.assertEqual(output.status_code, 302)
  102. # Redirect also happens for POST request
  103. output = self.app.post("/test/adddeploykey")
  104. self.assertEqual(output.status_code, 302)
  105. # Need to do this un-authentified since our fake user isn't in the DB
  106. # Check the message flashed during the redirect
  107. output = self.app.get("/", follow_redirects=True)
  108. self.assertEqual(output.status_code, 200)
  109. output_text = output.get_data(as_text=True)
  110. self.assertIn("Action canceled, try it " "again", output_text)
  111. ast.return_value = False
  112. user.username = "pingou"
  113. with tests.user_set(self.app.application, user):
  114. output = self.app.get("/test/adddeploykey")
  115. self.assertEqual(output.status_code, 200)
  116. output_text = output.get_data(as_text=True)
  117. self.assertIn("<strong>Add deploy key to the", output_text)
  118. csrf_token = output_text.split(
  119. 'name="csrf_token" type="hidden" value="'
  120. )[1].split('">')[0]
  121. data = {"ssh_key": "asdf", "pushaccess": "false"}
  122. # No CSRF token
  123. output = self.app.post("/test/adddeploykey", data=data)
  124. self.assertEqual(output.status_code, 200)
  125. output_text = output.get_data(as_text=True)
  126. self.assertIn("<strong>Add deploy key to the", output_text)
  127. data["csrf_token"] = csrf_token
  128. # First, invalid SSH key
  129. output = self.app.post("/test/adddeploykey", data=data)
  130. self.assertEqual(output.status_code, 200)
  131. output_text = output.get_data(as_text=True)
  132. self.assertIn("<strong>Add deploy key to the", output_text)
  133. self.assertIn("SSH key invalid", output_text)
  134. # Next up, multiple SSH keys
  135. data[
  136. "ssh_key"
  137. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q=="
  138. output = self.app.post(
  139. "/test/adddeploykey", data=data, follow_redirects=True
  140. )
  141. self.assertEqual(output.status_code, 200)
  142. output_text = output.get_data(as_text=True)
  143. self.assertIn("Please add single SSH keys.", output_text)
  144. # Now, a valid SSH key
  145. data[
  146. "ssh_key"
  147. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q=="
  148. output = self.app.post(
  149. "/test/adddeploykey", data=data, follow_redirects=True
  150. )
  151. self.assertEqual(output.status_code, 200)
  152. output_text = output.get_data(as_text=True)
  153. self.assertIn(
  154. "<title>Settings - test - Pagure</title>", output_text
  155. )
  156. self.assertIn(
  157. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  158. output_text,
  159. )
  160. self.assertIn("SSH key added", output_text)
  161. self.assertNotIn("Push Access", output_text)
  162. # And now, adding the same key
  163. output = self.app.post(
  164. "/test/adddeploykey", data=data, follow_redirects=True
  165. )
  166. self.assertEqual(output.status_code, 200)
  167. output_text = output.get_data(as_text=True)
  168. self.assertIn("SSH key already exists", output_text)
  169. # And next, a key with push access
  170. data[
  171. "ssh_key"
  172. ] = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9Xwc2RDzPBhlEDARfHldGjudIVoa04tqT1JVKGQmyllTFz7Rb8CngQL3e7zyNzotnhwYKHdoiLlPkVEiDee4dWMUe48ilqId+FJZQGhyv8fu4BoFdE1AJUVylzmltbLg14VqG5gjTpXgtlrEva9arKwBMHJjRYc8ScaSn3OgyQw=="
  173. data["pushaccess"] = "true"
  174. output = self.app.post(
  175. "/test/adddeploykey", data=data, follow_redirects=True
  176. )
  177. self.assertEqual(output.status_code, 200)
  178. output_text = output.get_data(as_text=True)
  179. self.assertIn(
  180. "<title>Settings - test - Pagure</title>", output_text
  181. )
  182. self.assertIn(
  183. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  184. output_text,
  185. )
  186. self.assertIn("SSH key added", output_text)
  187. self.assertIn("Push Access", output_text)
  188. @patch("pagure.decorators.admin_session_timedout")
  189. @patch.dict("pagure.config.config", {"DEPLOY_KEY": False})
  190. def test_add_deploykey_disabled(self, ast):
  191. """Test the add_deploykey endpoint when it's disabled in the config."""
  192. ast.return_value = False
  193. tests.create_projects(self.session)
  194. tests.create_projects_git(os.path.join(self.path, "repos"))
  195. user = tests.FakeUser(username="pingou")
  196. with tests.user_set(self.app.application, user):
  197. output = self.app.get("/test/adddeploykey")
  198. self.assertEqual(output.status_code, 404)
  199. output = self.app.post("/test/adddeploykey")
  200. self.assertEqual(output.status_code, 404)
  201. @patch.dict(
  202. "pagure.config.config", {"FEDORA_MESSAGING_NOTIFICATIONS": True}
  203. )
  204. @patch("pagure.decorators.admin_session_timedout")
  205. def test_add_user(self, ast):
  206. """Test the add_user endpoint."""
  207. ast.return_value = False
  208. # No git repo
  209. output = self.app.get("/foo/adduser")
  210. self.assertEqual(output.status_code, 404)
  211. tests.create_projects(self.session)
  212. tests.create_projects_git(os.path.join(self.path, "repos"))
  213. # User not logged in
  214. output = self.app.get("/test/adduser")
  215. self.assertEqual(output.status_code, 302)
  216. user = tests.FakeUser()
  217. with tests.user_set(self.app.application, user):
  218. output = self.app.get("/test/adduser")
  219. self.assertEqual(output.status_code, 403)
  220. ast.return_value = True
  221. output = self.app.get("/test/adduser")
  222. self.assertEqual(output.status_code, 302)
  223. # Redirect also happens for POST request
  224. output = self.app.post("/test/adduser")
  225. self.assertEqual(output.status_code, 302)
  226. # Need to do this un-authentified since our fake user isn't in the DB
  227. # Check the message flashed during the redirect
  228. output = self.app.get("/", follow_redirects=True)
  229. self.assertEqual(output.status_code, 200)
  230. output_text = output.get_data(as_text=True)
  231. self.assertIn("Action canceled, try it " "again", output_text)
  232. ast.return_value = False
  233. user.username = "pingou"
  234. with tests.user_set(self.app.application, user):
  235. output = self.app.get("/test/adduser")
  236. self.assertEqual(output.status_code, 200)
  237. output_text = output.get_data(as_text=True)
  238. self.assertIn("<strong>Add user to the", output_text)
  239. csrf_token = output_text.split(
  240. 'name="csrf_token" type="hidden" value="'
  241. )[1].split('">')[0]
  242. data = {"user": "ralph"}
  243. # Missing access and no CSRF
  244. output = self.app.post("/test/adduser", data=data)
  245. self.assertEqual(output.status_code, 200)
  246. output_text = output.get_data(as_text=True)
  247. self.assertIn(
  248. "<title>Add user - test - Pagure</title>", output_text
  249. )
  250. self.assertIn("<strong>Add user to the", output_text)
  251. # No CSRF
  252. output = self.app.post("/test/adduser", data=data)
  253. self.assertEqual(output.status_code, 200)
  254. output_text = output.get_data(as_text=True)
  255. self.assertIn(
  256. "<title>Add user - test - Pagure</title>", output_text
  257. )
  258. # Missing access
  259. data["csrf_token"] = csrf_token
  260. output = self.app.post("/test/adduser", data=data)
  261. self.assertEqual(output.status_code, 200)
  262. output_text = output.get_data(as_text=True)
  263. self.assertIn(
  264. "<title>Add user - test - Pagure</title>", output_text
  265. )
  266. self.assertIn("<strong>Add user to the", output_text)
  267. # Unknown user
  268. data["access"] = "commit"
  269. output = self.app.post("/test/adduser", data=data)
  270. self.assertEqual(output.status_code, 200)
  271. output_text = output.get_data(as_text=True)
  272. self.assertIn(
  273. "<title>Add user - test - Pagure</title>", output_text
  274. )
  275. self.assertIn("<strong>Add user to the", output_text)
  276. self.assertIn("No user &#34;ralph&#34; found", output_text)
  277. # All correct
  278. data["user"] = "foo"
  279. with testing.mock_sends(
  280. pagure_messages.ProjectUserAddedV1(
  281. topic="pagure.project.user.added",
  282. body={
  283. "project": {
  284. "id": 1,
  285. "name": "test",
  286. "fullname": "test",
  287. "url_path": "test",
  288. "full_url": "http://localhost.localdomain/test",
  289. "description": "test project #1",
  290. "namespace": None,
  291. "parent": None,
  292. "date_created": ANY,
  293. "date_modified": ANY,
  294. "user": {
  295. "name": "pingou",
  296. "fullname": "PY C",
  297. "url_path": "user/pingou",
  298. "full_url": "http://localhost.localdomain/user/pingou",
  299. },
  300. "access_users": {
  301. "owner": ["pingou"],
  302. "admin": [],
  303. "commit": ["foo"],
  304. "collaborator": [],
  305. "ticket": [],
  306. },
  307. "access_groups": {
  308. "admin": [],
  309. "commit": [],
  310. "collaborator": [],
  311. "ticket": [],
  312. },
  313. "tags": [],
  314. "priorities": {},
  315. "custom_keys": [],
  316. "close_status": [
  317. "Invalid",
  318. "Insufficient data",
  319. "Fixed",
  320. "Duplicate",
  321. ],
  322. "milestones": {},
  323. },
  324. "new_user": "foo",
  325. "access": "commit",
  326. "branches": None,
  327. "agent": "pingou",
  328. },
  329. )
  330. ):
  331. output = self.app.post(
  332. "/test/adduser", data=data, follow_redirects=True
  333. )
  334. self.assertEqual(output.status_code, 200)
  335. output_text = output.get_data(as_text=True)
  336. self.assertIn(
  337. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  338. output_text,
  339. )
  340. self.assertIn("User added", output_text)
  341. # Update access
  342. data["access"] = "ticket"
  343. data["user"] = "foo"
  344. with testing.mock_sends(
  345. pagure_messages.ProjectUserAccessUpdatedV1(
  346. topic="pagure.project.user.access.updated",
  347. body={
  348. "project": {
  349. "id": 1,
  350. "name": "test",
  351. "fullname": "test",
  352. "url_path": "test",
  353. "full_url": "http://localhost.localdomain/test",
  354. "description": "test project #1",
  355. "namespace": None,
  356. "parent": None,
  357. "date_created": ANY,
  358. "date_modified": ANY,
  359. "user": {
  360. "name": "pingou",
  361. "fullname": "PY C",
  362. "url_path": "user/pingou",
  363. "full_url": "http://localhost.localdomain/user/pingou",
  364. },
  365. "access_users": {
  366. "owner": ["pingou"],
  367. "admin": [],
  368. "commit": [],
  369. "collaborator": [],
  370. "ticket": ["foo"],
  371. },
  372. "access_groups": {
  373. "admin": [],
  374. "commit": [],
  375. "collaborator": [],
  376. "ticket": [],
  377. },
  378. "tags": [],
  379. "priorities": {},
  380. "custom_keys": [],
  381. "close_status": [
  382. "Invalid",
  383. "Insufficient data",
  384. "Fixed",
  385. "Duplicate",
  386. ],
  387. "milestones": {},
  388. },
  389. "new_user": "foo",
  390. "new_access": "ticket",
  391. "new_branches": None,
  392. "agent": "pingou",
  393. },
  394. )
  395. ):
  396. output = self.app.post(
  397. "/test/adduser", data=data, follow_redirects=True
  398. )
  399. self.assertEqual(output.status_code, 200)
  400. output_text = output.get_data(as_text=True)
  401. self.assertIn(
  402. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  403. output_text,
  404. )
  405. self.assertIn("User access updated", output_text)
  406. @patch("pagure.decorators.admin_session_timedout")
  407. def test_add_group_project_when_user_mngt_off(self, ast):
  408. """Test the add_group_project endpoint when user management is
  409. turned off in the pagure instance"""
  410. pagure.config.config["ENABLE_USER_MNGT"] = False
  411. ast.return_value = False
  412. # No Git repo
  413. output = self.app.get("/foo/addgroup")
  414. self.assertEqual(output.status_code, 404)
  415. tests.create_projects(self.session)
  416. tests.create_projects_git(os.path.join(self.path, "repos"))
  417. # User not logged in
  418. output = self.app.get("/test/addgroup")
  419. self.assertEqual(output.status_code, 302)
  420. msg = pagure.lib.query.add_group(
  421. self.session,
  422. group_name="foo",
  423. group_type="bar",
  424. display_name="foo group",
  425. description=None,
  426. user="pingou",
  427. is_admin=False,
  428. blacklist=pagure.config.config["BLACKLISTED_GROUPS"],
  429. )
  430. self.session.commit()
  431. self.assertEqual(msg, "User `pingou` added to the group `foo`.")
  432. user = tests.FakeUser(username="pingou")
  433. with tests.user_set(self.app.application, user):
  434. # just get the csrf token
  435. pagure.config.config["ENABLE_USER_MNGT"] = True
  436. output = self.app.get("/test/addgroup")
  437. output_text = output.get_data(as_text=True)
  438. csrf_token = output_text.split(
  439. 'name="csrf_token" type="hidden" value="'
  440. )[1].split('">')[0]
  441. pagure.config.config["ENABLE_USER_MNGT"] = False
  442. data = {"group": "ralph"}
  443. output = self.app.post("/test/addgroup", data=data)
  444. self.assertEqual(output.status_code, 404)
  445. data["csrf_token"] = csrf_token
  446. output = self.app.post("/test/addgroup", data=data)
  447. self.assertEqual(output.status_code, 404)
  448. data["group"] = "foo"
  449. output = self.app.post(
  450. "/test/addgroup", data=data, follow_redirects=True
  451. )
  452. self.assertEqual(output.status_code, 404)
  453. pagure.config.config["ENABLE_USER_MNGT"] = True
  454. @patch.dict("pagure.config.config", {"ENABLE_GROUP_MNGT": False})
  455. @patch("pagure.decorators.admin_session_timedout")
  456. def test_add_group_project_grp_mngt_off(self, ast):
  457. """Test the add_group_project endpoint when group management is
  458. turned off in the pagure instance"""
  459. ast.return_value = False
  460. tests.create_projects(self.session)
  461. tests.create_projects_git(os.path.join(self.path, "repos"))
  462. user = tests.FakeUser(username="pingou")
  463. with tests.user_set(self.app.application, user):
  464. data = {
  465. "group": "ralph",
  466. "access": "ticket",
  467. "csrf_token": self.get_csrf(),
  468. }
  469. output = self.app.post(
  470. "/test/addgroup", data=data, follow_redirects=True
  471. )
  472. self.assertEqual(output.status_code, 200)
  473. output_text = output.get_data(as_text=True)
  474. self.assertIn(
  475. "<title>Add group - test - Pagure</title>", output_text
  476. )
  477. self.assertIn("No group ralph found.", output_text)
  478. @patch.dict(
  479. "pagure.config.config", {"FEDORA_MESSAGING_NOTIFICATIONS": True}
  480. )
  481. @patch("pagure.decorators.admin_session_timedout")
  482. def test_add_group_project(self, ast):
  483. """Test the add_group_project endpoint."""
  484. ast.return_value = False
  485. # No Git repo
  486. output = self.app.get("/foo/addgroup")
  487. self.assertEqual(output.status_code, 404)
  488. tests.create_projects(self.session)
  489. tests.create_projects_git(os.path.join(self.path, "repos"))
  490. # User not logged in
  491. output = self.app.get("/test/addgroup")
  492. self.assertEqual(output.status_code, 302)
  493. user = tests.FakeUser()
  494. with tests.user_set(self.app.application, user):
  495. output = self.app.get("/test/addgroup")
  496. self.assertEqual(output.status_code, 403)
  497. ast.return_value = True
  498. output = self.app.get("/test/addgroup")
  499. self.assertEqual(output.status_code, 302)
  500. # Redirect also happens for POST request
  501. output = self.app.post("/test/addgroup")
  502. self.assertEqual(output.status_code, 302)
  503. # Need to do this un-authentified since our fake user isn't in the DB
  504. # Check the message flashed during the redirect
  505. output = self.app.get("/", follow_redirects=True)
  506. self.assertEqual(output.status_code, 200)
  507. output_text = output.get_data(as_text=True)
  508. self.assertIn("Action canceled, try it " "again", output_text)
  509. ast.return_value = False
  510. msg = pagure.lib.query.add_group(
  511. self.session,
  512. group_name="foo",
  513. display_name="foo group",
  514. description=None,
  515. group_type="bar",
  516. user="pingou",
  517. is_admin=False,
  518. blacklist=pagure.config.config["BLACKLISTED_GROUPS"],
  519. )
  520. self.session.commit()
  521. self.assertEqual(msg, "User `pingou` added to the group `foo`.")
  522. user.username = "pingou"
  523. with tests.user_set(self.app.application, user):
  524. output = self.app.get("/test/addgroup")
  525. self.assertEqual(output.status_code, 200)
  526. output_text = output.get_data(as_text=True)
  527. self.assertIn("<strong>Add group to the", output_text)
  528. csrf_token = output_text.split(
  529. 'name="csrf_token" type="hidden" value="'
  530. )[1].split('">')[0]
  531. data = {"group": "ralph"}
  532. # Missing CSRF
  533. output = self.app.post("/test/addgroup", data=data)
  534. self.assertEqual(output.status_code, 200)
  535. output_text = output.get_data(as_text=True)
  536. self.assertIn(
  537. "<title>Add group - test - Pagure</title>", output_text
  538. )
  539. self.assertIn("<strong>Add group to the", output_text)
  540. # Missing access
  541. data["csrf_token"] = csrf_token
  542. output = self.app.post("/test/addgroup", data=data)
  543. self.assertEqual(output.status_code, 200)
  544. output_text = output.get_data(as_text=True)
  545. self.assertIn(
  546. "<title>Add group - test - Pagure</title>", output_text
  547. )
  548. self.assertIn("<strong>Add group to the", output_text)
  549. # All good
  550. data["access"] = "ticket"
  551. with testing.mock_sends(
  552. pagure_messages.ProjectGroupAddedV1(
  553. topic="pagure.project.group.added",
  554. body={
  555. "project": {
  556. "id": 1,
  557. "name": "test",
  558. "fullname": "test",
  559. "url_path": "test",
  560. "full_url": "http://localhost.localdomain/test",
  561. "description": "test project #1",
  562. "namespace": None,
  563. "parent": None,
  564. "date_created": ANY,
  565. "date_modified": ANY,
  566. "user": {
  567. "name": "pingou",
  568. "fullname": "PY C",
  569. "url_path": "user/pingou",
  570. "full_url": "http://localhost.localdomain/user/pingou",
  571. },
  572. "access_users": {
  573. "owner": ["pingou"],
  574. "admin": [],
  575. "commit": [],
  576. "collaborator": [],
  577. "ticket": [],
  578. },
  579. "access_groups": {
  580. "admin": [],
  581. "commit": [],
  582. "collaborator": [],
  583. "ticket": ["ralph"],
  584. },
  585. "tags": [],
  586. "priorities": {},
  587. "custom_keys": [],
  588. "close_status": [
  589. "Invalid",
  590. "Insufficient data",
  591. "Fixed",
  592. "Duplicate",
  593. ],
  594. "milestones": {},
  595. },
  596. "new_group": "ralph",
  597. "access": "ticket",
  598. "branches": None,
  599. "agent": "pingou",
  600. },
  601. )
  602. ):
  603. output = self.app.post(
  604. "/test/addgroup", data=data, follow_redirects=True
  605. )
  606. self.assertEqual(output.status_code, 200)
  607. output_text = output.get_data(as_text=True)
  608. self.assertIn(
  609. "<title>Settings - test - Pagure</title>", output_text
  610. )
  611. self.assertIn(
  612. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  613. output_text,
  614. )
  615. self.assertIn("Group added", output_text)
  616. # All good -- Update existing group/access
  617. data["access"] = "commit"
  618. with testing.mock_sends(
  619. pagure_messages.ProjectGroupAccessUpdatedV1(
  620. topic="pagure.project.group.access.updated",
  621. body={
  622. "project": {
  623. "id": 1,
  624. "name": "test",
  625. "fullname": "test",
  626. "url_path": "test",
  627. "full_url": "http://localhost.localdomain/test",
  628. "description": "test project #1",
  629. "namespace": None,
  630. "parent": None,
  631. "date_created": ANY,
  632. "date_modified": ANY,
  633. "user": {
  634. "name": "pingou",
  635. "fullname": "PY C",
  636. "url_path": "user/pingou",
  637. "full_url": "http://localhost.localdomain/user/pingou",
  638. },
  639. "access_users": {
  640. "owner": ["pingou"],
  641. "admin": [],
  642. "commit": [],
  643. "collaborator": [],
  644. "ticket": [],
  645. },
  646. "access_groups": {
  647. "admin": [],
  648. "commit": ["ralph"],
  649. "collaborator": [],
  650. "ticket": [],
  651. },
  652. "tags": [],
  653. "priorities": {},
  654. "custom_keys": [],
  655. "close_status": [
  656. "Invalid",
  657. "Insufficient data",
  658. "Fixed",
  659. "Duplicate",
  660. ],
  661. "milestones": {},
  662. },
  663. "new_group": "ralph",
  664. "new_access": "commit",
  665. "new_branches": None,
  666. "agent": "pingou",
  667. },
  668. )
  669. ):
  670. output = self.app.post(
  671. "/test/addgroup", data=data, follow_redirects=True
  672. )
  673. self.assertEqual(output.status_code, 200)
  674. output_text = output.get_data(as_text=True)
  675. self.assertIn(
  676. "<title>Settings - test - Pagure</title>", output_text
  677. )
  678. self.assertIn(
  679. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  680. output_text,
  681. )
  682. self.assertIn("Group access updated", output_text)
  683. @patch("pagure.decorators.admin_session_timedout")
  684. def test_remove_user_when_user_mngt_off(self, ast):
  685. """Test the remove_user endpoint when user management is turned
  686. off in the pagure instance"""
  687. pagure.config.config["ENABLE_USER_MNGT"] = False
  688. ast.return_value = False
  689. # Git repo not found
  690. output = self.app.post("/foo/dropuser/1")
  691. self.assertEqual(output.status_code, 404)
  692. user = tests.FakeUser(username="pingou")
  693. with tests.user_set(self.app.application, user):
  694. tests.create_projects(self.session)
  695. tests.create_projects_git(os.path.join(self.path, "repos"))
  696. output = self.app.post("/test/settings")
  697. output_text = output.get_data(as_text=True)
  698. csrf_token = output_text.split(
  699. 'name="csrf_token" type="hidden" value="'
  700. )[1].split('">')[0]
  701. data = {"csrf_token": csrf_token}
  702. output = self.app.post(
  703. "/test/dropuser/2", data=data, follow_redirects=True
  704. )
  705. self.assertEqual(output.status_code, 404)
  706. # User not logged in
  707. output = self.app.post("/test/dropuser/1")
  708. self.assertEqual(output.status_code, 302)
  709. # Add an user to a project
  710. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  711. msg = pagure.lib.query.add_user_to_project(
  712. session=self.session, project=repo, new_user="foo", user="pingou"
  713. )
  714. self.session.commit()
  715. self.assertEqual(msg, "User added")
  716. with tests.user_set(self.app.application, user):
  717. output = self.app.post("/test/dropuser/2", follow_redirects=True)
  718. self.assertEqual(output.status_code, 404)
  719. data = {"csrf_token": csrf_token}
  720. output = self.app.post(
  721. "/test/dropuser/2", data=data, follow_redirects=True
  722. )
  723. self.assertEqual(output.status_code, 404)
  724. pagure.config.config["ENABLE_USER_MNGT"] = True
  725. @patch("pagure.decorators.admin_session_timedout")
  726. def test_remove_deploykey(self, ast):
  727. """Test the remove_deploykey endpoint."""
  728. ast.return_value = False
  729. # Git repo not found
  730. output = self.app.post("/foo/dropdeploykey/1")
  731. self.assertEqual(output.status_code, 404)
  732. user = tests.FakeUser()
  733. with tests.user_set(self.app.application, user):
  734. output = self.app.post("/foo/dropdeploykey/1")
  735. self.assertEqual(output.status_code, 404)
  736. tests.create_projects(self.session)
  737. tests.create_projects_git(os.path.join(self.path, "repos"))
  738. output = self.app.post("/test/dropdeploykey/1")
  739. self.assertEqual(output.status_code, 403)
  740. ast.return_value = True
  741. output = self.app.post("/test/dropdeploykey/1")
  742. self.assertEqual(output.status_code, 302)
  743. ast.return_value = False
  744. # User not logged in
  745. output = self.app.post("/test/dropdeploykey/1")
  746. self.assertEqual(output.status_code, 302)
  747. user.username = "pingou"
  748. with tests.user_set(self.app.application, user):
  749. output = self.app.post("/test/settings")
  750. output_text = output.get_data(as_text=True)
  751. csrf_token = output_text.split(
  752. 'name="csrf_token" type="hidden" value="'
  753. )[1].split('">')[0]
  754. data = {"csrf_token": csrf_token}
  755. output = self.app.post(
  756. "/test/dropdeploykey/1", data=data, follow_redirects=True
  757. )
  758. self.assertEqual(output.status_code, 200)
  759. output_text = output.get_data(as_text=True)
  760. self.assertIn(
  761. "<title>Settings - test - Pagure</title>", output_text
  762. )
  763. self.assertIn(
  764. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  765. output_text,
  766. )
  767. self.assertIn("Deploy key does not exist in project", output_text)
  768. # Add a deploy key to a project
  769. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  770. pingou = pagure.lib.query.get_user(self.session, "pingou")
  771. msg = pagure.lib.query.add_sshkey_to_project_or_user(
  772. session=self.session,
  773. project=repo,
  774. ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==",
  775. pushaccess=True,
  776. creator=pingou,
  777. )
  778. self.session.commit()
  779. self.assertEqual(msg, "SSH key added")
  780. with tests.user_set(self.app.application, user):
  781. output = self.app.post(
  782. "/test/dropdeploykey/1", follow_redirects=True
  783. )
  784. self.assertEqual(output.status_code, 200)
  785. output_text = output.get_data(as_text=True)
  786. self.assertIn(
  787. "<title>Settings - test - Pagure</title>", output_text
  788. )
  789. self.assertIn(
  790. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  791. output_text,
  792. )
  793. self.assertNotIn("Deploy key removed", output_text)
  794. data = {"csrf_token": csrf_token}
  795. output = self.app.post(
  796. "/test/dropdeploykey/1", data=data, follow_redirects=True
  797. )
  798. self.assertEqual(output.status_code, 200)
  799. output_text = output.get_data(as_text=True)
  800. self.assertIn(
  801. "<title>Settings - test - Pagure</title>", output_text
  802. )
  803. self.assertIn(
  804. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  805. output_text,
  806. )
  807. self.assertIn("Deploy key removed", output_text)
  808. @patch("pagure.decorators.admin_session_timedout")
  809. @patch.dict("pagure.config.config", {"DEPLOY_KEY": False})
  810. def test_remove_deploykey_disabled(self, ast):
  811. """Test the remove_deploykey endpoint when it's disabled in the
  812. config.
  813. """
  814. ast.return_value = False
  815. tests.create_projects(self.session)
  816. tests.create_projects_git(os.path.join(self.path, "repos"))
  817. user = tests.FakeUser(username="pingou")
  818. with tests.user_set(self.app.application, user):
  819. output = self.app.post("/test/dropdeploykey/1")
  820. self.assertEqual(output.status_code, 404)
  821. @patch.dict(
  822. "pagure.config.config", {"FEDORA_MESSAGING_NOTIFICATIONS": True}
  823. )
  824. @patch("pagure.decorators.admin_session_timedout")
  825. def test_remove_user(self, ast):
  826. """Test the remove_user endpoint."""
  827. ast.return_value = False
  828. # Git repo not found
  829. output = self.app.post("/foo/dropuser/1")
  830. self.assertEqual(output.status_code, 404)
  831. user = tests.FakeUser()
  832. with tests.user_set(self.app.application, user):
  833. output = self.app.post("/foo/dropuser/1")
  834. self.assertEqual(output.status_code, 404)
  835. tests.create_projects(self.session)
  836. tests.create_projects_git(os.path.join(self.path, "repos"))
  837. output = self.app.post("/test/dropuser/1")
  838. self.assertEqual(output.status_code, 403)
  839. ast.return_value = True
  840. output = self.app.post("/test/dropuser/1")
  841. self.assertEqual(output.status_code, 302)
  842. ast.return_value = False
  843. # User not logged in
  844. output = self.app.post("/test/dropuser/1")
  845. self.assertEqual(output.status_code, 302)
  846. user.username = "pingou"
  847. with tests.user_set(self.app.application, user):
  848. output = self.app.post("/test/settings")
  849. output_text = output.get_data(as_text=True)
  850. csrf_token = output_text.split(
  851. 'name="csrf_token" type="hidden" value="'
  852. )[1].split('">')[0]
  853. data = {"csrf_token": csrf_token}
  854. output = self.app.post(
  855. "/test/dropuser/2", data=data, follow_redirects=True
  856. )
  857. self.assertEqual(output.status_code, 200)
  858. output_text = output.get_data(as_text=True)
  859. self.assertIn(
  860. "<title>Settings - test - Pagure</title>", output_text
  861. )
  862. self.assertIn(
  863. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  864. output_text,
  865. )
  866. self.assertIn(
  867. "User does not have any " "access on the repo", output_text
  868. )
  869. # Add an user to a project
  870. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  871. self.assertEqual(len(repo.users), 0)
  872. msg = pagure.lib.query.add_user_to_project(
  873. session=self.session, project=repo, new_user="foo", user="pingou"
  874. )
  875. self.session.commit()
  876. self.assertEqual(msg, "User added")
  877. self.assertEqual(len(repo.users), 1)
  878. with tests.user_set(self.app.application, user):
  879. output = self.app.post("/test/dropuser/2", follow_redirects=True)
  880. self.assertEqual(output.status_code, 200)
  881. output_text = output.get_data(as_text=True)
  882. self.assertIn(
  883. "<title>Settings - test - Pagure</title>", output_text
  884. )
  885. self.assertIn(
  886. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  887. output_text,
  888. )
  889. self.assertNotIn("User removed", output_text)
  890. self.assertIn('action="/test/dropuser/2">', output_text)
  891. repo = pagure.lib.query.get_authorized_project(
  892. self.session, "test"
  893. )
  894. self.assertEqual(len(repo.users), 1)
  895. data = {"csrf_token": csrf_token}
  896. with testing.mock_sends(
  897. pagure_messages.ProjectUserRemovedV1(
  898. topic="pagure.project.user.removed",
  899. body={
  900. "project": {
  901. "id": 1,
  902. "name": "test",
  903. "fullname": "test",
  904. "url_path": "test",
  905. "full_url": "http://localhost.localdomain/test",
  906. "description": "test project #1",
  907. "namespace": None,
  908. "parent": None,
  909. "date_created": ANY,
  910. "date_modified": ANY,
  911. "user": {
  912. "name": "pingou",
  913. "fullname": "PY C",
  914. "url_path": "user/pingou",
  915. "full_url": "http://localhost.localdomain/user/pingou",
  916. },
  917. "access_users": {
  918. "owner": ["pingou"],
  919. "admin": [],
  920. "commit": [],
  921. "collaborator": [],
  922. "ticket": [],
  923. },
  924. "access_groups": {
  925. "admin": [],
  926. "commit": [],
  927. "collaborator": [],
  928. "ticket": [],
  929. },
  930. "tags": [],
  931. "priorities": {},
  932. "custom_keys": [],
  933. "close_status": [
  934. "Invalid",
  935. "Insufficient data",
  936. "Fixed",
  937. "Duplicate",
  938. ],
  939. "milestones": {},
  940. },
  941. "removed_user": "foo",
  942. "agent": "pingou",
  943. },
  944. )
  945. ):
  946. output = self.app.post(
  947. "/test/dropuser/2", data=data, follow_redirects=True
  948. )
  949. self.assertEqual(output.status_code, 200)
  950. output_text = output.get_data(as_text=True)
  951. self.assertIn(
  952. "<title>Settings - test - Pagure</title>", output_text
  953. )
  954. self.assertIn(
  955. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  956. output_text,
  957. )
  958. self.assertIn("User removed", output_text)
  959. self.assertNotIn('action="/test/dropuser/2">', output_text)
  960. self.session.commit()
  961. repo = pagure.lib.query.get_authorized_project(
  962. self.session, "test"
  963. )
  964. self.assertEqual(len(repo.users), 0)
  965. @patch("pagure.decorators.admin_session_timedout")
  966. @patch("pagure.lib.notify.log")
  967. def test_remove_user_self(self, mock_log, ast):
  968. """Test the remove_user endpoint when removing themselves."""
  969. ast.return_value = False
  970. tests.create_projects(self.session)
  971. tests.create_projects_git(os.path.join(self.path, "repos"))
  972. # Add an user to a project
  973. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  974. self.assertEqual(len(repo.users), 0)
  975. msg = pagure.lib.query.add_user_to_project(
  976. session=self.session, project=repo, new_user="foo", user="pingou"
  977. )
  978. self.session.commit()
  979. self.assertEqual(msg, "User added")
  980. self.assertEqual(len(repo.users), 1)
  981. # Let user foo remove themselves
  982. user = tests.FakeUser(username="foo")
  983. with tests.user_set(self.app.application, user):
  984. csrf_token = self.get_csrf()
  985. data = {"csrf_token": csrf_token}
  986. output = self.app.post(
  987. "/test/dropuser/2", data=data, follow_redirects=True
  988. )
  989. self.assertEqual(output.status_code, 200)
  990. output_text = output.get_data(as_text=True)
  991. self.assertIn(
  992. "<title>Overview - test - Pagure</title>", output_text
  993. )
  994. self.assertIn(
  995. '<h3 class="mb-0">\n<a href="/test"><strong>test</strong>'
  996. "</a>\n </h3>",
  997. output_text,
  998. )
  999. self.assertIn("User removed", output_text)
  1000. self.session.commit()
  1001. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  1002. self.assertEqual(len(repo.users), 0)
  1003. mock_log.assert_called_with(ANY, topic="project.user.removed", msg=ANY)
  1004. @patch("pagure.decorators.admin_session_timedout")
  1005. def test_remove_group_project_when_user_mngt_off(self, ast):
  1006. """Test the remove_group_project endpoint when user management is
  1007. turned off in the pagure instance"""
  1008. pagure.config.config["ENABLE_USER_MNGT"] = False
  1009. ast.return_value = False
  1010. # No Git repo
  1011. output = self.app.post("/foo/dropgroup/1")
  1012. self.assertEqual(output.status_code, 404)
  1013. tests.create_projects(self.session)
  1014. tests.create_projects_git(os.path.join(self.path, "repos"))
  1015. # User not logged in
  1016. output = self.app.post("/test/dropgroup/1")
  1017. self.assertEqual(output.status_code, 302)
  1018. user = tests.FakeUser()
  1019. user.username = "pingou"
  1020. with tests.user_set(self.app.application, user):
  1021. output = self.app.post("/test/settings")
  1022. output_text = output.get_data(as_text=True)
  1023. csrf_token = output_text.split(
  1024. 'name="csrf_token" type="hidden" value="'
  1025. )[1].split('">')[0]
  1026. data = {"csrf_token": csrf_token}
  1027. output = self.app.post(
  1028. "/test/dropgroup/2", data=data, follow_redirects=True
  1029. )
  1030. self.assertEqual(output.status_code, 404)
  1031. # Create the new group
  1032. msg = pagure.lib.query.add_group(
  1033. session=self.session,
  1034. group_name="testgrp",
  1035. group_type="user",
  1036. display_name="testgrp group",
  1037. description=None,
  1038. user="pingou",
  1039. is_admin=False,
  1040. blacklist=[],
  1041. )
  1042. self.assertEqual(msg, "User `pingou` added to the group `testgrp`.")
  1043. self.session.commit()
  1044. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  1045. # Add the group to a project
  1046. msg = pagure.lib.query.add_group_to_project(
  1047. session=self.session,
  1048. project=repo,
  1049. new_group="testgrp",
  1050. user="pingou",
  1051. )
  1052. self.session.commit()
  1053. self.assertEqual(msg, "Group added")
  1054. with tests.user_set(self.app.application, user):
  1055. output = self.app.post("/test/dropgroup/1", follow_redirects=True)
  1056. self.assertEqual(output.status_code, 404)
  1057. data = {"csrf_token": csrf_token}
  1058. output = self.app.post(
  1059. "/test/dropgroup/1", data=data, follow_redirects=True
  1060. )
  1061. self.assertEqual(output.status_code, 404)
  1062. pagure.config.config["ENABLE_USER_MNGT"] = True
  1063. @patch.dict(
  1064. "pagure.config.config", {"FEDORA_MESSAGING_NOTIFICATIONS": True}
  1065. )
  1066. @patch("pagure.decorators.admin_session_timedout")
  1067. def test_remove_group_project(self, ast):
  1068. """Test the remove_group_project endpoint."""
  1069. ast.return_value = False
  1070. # No Git repo
  1071. output = self.app.post("/foo/dropgroup/1")
  1072. self.assertEqual(output.status_code, 404)
  1073. user = tests.FakeUser()
  1074. with tests.user_set(self.app.application, user):
  1075. output = self.app.post("/foo/dropgroup/1")
  1076. self.assertEqual(output.status_code, 404)
  1077. tests.create_projects(self.session)
  1078. tests.create_projects_git(os.path.join(self.path, "repos"))
  1079. output = self.app.post("/test/dropgroup/1")
  1080. self.assertEqual(output.status_code, 403)
  1081. ast.return_value = True
  1082. output = self.app.post("/test/dropgroup/1")
  1083. self.assertEqual(output.status_code, 302)
  1084. ast.return_value = False
  1085. # User not logged in
  1086. output = self.app.post("/test/dropgroup/1")
  1087. self.assertEqual(output.status_code, 302)
  1088. user.username = "pingou"
  1089. with tests.user_set(self.app.application, user):
  1090. output = self.app.post("/test/settings")
  1091. output_text = output.get_data(as_text=True)
  1092. csrf_token = output_text.split(
  1093. 'name="csrf_token" type="hidden" value="'
  1094. )[1].split('">')[0]
  1095. data = {"csrf_token": csrf_token}
  1096. output = self.app.post(
  1097. "/test/dropgroup/2", data=data, follow_redirects=True
  1098. )
  1099. self.assertEqual(output.status_code, 200)
  1100. output_text = output.get_data(as_text=True)
  1101. self.assertIn(
  1102. "<title>Settings - test - Pagure</title>", output_text
  1103. )
  1104. self.assertIn(
  1105. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1106. output_text,
  1107. )
  1108. self.assertIn(
  1109. "" "Group does not seem to be part of this project",
  1110. output_text,
  1111. )
  1112. # Create the new group
  1113. msg = pagure.lib.query.add_group(
  1114. session=self.session,
  1115. group_name="testgrp",
  1116. group_type="user",
  1117. display_name="testgrp group",
  1118. description=None,
  1119. user="pingou",
  1120. is_admin=False,
  1121. blacklist=[],
  1122. )
  1123. self.assertEqual(msg, "User `pingou` added to the group `testgrp`.")
  1124. self.session.commit()
  1125. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  1126. # Add the group to a project
  1127. msg = pagure.lib.query.add_group_to_project(
  1128. session=self.session,
  1129. project=repo,
  1130. new_group="testgrp",
  1131. user="pingou",
  1132. )
  1133. self.session.commit()
  1134. self.assertEqual(msg, "Group added")
  1135. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  1136. self.assertEqual(len(repo.groups), 1)
  1137. with tests.user_set(self.app.application, user):
  1138. output = self.app.post("/test/dropgroup/1", follow_redirects=True)
  1139. self.assertEqual(output.status_code, 200)
  1140. output_text = output.get_data(as_text=True)
  1141. self.assertIn(
  1142. "<title>Settings - test - Pagure</title>", output_text
  1143. )
  1144. self.assertIn(
  1145. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1146. output_text,
  1147. )
  1148. self.assertIn('action="/test/dropgroup/1">', output_text)
  1149. self.assertNotIn("Group removed", output_text)
  1150. repo = pagure.lib.query.get_authorized_project(
  1151. self.session, "test"
  1152. )
  1153. self.assertEqual(len(repo.groups), 1)
  1154. data = {"csrf_token": csrf_token}
  1155. with testing.mock_sends(
  1156. pagure_messages.ProjectGroupRemovedV1(
  1157. topic="pagure.project.group.removed",
  1158. body={
  1159. "project": {
  1160. "id": 1,
  1161. "name": "test",
  1162. "fullname": "test",
  1163. "url_path": "test",
  1164. "full_url": "http://localhost.localdomain/test",
  1165. "description": "test project #1",
  1166. "namespace": None,
  1167. "parent": None,
  1168. "date_created": ANY,
  1169. "date_modified": ANY,
  1170. "user": {
  1171. "name": "pingou",
  1172. "fullname": "PY C",
  1173. "url_path": "user/pingou",
  1174. "full_url": "http://localhost.localdomain/user/pingou",
  1175. },
  1176. "access_users": {
  1177. "owner": ["pingou"],
  1178. "admin": [],
  1179. "commit": [],
  1180. "collaborator": [],
  1181. "ticket": [],
  1182. },
  1183. "access_groups": {
  1184. "admin": [],
  1185. "commit": [],
  1186. "collaborator": [],
  1187. "ticket": [],
  1188. },
  1189. "tags": [],
  1190. "priorities": {},
  1191. "custom_keys": [],
  1192. "close_status": [
  1193. "Invalid",
  1194. "Insufficient data",
  1195. "Fixed",
  1196. "Duplicate",
  1197. ],
  1198. "milestones": {},
  1199. },
  1200. "removed_groups": ["testgrp"],
  1201. "agent": "pingou",
  1202. },
  1203. )
  1204. ):
  1205. output = self.app.post(
  1206. "/test/dropgroup/1", data=data, follow_redirects=True
  1207. )
  1208. self.assertEqual(output.status_code, 200)
  1209. output_text = output.get_data(as_text=True)
  1210. self.assertIn(
  1211. "<title>Settings - test - Pagure</title>", output_text
  1212. )
  1213. self.assertIn(
  1214. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1215. output_text,
  1216. )
  1217. self.assertIn("Group removed", output_text)
  1218. self.assertNotIn('action="/test/dropgroup/1">', output_text)
  1219. self.session.commit()
  1220. repo = pagure.lib.query.get_authorized_project(
  1221. self.session, "test"
  1222. )
  1223. self.assertEqual(len(repo.groups), 0)
  1224. @patch("pagure.decorators.admin_session_timedout")
  1225. def test_update_project(self, ast):
  1226. """Test the update_project endpoint."""
  1227. ast.return_value = True
  1228. # Git repo not found
  1229. output = self.app.post("/foo/update")
  1230. self.assertEqual(output.status_code, 404)
  1231. user = tests.FakeUser()
  1232. with tests.user_set(self.app.application, user):
  1233. # Project does not exist
  1234. output = self.app.post("/foo/update")
  1235. self.assertEqual(output.status_code, 404)
  1236. tests.create_projects(self.session)
  1237. tests.create_projects_git(os.path.join(self.path, "repos"))
  1238. # Session timed-out
  1239. output = self.app.post("/test/update")
  1240. self.assertEqual(output.status_code, 302)
  1241. ast.return_value = False
  1242. # Not allowed
  1243. output = self.app.post("/test/update")
  1244. self.assertEqual(output.status_code, 403)
  1245. # User not logged in
  1246. output = self.app.post("/test/update")
  1247. self.assertEqual(output.status_code, 302)
  1248. user.username = "pingou"
  1249. with tests.user_set(self.app.application, user):
  1250. output = self.app.post("/test/update", follow_redirects=True)
  1251. self.assertEqual(output.status_code, 200)
  1252. output_text = output.get_data(as_text=True)
  1253. self.assertIn(
  1254. "<title>Settings - test - Pagure</title>", output_text
  1255. )
  1256. self.assertIn(
  1257. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1258. output_text,
  1259. )
  1260. csrf_token = output_text.split(
  1261. 'name="csrf_token" type="hidden" value="'
  1262. )[1].split('">')[0]
  1263. data = {
  1264. "description": "new description for test project #1",
  1265. "csrf_token": csrf_token,
  1266. }
  1267. output = self.app.post(
  1268. "/test/update", data=data, follow_redirects=True
  1269. )
  1270. self.assertEqual(output.status_code, 200)
  1271. output_text = output.get_data(as_text=True)
  1272. self.assertIn(
  1273. "<title>Settings - test - Pagure</title>", output_text
  1274. )
  1275. self.assertIn(
  1276. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1277. output_text,
  1278. )
  1279. self.assertIn(
  1280. '<input class="form-control" name="avatar_email" value="" />',
  1281. output_text,
  1282. )
  1283. self.assertIn("Project updated", output_text)
  1284. # Edit the avatar_email
  1285. data = {
  1286. "description": "new description for test project #1",
  1287. "avatar_email": "pingou@fp.o",
  1288. "csrf_token": csrf_token,
  1289. }
  1290. output = self.app.post(
  1291. "/test/update", data=data, follow_redirects=True
  1292. )
  1293. self.assertEqual(output.status_code, 200)
  1294. output_text = output.get_data(as_text=True)
  1295. self.assertIn(
  1296. "<title>Settings - test - Pagure</title>", output_text
  1297. )
  1298. self.assertIn(
  1299. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1300. output_text,
  1301. )
  1302. self.assertIn(
  1303. '<input class="form-control" name="avatar_email" value="pingou@fp.o" />',
  1304. output_text,
  1305. )
  1306. self.assertIn("Project updated", output_text)
  1307. # Reset the avatar_email
  1308. data = {
  1309. "description": "new description for test project #1",
  1310. "avatar_email": "",
  1311. "csrf_token": csrf_token,
  1312. }
  1313. output = self.app.post(
  1314. "/test/update", data=data, follow_redirects=True
  1315. )
  1316. self.assertEqual(output.status_code, 200)
  1317. output_text = output.get_data(as_text=True)
  1318. self.assertIn(
  1319. "<title>Settings - test - Pagure</title>", output_text
  1320. )
  1321. self.assertIn(
  1322. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1323. output_text,
  1324. )
  1325. self.assertIn(
  1326. '<input class="form-control" name="avatar_email" value="" />',
  1327. output_text,
  1328. )
  1329. self.assertIn("Project updated", output_text)
  1330. @patch("pagure.decorators.admin_session_timedout")
  1331. def test_update_project_update_tag(self, ast):
  1332. """Test the view_settings endpoint when updating the project's tags.
  1333. We had an issue where when you add an existing tag to a project we
  1334. were querying the wrong table in the database. It would thus not find
  1335. the tag, would try to add it, and (rightfully) complain about duplicated
  1336. content.
  1337. This test ensure we are behaving properly.
  1338. """
  1339. ast.return_value = False
  1340. tests.create_projects(self.session)
  1341. tests.create_projects_git(os.path.join(self.path, "repos"))
  1342. user = tests.FakeUser(username="pingou")
  1343. with tests.user_set(self.app.application, user):
  1344. output = self.app.get("/test/settings")
  1345. self.assertEqual(output.status_code, 200)
  1346. output_text = output.get_data(as_text=True)
  1347. self.assertIn(
  1348. "<title>Settings - test - Pagure</title>", output_text
  1349. )
  1350. self.assertIn(
  1351. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1352. output_text,
  1353. )
  1354. csrf_token = output_text.split(
  1355. 'name="csrf_token" type="hidden" value="'
  1356. )[1].split('">')[0]
  1357. # Add tag to a project so that they are added to the database
  1358. data = {
  1359. "csrf_token": csrf_token,
  1360. "description": "Test project",
  1361. "tags": "test,pagure,tag",
  1362. }
  1363. output = self.app.post(
  1364. "/test/update", data=data, follow_redirects=True
  1365. )
  1366. self.assertEqual(output.status_code, 200)
  1367. output_text = output.get_data(as_text=True)
  1368. self.assertIn(
  1369. "<title>Settings - test - Pagure</title>", output_text
  1370. )
  1371. self.assertIn(
  1372. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1373. output_text,
  1374. )
  1375. self.assertIn("Project updated", output_text)
  1376. # Remove two of the tags of the project, they will still be in
  1377. # the DB but not associated to this project
  1378. data = {
  1379. "csrf_token": csrf_token,
  1380. "description": "Test project",
  1381. "tags": "tag",
  1382. }
  1383. output = self.app.post(
  1384. "/test/update", data=data, follow_redirects=True
  1385. )
  1386. self.assertEqual(output.status_code, 200)
  1387. output_text = output.get_data(as_text=True)
  1388. self.assertIn(
  1389. "<title>Settings - test - Pagure</title>", output_text
  1390. )
  1391. self.assertIn(
  1392. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1393. output_text,
  1394. )
  1395. self.assertIn("Project updated", output_text)
  1396. # Try re-adding the two tags, this used to fail before we fixed
  1397. # it
  1398. data = {
  1399. "csrf_token": csrf_token,
  1400. "description": "Test project",
  1401. "tags": "test,pagure,tag",
  1402. }
  1403. output = self.app.post(
  1404. "/test/update", data=data, follow_redirects=True
  1405. )
  1406. self.assertEqual(output.status_code, 200)
  1407. output_text = output.get_data(as_text=True)
  1408. self.assertIn(
  1409. "<title>Settings - test - Pagure</title>", output_text
  1410. )
  1411. self.assertIn(
  1412. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1413. output_text,
  1414. )
  1415. self.assertIn("Project updated", output_text)
  1416. @patch.dict(
  1417. "pagure.config.config", {"FEDORA_MESSAGING_NOTIFICATIONS": True}
  1418. )
  1419. @patch("pagure.decorators.admin_session_timedout")
  1420. def test_view_settings(self, ast):
  1421. """Test the view_settings endpoint."""
  1422. ast.return_value = False
  1423. # No Git repo
  1424. output = self.app.get("/foo/settings")
  1425. self.assertEqual(output.status_code, 404)
  1426. user = tests.FakeUser()
  1427. with tests.user_set(self.app.application, user):
  1428. output = self.app.get("/foo/settings")
  1429. self.assertEqual(output.status_code, 404)
  1430. tests.create_projects(self.session)
  1431. tests.create_projects_git(os.path.join(self.path, "repos"))
  1432. output = self.app.get("/test/settings")
  1433. self.assertEqual(output.status_code, 403)
  1434. # User not logged in
  1435. output = self.app.get("/test/settings")
  1436. self.assertEqual(output.status_code, 302)
  1437. user.username = "pingou"
  1438. with tests.user_set(self.app.application, user):
  1439. ast.return_value = True
  1440. output = self.app.get("/test/settings")
  1441. self.assertEqual(output.status_code, 302)
  1442. ast.return_value = False
  1443. output = self.app.get("/test/settings")
  1444. self.assertEqual(output.status_code, 200)
  1445. output_text = output.get_data(as_text=True)
  1446. self.assertIn(
  1447. "<title>Settings - test - Pagure</title>", output_text
  1448. )
  1449. self.assertIn(
  1450. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1451. output_text,
  1452. )
  1453. # Both checkbox checked before
  1454. self.assertIn(
  1455. '<input id="pull_requests" type="checkbox" value="y" '
  1456. 'name="pull_requests" checked=""/>',
  1457. output_text,
  1458. )
  1459. self.assertIn(
  1460. '<input id="issue_tracker" type="checkbox" value="y" '
  1461. 'name="issue_tracker" checked=""/>',
  1462. output_text,
  1463. )
  1464. csrf_token = output_text.split(
  1465. 'name="csrf_token" type="hidden" value="'
  1466. )[1].split('">')[0]
  1467. data = {}
  1468. output = self.app.post(
  1469. "/test/settings", data=data, follow_redirects=True
  1470. )
  1471. self.assertEqual(output.status_code, 200)
  1472. output_text = output.get_data(as_text=True)
  1473. self.assertIn(
  1474. "<title>Settings - test - Pagure</title>", output_text
  1475. )
  1476. self.assertIn(
  1477. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1478. output_text,
  1479. )
  1480. # Both checkbox are still checked
  1481. output = self.app.get("/test/settings", follow_redirects=True)
  1482. self.assertEqual(output.status_code, 200)
  1483. output_text = output.get_data(as_text=True)
  1484. self.assertIn(
  1485. "<title>Settings - test - Pagure</title>", output_text
  1486. )
  1487. self.assertIn(
  1488. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1489. output_text,
  1490. )
  1491. self.assertIn(
  1492. '<input id="pull_requests" type="checkbox" value="y" '
  1493. 'name="pull_requests" checked=""/>',
  1494. output_text,
  1495. )
  1496. self.assertIn(
  1497. '<input id="issue_tracker" type="checkbox" value="y" '
  1498. 'name="issue_tracker" checked=""/>',
  1499. output_text,
  1500. )
  1501. data = {"csrf_token": csrf_token}
  1502. output = self.app.post(
  1503. "/test/settings", data=data, follow_redirects=True
  1504. )
  1505. self.assertEqual(output.status_code, 200)
  1506. output_text = output.get_data(as_text=True)
  1507. self.assertIn(
  1508. "<title>Overview - test - Pagure</title>", output_text
  1509. )
  1510. self.assertIn(
  1511. "Edited successfully " "settings of repo: test", output_text
  1512. )
  1513. # Both checkbox are now un-checked
  1514. output = self.app.get("/test/settings", follow_redirects=True)
  1515. self.assertEqual(output.status_code, 200)
  1516. output_text = output.get_data(as_text=True)
  1517. self.assertIn(
  1518. "<title>Settings - test - Pagure</title>", output_text
  1519. )
  1520. self.assertIn(
  1521. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1522. output_text,
  1523. )
  1524. self.assertIn(
  1525. '<input id="pull_requests" type="checkbox" value="y" '
  1526. 'name="pull_requests" />',
  1527. output_text,
  1528. )
  1529. self.assertIn(
  1530. '<input id="issue_tracker" type="checkbox" value="y" '
  1531. 'name="issue_tracker" />',
  1532. output_text,
  1533. )
  1534. data = {
  1535. "csrf_token": csrf_token,
  1536. "pull_requests": "y",
  1537. "issue_tracker": "y",
  1538. "fedmsg_notifications": "y",
  1539. }
  1540. with testing.mock_sends(
  1541. pagure_messages.ProjectEditV1(
  1542. topic="pagure.project.edit",
  1543. body={
  1544. "project": {
  1545. "id": 1,
  1546. "name": "test",
  1547. "fullname": "test",
  1548. "url_path": "test",
  1549. "full_url": "http://localhost.localdomain/test",
  1550. "description": "test project #1",
  1551. "namespace": None,
  1552. "parent": None,
  1553. "date_created": ANY,
  1554. "date_modified": ANY,
  1555. "user": {
  1556. "name": "pingou",
  1557. "fullname": "PY C",
  1558. "url_path": "user/pingou",
  1559. "full_url": "http://localhost.localdomain/user/pingou",
  1560. },
  1561. "access_users": {
  1562. "owner": ["pingou"],
  1563. "admin": [],
  1564. "commit": [],
  1565. "collaborator": [],
  1566. "ticket": [],
  1567. },
  1568. "access_groups": {
  1569. "admin": [],
  1570. "commit": [],
  1571. "collaborator": [],
  1572. "ticket": [],
  1573. },
  1574. "tags": [],
  1575. "priorities": {},
  1576. "custom_keys": [],
  1577. "close_status": [
  1578. "Invalid",
  1579. "Insufficient data",
  1580. "Fixed",
  1581. "Duplicate",
  1582. ],
  1583. "milestones": {},
  1584. },
  1585. "fields": [
  1586. "fedmsg_notifications",
  1587. "issue_tracker",
  1588. "pull_requests",
  1589. ],
  1590. "agent": "pingou",
  1591. },
  1592. )
  1593. ):
  1594. output = self.app.post(
  1595. "/test/settings", data=data, follow_redirects=True
  1596. )
  1597. self.assertEqual(output.status_code, 200)
  1598. output_text = output.get_data(as_text=True)
  1599. self.assertIn(
  1600. "<title>Overview - test - Pagure</title>", output_text
  1601. )
  1602. self.assertIn(
  1603. "Edited successfully " "settings of repo: test", output_text
  1604. )
  1605. # Both checkbox are again checked
  1606. output = self.app.get("/test/settings", follow_redirects=True)
  1607. self.assertEqual(output.status_code, 200)
  1608. output_text = output.get_data(as_text=True)
  1609. self.assertIn(
  1610. "<title>Settings - test - Pagure</title>", output_text
  1611. )
  1612. self.assertIn(
  1613. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1614. output_text,
  1615. )
  1616. self.assertIn(
  1617. '<input id="pull_requests" type="checkbox" value="y" '
  1618. 'name="pull_requests" checked=""/>',
  1619. output_text,
  1620. )
  1621. self.assertIn(
  1622. '<input id="issue_tracker" type="checkbox" value="y" '
  1623. 'name="issue_tracker" checked=""/>',
  1624. output_text,
  1625. )
  1626. @patch(
  1627. "pagure.decorators.admin_session_timedout",
  1628. MagicMock(return_value=False),
  1629. )
  1630. def test_view_settings_custom_fields(self):
  1631. """Test the view_settings endpoint when the project has some custom
  1632. field for issues."""
  1633. tests.create_projects(self.session)
  1634. tests.create_projects_git(os.path.join(self.path, "repos"))
  1635. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  1636. msg = pagure.lib.query.set_custom_key_fields(
  1637. self.session,
  1638. repo,
  1639. ["bugzilla", "upstream", "reviewstatus"],
  1640. ["link", "boolean", "list"],
  1641. [
  1642. "unused data for non-list type",
  1643. "",
  1644. "ack",
  1645. "nack",
  1646. "needs review",
  1647. ],
  1648. [None, None, None],
  1649. )
  1650. self.session.commit()
  1651. self.assertEqual(msg, "List of custom fields updated")
  1652. self.assertIsNotNone(repo.issue_keys)
  1653. user = tests.FakeUser(username="pingou")
  1654. with tests.user_set(self.app.application, user):
  1655. output = self.app.get("/test/settings")
  1656. self.assertEqual(output.status_code, 200)
  1657. @patch("pagure.lib.git.generate_gitolite_acls")
  1658. @patch("pagure.decorators.admin_session_timedout")
  1659. def test_view_settings_pr_only(self, ast, gen_acl):
  1660. """Test the view_settings endpoint when turning on PR only."""
  1661. ast.return_value = False
  1662. tests.create_projects(self.session)
  1663. tests.create_projects_git(os.path.join(self.path, "repos"))
  1664. user = tests.FakeUser(username="pingou")
  1665. with tests.user_set(self.app.application, user):
  1666. output = self.app.get("/test/settings")
  1667. self.assertEqual(output.status_code, 200)
  1668. output_text = output.get_data(as_text=True)
  1669. self.assertIn(
  1670. "<title>Settings - test - Pagure</title>", output_text
  1671. )
  1672. self.assertIn(
  1673. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1674. output_text,
  1675. )
  1676. csrf_token = self.get_csrf(output=output)
  1677. data = {
  1678. "csrf_token": csrf_token,
  1679. "pull_requests": "y",
  1680. "issue_tracker": "y",
  1681. "pull_request_access_only": "y",
  1682. }
  1683. output = self.app.post(
  1684. "/test/settings", data=data, follow_redirects=True
  1685. )
  1686. self.assertEqual(output.status_code, 200)
  1687. output_text = output.get_data(as_text=True)
  1688. self.assertIn(
  1689. "<title>Overview - test - Pagure</title>", output_text
  1690. )
  1691. self.assertIn(
  1692. "Edited successfully " "settings of repo: test", output_text
  1693. )
  1694. # Both checkbox are again checked
  1695. output = self.app.get("/test/settings", follow_redirects=True)
  1696. self.assertEqual(output.status_code, 200)
  1697. output_text = output.get_data(as_text=True)
  1698. self.assertIn(
  1699. "<title>Settings - test - Pagure</title>", output_text
  1700. )
  1701. self.assertIn(
  1702. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1703. output_text,
  1704. )
  1705. self.assertIn(
  1706. '<input id="pull_requests" type="checkbox" value="y" '
  1707. 'name="pull_requests" checked=""/>',
  1708. output_text,
  1709. )
  1710. self.assertIn(
  1711. '<input id="issue_tracker" type="checkbox" value="y" '
  1712. 'name="issue_tracker" checked=""/>',
  1713. output_text,
  1714. )
  1715. self.assertIn(
  1716. '<input id="pull_request_access_only" type="checkbox" '
  1717. 'value="y" name="pull_request_access_only" checked=""/>',
  1718. output_text,
  1719. )
  1720. repo = pagure.lib.query.get_authorized_project(
  1721. self.session, "test"
  1722. )
  1723. self.assertEqual(gen_acl.call_count, 1)
  1724. args = gen_acl.call_args
  1725. self.assertEqual(args[0], tuple())
  1726. self.assertListEqual(list(args[1]), ["project"])
  1727. self.assertEqual(args[1]["project"].fullname, "test")
  1728. @patch("pagure.decorators.admin_session_timedout")
  1729. def test_fields_in_view_settings(self, ast):
  1730. """Test the default fields in view_settings endpoint."""
  1731. ast.return_value = False
  1732. # No Git repo
  1733. output = self.app.get("/foo/settings")
  1734. self.assertEqual(output.status_code, 404)
  1735. user = tests.FakeUser()
  1736. with tests.user_set(self.app.application, user):
  1737. output = self.app.get("/foo/settings")
  1738. self.assertEqual(output.status_code, 404)
  1739. item = pagure.lib.model.Project(
  1740. user_id=1, # pingou
  1741. name="test",
  1742. description="test project #1",
  1743. hook_token="aaabbbccc",
  1744. )
  1745. self.session.add(item)
  1746. self.session.commit()
  1747. tests.create_projects_git(os.path.join(self.path, "repos"))
  1748. output = self.app.get("/test/settings")
  1749. self.assertEqual(output.status_code, 403)
  1750. # User not logged in
  1751. output = self.app.get("/test/settings")
  1752. self.assertEqual(output.status_code, 302)
  1753. user.username = "pingou"
  1754. with tests.user_set(self.app.application, user):
  1755. ast.return_value = True
  1756. output = self.app.get("/test/settings")
  1757. self.assertEqual(output.status_code, 302)
  1758. ast.return_value = False
  1759. output = self.app.get("/test/settings")
  1760. self.assertEqual(output.status_code, 200)
  1761. output_text = output.get_data(as_text=True)
  1762. self.assertIn(
  1763. "<title>Settings - test - Pagure</title>", output_text
  1764. )
  1765. self.assertIn(
  1766. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  1767. output_text,
  1768. )
  1769. # Check that the priorities have their empty fields
  1770. self.assertIn(
  1771. """<div class="form-group settings-field-rows" id="priorities-list">
  1772. <div class="row hidden blank-field">
  1773. <div class="col-sm-2" >
  1774. <input type="text" name="priority_weigth"
  1775. value="" size="3" class="form-control"/>
  1776. </div>
  1777. <div class="col-sm-9">
  1778. <input type="text" name="priority_title"
  1779. value="" class="form-control"/>
  1780. </div>""",
  1781. output_text,
  1782. )
  1783. # Check that the milestones have their empty fields
  1784. self.assertIn(
  1785. """<div id="milestones">
  1786. <div class="row p-t-1 milestone" id="milestone_1">
  1787. <input type="hidden" name="milestones" value="1">
  1788. <div class="col-sm-4 p-r-0">
  1789. <input type="text" name="milestone_1_name"
  1790. value="" size="3" class="form-control"/>
  1791. </div>
  1792. <div class="col-sm-4 p-r-0">
  1793. <input type="text" name="milestone_1_date"
  1794. value="" class="form-control"/>
  1795. </div>
  1796. <div class="col-sm-2 p-r-0" >
  1797. <span class="fa fa-long-arrow-up milestone_order_up"
  1798. data-stone="1"></span>
  1799. <span class="fa fa-long-arrow-down milestone_order_bottom"
  1800. data-stone="1"></span>
  1801. </div>
  1802. <div class="col-sm-1 p-r-0" >
  1803. <input type="checkbox" name="milestone_1_active" />
  1804. </div>
  1805. </div>""",
  1806. output_text,
  1807. )
  1808. # Check that the close_status have its empty field
  1809. self.assertIn(
  1810. """<div class="form-group settings-field-rows" id="status-list">
  1811. <div class="row hidden blank-field">
  1812. <div class="col-sm-11" >
  1813. <input type="text" name="close_status"
  1814. value="" class="form-control"/>
  1815. </div>""",
  1816. output_text,
  1817. )
  1818. # Check that the custom fields have their empty fields
  1819. self.assertIn(
  1820. """<div class="form-group settings-field-rows" id="customfields-list">
  1821. <div class="row hidden blank-field">
  1822. <div class="col-sm-2 pr-0">
  1823. <input type="text" name="custom_keys"
  1824. value="" class="form-control"/>
  1825. </div>
  1826. <div class="col-sm-2 pr-0">
  1827. <select name="custom_keys_type" class="form-control custom-keys">
  1828. <option value="text">Text</option>
  1829. <option value="boolean">Boolean</option>
  1830. <option value="link">Link</option>
  1831. <option value="list">List</option>
  1832. <option value="date">Date</option>
  1833. </select>
  1834. </div>
  1835. <div class="col-sm-6 pr-0">
  1836. <input title="Comma separated list items" type="text" name="custom_keys_data" value="" class="form-control custom-keys-list hidden" id="custom_keys_list"/>
  1837. </div>
  1838. <div class="col-sm-1 pr-0">
  1839. <input type="checkbox" name="custom_keys_notify" title="Trigger email notification when updated" class="form-control"/>
  1840. </div>""",
  1841. output_text,
  1842. )
  1843. def test_view_forks(self):
  1844. """Test the view_forks endpoint."""
  1845. output = self.app.get("/foo/forks", follow_redirects=True)
  1846. self.assertEqual(output.status_code, 404)
  1847. tests.create_projects(self.session)
  1848. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1849. output = self.app.get("/test/forks", follow_redirects=True)
  1850. self.assertEqual(output.status_code, 200)
  1851. output_text = output.get_data(as_text=True)
  1852. self.assertIn("This project has not been forked.", output_text)
  1853. @patch.dict("pagure.config.config", {"CASE_SENSITIVE": True})
  1854. def test_view_repo_case_sensitive(self):
  1855. """Test the view_repo endpoint."""
  1856. tests.create_projects(self.session)
  1857. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1858. output = self.app.get("/test")
  1859. self.assertEqual(output.status_code, 200)
  1860. output_text = output.get_data(as_text=True)
  1861. self.assertIn("<p>This repo is brand new!</p>", output_text)
  1862. output = self.app.get("/TEST")
  1863. self.assertEqual(output.status_code, 404)
  1864. def test_view_repo_more_button_absent_no_auth(self):
  1865. """Test the view_repo endpoint and check if the "more" button is
  1866. absent when not logged in."""
  1867. tests.create_projects(self.session)
  1868. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1869. output = self.app.get("/test")
  1870. self.assertEqual(output.status_code, 200)
  1871. output_text = output.get_data(as_text=True)
  1872. self.assertNotIn(
  1873. '<span class="pull-xs-right"><a data-toggle="collapse" '
  1874. 'href="#moregiturls"',
  1875. output_text,
  1876. )
  1877. self.assertIn("<p>This repo is brand new!</p>", output_text)
  1878. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  1879. self.assertIn(
  1880. '<span class="d-none d-md-inline">Stats</span>', output_text
  1881. )
  1882. self.perfMaxWalks(0, 0)
  1883. self.perfReset()
  1884. def test_view_repo_more_button_present(self):
  1885. """Test the view_repo endpoint and check if the "more" button is
  1886. present when it should be."""
  1887. tests.create_projects(self.session)
  1888. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1889. pingou = pagure.lib.query.get_user(self.session, "pingou")
  1890. pagure.lib.query.add_sshkey_to_project_or_user(
  1891. session=self.session,
  1892. user=pingou,
  1893. ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==",
  1894. pushaccess=True,
  1895. creator=pingou,
  1896. )
  1897. self.session.commit()
  1898. repo = pagure.lib.query._get_project(self.session, "test")
  1899. pagure.lib.query.update_read_only_mode(
  1900. self.session, repo, read_only=False
  1901. )
  1902. self.session.commit()
  1903. user = tests.FakeUser(username="pingou")
  1904. with tests.user_set(self.app.application, user):
  1905. output = self.app.get("/test")
  1906. self.assertEqual(output.status_code, 200)
  1907. output_text = output.get_data(as_text=True)
  1908. self.assertIn(
  1909. '<input class="form-control bg-white select-on-focus" type="text" '
  1910. 'value="ssh://git@localhost.localdomain/tickets/test.git" readonly>',
  1911. output_text,
  1912. )
  1913. self.assertIn("<p>This repo is brand new!</p>", output_text)
  1914. self.assertIn(
  1915. "<title>Overview - test - Pagure</title>", output_text
  1916. )
  1917. self.assertIn(
  1918. '<span class="d-none d-md-inline">Stats</span>', output_text
  1919. )
  1920. self.perfMaxWalks(0, 0)
  1921. self.perfReset()
  1922. def test_view_repo_more_button_absent_no_access(self):
  1923. """Test the view_repo endpoint and check if the "more" button is
  1924. absent if the user doesn't have access to the project."""
  1925. tests.create_projects(self.session)
  1926. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1927. user = tests.FakeUser(username="foo")
  1928. with tests.user_set(self.app.application, user):
  1929. output = self.app.get("/test")
  1930. self.assertEqual(output.status_code, 200)
  1931. output_text = output.get_data(as_text=True)
  1932. self.assertNotIn(
  1933. '<input class="form-control bg-white select-on-focus" type="text" '
  1934. 'value="ssh://git@localhost.localdomain/tickets/test.git" readonly>',
  1935. output_text,
  1936. )
  1937. self.assertIn("<p>This repo is brand new!</p>", output_text)
  1938. self.assertIn(
  1939. "<title>Overview - test - Pagure</title>", output_text
  1940. )
  1941. self.assertIn(
  1942. '<span class="d-none d-md-inline">Stats</span>', output_text
  1943. )
  1944. self.perfMaxWalks(0, 0)
  1945. self.perfReset()
  1946. def test_view_repo_ssh_key_not_uploaded_no_ssh_url(self):
  1947. """Test viewing repo when user hasn't uploaded SSH key yet
  1948. and thus should see a message instead of url for SSH cloning."""
  1949. tests.create_projects(self.session)
  1950. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1951. user = tests.FakeUser(username="pingou")
  1952. with tests.user_set(self.app.application, user):
  1953. output = self.app.get("/test")
  1954. self.assertEqual(output.status_code, 200)
  1955. output_text = output.get_data(as_text=True)
  1956. self.assertIn(
  1957. "You need to upload SSH key to be able to clone over SSH",
  1958. output_text,
  1959. )
  1960. def test_view_repo_read_only_no_ssh_url(self):
  1961. """Test viewing repo that is still readonly and thus user
  1962. should see a message instead of url for SSH cloning."""
  1963. tests.create_projects(self.session)
  1964. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1965. repo = pagure.lib.query._get_project(self.session, "test")
  1966. pagure.lib.query.update_read_only_mode(
  1967. self.session, repo, read_only=True
  1968. )
  1969. pingou = pagure.lib.query.get_user(self.session, "pingou")
  1970. pagure.lib.query.add_sshkey_to_project_or_user(
  1971. session=self.session,
  1972. user=pingou,
  1973. ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==",
  1974. pushaccess=True,
  1975. creator=pingou,
  1976. )
  1977. self.session.commit()
  1978. user = tests.FakeUser(username="pingou")
  1979. with tests.user_set(self.app.application, user):
  1980. output = self.app.get("/test")
  1981. self.assertEqual(output.status_code, 200)
  1982. output_text = output.get_data(as_text=True)
  1983. self.assertIn("Cloning over SSH is disabled.", output_text)
  1984. def test_view_repo(self):
  1985. """Test the view_repo endpoint."""
  1986. output = self.app.get("/foo")
  1987. # No project registered in the DB
  1988. self.assertEqual(output.status_code, 404)
  1989. tests.create_projects(self.session)
  1990. output = self.app.get("/test")
  1991. # No git repo associated
  1992. self.assertEqual(output.status_code, 404)
  1993. self.perfMaxWalks(0, 0)
  1994. self.perfReset()
  1995. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  1996. output = self.app.get("/test")
  1997. self.assertEqual(output.status_code, 200)
  1998. output_text = output.get_data(as_text=True)
  1999. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2000. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  2001. self.assertIn(
  2002. '<a class="nav-link" href="/test/stats">\n '
  2003. '<i class="fa fa-line-chart fa-fw text-muted"></i>\n '
  2004. '<span class="d-none d-md-inline">Stats</span>\n </a>',
  2005. output_text,
  2006. )
  2007. self.perfMaxWalks(0, 0)
  2008. self.perfReset()
  2009. output = self.app.get("/test/")
  2010. self.assertEqual(output.status_code, 200)
  2011. output_text = output.get_data(as_text=True)
  2012. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2013. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  2014. self.perfMaxWalks(0, 0)
  2015. self.perfReset()
  2016. # Add some content to the git repo
  2017. tests.add_content_git_repo(
  2018. os.path.join(self.path, "repos", "test.git")
  2019. )
  2020. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2021. tests.add_readme_git_repo(
  2022. os.path.join(self.path, "repos", "test.git"), "README.txt"
  2023. )
  2024. tests.add_readme_git_repo(
  2025. os.path.join(self.path, "repos", "test.git"), "README.dummy"
  2026. )
  2027. self.perfReset()
  2028. # Authenticated, the Fork button appears
  2029. user = tests.FakeUser(username="pingou")
  2030. with tests.user_set(self.app.application, user):
  2031. output = self.app.get("/test")
  2032. self.assertEqual(output.status_code, 200)
  2033. output_text = output.get_data(as_text=True)
  2034. self.assertIn(
  2035. '<i class="fa fa-code-fork fa-fw"></i> Fork</button>',
  2036. output_text,
  2037. )
  2038. self.assertFalse("<p>This repo is brand new!</p>" in output_text)
  2039. self.assertNotIn("Forked from", output_text)
  2040. self.assertNotIn("README.txt", output_text)
  2041. self.assertNotIn("README.dummy", output_text)
  2042. self.assertIn(
  2043. "<title>Overview - test - Pagure</title>", output_text
  2044. )
  2045. self.perfMaxWalks(3, 8) # Target: (1, 3)
  2046. self.perfReset()
  2047. # Non-authenticated, the Fork button does not appear
  2048. output = self.app.get("/test")
  2049. self.assertEqual(output.status_code, 200)
  2050. output_text = output.get_data(as_text=True)
  2051. self.assertNotIn(
  2052. '<i class="fa fa-code-fork"></i>Fork</button>', output_text
  2053. )
  2054. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2055. self.assertNotIn("Forked from", output_text)
  2056. self.assertNotIn("README.txt", output_text)
  2057. self.assertNotIn("README.dummy", output_text)
  2058. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  2059. self.perfMaxWalks(3, 8) # Target: (1, 3)
  2060. self.perfReset()
  2061. # Turn that repo into a fork
  2062. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  2063. repo.parent_id = 2
  2064. repo.is_fork = True
  2065. self.session.add(repo)
  2066. self.session.commit()
  2067. # View the repo in the UI
  2068. output = self.app.get("/test")
  2069. self.assertEqual(output.status_code, 404)
  2070. # Add some content to the git repo
  2071. tests.add_content_git_repo(
  2072. os.path.join(self.path, "repos", "forks", "pingou", "test.git")
  2073. )
  2074. tests.add_readme_git_repo(
  2075. os.path.join(self.path, "repos", "forks", "pingou", "test.git")
  2076. )
  2077. # Authenticated and already have a fork, the View Fork button appears
  2078. user = tests.FakeUser(username="pingou")
  2079. with tests.user_set(self.app.application, user):
  2080. output = self.app.get("/fork/pingou/test")
  2081. self.assertEqual(output.status_code, 200)
  2082. output_text = output.get_data(as_text=True)
  2083. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2084. self.assertIn(
  2085. "<title>Overview - test - Pagure</title>", output_text
  2086. )
  2087. self.assertIn("Forked from", output_text)
  2088. self.assertNotIn(
  2089. '<i class="fa fa-code-fork fa-fw"></i> Fork</button>',
  2090. output_text,
  2091. )
  2092. self.assertIn(
  2093. '<i class="fa fa-code-fork fa-fw"></i> View Upstream',
  2094. output_text,
  2095. )
  2096. self.perfMaxWalks(1, 3)
  2097. self.perfReset()
  2098. # Authenticated, the Fork button appears
  2099. user = tests.FakeUser(username="foo")
  2100. with tests.user_set(self.app.application, user):
  2101. output = self.app.get("/fork/pingou/test")
  2102. self.assertEqual(output.status_code, 200)
  2103. output_text = output.get_data(as_text=True)
  2104. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2105. self.assertIn(
  2106. "<title>Overview - test - Pagure</title>", output_text
  2107. )
  2108. self.assertIn("Forked from", output_text)
  2109. self.assertNotIn(
  2110. '<i class="fa fa-code-fork fa-fw"></i> View Upstream',
  2111. output_text,
  2112. )
  2113. self.assertIn(
  2114. '<i class="fa fa-code-fork fa-fw"></i> Fork</button>',
  2115. output_text,
  2116. )
  2117. self.perfMaxWalks(1, 3)
  2118. self.perfReset()
  2119. # Non-authenticated, the Fork button does not appear
  2120. output = self.app.get("/fork/pingou/test")
  2121. self.assertEqual(output.status_code, 200)
  2122. output_text = output.get_data(as_text=True)
  2123. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2124. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  2125. self.assertIn("Forked from", output_text)
  2126. self.assertNotIn(
  2127. '<i class="fa fa-code-fork"></i> View Fork', output_text
  2128. )
  2129. self.assertNotIn(
  2130. '<i class="fa fa-code-fork"></i>Fork</button>', output_text
  2131. )
  2132. self.perfMaxWalks(1, 3)
  2133. self.perfReset()
  2134. # Add a fork of a fork
  2135. item = pagure.lib.model.Project(
  2136. user_id=1, # pingou
  2137. name="test3",
  2138. description="test project #3",
  2139. is_fork=True,
  2140. parent_id=1,
  2141. hook_token="aaabbbmmm",
  2142. )
  2143. self.session.add(item)
  2144. self.session.commit()
  2145. tests.add_content_git_repo(
  2146. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2147. )
  2148. tests.add_readme_git_repo(
  2149. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2150. )
  2151. tests.add_commit_git_repo(
  2152. os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
  2153. ncommits=10,
  2154. )
  2155. output = self.app.get("/fork/pingou/test3")
  2156. self.assertEqual(output.status_code, 200)
  2157. output_text = output.get_data(as_text=True)
  2158. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2159. self.assertIn("<title>Overview - test3 - Pagure</title>", output_text)
  2160. self.assertIn("Forked from", output_text)
  2161. self.perfMaxWalks(3, 18) # Ideal: (1, 3)
  2162. self.perfReset()
  2163. def test_view_repo_empty(self):
  2164. """Test the view_repo endpoint on a repo w/o master branch."""
  2165. tests.create_projects(self.session)
  2166. # Create a git repo to play with
  2167. gitrepo = os.path.join(self.path, "repos", "test.git")
  2168. pygit2.init_repository(gitrepo, bare=True)
  2169. # Create a fork of this repo
  2170. newpath = tempfile.mkdtemp(prefix="pagure-viewrepo-test")
  2171. new_repo = pygit2.clone_repository(gitrepo, newpath)
  2172. # Edit the sources file again
  2173. with open(os.path.join(newpath, "sources"), "w") as stream:
  2174. stream.write("foo\n bar\nbaz\n boose")
  2175. new_repo.index.add("sources")
  2176. new_repo.index.write()
  2177. # Commits the files added
  2178. tree = new_repo.index.write_tree()
  2179. author = pygit2.Signature("Alice Author", "alice@authors.tld")
  2180. committer = pygit2.Signature("Cecil Committer", "cecil@committers.tld")
  2181. new_repo.create_commit(
  2182. "refs/heads/feature",
  2183. author,
  2184. committer,
  2185. "A commit on branch feature",
  2186. tree,
  2187. [],
  2188. )
  2189. refname = "refs/heads/feature"
  2190. ori_remote = new_repo.remotes[0]
  2191. PagureRepo.push(ori_remote, refname)
  2192. output = self.app.get("/test")
  2193. self.assertEqual(output.status_code, 200)
  2194. output_text = output.get_data(as_text=True)
  2195. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2196. self.assertNotIn("Forked from", output_text)
  2197. self.assertIn("<title>Overview - test - Pagure</title>", output_text)
  2198. self.assertEqual(output_text.count('<span class="commitid">'), 0)
  2199. shutil.rmtree(newpath)
  2200. '''
  2201. def test_view_repo_branch(self):
  2202. """ Test the view_repo_branch endpoint. """
  2203. output = self.app.get('/foo/branch/master')
  2204. # No project registered in the DB
  2205. self.assertEqual(output.status_code, 404)
  2206. tests.create_projects(self.session)
  2207. output = self.app.get('/test/branch/master')
  2208. # No git repo associated
  2209. self.assertEqual(output.status_code, 404)
  2210. tests.create_projects_git(os.path.join(self.path, 'repos'), bare=True)
  2211. output = self.app.get('/test/branch/master')
  2212. self.assertEqual(output.status_code, 404)
  2213. # Add some content to the git repo
  2214. tests.add_content_git_repo(os.path.join(self.path, 'repos',
  2215. 'test.git'))
  2216. tests.add_readme_git_repo(os.path.join(self.path, 'repos', 'test.git'))
  2217. # Turn that repo into a fork
  2218. repo = pagure.lib.query.get_authorized_project(self.session, 'test')
  2219. repo.parent_id = 2
  2220. repo.is_fork = True
  2221. self.session.add(repo)
  2222. self.session.commit()
  2223. # Add some content to the git repo
  2224. tests.add_content_git_repo(
  2225. os.path.join(self.path, 'repos', 'forks', 'pingou', 'test.git'))
  2226. tests.add_readme_git_repo(
  2227. os.path.join(self.path, 'repos', 'forks', 'pingou', 'test.git'))
  2228. output = self.app.get('/fork/pingou/test/')
  2229. self.assertEqual(output.status_code, 200)
  2230. output_text = output.get_data(as_text=True)
  2231. self.assertNotIn('<p>This repo is brand new!</p>', output_text)
  2232. self.assertIn('Forked from', output_text)
  2233. # Add a fork of a fork
  2234. item = pagure.lib.model.Project(
  2235. user_id=1, # pingou
  2236. name='test3',
  2237. description='test project #3',
  2238. is_fork=True,
  2239. parent_id=1,
  2240. hook_token='aaabbbnnn',
  2241. )
  2242. self.session.add(item)
  2243. self.session.commit()
  2244. tests.add_content_git_repo(
  2245. os.path.join(self.path, 'repos', 'forks', 'pingou', 'test3.git'))
  2246. tests.add_readme_git_repo(
  2247. os.path.join(self.path, 'repos', 'forks', 'pingou', 'test3.git'))
  2248. tests.add_commit_git_repo(
  2249. os.path.join(self.path, 'repos', 'forks', 'pingou', 'test3.git'),
  2250. ncommits=10)
  2251. output = self.app.get('/fork/pingou/test3/')
  2252. self.assertEqual(output.status_code, 200)
  2253. output_text = output.get_data(as_text=True)
  2254. self.assertNotIn('<p>This repo is brand new!</p>', output_text)
  2255. self.assertIn('Forked from', output_text)
  2256. '''
  2257. def test_view_commits(self):
  2258. """Test the view_commits endpoint."""
  2259. output = self.app.get("/foo/commits")
  2260. # No project registered in the DB
  2261. self.assertEqual(output.status_code, 404)
  2262. tests.create_projects(self.session)
  2263. output = self.app.get("/test/commits")
  2264. # No git repo associated
  2265. self.assertEqual(output.status_code, 404)
  2266. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2267. output = self.app.get("/test/commits")
  2268. self.assertEqual(output.status_code, 200)
  2269. output_text = output.get_data(as_text=True)
  2270. self.assertIn("<p>This repo is brand new!</p>", output_text)
  2271. self.assertIn("<title>Commits - test - Pagure</title>", output_text)
  2272. # Add some content to the git repo
  2273. tests.add_content_git_repo(
  2274. os.path.join(self.path, "repos", "test.git")
  2275. )
  2276. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2277. output = self.app.get("/test/commits")
  2278. self.assertEqual(output.status_code, 200)
  2279. output_text = output.get_data(as_text=True)
  2280. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2281. self.assertNotIn("Forked from", output_text)
  2282. self.assertIn("<title>Commits - test - Pagure</title>", output_text)
  2283. output = self.app.get("/test/commits/master")
  2284. self.assertEqual(output.status_code, 200)
  2285. output_text = output.get_data(as_text=True)
  2286. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2287. self.assertNotIn("Forked from", output_text)
  2288. self.assertIn("<title>Commits - test - Pagure</title>", output_text)
  2289. # Turn that repo into a fork
  2290. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  2291. repo.parent_id = 2
  2292. repo.is_fork = True
  2293. self.session.add(repo)
  2294. self.session.commit()
  2295. # View the repo in the UI
  2296. output = self.app.get("/test/commits")
  2297. self.assertEqual(output.status_code, 404)
  2298. # Add some content to the git repo
  2299. tests.add_content_git_repo(
  2300. os.path.join(self.path, "repos", "forks", "pingou", "test.git")
  2301. )
  2302. tests.add_readme_git_repo(
  2303. os.path.join(self.path, "repos", "forks", "pingou", "test.git")
  2304. )
  2305. output = self.app.get("/fork/pingou/test/commits?page=abc")
  2306. self.assertEqual(output.status_code, 200)
  2307. output_text = output.get_data(as_text=True)
  2308. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2309. self.assertIn("<title>Commits - test - Pagure</title>", output_text)
  2310. self.assertIn("Forked from", output_text)
  2311. # Add a fork of a fork
  2312. item = pagure.lib.model.Project(
  2313. user_id=1, # pingou
  2314. name="test3",
  2315. description="test project #3",
  2316. is_fork=True,
  2317. parent_id=1,
  2318. hook_token="aaabbbooo",
  2319. )
  2320. self.session.add(item)
  2321. self.session.commit()
  2322. tests.add_content_git_repo(
  2323. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2324. )
  2325. tests.add_readme_git_repo(
  2326. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2327. )
  2328. tests.add_commit_git_repo(
  2329. os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
  2330. ncommits=10,
  2331. )
  2332. # list is empty
  2333. output = self.app.get("/fork/pingou/test3/commits/fobranch")
  2334. self.assertEqual(output.status_code, 200)
  2335. output_text = output.get_data(as_text=True)
  2336. self.assertIn(
  2337. '<div class="list-group my-2">\n\n\n </div>', output_text
  2338. )
  2339. self.assertIn(
  2340. 'Commits <span class="badge badge-secondary"> 0</span>',
  2341. output_text,
  2342. )
  2343. output = self.app.get("/fork/pingou/test3/commits")
  2344. self.assertEqual(output.status_code, 200)
  2345. output_text = output.get_data(as_text=True)
  2346. self.assertNotIn("<p>This repo is brand new!</p>", output_text)
  2347. self.assertIn("<title>Commits - test3 - Pagure</title>", output_text)
  2348. self.assertIn("Forked from", output_text)
  2349. def test_view_commits_from_tag(self):
  2350. """Test the view_commits endpoint given a tag."""
  2351. tests.create_projects(self.session)
  2352. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2353. # Add a README to the git repo - First commit
  2354. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2355. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2356. first_commit = repo.revparse_single("HEAD")
  2357. tagger = pygit2.Signature("Alice Doe", "adoe@example.com", 12347, 0)
  2358. repo.create_tag(
  2359. "0.0.1",
  2360. first_commit.oid.hex,
  2361. pygit2.GIT_OBJ_COMMIT,
  2362. tagger,
  2363. "Release 0.0.1",
  2364. )
  2365. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2366. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2367. latest_commit = repo.revparse_single("HEAD")
  2368. output = self.app.get("/test/commits/0.0.1")
  2369. self.assertEqual(output.status_code, 200)
  2370. output_text = output.get_data(as_text=True)
  2371. self.assertIn(first_commit.oid.hex, output_text)
  2372. self.assertNotIn(latest_commit.oid.hex, output_text)
  2373. self.assertIn("<title>Commits - test - Pagure</title>", output_text)
  2374. self.assertEqual(output_text.count('<span id="commit-actions">'), 1)
  2375. def test_view_commits_from_blob(self):
  2376. """Test the view_commits endpoint given a blob."""
  2377. tests.create_projects(self.session)
  2378. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2379. tests.add_content_to_git(os.path.join(self.path, "repos", "test.git"))
  2380. # Retrieve the blob of the `sources` file in head
  2381. repo_obj = pygit2.Repository(
  2382. os.path.join(self.path, "repos", "test.git")
  2383. )
  2384. commit = repo_obj[repo_obj.head.target]
  2385. content = get_file_in_tree(
  2386. repo_obj, commit.tree, ["sources"], bail_on_tree=True
  2387. )
  2388. output = self.app.get("/test/commits/%s" % content.oid.hex)
  2389. self.assertEqual(output.status_code, 404)
  2390. output_text = output.get_data(as_text=True)
  2391. self.assertIn("Invalid branch/identifier provided", output_text)
  2392. def test_view_commit_from_tag(self):
  2393. """Test the view_commit endpoint given a tag."""
  2394. tests.create_projects(self.session)
  2395. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2396. # Add a README to the git repo - First commit
  2397. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2398. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2399. first_commit = repo.revparse_single("HEAD")
  2400. tagger = pygit2.Signature("Alice Doe", "adoe@example.com", 12347, 0)
  2401. repo.create_tag(
  2402. "0.0.1",
  2403. first_commit.oid.hex,
  2404. pygit2.GIT_OBJ_COMMIT,
  2405. tagger,
  2406. "Release 0.0.1",
  2407. )
  2408. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2409. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2410. project = pagure.lib.query.get_authorized_project(self.session, "test")
  2411. tags = pagure.lib.git.get_git_tags_objects(project)
  2412. tag_id = tags[0]["object"].oid
  2413. commit_id = tags[0]["object"].peel(pygit2.Commit).hex
  2414. output = self.app.get("/test/c/%s" % tag_id)
  2415. self.assertEqual(output.status_code, 302)
  2416. output = self.app.get("/test/c/%s" % tag_id, follow_redirects=True)
  2417. self.assertEqual(output.status_code, 200)
  2418. output_text = output.get_data(as_text=True)
  2419. self.assertIn(first_commit.oid.hex, output_text)
  2420. self.assertIn(
  2421. "<title>Commit - test - %s - Pagure</title>" % commit_id,
  2422. output_text,
  2423. )
  2424. def test_compare_commits(self):
  2425. """Test the compare_commits endpoint."""
  2426. # First two commits comparison
  2427. def compare_first_two(c1, c2):
  2428. # View commits comparison
  2429. output = self.app.get("/test/c/%s..%s" % (c2.oid.hex, c1.oid.hex))
  2430. self.assertEqual(output.status_code, 200)
  2431. output_text = output.get_data(as_text=True)
  2432. self.assertIn(
  2433. "<title>Diff from %s to %s - test\n - Pagure</title>"
  2434. % (c2.oid.hex, c1.oid.hex),
  2435. output_text,
  2436. )
  2437. self.assertIn(
  2438. ' <span class="badge-light border border-secondary badge">%s</span>\n ..\n <span class="badge-light border border-secondary badge">%s</span>\n'
  2439. % (c2.oid.hex, c1.oid.hex),
  2440. output_text,
  2441. )
  2442. self.assertNotIn('id="show_hidden_commits"', output_text)
  2443. self.assertIn(
  2444. '<pre class="alert-danger"><code>- Row 0</code></pre>',
  2445. output_text,
  2446. )
  2447. # View inverse commits comparison
  2448. output = self.app.get("/test/c/%s..%s" % (c1.oid.hex, c2.oid.hex))
  2449. self.assertEqual(output.status_code, 200)
  2450. output_text = output.get_data(as_text=True)
  2451. self.assertIn(
  2452. "<title>Diff from %s to %s - test\n - Pagure</title>"
  2453. % (c1.oid.hex, c2.oid.hex),
  2454. output_text,
  2455. )
  2456. self.assertNotIn('id="show_hidden_commits"', output_text)
  2457. self.assertIn(
  2458. ' <span class="badge-light border border-secondary badge">%s</span>\n ..\n <span class="badge-light border border-secondary badge">%s</span>\n'
  2459. % (c1.oid.hex, c2.oid.hex),
  2460. output_text,
  2461. )
  2462. self.assertIn(
  2463. '<pre class="alert-success"><code>+ Row 0</code></pre>',
  2464. output_text,
  2465. )
  2466. def compare_all(c1, c3):
  2467. # View commits comparison
  2468. output = self.app.get("/test/c/%s..%s" % (c1.oid.hex, c3.oid.hex))
  2469. self.assertEqual(output.status_code, 200)
  2470. output_text = output.get_data(as_text=True)
  2471. self.assertIn(
  2472. "<title>Diff from %s to %s - test\n - Pagure</title>"
  2473. % (c1.oid.hex, c3.oid.hex),
  2474. output_text,
  2475. )
  2476. self.assertIn(
  2477. ' <span class="badge-light border border-secondary badge">%s</span>\n ..\n <span class="badge-light border border-secondary badge">%s</span>\n'
  2478. % (c1.oid.hex, c3.oid.hex),
  2479. output_text,
  2480. )
  2481. self.assertIn(
  2482. '<pre class="alert-success"><code>+ Row 0</code></pre>',
  2483. output_text,
  2484. )
  2485. self.assertEqual(
  2486. output_text.count(
  2487. '<pre class="alert-success"><code>+ Row 0</code></pre>'
  2488. ),
  2489. 2,
  2490. )
  2491. self.assertIn('<a class="pointer">1 more commits...', output_text)
  2492. self.assertIn(
  2493. 'title="View file as of 4829cfa">Šource</a>', output_text
  2494. )
  2495. self.assertIn(
  2496. '<div class="btn btn-outline-success disabled opacity-100 border-0 font-weight-bold">\n'
  2497. " file added\n",
  2498. output_text,
  2499. )
  2500. # View inverse commits comparison
  2501. output = self.app.get("/test/c/%s..%s" % (c3.oid.hex, c1.oid.hex))
  2502. self.assertEqual(output.status_code, 200)
  2503. output_text = output.get_data(as_text=True)
  2504. self.assertIn(
  2505. "<title>Diff from %s to %s - test\n - Pagure</title>"
  2506. % (c3.oid.hex, c1.oid.hex),
  2507. output_text,
  2508. )
  2509. self.assertIn(
  2510. ' <span class="badge-light border border-secondary badge">%s</span>\n ..\n <span class="badge-light border border-secondary badge">%s</span>\n'
  2511. % (c3.oid.hex, c1.oid.hex),
  2512. output_text,
  2513. )
  2514. self.assertIn(
  2515. '<pre class="text-muted"><code>@@ -1,2 +1,1 @@</code></pre>',
  2516. output_text,
  2517. )
  2518. self.assertIn(
  2519. '<pre class="alert-danger"><code>- Row 0</code></pre>',
  2520. output_text,
  2521. )
  2522. self.assertIn('<a class="pointer">1 more commits...', output_text)
  2523. self.assertIn(
  2524. 'title="View file as of 0000000">Šource</a>', output_text
  2525. )
  2526. self.assertIn(
  2527. '<div class="btn btn-outline-danger disabled opacity-100 border-0 font-weight-bold">\n'
  2528. " file removed\n",
  2529. output_text,
  2530. )
  2531. def compare_with_symlink(c3, c4):
  2532. # View comparison of commits with symlink
  2533. # we only test that the patch itself renders correctly,
  2534. # the rest of the logic is already tested in the other functions
  2535. output = self.app.get("/test/c/%s..%s" % (c3.oid.hex, c4.oid.hex))
  2536. self.assertEqual(output.status_code, 200)
  2537. output_text = output.get_data(as_text=True)
  2538. print(output_text)
  2539. self.assertIn(
  2540. "<title>Diff from %s to %s - test\n - Pagure</title>"
  2541. % (c3.oid.hex, c4.oid.hex),
  2542. output_text,
  2543. )
  2544. self.assertIn(
  2545. '<pre class="alert-success"><code>+ Source </code></pre>',
  2546. output_text,
  2547. )
  2548. output = self.app.get("/foo/bar")
  2549. # No project registered in the DB
  2550. self.assertEqual(output.status_code, 404)
  2551. tests.create_projects(self.session)
  2552. output = self.app.get("/test/bar")
  2553. # No git repo associated
  2554. self.assertEqual(output.status_code, 404)
  2555. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2556. output = self.app.get("/test/bar")
  2557. self.assertEqual(output.status_code, 404)
  2558. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2559. # Add one commit to git repo
  2560. tests.add_commit_git_repo(
  2561. os.path.join(self.path, "repos", "test.git"), ncommits=1
  2562. )
  2563. c1 = repo.revparse_single("HEAD")
  2564. # Add another commit to git repo
  2565. tests.add_commit_git_repo(
  2566. os.path.join(self.path, "repos", "test.git"), ncommits=1
  2567. )
  2568. c2 = repo.revparse_single("HEAD")
  2569. # Add one more commit to git repo
  2570. tests.add_commit_git_repo(
  2571. os.path.join(self.path, "repos", "test.git"),
  2572. ncommits=1,
  2573. filename="Šource",
  2574. )
  2575. c3 = repo.revparse_single("HEAD")
  2576. tests.add_commit_git_repo(
  2577. os.path.join(self.path, "repos", "test.git"),
  2578. ncommits=1,
  2579. filename="Source-sl",
  2580. symlink_to="Source",
  2581. )
  2582. c4 = repo.revparse_single("HEAD")
  2583. compare_first_two(c1, c2)
  2584. compare_all(c1, c3)
  2585. compare_with_symlink(c3, c4)
  2586. user = tests.FakeUser()
  2587. # Set user logged in
  2588. with tests.user_set(self.app.application, user):
  2589. compare_first_two(c1, c2)
  2590. compare_all(c1, c3)
  2591. compare_with_symlink(c3, c4)
  2592. def test_view_file(self):
  2593. """Test the view_file endpoint."""
  2594. output = self.app.get("/foo/blob/foo/f/sources")
  2595. # No project registered in the DB
  2596. self.assertEqual(output.status_code, 404)
  2597. tests.create_projects(self.session)
  2598. output = self.app.get("/test/blob/foo/f/sources")
  2599. # No git repo associated
  2600. self.assertEqual(output.status_code, 404)
  2601. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2602. output = self.app.get("/test/blob/foo/f/sources")
  2603. self.assertEqual(output.status_code, 404)
  2604. # Add some content to the git repo
  2605. tests.add_content_git_repo(
  2606. os.path.join(self.path, "repos", "test.git")
  2607. )
  2608. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2609. tests.add_binary_git_repo(
  2610. os.path.join(self.path, "repos", "test.git"), "test.jpg"
  2611. )
  2612. tests.add_binary_git_repo(
  2613. os.path.join(self.path, "repos", "test.git"), "test_binary"
  2614. )
  2615. output = self.app.get("/test/blob/master/foofile")
  2616. self.assertEqual(output.status_code, 404)
  2617. # View in a branch
  2618. output = self.app.get("/test/blob/master/f/sources")
  2619. self.assertEqual(output.status_code, 200)
  2620. output_text = output.get_data(as_text=True)
  2621. self.assertIn(
  2622. '<pre class="syntaxhighlightblock">'
  2623. '<code class="lang-plaintext">foo\n bar</code></pre>',
  2624. output_text,
  2625. )
  2626. # Empty files should also be displayed
  2627. tests.add_content_to_git(
  2628. os.path.join(self.path, "repos", "test.git"),
  2629. filename="emptyfile.md",
  2630. content="",
  2631. )
  2632. output = self.app.get("/test/blob/master/f/emptyfile.md")
  2633. self.assertEqual(output.status_code, 200)
  2634. output_text = output.get_data(as_text=True)
  2635. self.assertIn(
  2636. '<a class="btn btn-secondary btn-sm" '
  2637. 'href="/test/raw/master/f/emptyfile.md" '
  2638. 'title="View as raw">Raw</a>',
  2639. output_text,
  2640. )
  2641. self.assertIn(
  2642. '<div class="m-2">\n' " \n </div>", output_text
  2643. )
  2644. # View what's supposed to be an image
  2645. output = self.app.get("/test/blob/master/f/test.jpg")
  2646. self.assertEqual(output.status_code, 200)
  2647. self.assertNotIn(b"<html", output.data)
  2648. # View by commit id
  2649. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2650. commit = repo.revparse_single("HEAD")
  2651. output = self.app.get("/test/blob/%s/f/test.jpg" % commit.oid.hex)
  2652. self.assertEqual(output.status_code, 200)
  2653. self.assertNotIn(b"<html", output.data)
  2654. # View by image name -- somehow we support this
  2655. output = self.app.get("/test/blob/master/f/test.jpg")
  2656. self.assertEqual(output.status_code, 200)
  2657. self.assertNotIn(b"<html", output.data)
  2658. # View binary file
  2659. output = self.app.get("/test/blob/master/f/test_binary")
  2660. self.assertEqual(output.status_code, 200)
  2661. self.assertNotIn(b"<html", output.data)
  2662. # View folder
  2663. output = self.app.get("/test/blob/master/f/folder1")
  2664. self.assertEqual(output.status_code, 200)
  2665. output_text = output.get_data(as_text=True)
  2666. self.assertIn(
  2667. '<li class="active breadcrumb-item">\n '
  2668. '<span class="fa fa-folder" data-glyph="">\n '
  2669. "</span>&nbsp; folder1\n </li>",
  2670. output_text,
  2671. )
  2672. self.assertIn("<title>Tree - test - Pagure</title>", output_text)
  2673. self.assertIn(
  2674. '<a href="/test/blob/master/f/folder1/folder2">', output_text
  2675. )
  2676. # Verify the nav links correctly when viewing a nested folder/file.
  2677. output = self.app.get("/test/blob/master/f/folder1/folder2/file")
  2678. self.assertEqual(output.status_code, 200)
  2679. output_text = output.get_data(as_text=True)
  2680. self.assertIn(
  2681. '<li class="breadcrumb-item"><a href="/test/blob/master/f/folder1/folder2">'
  2682. '\n <span class="fa fa-folder"></span>&nbsp; folder2</a>\n'
  2683. " </li>",
  2684. output_text,
  2685. )
  2686. # View by image name -- with a non-existant file
  2687. output = self.app.get("/test/blob/sources/f/testfoo.jpg")
  2688. self.assertEqual(output.status_code, 404)
  2689. output = self.app.get("/test/blob/master/f/folder1/testfoo.jpg")
  2690. self.assertEqual(output.status_code, 404)
  2691. # View file with a non-ascii name
  2692. tests.add_commit_git_repo(
  2693. os.path.join(self.path, "repos", "test.git"),
  2694. ncommits=1,
  2695. filename="Šource",
  2696. )
  2697. output = self.app.get("/test/blob/master/f/Šource")
  2698. self.assertEqual(output.status_code, 200)
  2699. output_text = output.get_data(as_text=True)
  2700. self.assertEqual(
  2701. output.headers["Content-Type"].lower(), "text/html; charset=utf-8"
  2702. )
  2703. self.assertIn("</span>&nbsp; Šource", output_text)
  2704. self.assertIn(
  2705. '<pre class="syntaxhighlightblock">'
  2706. '<code class="lang-plaintext">Row 0\n</code></pre>',
  2707. output_text,
  2708. )
  2709. # Add a fork of a fork
  2710. item = pagure.lib.model.Project(
  2711. user_id=1, # pingou
  2712. name="test3",
  2713. description="test project #3",
  2714. is_fork=True,
  2715. parent_id=1,
  2716. hook_token="aaabbbppp",
  2717. )
  2718. self.session.add(item)
  2719. self.session.commit()
  2720. tests.add_content_git_repo(
  2721. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2722. )
  2723. tests.add_readme_git_repo(
  2724. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2725. )
  2726. tests.add_commit_git_repo(
  2727. os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
  2728. ncommits=10,
  2729. )
  2730. # Verify the nav links correctly when viewing a file/folder in a fork.
  2731. output = self.app.get(
  2732. "/fork/pingou/test3/blob/master/f/folder1/folder2/file"
  2733. )
  2734. self.assertEqual(output.status_code, 200)
  2735. output_text = output.get_data(as_text=True)
  2736. self.assertIn(
  2737. '<li class="breadcrumb-item">'
  2738. '<a href="/fork/pingou/test3/blob/master/f/folder1/folder2">'
  2739. '\n <span class="fa fa-folder"></span>'
  2740. "&nbsp; folder2</a>\n </li>",
  2741. output_text,
  2742. )
  2743. output = self.app.get("/fork/pingou/test3/blob/master/f/sources")
  2744. self.assertEqual(output.status_code, 200)
  2745. output_text = output.get_data(as_text=True)
  2746. self.assertIn(
  2747. '<pre class="syntaxhighlightblock">'
  2748. '<code class="lang-plaintext">foo\n barRow 0\n'
  2749. "Row 1\nRow 2\nRow 3\nRow 4\nRow 5\nRow 6\nRow 7\nRow 8\n"
  2750. "Row 9\n</code></pre>",
  2751. output_text,
  2752. )
  2753. @patch(
  2754. "pagure.lib.encoding_utils.decode",
  2755. MagicMock(side_effect=pagure.exceptions.PagureException),
  2756. )
  2757. def test_view_file_with_wrong_encoding(self):
  2758. """Test the view_file endpoint."""
  2759. tests.create_projects(self.session)
  2760. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2761. # Add some content to the git repo
  2762. tests.add_content_git_repo(
  2763. os.path.join(self.path, "repos", "test.git")
  2764. )
  2765. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2766. tests.add_binary_git_repo(
  2767. os.path.join(self.path, "repos", "test.git"), "test.jpg"
  2768. )
  2769. tests.add_binary_git_repo(
  2770. os.path.join(self.path, "repos", "test.git"), "test_binary"
  2771. )
  2772. # View file
  2773. output = self.app.get("/test/blob/master/f/sources")
  2774. self.assertEqual(output.status_code, 200)
  2775. output_text = output.get_data(as_text=True)
  2776. self.assertEqual("foo\n bar", output_text)
  2777. def test_view_raw_file(self):
  2778. """Test the view_raw_file endpoint."""
  2779. output = self.app.get("/foo/raw/foo/sources")
  2780. # No project registered in the DB
  2781. self.assertEqual(output.status_code, 404)
  2782. tests.create_projects(self.session)
  2783. output = self.app.get("/test/raw/foo/sources")
  2784. # No git repo associated
  2785. self.assertEqual(output.status_code, 404)
  2786. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2787. output = self.app.get("/test/raw/foo/sources")
  2788. self.assertEqual(output.status_code, 404)
  2789. # Add some content to the git repo
  2790. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2791. # View first commit
  2792. output = self.app.get("/test/raw/master")
  2793. self.assertEqual(output.status_code, 200)
  2794. output_text = output.get_data(as_text=True)
  2795. self.assertEqual(
  2796. output.headers["Content-Type"].lower(),
  2797. "text/plain; charset=ascii",
  2798. )
  2799. self.assertIn(":Author: Pierre-Yves Chibon", output_text)
  2800. # Add some more content to the repo
  2801. tests.add_content_git_repo(
  2802. os.path.join(self.path, "repos", "test.git")
  2803. )
  2804. tests.add_binary_git_repo(
  2805. os.path.join(self.path, "repos", "test.git"), "test.jpg"
  2806. )
  2807. tests.add_binary_git_repo(
  2808. os.path.join(self.path, "repos", "test.git"), "test_binary"
  2809. )
  2810. output = self.app.get("/test/raw/master/f/foofile")
  2811. self.assertEqual(output.status_code, 404)
  2812. # View in a branch
  2813. output = self.app.get("/test/raw/master/f/sources")
  2814. self.assertEqual(
  2815. output.headers["Content-Type"].lower(),
  2816. "text/plain; charset=ascii",
  2817. )
  2818. self.assertEqual(output.status_code, 200)
  2819. output_text = output.get_data(as_text=True)
  2820. self.assertIn("foo\n bar", output_text)
  2821. # View what's supposed to be an image
  2822. output = self.app.get("/test/raw/master/f/test.jpg")
  2823. self.assertEqual(output.status_code, 200)
  2824. output_text = output.get_data()
  2825. self.assertTrue(output_text.startswith(b"\x00\x00\x01\x00"))
  2826. # View by commit id
  2827. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2828. commit = repo.revparse_single("HEAD")
  2829. output = self.app.get("/test/raw/%s/f/test.jpg" % commit.oid.hex)
  2830. self.assertEqual(output.status_code, 200)
  2831. output_text = output.get_data()
  2832. self.assertTrue(output_text.startswith(b"\x00\x00\x01\x00"))
  2833. # View by image name -- somehow we support this
  2834. output = self.app.get("/test/raw/master/f/test.jpg")
  2835. self.assertEqual(output.status_code, 200)
  2836. output_text = output.get_data()
  2837. self.assertTrue(output_text.startswith(b"\x00\x00\x01\x00"))
  2838. # View binary file
  2839. output = self.app.get("/test/raw/master/f/test_binary")
  2840. self.assertEqual(output.status_code, 200)
  2841. output_text = output.get_data()
  2842. self.assertEqual(
  2843. output.headers["Content-Type"].lower(), "application/octet-stream"
  2844. )
  2845. self.assertTrue(output_text.startswith(b"\x00\x00\x01\x00"))
  2846. # View folder
  2847. output = self.app.get("/test/raw/master/f/folder1")
  2848. self.assertEqual(output.status_code, 404)
  2849. # View by image name -- with a non-existant file
  2850. output = self.app.get("/test/raw/master/f/testfoo.jpg")
  2851. self.assertEqual(output.status_code, 404)
  2852. output = self.app.get("/test/raw/master/f/folder1/testfoo.jpg")
  2853. self.assertEqual(output.status_code, 404)
  2854. output = self.app.get("/test/raw/master/f/")
  2855. self.assertEqual(output.status_code, 404)
  2856. output = self.app.get("/test/raw/master")
  2857. self.assertEqual(output.status_code, 200)
  2858. output_text = output.get_data(as_text=True)
  2859. self.assertEqual(
  2860. output.headers["Content-Type"].lower(),
  2861. "text/plain; charset=ascii",
  2862. )
  2863. self.assertTrue(
  2864. output_text.startswith("diff --git a/test_binary b/test_binary\n")
  2865. )
  2866. output = self.app.get("/test/raw/%s" % commit.oid.hex)
  2867. self.assertEqual(output.status_code, 200)
  2868. output_text = output.get_data(as_text=True)
  2869. self.assertTrue(
  2870. output_text.startswith("diff --git a/test_binary b/test_binary\n")
  2871. )
  2872. # Add a fork of a fork
  2873. item = pagure.lib.model.Project(
  2874. user_id=1, # pingou
  2875. name="test3",
  2876. description="test project #3",
  2877. is_fork=True,
  2878. parent_id=1,
  2879. hook_token="aaabbbqqq",
  2880. )
  2881. self.session.add(item)
  2882. self.session.commit()
  2883. tests.add_content_git_repo(
  2884. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2885. )
  2886. tests.add_readme_git_repo(
  2887. os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
  2888. )
  2889. tests.add_commit_git_repo(
  2890. os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
  2891. ncommits=10,
  2892. )
  2893. output = self.app.get("/fork/pingou/test3/raw/master/f/sources")
  2894. self.assertEqual(output.status_code, 200)
  2895. output_text = output.get_data(as_text=True)
  2896. self.assertEqual(
  2897. output.headers["Content-Type"].lower(),
  2898. "text/plain; charset=ascii",
  2899. )
  2900. self.assertIn("foo\n bar", output_text)
  2901. def test_view_commit(self):
  2902. """Test the view_commit endpoint."""
  2903. output = self.app.get("/foo/c/bar")
  2904. # No project registered in the DB
  2905. self.assertEqual(output.status_code, 404)
  2906. tests.create_projects(self.session)
  2907. output = self.app.get("/test/c/bar")
  2908. # No git repo associated
  2909. self.assertEqual(output.status_code, 404)
  2910. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  2911. output = self.app.get("/test/c/bar")
  2912. self.assertEqual(output.status_code, 404)
  2913. # Add a README to the git repo - First commit
  2914. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  2915. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2916. commit = repo.revparse_single("HEAD")
  2917. # View first commit
  2918. output = self.app.get("/test/c/%s" % commit.oid.hex)
  2919. self.assertEqual(output.status_code, 200)
  2920. output_text = output.get_data(as_text=True)
  2921. self.assertIn("#commit-overview-collapse", output_text)
  2922. self.assertIn("Merged by Alice Author", output_text)
  2923. self.assertIn("Committed by Cecil Committer", output_text)
  2924. self.assertIn(
  2925. '<div class="btn btn-outline-success disabled opacity-100 '
  2926. 'border-0 font-weight-bold">file added</div>',
  2927. output_text,
  2928. )
  2929. # View first commit - with the old URL scheme disabled - default
  2930. output = self.app.get(
  2931. "/test/%s" % commit.oid.hex, follow_redirects=True
  2932. )
  2933. self.assertEqual(output.status_code, 404)
  2934. output_text = output.get_data(as_text=True)
  2935. self.assertIn("<p>Project not found</p>", output_text)
  2936. # Add some content to the git repo
  2937. tests.add_content_git_repo(
  2938. os.path.join(self.path, "repos", "test.git")
  2939. )
  2940. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  2941. commit = repo.revparse_single("HEAD")
  2942. # Add a symlink to test that it displays correctly
  2943. tests.add_commit_git_repo(
  2944. os.path.join(self.path, "repos", "test.git"),
  2945. ncommits=1,
  2946. filename="sources-sl",
  2947. symlink_to="sources",
  2948. )
  2949. commit_sl = repo.revparse_single("HEAD")
  2950. # View another commit
  2951. output = self.app.get("/test/c/%s" % commit.oid.hex)
  2952. self.assertEqual(output.status_code, 200)
  2953. output_text = output.get_data(as_text=True)
  2954. self.assertIn("#commit-overview-collapse", output_text)
  2955. self.assertIn("Authored by Alice Author", output_text)
  2956. self.assertIn("Committed by Cecil Committer", output_text)
  2957. # Make sure that diff containing symlink displays the header correctly
  2958. output = self.app.get("/test/c/%s" % commit_sl.oid.hex)
  2959. self.assertEqual(output.status_code, 200)
  2960. output_text = output.get_data(as_text=True)
  2961. # check the link to the file
  2962. self.assertIn(">sources-sl</a>", output_text)
  2963. # check that the header contains "file added" and a +1 for one added line
  2964. self.assertIn(">file added</span>", output_text)
  2965. self.assertIn(">+1</span>", output_text)
  2966. # View the commit when branch name is provided
  2967. output = self.app.get("/test/c/%s?branch=master" % commit.oid.hex)
  2968. self.assertEqual(output.status_code, 200)
  2969. output_text = output.get_data(as_text=True)
  2970. self.assertIn(
  2971. '<a class=\n "nav-link nowrap\n active"\n '
  2972. 'href="/test/commits/master">\n <i class="fa fa-list-alt '
  2973. 'text-muted fa-fw" data-glyph="spreadsheet"></i>&nbsp;Commits'
  2974. "\n </a>",
  2975. output_text,
  2976. )
  2977. # View the commit when branch name is wrong, show the commit
  2978. output = self.app.get("/test/c/%s?branch=abcxyz" % commit.oid.hex)
  2979. self.assertEqual(output.status_code, 200)
  2980. output_text = output.get_data(as_text=True)
  2981. self.assertIn(
  2982. '<a class=\n "nav-link nowrap\n active"\n '
  2983. 'href="/test/commits">\n <i class="fa fa-list-alt '
  2984. 'text-muted fa-fw" data-glyph="spreadsheet"></i>&nbsp;Commits'
  2985. "\n </a>\n",
  2986. output_text,
  2987. )
  2988. # Add a fork of a fork
  2989. item = pagure.lib.model.Project(
  2990. user_id=1, # pingou
  2991. name="test3",
  2992. description="test project #3",
  2993. is_fork=True,
  2994. parent_id=1,
  2995. hook_token="aaabbbkkk",
  2996. )
  2997. self.session.add(item)
  2998. self.session.commit()
  2999. forkedgit = os.path.join(
  3000. self.path, "repos", "forks", "pingou", "test3.git"
  3001. )
  3002. tests.add_content_git_repo(forkedgit)
  3003. tests.add_readme_git_repo(forkedgit)
  3004. repo = pygit2.Repository(forkedgit)
  3005. commit = repo.revparse_single("HEAD")
  3006. # Commit does not exist in anothe repo :)
  3007. output = self.app.get("/test/c/%s" % commit.oid.hex)
  3008. self.assertEqual(output.status_code, 404)
  3009. # View commit of fork
  3010. output = self.app.get("/fork/pingou/test3/c/%s" % commit.oid.hex)
  3011. self.assertEqual(output.status_code, 200)
  3012. output_text = output.get_data(as_text=True)
  3013. self.assertIn("#commit-overview-collapse", output_text)
  3014. self.assertIn("Authored by Alice Author", output_text)
  3015. self.assertIn("Committed by Cecil Committer", output_text)
  3016. # Try the old URL scheme with a short hash
  3017. output = self.app.get(
  3018. "/fork/pingou/test3/%s" % commit.oid.hex[:10],
  3019. follow_redirects=True,
  3020. )
  3021. self.assertEqual(output.status_code, 404)
  3022. output_text = output.get_data(as_text=True)
  3023. self.assertIn("<p>Project not found</p>", output_text)
  3024. # View the commit of the fork when branch name is provided
  3025. output = self.app.get(
  3026. "/fork/pingou/test3/c/%s?branch=master" % commit.oid.hex
  3027. )
  3028. self.assertEqual(output.status_code, 200)
  3029. output_text = output.get_data(as_text=True)
  3030. self.assertIn(
  3031. '<a class=\n "nav-link nowrap\n active"\n '
  3032. 'href="/fork/pingou/test3/commits/master">\n '
  3033. '<i class="fa fa-list-alt '
  3034. 'text-muted fa-fw" data-glyph="spreadsheet"></i>&nbsp;Commits'
  3035. "\n </a>\n",
  3036. output_text,
  3037. )
  3038. # View the commit of the fork when branch name is wrong
  3039. output = self.app.get(
  3040. "/fork/pingou/test3/c/%s?branch=abcxyz" % commit.oid.hex
  3041. )
  3042. self.assertEqual(output.status_code, 200)
  3043. output_text = output.get_data(as_text=True)
  3044. self.assertIn(
  3045. '<a class=\n "nav-link nowrap\n active"\n '
  3046. 'href="/fork/pingou/test3/commits">\n <i class="fa fa-list-alt '
  3047. 'text-muted fa-fw" data-glyph="spreadsheet"></i>&nbsp;Commits'
  3048. "\n </a>",
  3049. output_text,
  3050. )
  3051. def test_view_commit_with_full_link(self):
  3052. """Test the view_commit endpoint when the commit message includes
  3053. an url."""
  3054. tests.create_projects(self.session)
  3055. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  3056. folder = os.path.join(self.path, "repos", "test.git")
  3057. # Add a README to the git repo - First commit
  3058. tests.add_readme_git_repo(folder)
  3059. tests.create_projects_git(folder, bare=True)
  3060. # Add a commit with an url in the commit message
  3061. tests.add_content_to_git(
  3062. folder,
  3063. branch="master",
  3064. filename="sources",
  3065. content="foo",
  3066. message="Test commit message\n\n"
  3067. "Fixes http://example.com/pagure/issue/2",
  3068. )
  3069. # Add a README to the git repo - First commit
  3070. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3071. commit = repo.revparse_single("HEAD")
  3072. # View first commit
  3073. output = self.app.get("/test/c/%s" % commit.oid.hex)
  3074. self.assertEqual(output.status_code, 200)
  3075. output_text = output.get_data(as_text=True)
  3076. self.assertIn("#commit-overview-collapse", output_text)
  3077. self.assertIn(
  3078. '<pre class="commit_message_body">\n '
  3079. "Test commit message\n \n "
  3080. 'Fixes <a href="http://example.com/pagure/issue/2" '
  3081. 'rel="nofollow">http://example.com/pagure/issue/2</a>\n '
  3082. "</pre>",
  3083. output_text,
  3084. )
  3085. self.assertIn(
  3086. '<div class="btn btn-outline-success disabled opacity-100 '
  3087. 'border-0 font-weight-bold">file added</div>',
  3088. output_text,
  3089. )
  3090. def test_view_commit_with_short_link(self):
  3091. """Test the view_commit endpoint when the commit message includes
  3092. an url."""
  3093. tests.create_projects(self.session)
  3094. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  3095. folder = os.path.join(self.path, "repos", "test.git")
  3096. # Add a README to the git repo - First commit
  3097. tests.add_readme_git_repo(folder)
  3098. tests.create_projects_git(folder, bare=True)
  3099. # Add a commit with an url in the commit message
  3100. tests.add_content_to_git(
  3101. folder,
  3102. branch="master",
  3103. filename="sources",
  3104. content="foo",
  3105. message="Test commit message\n\nFixes #2",
  3106. )
  3107. # Add a README to the git repo - First commit
  3108. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3109. commit = repo.revparse_single("HEAD")
  3110. # View first commit
  3111. output = self.app.get("/test/c/%s" % commit.oid.hex)
  3112. self.assertEqual(output.status_code, 200)
  3113. output_text = output.get_data(as_text=True)
  3114. self.assertIn("#commit-overview-collapse", output_text)
  3115. self.assertIn(
  3116. '<pre class="commit_message_body">\n '
  3117. "Test commit message\n \n "
  3118. "Fixes #2\n </pre>",
  3119. output_text,
  3120. )
  3121. self.assertIn(
  3122. '<div class="btn btn-outline-success disabled opacity-100 '
  3123. 'border-0 font-weight-bold">file added</div>',
  3124. output_text,
  3125. )
  3126. def test_view_commit_patch(self):
  3127. """Test the view_commit_patch endpoint."""
  3128. # No project registered in the DB
  3129. output = self.app.get("/foo/c/bar.patch")
  3130. self.assertEqual(output.status_code, 404)
  3131. tests.create_projects(self.session)
  3132. output = self.app.get("/test/c/bar.patch")
  3133. # No git repo associated
  3134. self.assertEqual(output.status_code, 404)
  3135. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  3136. output = self.app.get("/test/c/bar.patch")
  3137. self.assertEqual(output.status_code, 404)
  3138. # Add a README to the git repo - First commit
  3139. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  3140. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3141. commit = repo.revparse_single("HEAD")
  3142. # View first commit
  3143. output = self.app.get("/test/c/%s.patch" % commit.oid.hex)
  3144. self.assertEqual(output.status_code, 200)
  3145. output_text = output.get_data(as_text=True)
  3146. self.assertIn(
  3147. r"""diff --git a/README.rst b/README.rst
  3148. new file mode 100644
  3149. index 0000000..fb7093d
  3150. --- /dev/null
  3151. +++ b/README.rst
  3152. @@ -0,0 +1,16 @@
  3153. +Pagure
  3154. +======
  3155. +
  3156. +:Author: Pierre-Yves Chibon <pingou@pingoured.fr>
  3157. +
  3158. +
  3159. +Pagure is a light-weight git-centered forge based on pygit2.
  3160. +
  3161. +Currently, Pagure offers a web-interface for git repositories, a ticket
  3162. +system and possibilities to create new projects, fork existing ones and
  3163. +create/merge pull-requests across or within projects.
  3164. +
  3165. +
  3166. +Homepage: https://github.com/pypingou/pagure
  3167. +
  3168. +Dev instance: http://209.132.184.222/ (/!\ May change unexpectedly, it's a dev instance ;-))
  3169. """,
  3170. output_text,
  3171. )
  3172. self.assertIn("Subject: Add a README file", output_text)
  3173. # Add some content to the git repo
  3174. tests.add_content_git_repo(
  3175. os.path.join(self.path, "repos", "test.git")
  3176. )
  3177. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3178. commit = repo.revparse_single("HEAD")
  3179. # View another commit
  3180. output = self.app.get("/test/c/%s.patch" % commit.oid.hex)
  3181. self.assertEqual(output.status_code, 200)
  3182. output_text = output.get_data(as_text=True)
  3183. self.assertIn(
  3184. "Subject: Add some directory and a file for more testing",
  3185. output_text,
  3186. )
  3187. self.assertIn(
  3188. r"""diff --git a/folder1/folder2/file b/folder1/folder2/file
  3189. new file mode 100644
  3190. index 0000000..11980b1
  3191. --- /dev/null
  3192. +++ b/folder1/folder2/file
  3193. @@ -0,0 +1,3 @@
  3194. +foo
  3195. + bar
  3196. +baz
  3197. \ No newline at end of file
  3198. """,
  3199. output_text,
  3200. )
  3201. # Add a fork of a fork
  3202. item = pagure.lib.model.Project(
  3203. user_id=1, # pingou
  3204. name="test3",
  3205. description="test project #3",
  3206. is_fork=True,
  3207. parent_id=1,
  3208. hook_token="aaabbblll",
  3209. )
  3210. self.session.add(item)
  3211. self.session.commit()
  3212. forkedgit = os.path.join(
  3213. self.path, "repos", "forks", "pingou", "test3.git"
  3214. )
  3215. tests.add_content_git_repo(forkedgit)
  3216. tests.add_readme_git_repo(forkedgit)
  3217. repo = pygit2.Repository(forkedgit)
  3218. commit = repo.revparse_single("HEAD")
  3219. # Commit does not exist in anothe repo :)
  3220. output = self.app.get("/test/c/%s.patch" % commit.oid.hex)
  3221. self.assertEqual(output.status_code, 404)
  3222. # View commit of fork
  3223. output = self.app.get("/fork/pingou/test3/c/%s.patch" % commit.oid.hex)
  3224. self.assertEqual(output.status_code, 200)
  3225. output_text = output.get_data(as_text=True)
  3226. self.assertIn(
  3227. r"""diff --git a/README.rst b/README.rst
  3228. new file mode 100644
  3229. index 0000000..fb7093d
  3230. --- /dev/null
  3231. +++ b/README.rst
  3232. @@ -0,0 +1,16 @@
  3233. +Pagure
  3234. +======
  3235. +
  3236. +:Author: Pierre-Yves Chibon <pingou@pingoured.fr>
  3237. +
  3238. +
  3239. +Pagure is a light-weight git-centered forge based on pygit2.
  3240. +
  3241. +Currently, Pagure offers a web-interface for git repositories, a ticket
  3242. +system and possibilities to create new projects, fork existing ones and
  3243. +create/merge pull-requests across or within projects.
  3244. +
  3245. +
  3246. +Homepage: https://github.com/pypingou/pagure
  3247. +
  3248. +Dev instance: http://209.132.184.222/ (/!\ May change unexpectedly, it's a dev instance ;-))
  3249. """,
  3250. output_text,
  3251. )
  3252. def test_view_commit_diff(self):
  3253. """Test the view_commit_diff endpoint."""
  3254. # No project registered in the DB
  3255. output = self.app.get("/foo/c/bar.diff")
  3256. self.assertEqual(output.status_code, 404)
  3257. tests.create_projects(self.session)
  3258. output = self.app.get("/test/c/bar.diff")
  3259. # No git repo associated
  3260. self.assertEqual(output.status_code, 404)
  3261. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  3262. output = self.app.get("/test/c/bar.diff")
  3263. self.assertEqual(output.status_code, 404)
  3264. # Add a README to the git repo - First commit
  3265. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  3266. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3267. commit = repo.revparse_single("HEAD")
  3268. # View first commit
  3269. output = self.app.get("/test/c/%s.diff" % commit.oid.hex)
  3270. self.assertEqual(output.status_code, 200)
  3271. output_text = output.get_data(as_text=True)
  3272. self.assertEqual(
  3273. r"""diff --git a/README.rst b/README.rst
  3274. new file mode 100644
  3275. index 0000000..fb7093d
  3276. --- /dev/null
  3277. +++ b/README.rst
  3278. @@ -0,0 +1,16 @@
  3279. +Pagure
  3280. +======
  3281. +
  3282. +:Author: Pierre-Yves Chibon <pingou@pingoured.fr>
  3283. +
  3284. +
  3285. +Pagure is a light-weight git-centered forge based on pygit2.
  3286. +
  3287. +Currently, Pagure offers a web-interface for git repositories, a ticket
  3288. +system and possibilities to create new projects, fork existing ones and
  3289. +create/merge pull-requests across or within projects.
  3290. +
  3291. +
  3292. +Homepage: https://github.com/pypingou/pagure
  3293. +
  3294. +Dev instance: http://209.132.184.222/ (/!\ May change unexpectedly, it's a dev instance ;-))
  3295. """,
  3296. output_text,
  3297. )
  3298. def test_view_tree(self):
  3299. """Test the view_tree endpoint."""
  3300. output = self.app.get("/foo/tree/")
  3301. # No project registered in the DB
  3302. self.assertEqual(output.status_code, 404)
  3303. tests.create_projects(self.session)
  3304. output = self.app.get("/test/tree/")
  3305. # No git repo associated
  3306. self.assertEqual(output.status_code, 404)
  3307. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  3308. output = self.app.get("/test/tree/")
  3309. self.assertEqual(output.status_code, 200)
  3310. output_text = output.get_data(as_text=True)
  3311. self.assertIn(
  3312. """<ol class="breadcrumb p-0 bg-transparent mb-0">
  3313. <li class="breadcrumb-item">
  3314. <a href="/test/tree">
  3315. <span class="fa fa-random">
  3316. </span>&nbsp; None
  3317. </a>
  3318. </li>
  3319. </ol>""",
  3320. output_text,
  3321. )
  3322. self.assertIn("No content found in this repository", output_text)
  3323. # Add a README to the git repo - First commit
  3324. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  3325. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  3326. commit = repo.revparse_single("HEAD")
  3327. # View first commit
  3328. output = self.app.get("/test/tree/%s" % commit.oid.hex)
  3329. self.assertEqual(output.status_code, 200)
  3330. output_text = output.get_data(as_text=True)
  3331. self.assertIn("<title>Tree - test - Pagure</title>", output_text)
  3332. self.assertIn("README.rst", output_text)
  3333. self.assertFalse("No content found in this repository" in output_text)
  3334. # View tree, no identifier:
  3335. output = self.app.get("/test/tree/")
  3336. self.assertEqual(output.status_code, 200)
  3337. output_text = output.get_data(as_text=True)
  3338. self.assertIn("<title>Tree - test - Pagure</title>", output_text)
  3339. self.assertIn("README.rst", output_text)
  3340. self.assertNotIn("No content found in this repository", output_text)
  3341. self.assertNotIn(
  3342. "&#39;None&#39; not found in the git repository, going back to: "
  3343. "master",
  3344. output_text,
  3345. )
  3346. # View tree, invalid identifier:
  3347. output = self.app.get("/test/tree/invalid")
  3348. self.assertEqual(output.status_code, 200)
  3349. output_text = output.get_data(as_text=True)
  3350. self.assertIn("<title>Tree - test - Pagure</title>", output_text)
  3351. self.assertIn("README.rst", output_text)
  3352. self.assertNotIn("No content found in this repository", output_text)
  3353. self.assertIn(
  3354. "&#39;invalid&#39; not found in the git repository, going back "
  3355. "to: master",
  3356. output_text,
  3357. )
  3358. # View tree by branch
  3359. output = self.app.get("/test/tree/master")
  3360. self.assertEqual(output.status_code, 200)
  3361. output_text = output.get_data(as_text=True)
  3362. self.assertIn("<title>Tree - test - Pagure</title>", output_text)
  3363. self.assertIn("README.rst", output_text)
  3364. self.assertNotIn("No content found in this repository", output_text)
  3365. # Add a fork of a fork
  3366. item = pagure.lib.model.Project(
  3367. user_id=1, # pingou
  3368. name="test3",
  3369. description="test project #3",
  3370. is_fork=True,
  3371. parent_id=1,
  3372. hook_token="aaabbbfff",
  3373. )
  3374. self.session.add(item)
  3375. self.session.commit()
  3376. forkedgit = os.path.join(
  3377. self.path, "repos", "forks", "pingou", "test3.git"
  3378. )
  3379. tests.add_content_git_repo(forkedgit)
  3380. output = self.app.get("/fork/pingou/test3/tree/")
  3381. self.assertEqual(output.status_code, 200)
  3382. output_text = output.get_data(as_text=True)
  3383. self.assertIn("<title>Tree - test3 - Pagure</title>", output_text)
  3384. self.assertIn(
  3385. '<a href="/fork/pingou/test3/blob/master/f/folder1">', output_text
  3386. )
  3387. self.assertIn(
  3388. '<a href="/fork/pingou/test3/blob/master/f/sources">', output_text
  3389. )
  3390. self.assertNotIn("No content found in this repository", output_text)
  3391. output = self.app.get(
  3392. "/fork/pingou/test3/blob/master/f/folder1/folder2"
  3393. )
  3394. self.assertEqual(output.status_code, 200)
  3395. output_text = output.get_data(as_text=True)
  3396. self.assertIn(
  3397. '<a href="/fork/pingou/test3/blob/master/'
  3398. 'f/folder1/folder2/file%C5%A0">',
  3399. output_text,
  3400. )
  3401. @patch.dict("pagure.config.config", {"ENABLE_DEL_PROJECTS": False})
  3402. @patch("pagure.lib.notify.send_email")
  3403. @patch("pagure.decorators.admin_session_timedout")
  3404. def test_delete_repo_when_turned_off(self, ast, send_email):
  3405. """Test the delete_repo endpoint when deletion of a repo is
  3406. turned off in the pagure instance"""
  3407. ast.return_value = False
  3408. send_email.return_value = True
  3409. # No Git repo
  3410. output = self.app.post("/foo/delete")
  3411. self.assertEqual(output.status_code, 404)
  3412. user = tests.FakeUser(username="pingou")
  3413. with tests.user_set(self.app.application, user):
  3414. tests.create_projects(self.session)
  3415. tests.create_projects_git(os.path.join(self.path, "repos"))
  3416. output = self.app.post("/test/delete", follow_redirects=True)
  3417. self.assertEqual(output.status_code, 404)
  3418. # User not logged in
  3419. output = self.app.post("/test/delete")
  3420. self.assertEqual(output.status_code, 302)
  3421. # Ensure the project isn't read-only
  3422. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  3423. repo.read_only = False
  3424. self.session.add(repo)
  3425. self.session.commit()
  3426. with tests.user_set(self.app.application, user):
  3427. # Only git repo
  3428. output = self.app.post("/test/delete", follow_redirects=True)
  3429. self.assertEqual(output.status_code, 404)
  3430. # Only git and doc repo
  3431. tests.create_projects_git(os.path.join(self.path, "repos"))
  3432. tests.create_projects_git(os.path.join(self.path, "docs"))
  3433. output = self.app.post("/test/delete", follow_redirects=True)
  3434. self.assertEqual(output.status_code, 404)
  3435. # Create all the git repos
  3436. tests.create_projects_git(os.path.join(self.path, "repos"))
  3437. tests.create_projects_git(os.path.join(self.path, "docs"))
  3438. tests.create_projects_git(
  3439. os.path.join(self.path, "tickets"), bare=True
  3440. )
  3441. tests.create_projects_git(
  3442. os.path.join(self.path, "requests"), bare=True
  3443. )
  3444. # Check repo was created
  3445. output = self.app.get("/", follow_redirects=True)
  3446. self.assertEqual(output.status_code, 200)
  3447. output_text = output.get_data(as_text=True)
  3448. self.assertIn(
  3449. '<span class="btn btn-outline-secondary disabled opacity-100 '
  3450. 'border-0 ml-auto font-weight-bold">3 Projects</span>',
  3451. output_text,
  3452. )
  3453. self.assertNotIn(
  3454. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  3455. output_text,
  3456. )
  3457. # add issues
  3458. repo = pagure.lib.query.get_authorized_project(
  3459. self.session, "test"
  3460. )
  3461. msg = pagure.lib.query.new_issue(
  3462. session=self.session,
  3463. repo=repo,
  3464. title="Test issue",
  3465. content="We should work on this",
  3466. user="pingou",
  3467. )
  3468. self.session.commit()
  3469. self.assertEqual(msg.title, "Test issue")
  3470. msg = pagure.lib.query.new_issue(
  3471. session=self.session,
  3472. repo=repo,
  3473. title="Test issue #2",
  3474. content="We should work on this, really",
  3475. user="pingou",
  3476. )
  3477. self.session.commit()
  3478. self.assertEqual(msg.title, "Test issue #2")
  3479. # Add a comment to an issue
  3480. issue = pagure.lib.query.search_issues(
  3481. self.session, repo, issueid=1
  3482. )
  3483. msg = pagure.lib.query.add_issue_comment(
  3484. session=self.session,
  3485. issue=issue,
  3486. comment="Hey look a comment!",
  3487. user="foo",
  3488. )
  3489. self.session.commit()
  3490. self.assertEqual(msg, "Comment added")
  3491. # add pull-requests
  3492. req = pagure.lib.query.new_pull_request(
  3493. session=self.session,
  3494. repo_from=repo,
  3495. branch_from="feature",
  3496. repo_to=repo,
  3497. branch_to="master",
  3498. title="test pull-request",
  3499. user="pingou",
  3500. )
  3501. self.session.commit()
  3502. self.assertEqual(req.id, 3)
  3503. self.assertEqual(req.title, "test pull-request")
  3504. req = pagure.lib.query.new_pull_request(
  3505. session=self.session,
  3506. repo_from=repo,
  3507. branch_from="feature2",
  3508. repo_to=repo,
  3509. branch_to="master",
  3510. title="test pull-request",
  3511. user="pingou",
  3512. )
  3513. self.session.commit()
  3514. self.assertEqual(req.id, 4)
  3515. self.assertEqual(req.title, "test pull-request")
  3516. # Add comment on a pull-request
  3517. request = pagure.lib.query.search_pull_requests(
  3518. self.session, requestid=3
  3519. )
  3520. msg = pagure.lib.query.add_pull_request_comment(
  3521. session=self.session,
  3522. request=request,
  3523. commit="commithash",
  3524. tree_id=None,
  3525. filename="file",
  3526. row=None,
  3527. comment="This is awesome, I got to remember it!",
  3528. user="foo",
  3529. )
  3530. self.assertEqual(msg, "Comment added")
  3531. # Check before deleting the project
  3532. output = self.app.get("/", follow_redirects=True)
  3533. self.assertEqual(output.status_code, 200)
  3534. output_text = output.get_data(as_text=True)
  3535. self.assertIn(
  3536. '<span class="btn btn-outline-secondary disabled opacity-100 '
  3537. 'border-0 ml-auto font-weight-bold">3 Projects</span>',
  3538. output_text,
  3539. )
  3540. self.assertNotIn(
  3541. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  3542. output_text,
  3543. )
  3544. output = self.app.post("/test/delete", follow_redirects=True)
  3545. self.assertEqual(output.status_code, 404)
  3546. repo = pagure.lib.query.get_authorized_project(
  3547. self.session, "test"
  3548. )
  3549. self.assertNotEqual(repo, None)
  3550. repo = pagure.lib.query.get_authorized_project(
  3551. self.session, "test2"
  3552. )
  3553. self.assertNotEqual(repo, None)
  3554. # Add a fork of a fork
  3555. item = pagure.lib.model.Project(
  3556. user_id=1, # pingou
  3557. name="test3",
  3558. description="test project #3",
  3559. is_fork=True,
  3560. parent_id=2,
  3561. hook_token="aaabbbjjj",
  3562. )
  3563. self.session.add(item)
  3564. self.session.commit()
  3565. tests.add_content_git_repo(
  3566. os.path.join(
  3567. self.path, "repos", "forks", "pingou", "test3.git"
  3568. )
  3569. )
  3570. tests.add_content_git_repo(
  3571. os.path.join(self.path, "docs", "pingou", "test3.git")
  3572. )
  3573. tests.add_content_git_repo(
  3574. os.path.join(self.path, "tickets", "pingou", "test3.git")
  3575. )
  3576. # Check before deleting the fork
  3577. output = self.app.get("/", follow_redirects=True)
  3578. self.assertEqual(output.status_code, 200)
  3579. output_text = output.get_data(as_text=True)
  3580. self.assertIn(
  3581. '<span class="btn btn-outline-secondary disabled opacity-100 '
  3582. 'border-0 ml-auto font-weight-bold">3 Projects</span>',
  3583. output_text,
  3584. )
  3585. self.assertIn(
  3586. """<span>
  3587. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3588. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3589. </span>
  3590. <div class="ml-auto">
  3591. <span class="badge badge-secondary">
  3592. 1
  3593. </span>
  3594. </div>""",
  3595. output_text,
  3596. )
  3597. output = self.app.post(
  3598. "/fork/pingou/test3/delete", follow_redirects=True
  3599. )
  3600. self.assertEqual(output.status_code, 404)
  3601. @patch("pagure.lib.notify.send_email")
  3602. @patch("pagure.decorators.admin_session_timedout")
  3603. def test_delete_read_only_repo(self, ast, send_email):
  3604. """Test the delete_repo endpoint when the repo is read_only"""
  3605. ast.return_value = False
  3606. send_email.return_value = True
  3607. tests.create_projects(self.session)
  3608. tests.create_projects_git(os.path.join(self.path, "repos"))
  3609. # Create all the git repos
  3610. tests.create_projects_git(os.path.join(self.path, "repos"))
  3611. tests.create_projects_git(os.path.join(self.path, "docs"))
  3612. tests.create_projects_git(
  3613. os.path.join(self.path, "tickets"), bare=True
  3614. )
  3615. tests.create_projects_git(
  3616. os.path.join(self.path, "requests"), bare=True
  3617. )
  3618. user = tests.FakeUser(username="pingou")
  3619. with tests.user_set(self.app.application, user):
  3620. repo = pagure.lib.query.get_authorized_project(
  3621. self.session, "test"
  3622. )
  3623. self.assertNotEqual(repo, None)
  3624. repo.read_only = True
  3625. self.session.add(repo)
  3626. self.session.commit()
  3627. output = self.app.post("/test/delete", follow_redirects=True)
  3628. self.assertEqual(output.status_code, 200)
  3629. output_text = output.get_data(as_text=True)
  3630. self.assertIn(
  3631. "<title>Settings - test - Pagure</title>", output_text
  3632. )
  3633. self.assertIn(
  3634. "The ACLs of this project are being refreshed in the "
  3635. "backend this prevents the project from being deleted. "
  3636. "Please wait for this task to finish before trying again. "
  3637. "Thanks!",
  3638. output_text,
  3639. )
  3640. self.assertIn(
  3641. 'title="Action disabled while project\'s ACLs are being refreshed">',
  3642. output_text,
  3643. )
  3644. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  3645. @patch("pagure.decorators.admin_session_timedout")
  3646. def test_delete_repo(self, ast):
  3647. """Test the delete_repo endpoint."""
  3648. ast.return_value = False
  3649. # No Git repo
  3650. output = self.app.post("/foo/delete")
  3651. self.assertEqual(output.status_code, 404)
  3652. user = tests.FakeUser()
  3653. with tests.user_set(self.app.application, user):
  3654. tests.create_projects(self.session)
  3655. tests.create_projects_git(os.path.join(self.path, "repos"))
  3656. # No project registered in the DB (no git repo)
  3657. output = self.app.post("/foo/delete")
  3658. self.assertEqual(output.status_code, 404)
  3659. # User not allowed
  3660. output = self.app.post("/test/delete")
  3661. self.assertEqual(output.status_code, 403)
  3662. # User not logged in
  3663. output = self.app.post("/test/delete")
  3664. self.assertEqual(output.status_code, 302)
  3665. # Ensure the project isn't read-only
  3666. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  3667. repo.read_only = False
  3668. self.session.add(repo)
  3669. self.session.commit()
  3670. user = tests.FakeUser(username="pingou")
  3671. with tests.user_set(self.app.application, user):
  3672. tests.create_projects_git(os.path.join(self.path, "repos"))
  3673. ast.return_value = True
  3674. output = self.app.post("/test/delete")
  3675. self.assertEqual(output.status_code, 302)
  3676. ast.return_value = False
  3677. output = self.app.post("/test/delete", follow_redirects=True)
  3678. self.assertEqual(output.status_code, 200)
  3679. output_text = output.get_data(as_text=True)
  3680. self.assertIn(
  3681. """<span>
  3682. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  3683. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3684. </span>
  3685. <div class="ml-auto">
  3686. <span class="badge badge-secondary">
  3687. 2
  3688. </span>
  3689. </div>""",
  3690. output_text,
  3691. )
  3692. self.assertIn(
  3693. """<span>
  3694. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3695. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3696. </span>
  3697. <div class="ml-auto">
  3698. <span class="badge badge-secondary">
  3699. 0
  3700. </span>
  3701. </div>""",
  3702. output_text,
  3703. )
  3704. # Only git repo
  3705. item = pagure.lib.model.Project(
  3706. user_id=1, # pingou
  3707. name="test",
  3708. description="test project #1",
  3709. hook_token="aaabbbggg",
  3710. read_only=False,
  3711. )
  3712. self.session.add(item)
  3713. self.session.commit()
  3714. tests.create_projects_git(os.path.join(self.path, "repos"))
  3715. output = self.app.post("/test/delete", follow_redirects=True)
  3716. self.assertEqual(output.status_code, 200)
  3717. output_text = output.get_data(as_text=True)
  3718. self.assertIn(
  3719. """<span>
  3720. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  3721. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3722. </span>
  3723. <div class="ml-auto">
  3724. <span class="badge badge-secondary">
  3725. 2
  3726. </span>
  3727. </div>""",
  3728. output_text,
  3729. )
  3730. self.assertIn(
  3731. """<span>
  3732. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3733. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3734. </span>
  3735. <div class="ml-auto">
  3736. <span class="badge badge-secondary">
  3737. 0
  3738. </span>
  3739. </div>""",
  3740. output_text,
  3741. )
  3742. # Only git and doc repo
  3743. item = pagure.lib.model.Project(
  3744. user_id=1, # pingou
  3745. name="test",
  3746. description="test project #1",
  3747. hook_token="aaabbbhhh",
  3748. read_only=False,
  3749. )
  3750. self.session.add(item)
  3751. self.session.commit()
  3752. tests.create_projects_git(os.path.join(self.path, "repos"))
  3753. tests.create_projects_git(os.path.join(self.path, "docs"))
  3754. output = self.app.post("/test/delete", follow_redirects=True)
  3755. self.assertEqual(output.status_code, 200)
  3756. output_text = output.get_data(as_text=True)
  3757. self.assertIn(
  3758. """<span>
  3759. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  3760. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3761. </span>
  3762. <div class="ml-auto">
  3763. <span class="badge badge-secondary">
  3764. 2
  3765. </span>
  3766. </div>""",
  3767. output_text,
  3768. )
  3769. self.assertIn(
  3770. """<span>
  3771. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3772. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3773. </span>
  3774. <div class="ml-auto">
  3775. <span class="badge badge-secondary">
  3776. 0
  3777. </span>
  3778. </div>""",
  3779. output_text,
  3780. )
  3781. # All repo there
  3782. item = pagure.lib.model.Project(
  3783. user_id=1, # pingou
  3784. name="test",
  3785. description="test project #1",
  3786. hook_token="aaabbbiii",
  3787. read_only=False,
  3788. )
  3789. self.session.add(item)
  3790. self.session.commit()
  3791. # Create all the git repos
  3792. tests.create_projects_git(os.path.join(self.path, "repos"))
  3793. tests.create_projects_git(os.path.join(self.path, "docs"))
  3794. tests.create_projects_git(
  3795. os.path.join(self.path, "tickets"), bare=True
  3796. )
  3797. tests.create_projects_git(
  3798. os.path.join(self.path, "requests"), bare=True
  3799. )
  3800. # Check repo was created
  3801. output = self.app.get("/", follow_redirects=True)
  3802. self.assertEqual(output.status_code, 200)
  3803. output_text = output.get_data(as_text=True)
  3804. self.assertIn(
  3805. """<span>
  3806. <i class="fa fa-calendar-o fa-rotate-270 fa-fw text-muted"></i>
  3807. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3808. </span>
  3809. <div class="ml-auto">
  3810. <span class="badge badge-secondary">
  3811. 3
  3812. </span>
  3813. </div>""",
  3814. output_text,
  3815. )
  3816. self.assertNotIn(
  3817. """<span class="d-none d-md-inline">Forks&nbsp;</span>""",
  3818. output_text,
  3819. )
  3820. # add issues
  3821. repo = pagure.lib.query.get_authorized_project(
  3822. self.session, "test"
  3823. )
  3824. msg = pagure.lib.query.new_issue(
  3825. session=self.session,
  3826. repo=repo,
  3827. title="Test issue",
  3828. content="We should work on this",
  3829. user="pingou",
  3830. )
  3831. self.session.commit()
  3832. self.assertEqual(msg.title, "Test issue")
  3833. msg = pagure.lib.query.new_issue(
  3834. session=self.session,
  3835. repo=repo,
  3836. title="Test issue #2",
  3837. content="We should work on this, really",
  3838. user="pingou",
  3839. )
  3840. self.session.commit()
  3841. self.assertEqual(msg.title, "Test issue #2")
  3842. # Add a comment to an issue
  3843. issue = pagure.lib.query.search_issues(
  3844. self.session, repo, issueid=1
  3845. )
  3846. msg = pagure.lib.query.add_issue_comment(
  3847. session=self.session,
  3848. issue=issue,
  3849. comment="Hey look a comment!",
  3850. user="foo",
  3851. )
  3852. self.session.commit()
  3853. self.assertEqual(msg, "Comment added")
  3854. # add pull-requests
  3855. req = pagure.lib.query.new_pull_request(
  3856. session=self.session,
  3857. repo_from=repo,
  3858. branch_from="feature",
  3859. repo_to=repo,
  3860. branch_to="master",
  3861. title="test pull-request",
  3862. user="pingou",
  3863. )
  3864. self.session.commit()
  3865. self.assertEqual(req.id, 3)
  3866. self.assertEqual(req.title, "test pull-request")
  3867. req = pagure.lib.query.new_pull_request(
  3868. session=self.session,
  3869. repo_from=repo,
  3870. branch_from="feature2",
  3871. repo_to=repo,
  3872. branch_to="master",
  3873. title="test pull-request",
  3874. user="pingou",
  3875. )
  3876. self.session.commit()
  3877. self.assertEqual(req.id, 4)
  3878. self.assertEqual(req.title, "test pull-request")
  3879. # Add comment on a pull-request
  3880. request = pagure.lib.query.search_pull_requests(
  3881. self.session, requestid=3
  3882. )
  3883. msg = pagure.lib.query.add_pull_request_comment(
  3884. session=self.session,
  3885. request=request,
  3886. commit="commithash",
  3887. tree_id=None,
  3888. filename="file",
  3889. row=None,
  3890. comment="This is awesome, I got to remember it!",
  3891. user="foo",
  3892. )
  3893. self.assertEqual(msg, "Comment added")
  3894. # Check before deleting the project
  3895. output = self.app.get("/", follow_redirects=True)
  3896. self.assertEqual(output.status_code, 200)
  3897. output_text = output.get_data(as_text=True)
  3898. self.assertIn(
  3899. """<span>
  3900. <i class="fa fa-calendar-o fa-rotate-270 fa-fw text-muted"></i>
  3901. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3902. </span>
  3903. <div class="ml-auto">
  3904. <span class="badge badge-secondary">
  3905. 3
  3906. </span>
  3907. </div>""",
  3908. output_text,
  3909. )
  3910. self.assertNotIn(
  3911. """<span class="d-none d-md-inline">Forks&nbsp;</span>""",
  3912. output_text,
  3913. )
  3914. output = self.app.post("/test/delete", follow_redirects=True)
  3915. self.assertEqual(output.status_code, 200)
  3916. output_text = output.get_data(as_text=True)
  3917. self.assertIn(
  3918. """<span>
  3919. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  3920. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3921. </span>
  3922. <div class="ml-auto">
  3923. <span class="badge badge-secondary">
  3924. 2
  3925. </span>
  3926. </div>""",
  3927. output_text,
  3928. )
  3929. self.assertIn(
  3930. """<span>
  3931. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3932. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3933. </span>
  3934. <div class="ml-auto">
  3935. <span class="badge badge-secondary">
  3936. 0
  3937. </span>
  3938. </div>""",
  3939. output_text,
  3940. )
  3941. repo = pagure.lib.query.get_authorized_project(
  3942. self.session, "test"
  3943. )
  3944. self.assertEqual(repo, None)
  3945. repo = pagure.lib.query.get_authorized_project(
  3946. self.session, "test2"
  3947. )
  3948. self.assertNotEqual(repo, None)
  3949. # Add a fork of a fork
  3950. item = pagure.lib.model.Project(
  3951. user_id=1, # pingou
  3952. name="test3",
  3953. description="test project #3",
  3954. is_fork=True,
  3955. parent_id=2,
  3956. hook_token="aaabbbjjj",
  3957. read_only=False,
  3958. )
  3959. self.session.add(item)
  3960. self.session.commit()
  3961. tests.add_content_git_repo(
  3962. os.path.join(
  3963. self.path, "repos", "forks", "pingou", "test3.git"
  3964. )
  3965. )
  3966. tests.add_content_git_repo(
  3967. os.path.join(self.path, "docs", "pingou", "test3.git")
  3968. )
  3969. tests.add_content_git_repo(
  3970. os.path.join(self.path, "tickets", "pingou", "test3.git")
  3971. )
  3972. # Check before deleting the fork
  3973. output = self.app.get("/", follow_redirects=True)
  3974. self.assertEqual(output.status_code, 200)
  3975. output_text = output.get_data(as_text=True)
  3976. self.assertIn(
  3977. """<span>
  3978. <i class="fa fa-calendar-o fa-rotate-270 fa-fw text-muted"></i>
  3979. <span class="d-none d-md-inline">Projects&nbsp;</span>
  3980. </span>
  3981. <div class="ml-auto">
  3982. <span class="badge badge-secondary">
  3983. 2
  3984. </span>
  3985. </div>""",
  3986. output_text,
  3987. )
  3988. self.assertIn(
  3989. """<span>
  3990. <i class="fa fa-fw text-muted fa-code-fork"></i>
  3991. <span class="d-none d-md-inline">Forks&nbsp;</span>
  3992. </span>
  3993. <div class="ml-auto">
  3994. <span class="badge badge-secondary">
  3995. 1
  3996. </span>
  3997. </div>""",
  3998. output_text,
  3999. )
  4000. output = self.app.post(
  4001. "/fork/pingou/test3/delete", follow_redirects=True
  4002. )
  4003. self.assertEqual(output.status_code, 200)
  4004. output_text = output.get_data(as_text=True)
  4005. self.assertIn(
  4006. """<span>
  4007. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  4008. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4009. </span>
  4010. <div class="ml-auto">
  4011. <span class="badge badge-secondary">
  4012. 2
  4013. </span>
  4014. </div>""",
  4015. output_text,
  4016. )
  4017. self.assertIn(
  4018. """<span>
  4019. <i class="fa fa-fw text-muted fa-code-fork"></i>
  4020. <span class="d-none d-md-inline">Forks&nbsp;</span>
  4021. </span>
  4022. <div class="ml-auto">
  4023. <span class="badge badge-secondary">
  4024. 0
  4025. </span>
  4026. </div>""",
  4027. output_text,
  4028. )
  4029. @patch.dict("pagure.config.config", {"TICKETS_FOLDER": None})
  4030. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  4031. @patch(
  4032. "pagure.decorators.admin_session_timedout",
  4033. MagicMock(return_value=False),
  4034. )
  4035. def test_delete_repo_no_ticket(self):
  4036. """Test the delete_repo endpoint when tickets aren't enabled in
  4037. this pagure instance."""
  4038. tests.create_projects(self.session)
  4039. tests.create_projects_git(os.path.join(self.path, "repos"))
  4040. # Ensure the project isn't read-only
  4041. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  4042. repo.read_only = False
  4043. self.session.add(repo)
  4044. self.session.commit()
  4045. user = tests.FakeUser(username="pingou")
  4046. with tests.user_set(self.app.application, user):
  4047. # Check before deleting the project
  4048. output = self.app.get("/", follow_redirects=True)
  4049. self.assertEqual(output.status_code, 200)
  4050. output_text = output.get_data(as_text=True)
  4051. self.assertIn(
  4052. """<span>
  4053. <i class="fa fa-calendar-o fa-rotate-270 fa-fw text-muted"></i>
  4054. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4055. </span>
  4056. <div class="ml-auto">
  4057. <span class="badge badge-secondary">
  4058. 3
  4059. </span>
  4060. </div>""",
  4061. output_text,
  4062. )
  4063. self.assertNotIn(
  4064. """<span class="d-none d-md-inline">Forks&nbsp;</span>""",
  4065. output_text,
  4066. )
  4067. # Delete the project
  4068. output = self.app.post("/test/delete", follow_redirects=True)
  4069. self.assertEqual(output.status_code, 200)
  4070. output_text = output.get_data(as_text=True)
  4071. # Check deletion worked
  4072. self.assertIn(
  4073. """<span>
  4074. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  4075. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4076. </span>
  4077. <div class="ml-auto">
  4078. <span class="badge badge-secondary">
  4079. 2
  4080. </span>
  4081. </div>""",
  4082. output_text,
  4083. )
  4084. self.assertIn(
  4085. """<span>
  4086. <i class="fa fa-fw text-muted fa-code-fork"></i>
  4087. <span class="d-none d-md-inline">Forks&nbsp;</span>
  4088. </span>
  4089. <div class="ml-auto">
  4090. <span class="badge badge-secondary">
  4091. 0
  4092. </span>
  4093. </div>""",
  4094. output_text,
  4095. )
  4096. @patch("pagure.lib.notify.send_email")
  4097. @patch("pagure.decorators.admin_session_timedout")
  4098. def test_delete_repo_with_users(self, ast, send_email):
  4099. """Test the delete_repo endpoint."""
  4100. ast.return_value = False
  4101. send_email.return_value = True
  4102. user = tests.FakeUser()
  4103. user = tests.FakeUser(username="pingou")
  4104. with tests.user_set(self.app.application, user):
  4105. # Create new project
  4106. item = pagure.lib.model.Project(
  4107. user_id=1, # pingou
  4108. name="test",
  4109. description="test project #1",
  4110. hook_token="aaabbbiii",
  4111. read_only=False,
  4112. )
  4113. self.session.add(item)
  4114. self.session.commit()
  4115. # Create all the git repos
  4116. tests.create_projects_git(os.path.join(self.path, "repos"))
  4117. tests.create_projects_git(
  4118. os.path.join(self.path, "docs"), bare=True
  4119. )
  4120. tests.create_projects_git(
  4121. os.path.join(self.path, "tickets"), bare=True
  4122. )
  4123. tests.create_projects_git(
  4124. os.path.join(self.path, "requests"), bare=True
  4125. )
  4126. # Check repo was created
  4127. output = self.app.get("/", follow_redirects=True)
  4128. self.assertEqual(output.status_code, 200)
  4129. output_text = output.get_data(as_text=True)
  4130. self.assertIn(
  4131. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4132. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4133. output_text,
  4134. )
  4135. self.assertNotIn(
  4136. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4137. output_text,
  4138. )
  4139. # add user
  4140. repo = pagure.lib.query.get_authorized_project(
  4141. self.session, "test"
  4142. )
  4143. msg = pagure.lib.query.add_user_to_project(
  4144. session=self.session,
  4145. project=repo,
  4146. new_user="foo",
  4147. user="pingou",
  4148. )
  4149. self.session.commit()
  4150. self.assertEqual(msg, "User added")
  4151. # Ensure the project isn't read-only (because adding an user
  4152. # will trigger an ACL refresh, thus read-only)
  4153. repo = pagure.lib.query.get_authorized_project(
  4154. self.session, "test"
  4155. )
  4156. repo.read_only = False
  4157. self.session.add(repo)
  4158. self.session.commit()
  4159. # Check before deleting the project
  4160. output = self.app.get("/", follow_redirects=True)
  4161. self.assertEqual(output.status_code, 200)
  4162. output_text = output.get_data(as_text=True)
  4163. self.assertIn(
  4164. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4165. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4166. output_text,
  4167. )
  4168. self.assertNotIn(
  4169. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4170. output_text,
  4171. )
  4172. repo = pagure.lib.query.get_authorized_project(
  4173. self.session, "test"
  4174. )
  4175. self.assertNotEqual(repo, None)
  4176. repo = pagure.lib.query.get_authorized_project(
  4177. self.session, "test2"
  4178. )
  4179. self.assertEqual(repo, None)
  4180. # Delete the project
  4181. output = self.app.post("/test/delete", follow_redirects=True)
  4182. self.assertEqual(output.status_code, 200)
  4183. output_text = output.get_data(as_text=True)
  4184. self.assertIn(
  4185. """<span>
  4186. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  4187. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4188. </span>
  4189. <div class="ml-auto">
  4190. <span class="badge badge-secondary">
  4191. 0
  4192. </span>
  4193. </div>""",
  4194. output_text,
  4195. )
  4196. self.assertIn(
  4197. """<span>
  4198. <i class="fa fa-fw text-muted fa-code-fork"></i>
  4199. <span class="d-none d-md-inline">Forks&nbsp;</span>
  4200. </span>
  4201. <div class="ml-auto">
  4202. <span class="badge badge-secondary">
  4203. 0
  4204. </span>
  4205. </div>""",
  4206. output_text,
  4207. )
  4208. # Check after
  4209. repo = pagure.lib.query.get_authorized_project(
  4210. self.session, "test"
  4211. )
  4212. self.assertEqual(repo, None)
  4213. repo = pagure.lib.query.get_authorized_project(
  4214. self.session, "test2"
  4215. )
  4216. self.assertEqual(repo, None)
  4217. @patch("pagure.lib.notify.send_email")
  4218. @patch("pagure.decorators.admin_session_timedout")
  4219. def test_delete_repo_with_group(self, ast, send_email):
  4220. """Test the delete_repo endpoint."""
  4221. ast.return_value = False
  4222. send_email.return_value = True
  4223. user = tests.FakeUser()
  4224. user = tests.FakeUser(username="pingou")
  4225. with tests.user_set(self.app.application, user):
  4226. # Create new project
  4227. item = pagure.lib.model.Project(
  4228. user_id=1, # pingou
  4229. name="test",
  4230. description="test project #1",
  4231. hook_token="aaabbbiii",
  4232. read_only=False,
  4233. )
  4234. self.session.add(item)
  4235. self.session.commit()
  4236. # Create all the git repos
  4237. tests.create_projects_git(os.path.join(self.path, "repos"))
  4238. tests.create_projects_git(
  4239. os.path.join(self.path, "docs"), bare=True
  4240. )
  4241. tests.create_projects_git(
  4242. os.path.join(self.path, "tickets"), bare=True
  4243. )
  4244. tests.create_projects_git(
  4245. os.path.join(self.path, "requests"), bare=True
  4246. )
  4247. # Check repo was created
  4248. output = self.app.get("/", follow_redirects=True)
  4249. self.assertEqual(output.status_code, 200)
  4250. output_text = output.get_data(as_text=True)
  4251. self.assertIn(
  4252. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4253. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4254. output_text,
  4255. )
  4256. self.assertNotIn(
  4257. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4258. output_text,
  4259. )
  4260. # Create group
  4261. msg = pagure.lib.query.add_group(
  4262. self.session,
  4263. group_name="foo",
  4264. display_name="foo group",
  4265. description=None,
  4266. group_type="bar",
  4267. user="pingou",
  4268. is_admin=False,
  4269. blacklist=[],
  4270. )
  4271. self.session.commit()
  4272. self.assertEqual(msg, "User `pingou` added to the group `foo`.")
  4273. # Add group to the project
  4274. repo = pagure.lib.query.get_authorized_project(
  4275. self.session, "test"
  4276. )
  4277. msg = pagure.lib.query.add_group_to_project(
  4278. session=self.session,
  4279. project=repo,
  4280. new_group="foo",
  4281. user="pingou",
  4282. )
  4283. self.session.commit()
  4284. self.assertEqual(msg, "Group added")
  4285. # Ensure the project isn't read-only (because adding a group
  4286. # will trigger an ACL refresh, thus read-only)
  4287. repo = pagure.lib.query.get_authorized_project(
  4288. self.session, "test"
  4289. )
  4290. repo.read_only = False
  4291. self.session.add(repo)
  4292. self.session.commit()
  4293. # check if group where we expect it
  4294. repo = pagure.lib.query.get_authorized_project(
  4295. self.session, "test"
  4296. )
  4297. self.assertEqual(len(repo.projects_groups), 1)
  4298. # Check before deleting the project
  4299. output = self.app.get("/", follow_redirects=True)
  4300. self.assertEqual(output.status_code, 200)
  4301. output_text = output.get_data(as_text=True)
  4302. self.assertIn(
  4303. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4304. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4305. output_text,
  4306. )
  4307. self.assertNotIn(
  4308. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4309. output_text,
  4310. )
  4311. repo = pagure.lib.query.get_authorized_project(
  4312. self.session, "test"
  4313. )
  4314. self.assertNotEqual(repo, None)
  4315. # Delete the project
  4316. output = self.app.post("/test/delete", follow_redirects=True)
  4317. self.assertEqual(output.status_code, 200)
  4318. output_text = output.get_data(as_text=True)
  4319. self.assertIn(
  4320. """<span>
  4321. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  4322. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4323. </span>
  4324. <div class="ml-auto">
  4325. <span class="badge badge-secondary">
  4326. 0
  4327. </span>
  4328. </div>""",
  4329. output_text,
  4330. )
  4331. self.assertIn(
  4332. """<span>
  4333. <i class="fa fa-fw text-muted fa-code-fork"></i>
  4334. <span class="d-none d-md-inline">Forks&nbsp;</span>
  4335. </span>
  4336. <div class="ml-auto">
  4337. <span class="badge badge-secondary">
  4338. 0
  4339. </span>
  4340. </div>""",
  4341. output_text,
  4342. )
  4343. # Check after
  4344. repo = pagure.lib.query.get_authorized_project(
  4345. self.session, "test"
  4346. )
  4347. self.assertEqual(repo, None)
  4348. @patch("pagure.lib.notify.send_email")
  4349. @patch("pagure.decorators.admin_session_timedout")
  4350. def test_delete_repo_with_coloredtag(self, ast, send_email):
  4351. """Test the delete_repo endpoint."""
  4352. ast.return_value = False
  4353. send_email.return_value = True
  4354. user = tests.FakeUser()
  4355. user = tests.FakeUser(username="pingou")
  4356. with tests.user_set(self.app.application, user):
  4357. # Create new project
  4358. item = pagure.lib.model.Project(
  4359. user_id=1, # pingou
  4360. name="test",
  4361. description="test project #1",
  4362. hook_token="aaabbbiii",
  4363. read_only=False,
  4364. )
  4365. self.session.add(item)
  4366. self.session.commit()
  4367. # Create all the git repos
  4368. tests.create_projects_git(os.path.join(self.path, "repos"))
  4369. tests.create_projects_git(
  4370. os.path.join(self.path, "docs"), bare=True
  4371. )
  4372. tests.create_projects_git(
  4373. os.path.join(self.path, "tickets"), bare=True
  4374. )
  4375. tests.create_projects_git(
  4376. os.path.join(self.path, "requests"), bare=True
  4377. )
  4378. # Check repo was created
  4379. output = self.app.get("/", follow_redirects=True)
  4380. self.assertEqual(output.status_code, 200)
  4381. output_text = output.get_data(as_text=True)
  4382. self.assertIn(
  4383. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4384. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4385. output_text,
  4386. )
  4387. self.assertNotIn(
  4388. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4389. output_text,
  4390. )
  4391. # Create the issue
  4392. repo = pagure.lib.query.get_authorized_project(
  4393. self.session, "test"
  4394. )
  4395. msg = pagure.lib.query.new_issue(
  4396. session=self.session,
  4397. repo=repo,
  4398. title="Test issue",
  4399. content="We should work on this",
  4400. user="pingou",
  4401. )
  4402. self.session.commit()
  4403. self.assertEqual(msg.title, "Test issue")
  4404. # Add a tag to the issue
  4405. repo = pagure.lib.query.get_authorized_project(
  4406. self.session, "test"
  4407. )
  4408. issue = pagure.lib.query.search_issues(
  4409. self.session, repo, issueid=1
  4410. )
  4411. msg = pagure.lib.query.add_tag_obj(
  4412. session=self.session, obj=issue, tags="tag1", user="pingou"
  4413. )
  4414. self.session.commit()
  4415. self.assertEqual(msg, "Issue tagged with: tag1")
  4416. # Check before deleting the project
  4417. output = self.app.get("/", follow_redirects=True)
  4418. self.assertEqual(output.status_code, 200)
  4419. output_text = output.get_data(as_text=True)
  4420. self.assertIn(
  4421. '<span class="btn btn-outline-secondary disabled opacity-100 '
  4422. 'border-0 ml-auto font-weight-bold">1 Projects</span>',
  4423. output_text,
  4424. )
  4425. self.assertNotIn(
  4426. '<span class="d-none d-md-inline">Forks&nbsp;</span>',
  4427. output_text,
  4428. )
  4429. repo = pagure.lib.query.get_authorized_project(
  4430. self.session, "test"
  4431. )
  4432. self.assertNotEqual(repo, None)
  4433. repo = pagure.lib.query.get_authorized_project(
  4434. self.session, "test2"
  4435. )
  4436. self.assertEqual(repo, None)
  4437. # Delete the project
  4438. output = self.app.post("/test/delete", follow_redirects=True)
  4439. self.assertEqual(output.status_code, 200)
  4440. output_text = output.get_data(as_text=True)
  4441. self.assertIn(
  4442. """<span>
  4443. <i class="fa fa-fw text-muted fa-calendar-o fa-rotate-270"></i>
  4444. <span class="d-none d-md-inline">Projects&nbsp;</span>
  4445. </span>
  4446. <div class="ml-auto">
  4447. <span class="badge badge-secondary">
  4448. 0
  4449. </span>
  4450. </div>""",
  4451. output_text,
  4452. )
  4453. self.assertIn(
  4454. """<span>
  4455. <i class="fa fa-fw text-muted fa-code-fork"></i>
  4456. <span class="d-none d-md-inline">Forks&nbsp;</span>
  4457. </span>
  4458. <div class="ml-auto">
  4459. <span class="badge badge-secondary">
  4460. 0
  4461. </span>
  4462. </div>""",
  4463. output_text,
  4464. )
  4465. # Check after
  4466. repo = pagure.lib.query.get_authorized_project(
  4467. self.session, "test"
  4468. )
  4469. self.assertEqual(repo, None)
  4470. repo = pagure.lib.query.get_authorized_project(
  4471. self.session, "test2"
  4472. )
  4473. self.assertEqual(repo, None)
  4474. @patch("pagure.decorators.admin_session_timedout")
  4475. def test_new_repo_hook_token(self, ast):
  4476. """Test the new_repo_hook_token endpoint."""
  4477. ast.return_value = False
  4478. tests.create_projects(self.session)
  4479. tests.create_projects_git(os.path.join(self.path, "repos"))
  4480. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  4481. self.assertEqual(repo.hook_token, "aaabbbccc")
  4482. user = tests.FakeUser()
  4483. with tests.user_set(self.app.application, user):
  4484. pagure.config.config["WEBHOOK"] = True
  4485. output = self.app.get("/new/")
  4486. self.assertEqual(output.status_code, 200)
  4487. output_text = output.get_data(as_text=True)
  4488. self.assertIn("<strong>Create new Project</strong>", output_text)
  4489. csrf_token = output_text.split(
  4490. 'name="csrf_token" type="hidden" value="'
  4491. )[1].split('">')[0]
  4492. output = self.app.post("/foo/hook_token")
  4493. self.assertEqual(output.status_code, 404)
  4494. output = self.app.post("/test/hook_token")
  4495. self.assertEqual(output.status_code, 403)
  4496. ast.return_value = True
  4497. output = self.app.post("/test/hook_token")
  4498. self.assertEqual(output.status_code, 302)
  4499. ast.return_value = False
  4500. pagure.config.config["WEBHOOK"] = False
  4501. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  4502. self.assertEqual(repo.hook_token, "aaabbbccc")
  4503. user.username = "pingou"
  4504. with tests.user_set(self.app.application, user):
  4505. pagure.config.config["WEBHOOK"] = True
  4506. output = self.app.post("/test/hook_token")
  4507. self.assertEqual(output.status_code, 400)
  4508. data = {"csrf_token": csrf_token}
  4509. repo = pagure.lib.query.get_authorized_project(
  4510. self.session, "test"
  4511. )
  4512. self.assertEqual(repo.hook_token, "aaabbbccc")
  4513. output = self.app.post(
  4514. "/test/hook_token", data=data, follow_redirects=True
  4515. )
  4516. self.assertEqual(output.status_code, 200)
  4517. output_text = output.get_data(as_text=True)
  4518. self.assertIn("New hook token generated", output_text)
  4519. pagure.config.config["WEBHOOK"] = False
  4520. self.session.commit()
  4521. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  4522. self.assertNotEqual(repo.hook_token, "aaabbbccc")
  4523. def test_view_tags(self):
  4524. """Test the view_tags endpoint."""
  4525. output = self.app.get("/foo/releases")
  4526. # No project registered in the DB
  4527. self.assertEqual(output.status_code, 404)
  4528. tests.create_projects(self.session)
  4529. output = self.app.get("/test/releases")
  4530. # No git repo associated
  4531. self.assertEqual(output.status_code, 404)
  4532. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  4533. output = self.app.get("/test/releases")
  4534. self.assertEqual(output.status_code, 200)
  4535. output_text = output.get_data(as_text=True)
  4536. self.assertIn("This project has not been tagged.", output_text)
  4537. # Add a README to the git repo - First commit
  4538. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  4539. repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
  4540. first_commit = repo.revparse_single("HEAD")
  4541. tagger = pygit2.Signature("Alice Doe", "adoe@example.com", 12347, 0)
  4542. repo.create_tag(
  4543. "0.0.1",
  4544. first_commit.oid.hex,
  4545. pygit2.GIT_OBJ_COMMIT,
  4546. tagger,
  4547. "Release 0.0.1",
  4548. )
  4549. output = self.app.get("/test/releases")
  4550. self.assertEqual(output.status_code, 200)
  4551. output_text = output.get_data(as_text=True)
  4552. self.assertIn("0.0.1", output_text)
  4553. self.assertIn('<section class="tag_list">', output_text)
  4554. self.assertEqual(
  4555. output_text.count(
  4556. '<i class="fa fa-calendar-o fa-rotate-270 text-muted"></i>'
  4557. ),
  4558. 1,
  4559. )
  4560. def test_edit_file_no_signed_off(self):
  4561. """Test the edit_file endpoint when signed-off isn't enforced."""
  4562. tests.create_projects(self.session)
  4563. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  4564. user = tests.FakeUser()
  4565. user.username = "pingou"
  4566. with tests.user_set(self.app.application, user):
  4567. # Add some content to the git repo
  4568. tests.add_content_git_repo(
  4569. os.path.join(self.path, "repos", "test.git")
  4570. )
  4571. output = self.app.get("/test/edit/master/f/sources")
  4572. self.assertEqual(output.status_code, 200)
  4573. output_text = output.get_data(as_text=True)
  4574. self.assertIn(
  4575. '<li><a href="/test/tree/master"><span class="fa fa-random">'
  4576. '</span>&nbsp; master</a></li><li class="active">'
  4577. '<span class="fa fa-file"></span>&nbsp; sources</li>',
  4578. output_text,
  4579. )
  4580. self.assertIn(
  4581. '<textarea id="textareaCode" name="content">foo\n bar</textarea>',
  4582. output_text,
  4583. )
  4584. self.assertIn(
  4585. '<textarea rows="5" class="form-control" type="text" '
  4586. 'id="commit_message"\n name="commit_message" '
  4587. 'placeholder="An optional description of the change">'
  4588. "</textarea>",
  4589. output_text,
  4590. )
  4591. def test_edit_file_signed_off(self):
  4592. """Test the edit_file endpoint when signed-off is enforced."""
  4593. tests.create_projects(self.session)
  4594. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  4595. repo = pagure.lib.query.get_authorized_project(self.session, "test")
  4596. settings = repo.settings
  4597. settings["Enforce_signed-off_commits_in_pull-request"] = True
  4598. repo.settings = settings
  4599. self.session.add(repo)
  4600. self.session.commit()
  4601. user = tests.FakeUser()
  4602. user.username = "pingou"
  4603. with tests.user_set(self.app.application, user):
  4604. # Add some content to the git repo
  4605. tests.add_content_git_repo(
  4606. os.path.join(self.path, "repos", "test.git")
  4607. )
  4608. output = self.app.get("/test/edit/master/f/sources")
  4609. self.assertEqual(output.status_code, 200)
  4610. output_text = output.get_data(as_text=True)
  4611. self.assertIn(
  4612. '<li><a href="/test/tree/master"><span class="fa fa-random">'
  4613. '</span>&nbsp; master</a></li><li class="active">'
  4614. '<span class="fa fa-file"></span>&nbsp; sources</li>',
  4615. output_text,
  4616. )
  4617. self.assertIn(
  4618. '<textarea id="textareaCode" name="content">foo\n bar</textarea>',
  4619. output_text,
  4620. )
  4621. self.assertIn(
  4622. '<textarea rows="5" class="form-control" type="text" '
  4623. 'id="commit_message"\n name="commit_message" '
  4624. 'placeholder="An optional description of the change">'
  4625. "Signed-off-by: pingou <bar@pingou.com></textarea>",
  4626. output_text,
  4627. )
  4628. def test_edit_file(self):
  4629. """Test the edit_file endpoint."""
  4630. # No Git repo
  4631. output = self.app.get("/foo/edit/foo/f/sources")
  4632. self.assertEqual(output.status_code, 404)
  4633. # Add some content to the git repo
  4634. tests.add_content_git_repo(
  4635. os.path.join(self.path, "repos", "test.git")
  4636. )
  4637. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  4638. tests.add_binary_git_repo(
  4639. os.path.join(self.path, "repos", "test.git"), "test.jpg"
  4640. )
  4641. tests.add_binary_git_repo(
  4642. os.path.join(self.path, "repos", "test.git"), "test_binary"
  4643. )
  4644. user = tests.FakeUser()
  4645. with tests.user_set(self.app.application, user):
  4646. # No project registered in the DB
  4647. output = self.app.get("/foo/edit/foo/f/sources")
  4648. self.assertEqual(output.status_code, 404)
  4649. tests.create_projects(self.session)
  4650. tests.create_projects_git(
  4651. os.path.join(self.path, "repos"), bare=True
  4652. )
  4653. # No a repo admin
  4654. output = self.app.get("/test/edit/master/f/sources")
  4655. self.assertEqual(output.status_code, 403)
  4656. # User not logged in
  4657. output = self.app.get("/test/edit/foo/f/sources")
  4658. self.assertEqual(output.status_code, 302)
  4659. user.username = "pingou"
  4660. with tests.user_set(self.app.application, user):
  4661. output = self.app.get("/test/edit/master/foofile")
  4662. self.assertEqual(output.status_code, 404)
  4663. # Edit page
  4664. output = self.app.get("/test/edit/master/f/sources")
  4665. self.assertEqual(output.status_code, 200)
  4666. output_text = output.get_data(as_text=True)
  4667. self.assertIn(
  4668. '<li><a href="/test/tree/master"><span class="fa fa-random">'
  4669. '</span>&nbsp; master</a></li><li class="active">'
  4670. '<span class="fa fa-file"></span>&nbsp; sources</li>',
  4671. output_text,
  4672. )
  4673. self.assertIn(
  4674. '<textarea id="textareaCode" name="content">foo\n bar</textarea>',
  4675. output_text,
  4676. )
  4677. # Verify the nav links correctly when editing a file.
  4678. output = self.app.get("/test/blob/master/f/folder1/folder2/file")
  4679. self.assertEqual(output.status_code, 200)
  4680. output_text = output.get_data(as_text=True)
  4681. self.assertIn(
  4682. '<li class="breadcrumb-item"><a href="/test/blob/master/f/folder1/folder2">'
  4683. '\n <span class="fa fa-folder"></span>&nbsp; folder2</a>\n'
  4684. " </li>",
  4685. output_text,
  4686. )
  4687. csrf_token = output_text.split(
  4688. 'name="csrf_token" type="hidden" value="'
  4689. )[1].split('">')[0]
  4690. # View what's supposed to be an image
  4691. output = self.app.get("/test/edit/master/f/test.jpg")
  4692. self.assertEqual(output.status_code, 400)
  4693. output_text = output.get_data(as_text=True)
  4694. self.assertIn("<p>Cannot edit binary files</p>", output_text)
  4695. # Check file before the commit:
  4696. output = self.app.get("/test/raw/master/f/sources")
  4697. self.assertEqual(output.status_code, 200)
  4698. output_text = output.get_data(as_text=True)
  4699. self.assertEqual(output_text, "foo\n bar")
  4700. # No CSRF Token
  4701. data = {
  4702. "content": "foo\n bar\n baz",
  4703. "commit_title": "test commit",
  4704. "commit_message": "Online commits from the gure.lib.get",
  4705. }
  4706. output = self.app.post("/test/edit/master/f/sources", data=data)
  4707. self.assertEqual(output.status_code, 200)
  4708. output_text = output.get_data(as_text=True)
  4709. self.assertIn("<title>Edit - test - Pagure</title>", output_text)
  4710. # Check that nothing changed
  4711. output = self.app.get("/test/raw/master/f/sources")
  4712. self.assertEqual(output.status_code, 200)
  4713. output_text = output.get_data(as_text=True)
  4714. self.assertEqual(output_text, "foo\n bar")
  4715. # Missing email
  4716. data["csrf_token"] = csrf_token
  4717. output = self.app.post("/test/edit/master/f/sources", data=data)
  4718. self.assertEqual(output.status_code, 200)
  4719. output_text = output.get_data(as_text=True)
  4720. self.assertIn("<title>Edit - test - Pagure</title>", output_text)
  4721. # Invalid email
  4722. data["email"] = "pingou@fp.o"
  4723. output = self.app.post("/test/edit/master/f/sources", data=data)
  4724. output_text = output.get_data(as_text=True)
  4725. self.assertIn("<title>Edit - test - Pagure</title>", output_text)
  4726. # Works
  4727. data["email"] = "bar@pingou.com"
  4728. data["branch"] = "master"
  4729. output = self.app.post(
  4730. "/test/edit/master/f/sources", data=data, follow_redirects=True
  4731. )
  4732. self.assertEqual(output.status_code, 200)
  4733. output_text = output.get_data(as_text=True)
  4734. self.assertIn(
  4735. "<title>Commits - test - Pagure</title>", output_text
  4736. )
  4737. self.assertIn("test commit", output_text)
  4738. # Check file after the commit:
  4739. output = self.app.get("/test/raw/master/f/sources")
  4740. self.assertEqual(output.status_code, 200)
  4741. output_text = output.get_data(as_text=True)
  4742. self.assertEqual(output_text, "foo\n bar\n baz")
  4743. # Add a fork of a fork
  4744. item = pagure.lib.model.Project(
  4745. user_id=1, # pingou
  4746. name="test3",
  4747. description="test project #3",
  4748. is_fork=True,
  4749. parent_id=1,
  4750. hook_token="aaabbbppp",
  4751. )
  4752. self.session.add(item)
  4753. self.session.commit()
  4754. tests.add_content_git_repo(
  4755. os.path.join(
  4756. self.path, "repos", "forks", "pingou", "test3.git"
  4757. )
  4758. )
  4759. tests.add_readme_git_repo(
  4760. os.path.join(
  4761. self.path, "repos", "forks", "pingou", "test3.git"
  4762. )
  4763. )
  4764. tests.add_commit_git_repo(
  4765. os.path.join(
  4766. self.path, "repos", "forks", "pingou", "test3.git"
  4767. ),
  4768. ncommits=10,
  4769. )
  4770. # Verify the nav links correctly when editing a file in a fork.
  4771. output = self.app.get(
  4772. "/fork/pingou/test3/edit/master/f/folder1/folder2/file"
  4773. )
  4774. self.assertEqual(output.status_code, 200)
  4775. output_text = output.get_data(as_text=True)
  4776. self.assertIn(
  4777. '<li><a\n href="/fork/pingou/test3/blob/master/f/folder1/folder2"\n'
  4778. ' ><span class="fa fa-folder"></span>&nbsp; folder2</a>\n'
  4779. " </li>",
  4780. output_text,
  4781. )
  4782. output = self.app.get("/fork/pingou/test3/edit/master/f/sources")
  4783. self.assertEqual(output.status_code, 200)
  4784. output_text = output.get_data(as_text=True)
  4785. self.assertIn(
  4786. '<li><a href="/fork/pingou/test3/tree/master">'
  4787. '<span class="fa fa-random">'
  4788. '</span>&nbsp; master</a></li><li class="active">'
  4789. '<span class="fa fa-file"></span>&nbsp; sources</li>',
  4790. output_text,
  4791. )
  4792. self.assertIn(
  4793. '<textarea id="textareaCode" name="content">foo\n barRow 0\n',
  4794. output_text,
  4795. )
  4796. # Empty the file - no `content` provided
  4797. data = {
  4798. "commit_title": "test commit",
  4799. "commit_message": "Online commits from the gure.lib.get",
  4800. "csrf_token": csrf_token,
  4801. "email": "bar@pingou.com",
  4802. "branch": "master",
  4803. }
  4804. output = self.app.post(
  4805. "/test/edit/master/f/sources", data=data, follow_redirects=True
  4806. )
  4807. self.assertEqual(output.status_code, 200)
  4808. output_text = output.get_data(as_text=True)
  4809. self.assertIn(
  4810. "<title>Commits - test - Pagure</title>", output_text
  4811. )
  4812. self.assertIn("test commit", output_text)
  4813. # Check file after the commit:
  4814. output = self.app.get("/test/raw/master/f/sources")
  4815. self.assertEqual(output.status_code, 404)
  4816. output_text = output.get_data(as_text=True)
  4817. self.assertIn("<p>No content found</p>", output_text)
  4818. def test_edit_file_default_email(self):
  4819. """Test the default email shown by the edit_file endpoint."""
  4820. tests.create_projects(self.session)
  4821. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  4822. # Add some content to the git repo
  4823. tests.add_content_git_repo(
  4824. os.path.join(self.path, "repos", "test.git")
  4825. )
  4826. tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git"))
  4827. user = pagure.lib.query.search_user(self.session, username="pingou")
  4828. self.assertEquals(len(user.emails), 2)
  4829. self.assertEquals(user.default_email, "bar@pingou.com")
  4830. user = tests.FakeUser(username="pingou")
  4831. with tests.user_set(self.app.application, user):
  4832. # Edit page
  4833. output = self.app.get("/test/edit/master/f/sources")
  4834. self.assertEqual(output.status_code, 200)
  4835. output_text = output.get_data(as_text=True)
  4836. self.assertIn(
  4837. '<li><a href="/test/tree/master"><span class="fa fa-random">'
  4838. '</span>&nbsp; master</a></li><li class="active">'
  4839. '<span class="fa fa-file"></span>&nbsp; sources</li>',
  4840. output_text,
  4841. )
  4842. self.assertIn(
  4843. '<textarea id="textareaCode" name="content">foo\n bar</textarea>',
  4844. output_text,
  4845. )
  4846. self.assertIn(
  4847. '<option value="bar@pingou.com" selected>bar@pingou.com'
  4848. "</option>",
  4849. output_text,
  4850. )
  4851. self.assertIn(
  4852. '<option value="foo@pingou.com" >foo@pingou.com</option>',
  4853. output_text,
  4854. )
  4855. @patch("pagure.decorators.admin_session_timedout")
  4856. def test_change_ref_head(self, ast):
  4857. """Test the change_ref_head endpoint."""
  4858. ast.return_value = True
  4859. # No Git repo
  4860. output = self.app.post("/foo/default/branch/")
  4861. self.assertEqual(output.status_code, 404)
  4862. user = tests.FakeUser()
  4863. with tests.user_set(self.app.application, user):
  4864. output = self.app.post("/foo/default/branch/")
  4865. self.assertEqual(output.status_code, 404)
  4866. ast.return_value = False
  4867. output = self.app.post("/foo/default/branch/")
  4868. self.assertEqual(output.status_code, 404)
  4869. tests.create_projects(self.session)
  4870. repos = tests.create_projects_git(os.path.join(self.path, "repos"))
  4871. output = self.app.post("/test/default/branch/")
  4872. self.assertEqual(output.status_code, 403)
  4873. # User no logged in
  4874. output = self.app.post("/test/default/branch/")
  4875. self.assertEqual(output.status_code, 302)
  4876. user.username = "pingou"
  4877. with tests.user_set(self.app.application, user):
  4878. output = self.app.post(
  4879. "/test/default/branch/", follow_redirects=True
  4880. ) # without git branch
  4881. self.assertEqual(output.status_code, 200)
  4882. output_text = output.get_data(as_text=True)
  4883. self.assertIn(
  4884. "<title>Settings - test - Pagure</title>", output_text
  4885. )
  4886. self.assertIn(
  4887. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  4888. output_text,
  4889. )
  4890. if self.get_wtforms_version() >= (2, 2):
  4891. self.assertIn(
  4892. '<select class="c-select" id="branches" name="branches" '
  4893. "required></select>",
  4894. output_text,
  4895. )
  4896. else:
  4897. self.assertIn(
  4898. '<select class="c-select" id="branches" name="branches">'
  4899. "</select>",
  4900. output_text,
  4901. )
  4902. csrf_token = output_text.split(
  4903. 'name="csrf_token" type="hidden" value="'
  4904. )[1].split('">')[0]
  4905. repo_obj = pygit2.Repository(repos[0])
  4906. tree = repo_obj.index.write_tree()
  4907. author = pygit2.Signature("Alice Author", "alice@authors.tld")
  4908. committer = pygit2.Signature(
  4909. "Cecil Committer", "cecil@committers.tld"
  4910. )
  4911. repo_obj.create_commit(
  4912. "refs/heads/master", # the name of the reference to update
  4913. author,
  4914. committer,
  4915. "Add sources file for testing",
  4916. # binary string representing the tree object ID
  4917. tree,
  4918. # list of binary strings representing parents of the new commit
  4919. [],
  4920. )
  4921. repo_obj.create_branch("feature", repo_obj.head.peel())
  4922. data = {"branches": "feature", "csrf_token": csrf_token}
  4923. # changing head to feature branch
  4924. output = self.app.post(
  4925. "/test/default/branch/", data=data, follow_redirects=True
  4926. )
  4927. self.assertEqual(output.status_code, 200)
  4928. output_text = output.get_data(as_text=True)
  4929. self.assertIn(
  4930. "<title>Settings - test - Pagure</title>", output_text
  4931. )
  4932. self.assertIn(
  4933. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  4934. output_text,
  4935. )
  4936. if self.get_wtforms_version() >= (2, 2):
  4937. self.assertIn(
  4938. '<select class="c-select" id="branches" name="branches" '
  4939. "required>"
  4940. '<option selected value="feature">feature</option>'
  4941. '<option value="master">master</option>'
  4942. "</select>",
  4943. output_text,
  4944. )
  4945. else:
  4946. self.assertIn(
  4947. '<select class="c-select" id="branches" name="branches">'
  4948. '<option selected value="feature">feature</option>'
  4949. '<option value="master">master</option>'
  4950. "</select>",
  4951. output_text,
  4952. )
  4953. self.assertIn("Default branch updated " "to feature", output_text)
  4954. data = {"branches": "master", "csrf_token": csrf_token}
  4955. # changing head to master branch
  4956. output = self.app.post(
  4957. "/test/default/branch/", data=data, follow_redirects=True
  4958. )
  4959. self.assertEqual(output.status_code, 200)
  4960. output_text = output.get_data(as_text=True)
  4961. self.assertIn(
  4962. "<title>Settings - test - Pagure</title>", output_text
  4963. )
  4964. self.assertIn(
  4965. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  4966. output_text,
  4967. )
  4968. if self.get_wtforms_version() >= (2, 2):
  4969. self.assertIn(
  4970. '<select class="c-select" id="branches" name="branches" '
  4971. "required>"
  4972. '<option value="feature">feature</option>'
  4973. '<option selected value="master">master</option>'
  4974. "</select>",
  4975. output_text,
  4976. )
  4977. else:
  4978. self.assertIn(
  4979. '<select class="c-select" id="branches" name="branches">'
  4980. '<option value="feature">feature</option>'
  4981. '<option selected value="master">master</option>'
  4982. "</select>",
  4983. output_text,
  4984. )
  4985. self.assertIn("Default branch updated " "to master", output_text)
  4986. def test_new_release(self):
  4987. """Test the new_release endpoint."""
  4988. # No Git repo
  4989. output = self.app.post("/foo/upload/")
  4990. self.assertEqual(output.status_code, 404)
  4991. user = tests.FakeUser()
  4992. with tests.user_set(self.app.application, user):
  4993. output = self.app.post("/foo/upload/")
  4994. self.assertEqual(output.status_code, 404)
  4995. tests.create_projects(self.session)
  4996. repo = tests.create_projects_git(os.path.join(self.path, "repos"))
  4997. output = self.app.post("/test/upload/")
  4998. self.assertEqual(output.status_code, 403)
  4999. # User not logged in
  5000. output = self.app.post("/test/upload/")
  5001. self.assertEqual(output.status_code, 302)
  5002. user.username = "pingou"
  5003. with tests.user_set(self.app.application, user):
  5004. img = os.path.join(
  5005. os.path.abspath(os.path.dirname(__file__)), "placebo.png"
  5006. )
  5007. # Missing CSRF Token
  5008. with open(img, mode="rb") as stream:
  5009. data = {"filestream": stream}
  5010. output = self.app.post("/test/upload/", data=data)
  5011. self.assertEqual(output.status_code, 200)
  5012. output_text = output.get_data(as_text=True)
  5013. self.assertIn("<h2>Upload a new release</h2>", output_text)
  5014. csrf_token = output_text.split(
  5015. 'name="csrf_token" type="hidden" value="'
  5016. )[1].split('">')[0]
  5017. upload_dir = os.path.join(self.path, "releases")
  5018. self.assertEqual(os.listdir(upload_dir), [])
  5019. # Upload successful
  5020. with open(img, mode="rb") as stream:
  5021. data = {"filestream": stream, "csrf_token": csrf_token}
  5022. output = self.app.post(
  5023. "/test/upload/", data=data, follow_redirects=True
  5024. )
  5025. self.assertEqual(output.status_code, 200)
  5026. output_text = output.get_data(as_text=True)
  5027. self.assertIn("File", output_text)
  5028. self.assertIn("uploaded", output_text)
  5029. self.assertIn("This project has not been tagged.", output_text)
  5030. self.assertEqual(os.listdir(upload_dir), ["test"])
  5031. folder = os.path.join(upload_dir, "test")
  5032. checksum_file = os.path.join(folder, "CHECKSUMS")
  5033. # Check the checksums file
  5034. self.assertTrue(os.path.exists(checksum_file))
  5035. self.assertEqual(len(os.listdir(folder)), 2)
  5036. # Check the content of the checksums file
  5037. with open(checksum_file) as stream:
  5038. data = stream.readlines()
  5039. self.assertEqual(len(data), 3)
  5040. self.assertEqual(data[0], "# Generated and updated by pagure\n")
  5041. self.assertTrue(data[1].startswith("SHA256 ("))
  5042. self.assertTrue(
  5043. data[1].endswith(
  5044. "tests_placebo.png) = 8a06845923010b27bfd8e7e75acff"
  5045. "7badc40d1021b4994e01f5e11ca40bc3abe\n"
  5046. )
  5047. )
  5048. self.assertTrue(data[2].startswith("SHA512 ("))
  5049. self.assertTrue(
  5050. data[2].endswith(
  5051. "tests_placebo.png) = 65a4458df0acb29dc3c5ad4a3620e"
  5052. "98841d1fcf3f8df358f5348fdeddd1a86706491ac6e416768e"
  5053. "9f218aae8147d6ac524a59d3eb91fb925fdcb5c489e55ccbb\n"
  5054. )
  5055. )
  5056. # Try uploading the same file -- fails
  5057. with open(img, mode="rb") as stream:
  5058. data = {"filestream": stream, "csrf_token": csrf_token}
  5059. output = self.app.post(
  5060. "/test/upload/", data=data, follow_redirects=True
  5061. )
  5062. self.assertEqual(output.status_code, 200)
  5063. output_text = output.get_data(as_text=True)
  5064. self.assertIn(
  5065. "This tarball has already " "been uploaded", output_text
  5066. )
  5067. self.assertIn("This project has not been tagged.", output_text)
  5068. def test_new_release_two_files(self):
  5069. """Test the new_release endpoint when uploading two files."""
  5070. tests.create_projects(self.session)
  5071. repo = tests.create_projects_git(os.path.join(self.path, "repos"))
  5072. user = tests.FakeUser(username="pingou")
  5073. with tests.user_set(self.app.application, user):
  5074. img = os.path.join(
  5075. os.path.abspath(os.path.dirname(__file__)), "placebo.png"
  5076. )
  5077. img2 = os.path.join(
  5078. os.path.abspath(os.path.dirname(__file__)), "pagure.png"
  5079. )
  5080. csrf_token = self.get_csrf()
  5081. upload_dir = os.path.join(self.path, "releases")
  5082. self.assertEqual(os.listdir(upload_dir), [])
  5083. # Upload successful
  5084. with open(img, mode="rb") as stream:
  5085. with open(img2, mode="rb") as stream2:
  5086. data = {
  5087. "filestream": [stream, stream2],
  5088. "csrf_token": csrf_token,
  5089. }
  5090. output = self.app.post(
  5091. "/test/upload/", data=data, follow_redirects=True
  5092. )
  5093. self.assertEqual(output.status_code, 200)
  5094. output_text = output.get_data(as_text=True)
  5095. self.assertIn(
  5096. '<i class="fa fa-fw fa-info-circle"></i> File', output_text
  5097. )
  5098. self.assertIn("pagure.png&#34; uploaded</div>\n", output_text)
  5099. # self.assertTrue(0)
  5100. self.assertEqual(os.listdir(upload_dir), ["test"])
  5101. folder = os.path.join(upload_dir, "test")
  5102. checksum_file = os.path.join(folder, "CHECKSUMS")
  5103. # Check the checksums file
  5104. self.assertTrue(os.path.exists(checksum_file))
  5105. self.assertEqual(len(os.listdir(folder)), 3)
  5106. # Check the content of the checksums file
  5107. with open(checksum_file) as stream:
  5108. data = stream.readlines()
  5109. self.assertEqual(len(data), 5)
  5110. self.assertEqual(data[0], "# Generated and updated by pagure\n")
  5111. self.assertTrue(data[1].startswith("SHA256 ("))
  5112. self.assertTrue(
  5113. data[1].endswith(
  5114. "tests_placebo.png) = 8a06845923010b27bfd8e7e75acff"
  5115. "7badc40d1021b4994e01f5e11ca40bc3abe\n"
  5116. )
  5117. )
  5118. self.assertTrue(data[2].startswith("SHA512 ("))
  5119. self.assertTrue(
  5120. data[2].endswith(
  5121. "tests_placebo.png) = 65a4458df0acb29dc3c5ad4a3620e"
  5122. "98841d1fcf3f8df358f5348fdeddd1a86706491ac6e416768e"
  5123. "9f218aae8147d6ac524a59d3eb91fb925fdcb5c489e55ccbb\n"
  5124. )
  5125. )
  5126. self.assertTrue(data[3].startswith("SHA256 ("))
  5127. self.assertTrue(
  5128. data[3].endswith(
  5129. "tests_pagure.png) = 6498a2de405546200b6144da56fc25"
  5130. "d0a3976ae688dbfccaca609c8b4480523e\n"
  5131. )
  5132. )
  5133. self.assertTrue(data[4].startswith("SHA512 ("))
  5134. self.assertTrue(
  5135. data[4].endswith(
  5136. "tests_pagure.png) = 15458775e5d73cd74de7da7224597f6"
  5137. "7f8b23d62d3affb8abba4f5db74d33235642a0f744de2265cca7"
  5138. "d2b5866782c45e1fdeb32dd2822ae33e97995d4879afd\n"
  5139. )
  5140. )
  5141. @patch("pagure.decorators.admin_session_timedout")
  5142. def test_add_token_all_tokens(self, ast):
  5143. """Test the add_token endpoint."""
  5144. ast.return_value = False
  5145. tests.create_projects(self.session)
  5146. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5147. user = tests.FakeUser(username="pingou")
  5148. with tests.user_set(self.app.application, user):
  5149. output = self.app.get("/test/token/new/")
  5150. self.assertEqual(output.status_code, 200)
  5151. output_text = output.get_data(as_text=True)
  5152. self.assertIn("<strong>Create a new token</strong>", output_text)
  5153. self.assertEqual(
  5154. output_text.count('<label class="c-input c-checkbox">'),
  5155. len(pagure.config.config["ACLS"].keys()) - 2,
  5156. )
  5157. @patch.dict("pagure.config.config", {"USER_ACLS": ["create_project"]})
  5158. @patch("pagure.decorators.admin_session_timedout")
  5159. def test_add_token_one_token(self, ast):
  5160. """Test the add_token endpoint."""
  5161. ast.return_value = False
  5162. tests.create_projects(self.session)
  5163. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5164. user = tests.FakeUser(username="pingou")
  5165. with tests.user_set(self.app.application, user):
  5166. output = self.app.get("/test/token/new/")
  5167. self.assertEqual(output.status_code, 200)
  5168. output_text = output.get_data(as_text=True)
  5169. self.assertIn("<strong>Create a new token</strong>", output_text)
  5170. self.assertEqual(
  5171. output_text.count('<label class="c-input c-checkbox">'), 1
  5172. )
  5173. @patch("pagure.decorators.admin_session_timedout")
  5174. def test_add_token(self, ast):
  5175. """Test the add_token endpoint."""
  5176. ast.return_value = False
  5177. # No Git repo
  5178. output = self.app.get("/foo/token/new/")
  5179. self.assertEqual(output.status_code, 404)
  5180. user = tests.FakeUser()
  5181. with tests.user_set(self.app.application, user):
  5182. output = self.app.get("/foo/token/new/")
  5183. self.assertEqual(output.status_code, 404)
  5184. tests.create_projects(self.session)
  5185. tests.create_projects_git(
  5186. os.path.join(self.path, "repos"), bare=True
  5187. )
  5188. output = self.app.get("/test/token/new/")
  5189. self.assertEqual(output.status_code, 403)
  5190. # User not logged in
  5191. output = self.app.get("/test/token/new/")
  5192. self.assertEqual(output.status_code, 302)
  5193. user.username = "pingou"
  5194. with tests.user_set(self.app.application, user):
  5195. output = self.app.get("/test/token/new/")
  5196. self.assertEqual(output.status_code, 200)
  5197. output_text = output.get_data(as_text=True)
  5198. self.assertIn("<strong>Create a new token</strong>", output_text)
  5199. csrf_token = output_text.split(
  5200. 'name="csrf_token" type="hidden" value="'
  5201. )[1].split('">')[0]
  5202. data = {"csrf_token": csrf_token}
  5203. ast.return_value = True
  5204. # Test when the session timed-out
  5205. output = self.app.post("/test/token/new/", data=data)
  5206. self.assertEqual(output.status_code, 302)
  5207. output = self.app.get("/", follow_redirects=True)
  5208. self.assertEqual(output.status_code, 200)
  5209. output_text = output.get_data(as_text=True)
  5210. self.assertIn("Action canceled, try it " "again", output_text)
  5211. ast.return_value = False
  5212. # Missing acls
  5213. output = self.app.post("/test/token/new/", data=data)
  5214. self.assertEqual(output.status_code, 200)
  5215. output_text = output.get_data(as_text=True)
  5216. self.assertIn("<strong>Create a new token</strong>", output_text)
  5217. self.assertIn(
  5218. "You must select at least " "one permission.", output_text
  5219. )
  5220. data = {
  5221. "csrf_token": csrf_token,
  5222. "acls": ["issue_create"],
  5223. "description": "Test token",
  5224. }
  5225. # New token created
  5226. output = self.app.post(
  5227. "/test/token/new/", data=data, follow_redirects=True
  5228. )
  5229. self.assertEqual(output.status_code, 200)
  5230. output_text = output.get_data(as_text=True)
  5231. self.assertIn("Token created", output_text)
  5232. self.assertIn(
  5233. "<title>Settings - test - Pagure</title>", output_text
  5234. )
  5235. self.assertIn(
  5236. '<h5 class="pl-2 font-weight-bold text-muted">Project Settings</h5>',
  5237. output_text,
  5238. )
  5239. self.assertIn("<strong> Test token</strong>", output_text)
  5240. self.assertIn(
  5241. '<small class="font-weight-bold">Active until', output_text
  5242. )
  5243. @patch("pagure.decorators.admin_session_timedout")
  5244. def test_revoke_api_token(self, ast):
  5245. """Test the revoke_api_token endpoint."""
  5246. ast.return_value = False
  5247. # No Git repo
  5248. output = self.app.post("/foo/token/revoke/123")
  5249. self.assertEqual(output.status_code, 404)
  5250. user = tests.FakeUser()
  5251. with tests.user_set(self.app.application, user):
  5252. output = self.app.post("/foo/token/revoke/123")
  5253. self.assertEqual(output.status_code, 404)
  5254. tests.create_projects(self.session)
  5255. tests.create_projects_git(
  5256. os.path.join(self.path, "repos"), bare=True
  5257. )
  5258. output = self.app.post("/test/token/revoke/123")
  5259. self.assertEqual(output.status_code, 403)
  5260. # User not logged in
  5261. output = self.app.post("/test/token/revoke/123")
  5262. self.assertEqual(output.status_code, 302)
  5263. user.username = "pingou"
  5264. with tests.user_set(self.app.application, user):
  5265. output = self.app.get("/test/token/new")
  5266. self.assertEqual(output.status_code, 200)
  5267. output_text = output.get_data(as_text=True)
  5268. self.assertIn("<strong>Create a new token</strong>", output_text)
  5269. csrf_token = output_text.split(
  5270. 'name="csrf_token" type="hidden" value="'
  5271. )[1].split('">')[0]
  5272. data = {"csrf_token": csrf_token}
  5273. ast.return_value = True
  5274. # Test when the session timed-out
  5275. output = self.app.post("/test/token/revoke/123", data=data)
  5276. self.assertEqual(output.status_code, 302)
  5277. output = self.app.get("/", follow_redirects=True)
  5278. self.assertEqual(output.status_code, 200)
  5279. output_text = output.get_data(as_text=True)
  5280. self.assertIn("Action canceled, try it again", output_text)
  5281. ast.return_value = False
  5282. output = self.app.post("/test/token/revoke/123", data=data)
  5283. self.assertEqual(output.status_code, 404)
  5284. output_text = output.get_data(as_text=True)
  5285. self.assertIn("<p>Token not found</p>", output_text)
  5286. # Create a token to revoke
  5287. data = {"csrf_token": csrf_token, "acls": ["issue_create"]}
  5288. output = self.app.post(
  5289. "/test/token/new/", data=data, follow_redirects=True
  5290. )
  5291. self.assertEqual(output.status_code, 200)
  5292. output_text = output.get_data(as_text=True)
  5293. self.assertIn("Token created", output_text)
  5294. # Existing token will expire in 60 days
  5295. repo = pagure.lib.query.get_authorized_project(
  5296. self.session, "test"
  5297. )
  5298. self.assertEqual(
  5299. repo.tokens[0].expiration.date(),
  5300. datetime.datetime.utcnow().date()
  5301. + datetime.timedelta(days=(30 * 6)),
  5302. )
  5303. token = repo.tokens[0].id
  5304. output = self.app.post(
  5305. "/test/token/revoke/%s" % token,
  5306. data=data,
  5307. follow_redirects=True,
  5308. )
  5309. output_text = output.get_data(as_text=True)
  5310. self.assertIn(
  5311. "<title>Settings - test - Pagure</title>", output_text
  5312. )
  5313. self.assertIn("Token revoked", output_text)
  5314. self.assertEqual(output_text.count('title="Revoke token">'), 0)
  5315. self.assertEqual(output_text.count('title="Renew token">'), 1)
  5316. # Existing token has been expired
  5317. self.session.commit()
  5318. repo = pagure.lib.query.get_authorized_project(
  5319. self.session, "test"
  5320. )
  5321. self.assertEqual(
  5322. repo.tokens[0].expiration.date(), repo.tokens[0].created.date()
  5323. )
  5324. self.assertEqual(
  5325. repo.tokens[0].expiration.date(),
  5326. datetime.datetime.utcnow().date(),
  5327. )
  5328. @patch("pagure.decorators.admin_session_timedout")
  5329. def test_renew_api_token(self, ast):
  5330. """Test the renew_api_token endpoint."""
  5331. ast.return_value = False
  5332. # No Git repo
  5333. output = self.app.post("/foo/token/renew/123")
  5334. self.assertEqual(output.status_code, 404)
  5335. user = tests.FakeUser()
  5336. with tests.user_set(self.app.application, user):
  5337. # user logged in but still no git repo
  5338. output = self.app.post("/foo/token/renew/123")
  5339. self.assertEqual(output.status_code, 404)
  5340. tests.create_projects(self.session)
  5341. tests.create_projects_git(
  5342. os.path.join(self.path, "repos"), bare=True
  5343. )
  5344. # user logged in, git repo present, but user doesn't have access
  5345. output = self.app.post("/test/token/renew/123")
  5346. self.assertEqual(output.status_code, 403)
  5347. # User not logged in
  5348. output = self.app.post("/test/token/renew/123")
  5349. self.assertEqual(output.status_code, 302)
  5350. user.username = "pingou"
  5351. with tests.user_set(self.app.application, user):
  5352. output = self.app.get("/test/token/new")
  5353. self.assertEqual(output.status_code, 200)
  5354. output_text = output.get_data(as_text=True)
  5355. self.assertIn("<strong>Create a new token</strong>", output_text)
  5356. csrf_token = self.get_csrf(output=output)
  5357. data = {"csrf_token": csrf_token}
  5358. ast.return_value = True
  5359. # Test when the session timed-out
  5360. output = self.app.post("/test/token/renew/123", data=data)
  5361. self.assertEqual(output.status_code, 302)
  5362. output = self.app.get("/", follow_redirects=True)
  5363. self.assertEqual(output.status_code, 200)
  5364. output_text = output.get_data(as_text=True)
  5365. self.assertIn("Action canceled, try it again", output_text)
  5366. ast.return_value = False
  5367. output = self.app.post("/test/token/renew/123", data=data)
  5368. self.assertEqual(output.status_code, 404)
  5369. output_text = output.get_data(as_text=True)
  5370. self.assertIn("<p>Token not found</p>", output_text)
  5371. # Create a token to renew
  5372. data = {"csrf_token": csrf_token, "acls": ["issue_create"]}
  5373. output = self.app.post(
  5374. "/test/token/new/", data=data, follow_redirects=True
  5375. )
  5376. self.assertEqual(output.status_code, 200)
  5377. output_text = output.get_data(as_text=True)
  5378. self.assertIn("Token created", output_text)
  5379. # 1 token associated with the project, expires in 60 days
  5380. repo = pagure.lib.query.get_authorized_project(
  5381. self.session, "test"
  5382. )
  5383. self.assertEqual(len(repo.tokens), 1)
  5384. self.assertEqual(
  5385. repo.tokens[0].expiration.date(),
  5386. datetime.datetime.utcnow().date()
  5387. + datetime.timedelta(days=(30 * 6)),
  5388. )
  5389. token = repo.tokens[0].id
  5390. output = self.app.post(
  5391. "/test/token/renew/%s" % token,
  5392. data=data,
  5393. follow_redirects=True,
  5394. )
  5395. output_text = output.get_data(as_text=True)
  5396. self.assertIn(
  5397. "<title>Settings - test - Pagure</title>", output_text
  5398. )
  5399. self.assertIn("Token created", output_text)
  5400. self.assertEqual(output_text.count('title="Revoke token">'), 2)
  5401. self.assertEqual(output_text.count('title="Renew token">'), 2)
  5402. # Existing token has been renewed
  5403. self.session.commit()
  5404. repo = pagure.lib.query.get_authorized_project(
  5405. self.session, "test"
  5406. )
  5407. self.assertEqual(len(repo.tokens), 2)
  5408. self.assertEqual(
  5409. repo.tokens[0].expiration.date(),
  5410. repo.tokens[1].expiration.date(),
  5411. )
  5412. self.assertEqual(
  5413. repo.tokens[0].created.date(), repo.tokens[1].created.date()
  5414. )
  5415. self.assertEqual(repo.tokens[0].acls, repo.tokens[1].acls)
  5416. self.assertEqual(
  5417. repo.tokens[0].description, repo.tokens[1].description
  5418. )
  5419. def test_delete_branch(self):
  5420. """Test the delete_branch endpoint."""
  5421. # No Git repo
  5422. output = self.app.post("/foo/b/master/delete")
  5423. self.assertEqual(output.status_code, 404)
  5424. tests.create_projects(self.session)
  5425. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5426. # User not logged in
  5427. output = self.app.post("/test/b/master/delete")
  5428. self.assertEqual(output.status_code, 302)
  5429. user = tests.FakeUser()
  5430. with tests.user_set(self.app.application, user):
  5431. # Unknown repo
  5432. output = self.app.post("/foo/b/master/delete")
  5433. self.assertEqual(output.status_code, 404)
  5434. output = self.app.post("/test/b/master/delete")
  5435. self.assertEqual(output.status_code, 403)
  5436. user.username = "pingou"
  5437. with tests.user_set(self.app.application, user):
  5438. output = self.app.post("/test/b/master/delete")
  5439. self.assertEqual(output.status_code, 403)
  5440. output_text = output.get_data(as_text=True)
  5441. self.assertIn(
  5442. "<p>You are not allowed to delete the default branch: master</p>",
  5443. output_text,
  5444. )
  5445. output = self.app.post("/test/b/bar/delete")
  5446. self.assertEqual(output.status_code, 404)
  5447. output_text = output.get_data(as_text=True)
  5448. self.assertIn("<p>Branch not found</p>", output_text)
  5449. # Add a branch that we can delete
  5450. path = os.path.join(self.path, "repos", "test.git")
  5451. tests.add_content_git_repo(path)
  5452. repo = pygit2.Repository(path)
  5453. repo.create_branch("foo", repo.head.peel())
  5454. # Check before deletion
  5455. output = self.app.get("/test")
  5456. self.assertEqual(output.status_code, 200)
  5457. output = self.app.get("/test/branches")
  5458. output_text = output.get_data(as_text=True)
  5459. self.assertIn('<form id="delete_branch_form-foo"', output_text)
  5460. # Delete the branch
  5461. output = self.app.post("/test/b/foo/delete", follow_redirects=True)
  5462. self.assertEqual(output.status_code, 200)
  5463. output = self.app.get("/test/branches")
  5464. output_text = output.get_data(as_text=True)
  5465. self.assertNotIn('<form id="delete_branch_form-foo"', output_text)
  5466. # Add a branch with a '/' in its name that we can delete
  5467. path = os.path.join(self.path, "repos", "test.git")
  5468. tests.add_content_git_repo(path)
  5469. repo = pygit2.Repository(path)
  5470. repo.create_branch("feature/foo", repo.head.peel())
  5471. # Check before deletion
  5472. output = self.app.get("/test")
  5473. self.assertEqual(output.status_code, 200)
  5474. output = self.app.get("/test/branches")
  5475. output_text = output.get_data(as_text=True)
  5476. self.assertIn(
  5477. '<form id="delete_branch_form-feature__foo"', output_text
  5478. )
  5479. # Delete the branch
  5480. output = self.app.post(
  5481. "/test/b/feature/foo/delete", follow_redirects=True
  5482. )
  5483. self.assertEqual(output.status_code, 200)
  5484. output = self.app.get("/test/branches")
  5485. output_text = output.get_data(as_text=True)
  5486. self.assertNotIn(
  5487. '<form id="delete_branch_form-feature__foo"', output_text
  5488. )
  5489. def test_delete_branch_unicode(self):
  5490. """Test the delete_branch endpoint with an unicode branch."""
  5491. tests.create_projects(self.session)
  5492. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5493. user = tests.FakeUser(username="pingou")
  5494. with tests.user_set(self.app.application, user):
  5495. # Add a branch that we can delete
  5496. path = os.path.join(self.path, "repos", "test.git")
  5497. tests.add_content_git_repo(path)
  5498. repo = pygit2.Repository(path)
  5499. branchname = "☃️"
  5500. if six.PY2:
  5501. branchname = branchname.encode("utf-8")
  5502. repo.create_branch(branchname, repo.head.peel())
  5503. # Check before deletion
  5504. output = self.app.get("/test")
  5505. self.assertEqual(output.status_code, 200)
  5506. output = self.app.get("/test/branches")
  5507. output_text = output.get_data(as_text=True)
  5508. self.assertIn('<form id="delete_branch_form-☃️"', output_text)
  5509. # Delete the branch
  5510. output = self.app.post("/test/b/☃️/delete", follow_redirects=True)
  5511. self.assertEqual(output.status_code, 200)
  5512. # Check after deletion
  5513. output = self.app.get("/test/branches")
  5514. output_text = output.get_data(as_text=True)
  5515. self.assertNotIn('<form id="delete_branch_form-☃️"', output_text)
  5516. def test_delete_branch_master(self):
  5517. """Test the delete_branch endpoint with the master branch."""
  5518. tests.create_projects(self.session)
  5519. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5520. project = pagure.lib.query._get_project(self.session, "test")
  5521. user = tests.FakeUser(username="pingou")
  5522. with tests.user_set(self.app.application, user):
  5523. # Add a branch that we can delete
  5524. path = os.path.join(self.path, "repos", "test.git")
  5525. tests.add_content_git_repo(path)
  5526. repo = pygit2.Repository(path)
  5527. branchname = "main"
  5528. repo.create_branch(branchname, repo.head.peel())
  5529. # Make that branch be the default one:
  5530. pagure.lib.git.git_set_ref_head(project=project, branch=branchname)
  5531. # Check before deletion
  5532. output = self.app.get("/test")
  5533. self.assertEqual(output.status_code, 200)
  5534. output = self.app.get("/test/branches")
  5535. output_text = output.get_data(as_text=True)
  5536. self.assertIn('<form id="delete_branch_form-master"', output_text)
  5537. self.assertNotIn('<form id="delete_branch_form-main"', output_text)
  5538. # Delete the branch
  5539. output = self.app.post(
  5540. "/test/b/master/delete", follow_redirects=True
  5541. )
  5542. self.assertEqual(output.status_code, 200)
  5543. # Check after deletion
  5544. output = self.app.get("/test/branches")
  5545. output_text = output.get_data(as_text=True)
  5546. self.assertNotIn(
  5547. '<form id="delete_branch_form-master"', output_text
  5548. )
  5549. self.assertNotIn('<form id="delete_branch_form-main"', output_text)
  5550. @patch.dict("pagure.config.config", {"ALLOW_DELETE_BRANCH": False})
  5551. def test_delete_branch_disabled_in_ui(self):
  5552. """Test that the delete branch button doesn't show when the feature
  5553. is turned off."""
  5554. tests.create_projects(self.session)
  5555. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5556. # Add a branch that we can delete
  5557. path = os.path.join(self.path, "repos", "test.git")
  5558. tests.add_content_git_repo(path)
  5559. repo = pygit2.Repository(path)
  5560. repo.create_branch("foo", repo.head.peel())
  5561. user = tests.FakeUser(username="pingou")
  5562. with tests.user_set(self.app.application, user):
  5563. # Check that the UI doesn't offer the button
  5564. output = self.app.get("/test")
  5565. self.assertEqual(output.status_code, 200)
  5566. output_text = output.get_data(as_text=True)
  5567. self.assertNotIn('<form id="delete_branch_form-foo"', output_text)
  5568. self.assertNotIn(
  5569. "Are you sure you want to remove the branch", output_text
  5570. )
  5571. @patch.dict("pagure.config.config", {"ALLOW_DELETE_BRANCH": False})
  5572. def test_delete_branch_disabled(self):
  5573. """Test the delete_branch endpoint when it's disabled in the entire
  5574. instance."""
  5575. tests.create_projects(self.session)
  5576. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5577. # Add a branch that we can delete
  5578. path = os.path.join(self.path, "repos", "test.git")
  5579. tests.add_content_git_repo(path)
  5580. repo = pygit2.Repository(path)
  5581. repo.create_branch("foo", repo.head.peel())
  5582. user = tests.FakeUser(username="pingou")
  5583. with tests.user_set(self.app.application, user):
  5584. # Check if the delete branch button does not show
  5585. output = self.app.get("/test/branches")
  5586. self.assertEqual(output.status_code, 200)
  5587. self.assertNotIn(
  5588. 'title="Remove branch foo"', output.get_data(as_text=True)
  5589. )
  5590. # Delete the branch
  5591. output = self.app.post("/test/b/foo/delete", follow_redirects=True)
  5592. self.assertEqual(output.status_code, 404)
  5593. self.assertIn(
  5594. "This pagure instance does not allow branch deletion",
  5595. output.get_data(as_text=True),
  5596. )
  5597. @patch.dict("pagure.config.config", {"ALLOW_DELETE_BRANCH": False})
  5598. def test_delete_branch_disabled_fork(self):
  5599. """Test the delete_branch endpoint when it's disabled in the entire
  5600. instance."""
  5601. item = pagure.lib.model.Project(
  5602. user_id=2, # foo
  5603. name="test",
  5604. description="test project #1",
  5605. hook_token="aaabbb",
  5606. is_fork=True,
  5607. parent_id=1,
  5608. )
  5609. self.session.add(item)
  5610. self.session.commit()
  5611. tests.create_projects_git(
  5612. os.path.join(self.path, "repos", "forks", "foo"), bare=True
  5613. )
  5614. # Add a branch that we can delete
  5615. path = os.path.join(self.path, "repos", "forks", "foo", "test.git")
  5616. tests.add_content_git_repo(path)
  5617. repo = pygit2.Repository(path)
  5618. repo.create_branch("foo", repo.head.peel())
  5619. user = tests.FakeUser(username="foo")
  5620. with tests.user_set(self.app.application, user):
  5621. # Check if the delete branch button shows
  5622. output = self.app.get("/fork/foo/test/branches")
  5623. self.assertEqual(output.status_code, 200)
  5624. self.assertIn(
  5625. 'title="Remove branch foo"', output.get_data(as_text=True)
  5626. )
  5627. # Delete the branch
  5628. output = self.app.post(
  5629. "/fork/foo/test/b/foo/delete", follow_redirects=True
  5630. )
  5631. self.assertEqual(output.status_code, 200)
  5632. # Check if the delete branch button no longer appears
  5633. output = self.app.get("/fork/foo/test/branches")
  5634. self.assertEqual(output.status_code, 200)
  5635. self.assertNotIn(
  5636. 'title="Remove branch foo"', output.get_data(as_text=True)
  5637. )
  5638. def test_view_docs(self):
  5639. """Test the view_docs endpoint."""
  5640. output = self.app.get("/docs/foo/")
  5641. # No project registered in the DB
  5642. self.assertEqual(output.status_code, 404)
  5643. tests.create_projects(self.session)
  5644. output = self.app.get("/docs/test/")
  5645. # No git repo associated
  5646. self.assertEqual(output.status_code, 404)
  5647. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5648. output = self.app.get("/docs/test/")
  5649. self.assertEqual(output.status_code, 404)
  5650. def test_view_project_activity(self):
  5651. """Test the view_project_activity endpoint."""
  5652. tests.create_projects(self.session)
  5653. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5654. # Project Exists, but No DATAGREPPER_URL set
  5655. output = self.app.get("/test/activity/")
  5656. self.assertEqual(output.status_code, 404)
  5657. # Project Exists, and DATAGREPPER_URL set
  5658. pagure.config.config["DATAGREPPER_URL"] = "foo"
  5659. output = self.app.get("/test/activity/")
  5660. self.assertEqual(output.status_code, 200)
  5661. output_text = output.get_data(as_text=True)
  5662. self.assertIn("<title>Activity - test - Pagure</title>", output_text)
  5663. self.assertIn("No activity reported on the test project", output_text)
  5664. # project doesnt exist
  5665. output = self.app.get("/foo/activity/")
  5666. self.assertEqual(output.status_code, 404)
  5667. def test_goimport(self):
  5668. """Test the go-import tag."""
  5669. tests.create_projects(self.session)
  5670. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5671. output = self.app.get("/test/")
  5672. self.assertEqual(output.status_code, 200)
  5673. output_text = output.get_data(as_text=True)
  5674. self.assertIn(
  5675. '<meta name="go-import" '
  5676. 'content="localhost.localdomain/test git git://localhost.localdomain/test.git"'
  5677. ">",
  5678. output_text,
  5679. )
  5680. def test_watch_repo(self):
  5681. """Test the watch_repo endpoint."""
  5682. output = self.app.post("/watch/")
  5683. self.assertEqual(output.status_code, 405)
  5684. tests.create_projects(self.session)
  5685. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5686. user = tests.FakeUser()
  5687. user.username = "pingou"
  5688. with tests.user_set(self.app.application, user):
  5689. output = self.app.get("/new/")
  5690. self.assertEqual(output.status_code, 200)
  5691. output_text = output.get_data(as_text=True)
  5692. self.assertIn("<strong>Create new Project</strong>", output_text)
  5693. csrf_token = output_text.split(
  5694. 'name="csrf_token" type="hidden" value="'
  5695. )[1].split('">')[0]
  5696. data = {"csrf_token": csrf_token}
  5697. output = self.app.post(
  5698. "/foo/watch/settings/1", data=data, follow_redirects=True
  5699. )
  5700. self.assertEqual(output.status_code, 404)
  5701. output = self.app.post(
  5702. "/test/watch/settings/8", data=data, follow_redirects=True
  5703. )
  5704. self.assertEqual(output.status_code, 400)
  5705. output = self.app.post(
  5706. "/test/watch/settings/0", data=data, follow_redirects=True
  5707. )
  5708. output_text = output.get_data(as_text=True)
  5709. self.assertIn(
  5710. "You are no longer" " watching this project", output_text
  5711. )
  5712. output = self.app.post(
  5713. "/test/watch/settings/1", data=data, follow_redirects=True
  5714. )
  5715. output_text = output.get_data(as_text=True)
  5716. self.assertIn(
  5717. "You are now" " watching issues and PRs on this project",
  5718. output_text,
  5719. )
  5720. output = self.app.post(
  5721. "/test/watch/settings/2", data=data, follow_redirects=True
  5722. )
  5723. output_text = output.get_data(as_text=True)
  5724. self.assertIn(
  5725. "You are now" " watching commits on this project", output_text
  5726. )
  5727. output = self.app.post(
  5728. "/test/watch/settings/3", data=data, follow_redirects=True
  5729. )
  5730. output_text = output.get_data(as_text=True)
  5731. self.assertIn(
  5732. (
  5733. "You are now"
  5734. " watching issues, PRs, and commits on this project"
  5735. ),
  5736. output_text,
  5737. )
  5738. item = pagure.lib.model.Project(
  5739. user_id=2, # foo
  5740. name="test",
  5741. description="foo project #1",
  5742. hook_token="aaabbb",
  5743. is_fork=True,
  5744. parent_id=1,
  5745. )
  5746. self.session.add(item)
  5747. self.session.commit()
  5748. gitrepo = os.path.join(
  5749. self.path, "repos", "forks", "foo", "test.git"
  5750. )
  5751. pygit2.init_repository(gitrepo, bare=True)
  5752. output = self.app.post(
  5753. "/fork/foo/test/watch/settings/-1",
  5754. data=data,
  5755. follow_redirects=True,
  5756. )
  5757. output_text = output.get_data(as_text=True)
  5758. self.assertIn("Watch status is already reset", output_text)
  5759. output = self.app.post(
  5760. "/fork/foo/test/watch/settings/0",
  5761. data=data,
  5762. follow_redirects=True,
  5763. )
  5764. output_text = output.get_data(as_text=True)
  5765. self.assertIn(
  5766. "You are no longer" " watching this project", output_text
  5767. )
  5768. output = self.app.get("/test", data=data, follow_redirects=True)
  5769. output_text = output.get_data(as_text=True)
  5770. self.assertIn(
  5771. (
  5772. '<span class="btn btn-sm btn-primary font-weight-bold">1'
  5773. "</span>\n "
  5774. '<div class="dropdown-menu dropdown-menu-right watch-menu">'
  5775. ),
  5776. output_text,
  5777. )
  5778. output = self.app.post(
  5779. "/fork/foo/test/watch/settings/1",
  5780. data=data,
  5781. follow_redirects=True,
  5782. )
  5783. output_text = output.get_data(as_text=True)
  5784. self.assertIn(
  5785. "You are now" " watching issues and PRs on this project",
  5786. output_text,
  5787. )
  5788. output = self.app.get("/test", data=data, follow_redirects=True)
  5789. output_text = output.get_data(as_text=True)
  5790. self.assertIn(
  5791. (
  5792. '<span class="btn btn-sm btn-primary font-weight-bold">1'
  5793. "</span>\n "
  5794. '<div class="dropdown-menu dropdown-menu-right watch-menu">'
  5795. ),
  5796. output_text,
  5797. )
  5798. output = self.app.post(
  5799. "/fork/foo/test/watch/settings/2",
  5800. data=data,
  5801. follow_redirects=True,
  5802. )
  5803. output_text = output.get_data(as_text=True)
  5804. self.assertIn(
  5805. "You are now" " watching commits on this project", output_text
  5806. )
  5807. output = self.app.post(
  5808. "/fork/foo/test/watch/settings/3",
  5809. data=data,
  5810. follow_redirects=True,
  5811. )
  5812. output_text = output.get_data(as_text=True)
  5813. self.assertIn(
  5814. (
  5815. "You are now"
  5816. " watching issues, PRs, and commits on this project"
  5817. ),
  5818. output_text,
  5819. )
  5820. output = self.app.get("/test", data=data, follow_redirects=True)
  5821. output_text = output.get_data(as_text=True)
  5822. self.assertIn(
  5823. (
  5824. '<span class="btn btn-sm btn-primary font-weight-bold">1'
  5825. "</span>\n "
  5826. '<div class="dropdown-menu dropdown-menu-right watch-menu">'
  5827. ),
  5828. output_text,
  5829. )
  5830. project = pagure.lib.query._get_project(self.session, "test")
  5831. pagure.lib.query.add_user_to_project(
  5832. self.session,
  5833. project,
  5834. new_user="foo",
  5835. user="pingou",
  5836. access="commit",
  5837. )
  5838. self.session.commit()
  5839. output = self.app.get("/test", data=data, follow_redirects=True)
  5840. output_text = output.get_data(as_text=True)
  5841. self.assertIn(
  5842. (
  5843. '<span class="btn btn-sm btn-primary font-weight-bold">2'
  5844. "</span>\n "
  5845. '<div class="dropdown-menu dropdown-menu-right watch-menu">'
  5846. ),
  5847. output_text,
  5848. )
  5849. output = self.app.post(
  5850. "/fork/foo/test/watch/settings/-1",
  5851. data=data,
  5852. follow_redirects=True,
  5853. )
  5854. output_text = output.get_data(as_text=True)
  5855. self.assertIn("Watch status reset", output_text)
  5856. output = self.app.get("/test", data=data, follow_redirects=True)
  5857. output_text = output.get_data(as_text=True)
  5858. self.assertIn(
  5859. (
  5860. '<span class="btn btn-sm btn-primary font-weight-bold">2'
  5861. "</span>\n "
  5862. '<div class="dropdown-menu dropdown-menu-right watch-menu">'
  5863. ),
  5864. output_text,
  5865. )
  5866. def test_delete_report(self):
  5867. """Test the delete_report endpoint."""
  5868. output = self.app.post("/test/delete/report")
  5869. self.assertEqual(output.status_code, 404)
  5870. tests.create_projects(self.session)
  5871. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5872. user = tests.FakeUser()
  5873. user.username = "pingou"
  5874. with tests.user_set(self.app.application, user):
  5875. output = self.app.get("/new/")
  5876. self.assertEqual(output.status_code, 200)
  5877. output_text = output.get_data(as_text=True)
  5878. self.assertIn("<strong>Create new Project</strong>", output_text)
  5879. csrf_token = output_text.split(
  5880. 'name="csrf_token" type="hidden" value="'
  5881. )[1].split('">')[0]
  5882. # No report specified
  5883. data = {"csrf_token": csrf_token}
  5884. output = self.app.post(
  5885. "/test/delete/report", data=data, follow_redirects=True
  5886. )
  5887. self.assertEqual(output.status_code, 200)
  5888. output_text = output.get_data(as_text=True)
  5889. self.assertIn("Unknown report: None", output_text)
  5890. # Report specified not in the project's reports
  5891. data = {"csrf_token": csrf_token, "report": "foo"}
  5892. output = self.app.post(
  5893. "/test/delete/report", data=data, follow_redirects=True
  5894. )
  5895. self.assertEqual(output.status_code, 200)
  5896. output_text = output.get_data(as_text=True)
  5897. self.assertIn("Unknown report: foo", output_text)
  5898. # Create a report
  5899. project = pagure.lib.query.get_authorized_project(
  5900. self.session, project_name="test"
  5901. )
  5902. self.assertEqual(project.reports, {})
  5903. name = "test report"
  5904. url = "?foo=bar&baz=biz"
  5905. pagure.lib.query.save_report(
  5906. self.session, repo=project, name=name, url=url, username=None
  5907. )
  5908. self.session.commit()
  5909. project = pagure.lib.query.get_authorized_project(
  5910. self.session, project_name="test"
  5911. )
  5912. self.assertEqual(
  5913. project.reports, {"test report": {"baz": "biz", "foo": "bar"}}
  5914. )
  5915. # Missing CSRF
  5916. data = {"report": "test report"}
  5917. output = self.app.post(
  5918. "/test/delete/report", data=data, follow_redirects=True
  5919. )
  5920. self.assertEqual(output.status_code, 200)
  5921. output_text = output.get_data(as_text=True)
  5922. self.assertIn(
  5923. "<title>Settings - test - Pagure</title>", output_text
  5924. )
  5925. project = pagure.lib.query.get_authorized_project(
  5926. self.session, project_name="test"
  5927. )
  5928. self.assertEqual(
  5929. project.reports, {"test report": {"baz": "biz", "foo": "bar"}}
  5930. )
  5931. # Delete the report
  5932. data = {"csrf_token": csrf_token, "report": "test report"}
  5933. output = self.app.post(
  5934. "/test/delete/report", data=data, follow_redirects=True
  5935. )
  5936. self.assertEqual(output.status_code, 200)
  5937. output_text = output.get_data(as_text=True)
  5938. self.assertIn("List of reports updated", output_text)
  5939. self.session.commit()
  5940. project = pagure.lib.query.get_authorized_project(
  5941. self.session, project_name="test"
  5942. )
  5943. self.assertEqual(project.reports, {})
  5944. def test_delete_report_ns_project(self):
  5945. """Test the delete_report endpoint on a namespaced project."""
  5946. output = self.app.post("/foo/test/delete/report")
  5947. self.assertEqual(output.status_code, 404)
  5948. tests.create_projects(self.session)
  5949. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  5950. user = tests.FakeUser()
  5951. user.username = "pingou"
  5952. with tests.user_set(self.app.application, user):
  5953. output = self.app.get("/new/")
  5954. self.assertEqual(output.status_code, 200)
  5955. output_text = output.get_data(as_text=True)
  5956. self.assertIn("<strong>Create new Project</strong>", output_text)
  5957. csrf_token = output_text.split(
  5958. 'name="csrf_token" type="hidden" value="'
  5959. )[1].split('">')[0]
  5960. item = pagure.lib.model.Project(
  5961. user_id=1, # pingou
  5962. namespace="foo",
  5963. name="test",
  5964. description="foo project #2",
  5965. hook_token="aaabbb",
  5966. )
  5967. self.session.add(item)
  5968. self.session.commit()
  5969. gitrepo = os.path.join(self.path, "repos", "foo", "test.git")
  5970. pygit2.init_repository(gitrepo, bare=True)
  5971. # No report specified
  5972. data = {"csrf_token": csrf_token}
  5973. output = self.app.post(
  5974. "/foo/test/delete/report", data=data, follow_redirects=True
  5975. )
  5976. self.assertEqual(output.status_code, 200)
  5977. output_text = output.get_data(as_text=True)
  5978. self.assertIn("Unknown report: None", output_text)
  5979. # Report specified not in the project's reports
  5980. data = {"csrf_token": csrf_token, "report": "foo"}
  5981. output = self.app.post(
  5982. "/foo/test/delete/report", data=data, follow_redirects=True
  5983. )
  5984. self.assertEqual(output.status_code, 200)
  5985. output_text = output.get_data(as_text=True)
  5986. self.assertIn("Unknown report: foo", output_text)
  5987. # Create a report
  5988. self.session.commit()
  5989. project = pagure.lib.query.get_authorized_project(
  5990. self.session, project_name="test", namespace="foo"
  5991. )
  5992. self.assertEqual(project.reports, {})
  5993. name = "test report"
  5994. url = "?foo=bar&baz=biz"
  5995. pagure.lib.query.save_report(
  5996. self.session, repo=project, name=name, url=url, username=None
  5997. )
  5998. self.session.commit()
  5999. project = pagure.lib.query.get_authorized_project(
  6000. self.session, project_name="test", namespace="foo"
  6001. )
  6002. self.assertEqual(
  6003. project.reports, {"test report": {"baz": "biz", "foo": "bar"}}
  6004. )
  6005. # Missing CSRF
  6006. data = {"report": "test report"}
  6007. output = self.app.post(
  6008. "/foo/test/delete/report", data=data, follow_redirects=True
  6009. )
  6010. self.assertEqual(output.status_code, 200)
  6011. output_text = output.get_data(as_text=True)
  6012. self.assertIn(
  6013. "<title>Settings - foo/test - Pagure</title>", output_text
  6014. )
  6015. project = pagure.lib.query.get_authorized_project(
  6016. self.session, project_name="test", namespace="foo"
  6017. )
  6018. self.assertEqual(
  6019. project.reports, {"test report": {"baz": "biz", "foo": "bar"}}
  6020. )
  6021. # Delete the report
  6022. data = {"csrf_token": csrf_token, "report": "test report"}
  6023. output = self.app.post(
  6024. "/foo/test/delete/report", data=data, follow_redirects=True
  6025. )
  6026. self.assertEqual(output.status_code, 200)
  6027. output_text = output.get_data(as_text=True)
  6028. self.assertIn("List of reports updated", output_text)
  6029. self.session.commit()
  6030. project = pagure.lib.query.get_authorized_project(
  6031. self.session, project_name="test", namespace="foo"
  6032. )
  6033. self.assertEqual(project.reports, {})
  6034. def test_open_pr_button_empty_repo(self):
  6035. """Test "Open Pull-Request" button on empty project."""
  6036. tests.create_projects(self.session)
  6037. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  6038. output = self.app.get("/test")
  6039. self.assertEqual(output.status_code, 200)
  6040. output_text = output.get_data(as_text=True)
  6041. self.assertIn("<p>This repo is brand new!</p>", output_text)
  6042. self.assertNotIn(
  6043. 'href="/test/diff/master..master">Open Pull-Request', output_text
  6044. )
  6045. @patch.dict(
  6046. "pagure.config.config",
  6047. {"UPLOAD_FOLDER_PATH": None, "UPLOAD_FOLDER_URL": None},
  6048. )
  6049. def test_releases_upload_folder_vars_None(self):
  6050. """Test that /releases/ page of a repo displays correctly with
  6051. UPLOAD_FOLDER_PATH and UPLOAD_FOLDER_URL set to None
  6052. """
  6053. tests.create_projects(self.session)
  6054. tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
  6055. output = self.app.get("/test/releases")
  6056. self.assertEqual(output.status_code, 200)
  6057. self.assertIn(
  6058. "This project has not been tagged.", output.get_data(as_text=True)
  6059. )
  6060. class PagureFlaskRepoTestHooktests(tests.Modeltests):
  6061. """Tests for the web hook test function"""
  6062. def setUp(self):
  6063. """Set up the environnment, ran before every tests."""
  6064. super(PagureFlaskRepoTestHooktests, self).setUp()
  6065. tests.create_projects(self.session)
  6066. tests.create_projects_git(os.path.join(self.path, "repos"))
  6067. @patch(
  6068. "pagure.decorators.admin_session_timedout",
  6069. MagicMock(return_value=False),
  6070. )
  6071. def test_test_hook_no_project(self):
  6072. """Test the test_hook endpoint when the project doesn't exist."""
  6073. # No project
  6074. output = self.app.post("/foo/settings/test_hook")
  6075. self.assertEqual(output.status_code, 404)
  6076. @patch(
  6077. "pagure.decorators.admin_session_timedout",
  6078. MagicMock(return_value=False),
  6079. )
  6080. def test_test_hook_existing_project(self):
  6081. """Test the test_hook endpoint when the project doesn't exist."""
  6082. user = tests.FakeUser()
  6083. with tests.user_set(self.app.application, user):
  6084. output = self.app.post("/test/settings/test_hook")
  6085. self.assertEqual(output.status_code, 403)
  6086. @patch(
  6087. "pagure.decorators.admin_session_timedout",
  6088. MagicMock(return_value=False),
  6089. )
  6090. def test_test_hook_logged_out(self):
  6091. """Test the test_hook endpoint when the project isn't logged in."""
  6092. # User not logged in
  6093. output = self.app.post("/test/settings/test_hook")
  6094. self.assertEqual(output.status_code, 302)
  6095. @patch(
  6096. "pagure.decorators.admin_session_timedout",
  6097. MagicMock(return_value=False),
  6098. )
  6099. def test_test_hook_logged_in_no_csrf(self):
  6100. """Test the test_hook endpoint when the user is logged in."""
  6101. user = tests.FakeUser(username="pingou")
  6102. with tests.user_set(self.app.application, user):
  6103. output = self.app.post("/test/settings/test_hook")
  6104. self.assertEqual(output.status_code, 302)
  6105. self.assertEqual(output.status_code, 302)
  6106. @patch(
  6107. "pagure.decorators.admin_session_timedout",
  6108. MagicMock(return_value=False),
  6109. )
  6110. def test_test_hook_logged_in_csrf(self):
  6111. """Test the test_hook endpoint when the user is logged in."""
  6112. user = tests.FakeUser(username="pingou")
  6113. with tests.user_set(self.app.application, user):
  6114. data = {"csrf_token": self.get_csrf()}
  6115. output = self.app.post("/test/settings/test_hook", data=data)
  6116. self.assertEqual(output.status_code, 302)
  6117. class PagureFlaskRepoTestRegenerateGittests(tests.Modeltests):
  6118. """Tests for the regenerate git repo function"""
  6119. @patch("pagure.lib.notify.send_email", MagicMock(return_value=True))
  6120. @patch(
  6121. "pagure.decorators.admin_session_timedout",
  6122. MagicMock(return_value=False),
  6123. )
  6124. def setUp(self):
  6125. """Set up the environnment, ran before every tests."""
  6126. super(PagureFlaskRepoTestRegenerateGittests, self).setUp()
  6127. tests.create_projects(self.session)
  6128. tests.create_projects_git(os.path.join(self.path, "repos"))
  6129. user = tests.FakeUser()
  6130. with tests.user_set(self.app.application, user):
  6131. self.csrf_token = self.get_csrf()
  6132. def test_regenerate_git_invalid_project(self):
  6133. """Test the regenerate_git endpoint."""
  6134. user = tests.FakeUser()
  6135. with tests.user_set(self.app.application, user):
  6136. output = self.app.post("/foo/regenerate")
  6137. self.assertEqual(output.status_code, 404)
  6138. def test_regenerate_git_invalid_user(self):
  6139. """Test the regenerate_git endpoint."""
  6140. user = tests.FakeUser()
  6141. with tests.user_set(self.app.application, user):
  6142. output = self.app.post("/test/regenerate")
  6143. self.assertEqual(output.status_code, 403)
  6144. @patch(
  6145. "pagure.decorators.admin_session_timedout",
  6146. MagicMock(return_value=True),
  6147. )
  6148. def test_regenerate_git_user_session_timeout(self):
  6149. """Test the regenerate_git endpoint."""
  6150. user = tests.FakeUser()
  6151. with tests.user_set(self.app.application, user):
  6152. output = self.app.post("/test/regenerate")
  6153. self.assertEqual(output.status_code, 302)
  6154. def test_regenerate_git_no_csrf(self):
  6155. """Test the regenerate_git endpoint."""
  6156. user = tests.FakeUser(username="pingou")
  6157. with tests.user_set(self.app.application, user):
  6158. output = self.app.post("/test/regenerate")
  6159. self.assertEqual(output.status_code, 400)
  6160. def test_regenerate_git_missing_repo_type(self):
  6161. """Test the regenerate_git endpoint."""
  6162. user = tests.FakeUser(username="pingou")
  6163. with tests.user_set(self.app.application, user):
  6164. data = {"csrf_token": self.csrf_token}
  6165. output = self.app.post("/test/regenerate", data=data)
  6166. self.assertEqual(output.status_code, 400)
  6167. def test_regenerate_git_missing_invalid_regenerate(self):
  6168. """Test the regenerate_git endpoint."""
  6169. user = tests.FakeUser(username="pingou")
  6170. with tests.user_set(self.app.application, user):
  6171. data = {"csrf_token": self.csrf_token, "regenerate": "ticket"}
  6172. output = self.app.post("/test/regenerate", data=data)
  6173. self.assertEqual(output.status_code, 400)
  6174. @patch("pagure.lib.git._update_git")
  6175. def test_regenerate_git_tickets(self, upgit):
  6176. """Test the regenerate_git endpoint."""
  6177. upgit.return_value = True
  6178. user = tests.FakeUser(username="pingou")
  6179. with tests.user_set(self.app.application, user):
  6180. # Create an issue to play with
  6181. repo = pagure.lib.query.get_authorized_project(
  6182. self.session, "test"
  6183. )
  6184. msg = pagure.lib.query.new_issue(
  6185. session=self.session,
  6186. repo=repo,
  6187. title="Test issue",
  6188. content="We should work on this",
  6189. user="pingou",
  6190. )
  6191. self.session.commit()
  6192. self.assertEqual(msg.title, "Test issue")
  6193. data = {"csrf_token": self.csrf_token, "regenerate": "tickets"}
  6194. output = self.app.post(
  6195. "/test/regenerate", data=data, follow_redirects=True
  6196. )
  6197. self.assertEqual(output.status_code, 200)
  6198. output_text = output.get_data(as_text=True)
  6199. self.assertIn("Tickets git repo updating", output_text)
  6200. self.assertEqual(upgit.call_count, 2)
  6201. @patch("pagure.lib.git._update_git")
  6202. def test_regenerate_git_requests(self, upgit):
  6203. """Test the regenerate_git endpoint."""
  6204. # upgit.return_value = True
  6205. user = tests.FakeUser(username="pingou")
  6206. with tests.user_set(self.app.application, user):
  6207. # Create a request to play with
  6208. repo = pagure.lib.query.get_authorized_project(
  6209. self.session, "test"
  6210. )
  6211. msg = pagure.lib.query.new_pull_request(
  6212. session=self.session,
  6213. repo_from=repo,
  6214. branch_from="branch",
  6215. repo_to=repo,
  6216. branch_to="master",
  6217. title="Test pull-request",
  6218. user="pingou",
  6219. )
  6220. self.session.commit()
  6221. self.assertEqual(msg.title, "Test pull-request")
  6222. data = {"csrf_token": self.csrf_token, "regenerate": "requests"}
  6223. output = self.app.post(
  6224. "/test/regenerate", data=data, follow_redirects=True
  6225. )
  6226. self.assertEqual(output.status_code, 200)
  6227. output_text = output.get_data(as_text=True)
  6228. self.assertIn("Requests git repo updating", output_text)
  6229. self.assertEqual(upgit.call_count, 1)
  6230. class PagureFlaskRepoTestGitSSHURL(tests.Modeltests):
  6231. """Tests the display of the SSH url in the UI"""
  6232. def setUp(self):
  6233. """Set up the environnment, ran before every tests."""
  6234. super(PagureFlaskRepoTestGitSSHURL, self).setUp()
  6235. tests.create_projects(self.session)
  6236. tests.create_projects_git(os.path.join(self.path, "repos"))
  6237. pingou = pagure.lib.query.get_user(self.session, "pingou")
  6238. # Make the repo not read-only
  6239. repo = pagure.lib.query._get_project(self.session, "test")
  6240. pagure.lib.query.update_read_only_mode(
  6241. self.session, repo, read_only=False
  6242. )
  6243. self.session.commit()
  6244. # Add a group and make pingou a member of it
  6245. item = pagure.lib.model.PagureGroup(
  6246. group_name="packager",
  6247. group_type="user",
  6248. display_name="User group",
  6249. user_id=1, # pingou
  6250. )
  6251. self.session.add(item)
  6252. self.session.commit()
  6253. pagure.lib.query.add_user_to_group(
  6254. self.session, pingou.username, item, pingou.username, True
  6255. )
  6256. # Add a SSH key for pingou so that he is allowed to push via ssh
  6257. msg = pagure.lib.query.add_sshkey_to_project_or_user(
  6258. session=self.session,
  6259. user=pingou,
  6260. ssh_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==",
  6261. pushaccess=True,
  6262. creator=pingou,
  6263. )
  6264. self.session.commit()
  6265. self.assertEqual(msg, "SSH key added")
  6266. def test_logged_out(self):
  6267. """Test the default behavior with the user logged out."""
  6268. output = self.app.get("/test")
  6269. self.assertEqual(output.status_code, 200)
  6270. output_text = output.get_data(as_text=True)
  6271. self.assertIn("<strong>Source Code</strong>", output_text)
  6272. self.assertIn(
  6273. '<div class="input-group-prepend"><span class="input-group-text">'
  6274. "GIT</span></div>",
  6275. output_text,
  6276. )
  6277. self.assertNotIn(
  6278. '<div class="input-group-prepend"><span class="input-group-text">'
  6279. "SSH</span></div>",
  6280. output_text,
  6281. )
  6282. def test_logged_in(self):
  6283. """Test the default behavior with the user logged in."""
  6284. user = tests.FakeUser(username="pingou")
  6285. with tests.user_set(self.app.application, user):
  6286. output = self.app.get("/test")
  6287. self.assertEqual(output.status_code, 200)
  6288. output_text = output.get_data(as_text=True)
  6289. self.assertIn("<strong>Source Code</strong>", output_text)
  6290. self.assertIn(
  6291. '<div class="input-group-prepend"><span class="input-group-text">'
  6292. "GIT</span></div>",
  6293. output_text,
  6294. )
  6295. self.assertIn(
  6296. '<div class="input-group-prepend"><span class="input-group-text">'
  6297. "SSH</span></div>",
  6298. output_text,
  6299. )
  6300. @patch.dict("pagure.config.config", {"SSH_ACCESS_GROUPS": ["packager"]})
  6301. def test_ssh_restricted_user_member(self):
  6302. """Test when ssh is restricted and the user has access."""
  6303. user = tests.FakeUser(username="pingou")
  6304. with tests.user_set(self.app.application, user):
  6305. output = self.app.get("/test")
  6306. self.assertEqual(output.status_code, 200)
  6307. output_text = output.get_data(as_text=True)
  6308. self.assertIn("<strong>Source Code</strong>", output_text)
  6309. self.assertIn(
  6310. '<div class="input-group-prepend"><span class="input-group-text">'
  6311. "GIT</span></div>",
  6312. output_text,
  6313. )
  6314. self.assertIn(
  6315. '<div class="input-group-prepend"><span class="input-group-text">'
  6316. "SSH</span></div>",
  6317. output_text,
  6318. )
  6319. @patch.dict("pagure.config.config", {"SSH_ACCESS_GROUPS": ["invalid"]})
  6320. def test_ssh_restricted_user_non_member(self):
  6321. """Test when ssh is restricted and the user does not have access."""
  6322. user = tests.FakeUser(username="pingou")
  6323. with tests.user_set(self.app.application, user):
  6324. output = self.app.get("/test")
  6325. self.assertEqual(output.status_code, 200)
  6326. output_text = output.get_data(as_text=True)
  6327. self.assertIn("<strong>Source Code</strong>", output_text)
  6328. self.assertIn(
  6329. '<div class="input-group-prepend"><span class="input-group-text">'
  6330. "GIT</span></div>",
  6331. output_text,
  6332. )
  6333. self.assertIn(
  6334. "Only members of the invalid group(s) can clone via ssh",
  6335. output_text,
  6336. )
  6337. self.assertNotIn(
  6338. '<div class="input-group-prepend"><span class="input-group-text">'
  6339. "SSH</span></div>",
  6340. output_text,
  6341. )
  6342. if __name__ == "__main__":
  6343. unittest.main(verbosity=2)