validator_test.go 222 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866
  1. package validator
  2. import (
  3. "bytes"
  4. "context"
  5. "database/sql"
  6. "database/sql/driver"
  7. "encoding/base64"
  8. "encoding/json"
  9. "fmt"
  10. "path/filepath"
  11. "reflect"
  12. "strings"
  13. "testing"
  14. "time"
  15. "github.com/go-playground/locales/en"
  16. "github.com/go-playground/locales/fr"
  17. "github.com/go-playground/locales/nl"
  18. ut "github.com/go-playground/universal-translator"
  19. . "gopkg.in/go-playground/assert.v1"
  20. )
  21. // NOTES:
  22. // - Run "go test" to run tests
  23. // - Run "gocov test | gocov report" to report on test converage by file
  24. // - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
  25. //
  26. // or
  27. //
  28. // -- may be a good idea to change to output path to somewherelike /tmp
  29. // go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
  30. //
  31. //
  32. // go test -cpuprofile cpu.out
  33. // ./validator.test -test.bench=. -test.cpuprofile=cpu.prof
  34. // go tool pprof validator.test cpu.prof
  35. //
  36. //
  37. // go test -memprofile mem.out
  38. type I interface {
  39. Foo() string
  40. }
  41. type Impl struct {
  42. F string `validate:"len=3"`
  43. }
  44. func (i *Impl) Foo() string {
  45. return i.F
  46. }
  47. type SubTest struct {
  48. Test string `validate:"required"`
  49. }
  50. type TestInterface struct {
  51. Iface I
  52. }
  53. type TestString struct {
  54. BlankTag string `validate:""`
  55. Required string `validate:"required"`
  56. Len string `validate:"len=10"`
  57. Min string `validate:"min=1"`
  58. Max string `validate:"max=10"`
  59. MinMax string `validate:"min=1,max=10"`
  60. Lt string `validate:"lt=10"`
  61. Lte string `validate:"lte=10"`
  62. Gt string `validate:"gt=10"`
  63. Gte string `validate:"gte=10"`
  64. OmitEmpty string `validate:"omitempty,min=1,max=10"`
  65. Sub *SubTest
  66. SubIgnore *SubTest `validate:"-"`
  67. Anonymous struct {
  68. A string `validate:"required"`
  69. }
  70. Iface I
  71. }
  72. type TestUint64 struct {
  73. Required uint64 `validate:"required"`
  74. Len uint64 `validate:"len=10"`
  75. Min uint64 `validate:"min=1"`
  76. Max uint64 `validate:"max=10"`
  77. MinMax uint64 `validate:"min=1,max=10"`
  78. OmitEmpty uint64 `validate:"omitempty,min=1,max=10"`
  79. }
  80. type TestFloat64 struct {
  81. Required float64 `validate:"required"`
  82. Len float64 `validate:"len=10"`
  83. Min float64 `validate:"min=1"`
  84. Max float64 `validate:"max=10"`
  85. MinMax float64 `validate:"min=1,max=10"`
  86. Lte float64 `validate:"lte=10"`
  87. OmitEmpty float64 `validate:"omitempty,min=1,max=10"`
  88. }
  89. type TestSlice struct {
  90. Required []int `validate:"required"`
  91. Len []int `validate:"len=10"`
  92. Min []int `validate:"min=1"`
  93. Max []int `validate:"max=10"`
  94. MinMax []int `validate:"min=1,max=10"`
  95. OmitEmpty []int `validate:"omitempty,min=1,max=10"`
  96. }
  97. func AssertError(t *testing.T, err error, nsKey, structNsKey, field, structField, expectedTag string) {
  98. errs := err.(ValidationErrors)
  99. found := false
  100. var fe FieldError
  101. for i := 0; i < len(errs); i++ {
  102. if errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey {
  103. found = true
  104. fe = errs[i]
  105. break
  106. }
  107. }
  108. EqualSkip(t, 2, found, true)
  109. NotEqualSkip(t, 2, fe, nil)
  110. EqualSkip(t, 2, fe.Field(), field)
  111. EqualSkip(t, 2, fe.StructField(), structField)
  112. EqualSkip(t, 2, fe.Tag(), expectedTag)
  113. }
  114. func AssertDeepError(t *testing.T, err error, nsKey, structNsKey, field, structField, expectedTag, actualTag string) {
  115. errs := err.(ValidationErrors)
  116. found := false
  117. var fe FieldError
  118. for i := 0; i < len(errs); i++ {
  119. if errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey && errs[i].Tag() == expectedTag && errs[i].ActualTag() == actualTag {
  120. found = true
  121. fe = errs[i]
  122. break
  123. }
  124. }
  125. EqualSkip(t, 2, found, true)
  126. NotEqualSkip(t, 2, fe, nil)
  127. EqualSkip(t, 2, fe.Field(), field)
  128. EqualSkip(t, 2, fe.StructField(), structField)
  129. }
  130. func getError(err error, nsKey, structNsKey string) FieldError {
  131. errs := err.(ValidationErrors)
  132. var fe FieldError
  133. for i := 0; i < len(errs); i++ {
  134. if errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey {
  135. fe = errs[i]
  136. break
  137. }
  138. }
  139. return fe
  140. }
  141. type valuer struct {
  142. Name string
  143. }
  144. func (v valuer) Value() (driver.Value, error) {
  145. if v.Name == "errorme" {
  146. panic("SQL Driver Valuer error: some kind of error")
  147. // return nil, errors.New("some kind of error")
  148. }
  149. if len(v.Name) == 0 {
  150. return nil, nil
  151. }
  152. return v.Name, nil
  153. }
  154. type MadeUpCustomType struct {
  155. FirstName string
  156. LastName string
  157. }
  158. func ValidateCustomType(field reflect.Value) interface{} {
  159. if cust, ok := field.Interface().(MadeUpCustomType); ok {
  160. if len(cust.FirstName) == 0 || len(cust.LastName) == 0 {
  161. return ""
  162. }
  163. return cust.FirstName + " " + cust.LastName
  164. }
  165. return ""
  166. }
  167. func OverrideIntTypeForSomeReason(field reflect.Value) interface{} {
  168. if i, ok := field.Interface().(int); ok {
  169. if i == 1 {
  170. return "1"
  171. }
  172. if i == 2 {
  173. return "12"
  174. }
  175. }
  176. return ""
  177. }
  178. type CustomMadeUpStruct struct {
  179. MadeUp MadeUpCustomType `validate:"required"`
  180. OverriddenInt int `validate:"gt=1"`
  181. }
  182. func ValidateValuerType(field reflect.Value) interface{} {
  183. if valuer, ok := field.Interface().(driver.Valuer); ok {
  184. val, err := valuer.Value()
  185. if err != nil {
  186. // handle the error how you want
  187. return nil
  188. }
  189. return val
  190. }
  191. return nil
  192. }
  193. type TestPartial struct {
  194. NoTag string
  195. BlankTag string `validate:""`
  196. Required string `validate:"required"`
  197. SubSlice []*SubTest `validate:"required,dive"`
  198. Sub *SubTest
  199. SubIgnore *SubTest `validate:"-"`
  200. Anonymous struct {
  201. A string `validate:"required"`
  202. ASubSlice []*SubTest `validate:"required,dive"`
  203. SubAnonStruct []struct {
  204. Test string `validate:"required"`
  205. OtherTest string `validate:"required"`
  206. } `validate:"required,dive"`
  207. }
  208. }
  209. type TestStruct struct {
  210. String string `validate:"required" json:"StringVal"`
  211. }
  212. func StructValidationTestStructSuccess(sl StructLevel) {
  213. st := sl.Current().Interface().(TestStruct)
  214. if st.String != "good value" {
  215. sl.ReportError(st.String, "StringVal", "String", "badvalueteststruct", "good value")
  216. }
  217. }
  218. func StructValidationTestStruct(sl StructLevel) {
  219. st := sl.Current().Interface().(TestStruct)
  220. if st.String != "bad value" {
  221. sl.ReportError(st.String, "StringVal", "String", "badvalueteststruct", "bad value")
  222. }
  223. }
  224. func StructValidationNoTestStructCustomName(sl StructLevel) {
  225. st := sl.Current().Interface().(TestStruct)
  226. if st.String != "bad value" {
  227. sl.ReportError(st.String, "String", "", "badvalueteststruct", "bad value")
  228. }
  229. }
  230. func StructValidationTestStructInvalid(sl StructLevel) {
  231. st := sl.Current().Interface().(TestStruct)
  232. if st.String != "bad value" {
  233. sl.ReportError(nil, "StringVal", "String", "badvalueteststruct", "bad value")
  234. }
  235. }
  236. func StructValidationTestStructReturnValidationErrors(sl StructLevel) {
  237. s := sl.Current().Interface().(TestStructReturnValidationErrors)
  238. errs := sl.Validator().Struct(s.Inner1.Inner2)
  239. if errs == nil {
  240. return
  241. }
  242. sl.ReportValidationErrors("Inner1.", "Inner1.", errs.(ValidationErrors))
  243. }
  244. func StructValidationTestStructReturnValidationErrors2(sl StructLevel) {
  245. s := sl.Current().Interface().(TestStructReturnValidationErrors)
  246. errs := sl.Validator().Struct(s.Inner1.Inner2)
  247. if errs == nil {
  248. return
  249. }
  250. sl.ReportValidationErrors("Inner1JSON.", "Inner1.", errs.(ValidationErrors))
  251. }
  252. type TestStructReturnValidationErrorsInner2 struct {
  253. String string `validate:"required" json:"JSONString"`
  254. }
  255. type TestStructReturnValidationErrorsInner1 struct {
  256. Inner2 *TestStructReturnValidationErrorsInner2
  257. }
  258. type TestStructReturnValidationErrors struct {
  259. Inner1 *TestStructReturnValidationErrorsInner1 `json:"Inner1JSON"`
  260. }
  261. type StructLevelInvalidErr struct {
  262. Value string
  263. }
  264. func StructLevelInvalidError(sl StructLevel) {
  265. top := sl.Top().Interface().(StructLevelInvalidErr)
  266. s := sl.Current().Interface().(StructLevelInvalidErr)
  267. if top.Value == s.Value {
  268. sl.ReportError(nil, "Value", "Value", "required", "")
  269. }
  270. }
  271. func TestStructLevelInvalidError(t *testing.T) {
  272. validate := New()
  273. validate.RegisterStructValidation(StructLevelInvalidError, StructLevelInvalidErr{})
  274. var test StructLevelInvalidErr
  275. err := validate.Struct(test)
  276. NotEqual(t, err, nil)
  277. errs, ok := err.(ValidationErrors)
  278. Equal(t, ok, true)
  279. fe := errs[0]
  280. Equal(t, fe.Field(), "Value")
  281. Equal(t, fe.StructField(), "Value")
  282. Equal(t, fe.Namespace(), "StructLevelInvalidErr.Value")
  283. Equal(t, fe.StructNamespace(), "StructLevelInvalidErr.Value")
  284. Equal(t, fe.Tag(), "required")
  285. Equal(t, fe.ActualTag(), "required")
  286. Equal(t, fe.Kind(), reflect.Invalid)
  287. Equal(t, fe.Type(), reflect.TypeOf(nil))
  288. }
  289. func TestNameNamespace(t *testing.T) {
  290. type Inner2Namespace struct {
  291. String []string `validate:"dive,required" json:"JSONString"`
  292. }
  293. type Inner1Namespace struct {
  294. Inner2 *Inner2Namespace `json:"Inner2JSON"`
  295. }
  296. type Namespace struct {
  297. Inner1 *Inner1Namespace `json:"Inner1JSON"`
  298. }
  299. validate := New()
  300. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  301. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  302. if name == "-" {
  303. return ""
  304. }
  305. return name
  306. })
  307. i2 := &Inner2Namespace{String: []string{"ok", "ok", "ok"}}
  308. i1 := &Inner1Namespace{Inner2: i2}
  309. ns := &Namespace{Inner1: i1}
  310. errs := validate.Struct(ns)
  311. Equal(t, errs, nil)
  312. i2.String[1] = ""
  313. errs = validate.Struct(ns)
  314. NotEqual(t, errs, nil)
  315. ve := errs.(ValidationErrors)
  316. Equal(t, len(ve), 1)
  317. AssertError(t, errs, "Namespace.Inner1JSON.Inner2JSON.JSONString[1]", "Namespace.Inner1.Inner2.String[1]", "JSONString[1]", "String[1]", "required")
  318. fe := getError(ve, "Namespace.Inner1JSON.Inner2JSON.JSONString[1]", "Namespace.Inner1.Inner2.String[1]")
  319. NotEqual(t, fe, nil)
  320. Equal(t, fe.Field(), "JSONString[1]")
  321. Equal(t, fe.StructField(), "String[1]")
  322. Equal(t, fe.Namespace(), "Namespace.Inner1JSON.Inner2JSON.JSONString[1]")
  323. Equal(t, fe.StructNamespace(), "Namespace.Inner1.Inner2.String[1]")
  324. }
  325. func TestAnonymous(t *testing.T) {
  326. validate := New()
  327. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  328. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  329. if name == "-" {
  330. return ""
  331. }
  332. return name
  333. })
  334. type Test struct {
  335. Anonymous struct {
  336. A string `validate:"required" json:"EH"`
  337. }
  338. AnonymousB struct {
  339. B string `validate:"required" json:"BEE"`
  340. }
  341. anonymousC struct {
  342. c string `validate:"required"`
  343. }
  344. }
  345. tst := &Test{
  346. Anonymous: struct {
  347. A string `validate:"required" json:"EH"`
  348. }{
  349. A: "1",
  350. },
  351. AnonymousB: struct {
  352. B string `validate:"required" json:"BEE"`
  353. }{
  354. B: "",
  355. },
  356. anonymousC: struct {
  357. c string `validate:"required"`
  358. }{
  359. c: "",
  360. },
  361. }
  362. Equal(t, tst.anonymousC.c, "")
  363. err := validate.Struct(tst)
  364. NotEqual(t, err, nil)
  365. errs := err.(ValidationErrors)
  366. Equal(t, len(errs), 1)
  367. AssertError(t, errs, "Test.AnonymousB.BEE", "Test.AnonymousB.B", "BEE", "B", "required")
  368. fe := getError(errs, "Test.AnonymousB.BEE", "Test.AnonymousB.B")
  369. NotEqual(t, fe, nil)
  370. Equal(t, fe.Field(), "BEE")
  371. Equal(t, fe.StructField(), "B")
  372. s := struct {
  373. c string `validate:"required"`
  374. }{
  375. c: "",
  376. }
  377. err = validate.Struct(s)
  378. Equal(t, err, nil)
  379. }
  380. func TestAnonymousSameStructDifferentTags(t *testing.T) {
  381. validate := New()
  382. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  383. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  384. if name == "-" {
  385. return ""
  386. }
  387. return name
  388. })
  389. type Test struct {
  390. A interface{}
  391. }
  392. tst := &Test{
  393. A: struct {
  394. A string `validate:"required"`
  395. }{
  396. A: "",
  397. },
  398. }
  399. err := validate.Struct(tst)
  400. NotEqual(t, err, nil)
  401. errs := err.(ValidationErrors)
  402. Equal(t, len(errs), 1)
  403. AssertError(t, errs, "Test.A.A", "Test.A.A", "A", "A", "required")
  404. tst = &Test{
  405. A: struct {
  406. A string `validate:"omitempty,required"`
  407. }{
  408. A: "",
  409. },
  410. }
  411. err = validate.Struct(tst)
  412. Equal(t, err, nil)
  413. }
  414. func TestStructLevelReturnValidationErrors(t *testing.T) {
  415. validate := New()
  416. validate.RegisterStructValidation(StructValidationTestStructReturnValidationErrors, TestStructReturnValidationErrors{})
  417. inner2 := &TestStructReturnValidationErrorsInner2{
  418. String: "I'm HERE",
  419. }
  420. inner1 := &TestStructReturnValidationErrorsInner1{
  421. Inner2: inner2,
  422. }
  423. val := &TestStructReturnValidationErrors{
  424. Inner1: inner1,
  425. }
  426. errs := validate.Struct(val)
  427. Equal(t, errs, nil)
  428. inner2.String = ""
  429. errs = validate.Struct(val)
  430. NotEqual(t, errs, nil)
  431. Equal(t, len(errs.(ValidationErrors)), 2)
  432. AssertError(t, errs, "TestStructReturnValidationErrors.Inner1.Inner2.String", "TestStructReturnValidationErrors.Inner1.Inner2.String", "String", "String", "required")
  433. // this is an extra error reported from struct validation
  434. AssertError(t, errs, "TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String", "TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String", "String", "String", "required")
  435. }
  436. func TestStructLevelReturnValidationErrorsWithJSON(t *testing.T) {
  437. validate := New()
  438. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  439. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  440. if name == "-" {
  441. return ""
  442. }
  443. return name
  444. })
  445. validate.RegisterStructValidation(StructValidationTestStructReturnValidationErrors2, TestStructReturnValidationErrors{})
  446. inner2 := &TestStructReturnValidationErrorsInner2{
  447. String: "I'm HERE",
  448. }
  449. inner1 := &TestStructReturnValidationErrorsInner1{
  450. Inner2: inner2,
  451. }
  452. val := &TestStructReturnValidationErrors{
  453. Inner1: inner1,
  454. }
  455. errs := validate.Struct(val)
  456. Equal(t, errs, nil)
  457. inner2.String = ""
  458. errs = validate.Struct(val)
  459. NotEqual(t, errs, nil)
  460. Equal(t, len(errs.(ValidationErrors)), 2)
  461. AssertError(t, errs, "TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString", "TestStructReturnValidationErrors.Inner1.Inner2.String", "JSONString", "String", "required")
  462. // this is an extra error reported from struct validation, it's a badly formatted one, but on purpose
  463. AssertError(t, errs, "TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString", "TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String", "JSONString", "String", "required")
  464. fe := getError(errs, "TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString", "TestStructReturnValidationErrors.Inner1.Inner2.String")
  465. NotEqual(t, fe, nil)
  466. // check for proper JSON namespace
  467. Equal(t, fe.Field(), "JSONString")
  468. Equal(t, fe.StructField(), "String")
  469. Equal(t, fe.Namespace(), "TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString")
  470. Equal(t, fe.StructNamespace(), "TestStructReturnValidationErrors.Inner1.Inner2.String")
  471. fe = getError(errs, "TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString", "TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String")
  472. NotEqual(t, fe, nil)
  473. // check for proper JSON namespace
  474. Equal(t, fe.Field(), "JSONString")
  475. Equal(t, fe.StructField(), "String")
  476. Equal(t, fe.Namespace(), "TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString")
  477. Equal(t, fe.StructNamespace(), "TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String")
  478. }
  479. func TestStructLevelValidations(t *testing.T) {
  480. v1 := New()
  481. v1.RegisterStructValidation(StructValidationTestStruct, TestStruct{})
  482. tst := &TestStruct{
  483. String: "good value",
  484. }
  485. errs := v1.Struct(tst)
  486. NotEqual(t, errs, nil)
  487. AssertError(t, errs, "TestStruct.StringVal", "TestStruct.String", "StringVal", "String", "badvalueteststruct")
  488. v2 := New()
  489. v2.RegisterStructValidation(StructValidationNoTestStructCustomName, TestStruct{})
  490. errs = v2.Struct(tst)
  491. NotEqual(t, errs, nil)
  492. AssertError(t, errs, "TestStruct.String", "TestStruct.String", "String", "String", "badvalueteststruct")
  493. v3 := New()
  494. v3.RegisterStructValidation(StructValidationTestStructInvalid, TestStruct{})
  495. errs = v3.Struct(tst)
  496. NotEqual(t, errs, nil)
  497. AssertError(t, errs, "TestStruct.StringVal", "TestStruct.String", "StringVal", "String", "badvalueteststruct")
  498. v4 := New()
  499. v4.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})
  500. errs = v4.Struct(tst)
  501. Equal(t, errs, nil)
  502. }
  503. func TestAliasTags(t *testing.T) {
  504. validate := New()
  505. validate.RegisterAlias("iscoloralias", "hexcolor|rgb|rgba|hsl|hsla")
  506. s := "rgb(255,255,255)"
  507. errs := validate.Var(s, "iscoloralias")
  508. Equal(t, errs, nil)
  509. s = ""
  510. errs = validate.Var(s, "omitempty,iscoloralias")
  511. Equal(t, errs, nil)
  512. s = "rgb(255,255,0)"
  513. errs = validate.Var(s, "iscoloralias,len=5")
  514. NotEqual(t, errs, nil)
  515. AssertError(t, errs, "", "", "", "", "len")
  516. type Test struct {
  517. Color string `validate:"iscoloralias"`
  518. }
  519. tst := &Test{
  520. Color: "#000",
  521. }
  522. errs = validate.Struct(tst)
  523. Equal(t, errs, nil)
  524. tst.Color = "cfvre"
  525. errs = validate.Struct(tst)
  526. NotEqual(t, errs, nil)
  527. AssertError(t, errs, "Test.Color", "Test.Color", "Color", "Color", "iscoloralias")
  528. fe := getError(errs, "Test.Color", "Test.Color")
  529. NotEqual(t, fe, nil)
  530. Equal(t, fe.ActualTag(), "hexcolor|rgb|rgba|hsl|hsla")
  531. validate.RegisterAlias("req", "required,dive,iscoloralias")
  532. arr := []string{"val1", "#fff", "#000"}
  533. errs = validate.Var(arr, "req")
  534. NotEqual(t, errs, nil)
  535. AssertError(t, errs, "[0]", "[0]", "[0]", "[0]", "iscoloralias")
  536. PanicMatches(t, func() { validate.RegisterAlias("exists!", "gt=5,lt=10") }, "Alias 'exists!' either contains restricted characters or is the same as a restricted tag needed for normal operation")
  537. }
  538. func TestNilValidator(t *testing.T) {
  539. type TestStruct struct {
  540. Test string `validate:"required"`
  541. }
  542. ts := TestStruct{}
  543. var val *Validate
  544. fn := func(fl FieldLevel) bool {
  545. return fl.Parent().String() == fl.Field().String()
  546. }
  547. PanicMatches(t, func() { val.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{}) }, "runtime error: invalid memory address or nil pointer dereference")
  548. PanicMatches(t, func() { _ = val.RegisterValidation("something", fn) }, "runtime error: invalid memory address or nil pointer dereference")
  549. PanicMatches(t, func() { _ = val.Var(ts.Test, "required") }, "runtime error: invalid memory address or nil pointer dereference")
  550. PanicMatches(t, func() { _ = val.VarWithValue("test", ts.Test, "required") }, "runtime error: invalid memory address or nil pointer dereference")
  551. PanicMatches(t, func() { _ = val.Struct(ts) }, "runtime error: invalid memory address or nil pointer dereference")
  552. PanicMatches(t, func() { _ = val.StructExcept(ts, "Test") }, "runtime error: invalid memory address or nil pointer dereference")
  553. PanicMatches(t, func() { _ = val.StructPartial(ts, "Test") }, "runtime error: invalid memory address or nil pointer dereference")
  554. }
  555. func TestStructPartial(t *testing.T) {
  556. p1 := []string{
  557. "NoTag",
  558. "Required",
  559. }
  560. p2 := []string{
  561. "SubSlice[0].Test",
  562. "Sub",
  563. "SubIgnore",
  564. "Anonymous.A",
  565. }
  566. p3 := []string{
  567. "SubTest.Test",
  568. }
  569. p4 := []string{
  570. "A",
  571. }
  572. tPartial := &TestPartial{
  573. NoTag: "NoTag",
  574. Required: "Required",
  575. SubSlice: []*SubTest{
  576. {
  577. Test: "Required",
  578. },
  579. {
  580. Test: "Required",
  581. },
  582. },
  583. Sub: &SubTest{
  584. Test: "1",
  585. },
  586. SubIgnore: &SubTest{
  587. Test: "",
  588. },
  589. Anonymous: struct {
  590. A string `validate:"required"`
  591. ASubSlice []*SubTest `validate:"required,dive"`
  592. SubAnonStruct []struct {
  593. Test string `validate:"required"`
  594. OtherTest string `validate:"required"`
  595. } `validate:"required,dive"`
  596. }{
  597. A: "1",
  598. ASubSlice: []*SubTest{
  599. {
  600. Test: "Required",
  601. },
  602. {
  603. Test: "Required",
  604. },
  605. },
  606. SubAnonStruct: []struct {
  607. Test string `validate:"required"`
  608. OtherTest string `validate:"required"`
  609. }{
  610. {"Required", "RequiredOther"},
  611. {"Required", "RequiredOther"},
  612. },
  613. },
  614. }
  615. validate := New()
  616. // the following should all return no errors as everything is valid in
  617. // the default state
  618. errs := validate.StructPartialCtx(context.Background(), tPartial, p1...)
  619. Equal(t, errs, nil)
  620. errs = validate.StructPartial(tPartial, p2...)
  621. Equal(t, errs, nil)
  622. // this isn't really a robust test, but is ment to illustrate the ANON CASE below
  623. errs = validate.StructPartial(tPartial.SubSlice[0], p3...)
  624. Equal(t, errs, nil)
  625. errs = validate.StructExceptCtx(context.Background(), tPartial, p1...)
  626. Equal(t, errs, nil)
  627. errs = validate.StructExcept(tPartial, p2...)
  628. Equal(t, errs, nil)
  629. // mod tParial for required feild and re-test making sure invalid fields are NOT required:
  630. tPartial.Required = ""
  631. errs = validate.StructExcept(tPartial, p1...)
  632. Equal(t, errs, nil)
  633. errs = validate.StructPartial(tPartial, p2...)
  634. Equal(t, errs, nil)
  635. // inversion and retesting Partial to generate failures:
  636. errs = validate.StructPartial(tPartial, p1...)
  637. NotEqual(t, errs, nil)
  638. AssertError(t, errs, "TestPartial.Required", "TestPartial.Required", "Required", "Required", "required")
  639. errs = validate.StructExcept(tPartial, p2...)
  640. AssertError(t, errs, "TestPartial.Required", "TestPartial.Required", "Required", "Required", "required")
  641. // reset Required field, and set nested struct
  642. tPartial.Required = "Required"
  643. tPartial.Anonymous.A = ""
  644. // will pass as unset feilds is not going to be tested
  645. errs = validate.StructPartial(tPartial, p1...)
  646. Equal(t, errs, nil)
  647. errs = validate.StructExcept(tPartial, p2...)
  648. Equal(t, errs, nil)
  649. // ANON CASE the response here is strange, it clearly does what it is being told to
  650. errs = validate.StructExcept(tPartial.Anonymous, p4...)
  651. Equal(t, errs, nil)
  652. // will fail as unset feild is tested
  653. errs = validate.StructPartial(tPartial, p2...)
  654. NotEqual(t, errs, nil)
  655. AssertError(t, errs, "TestPartial.Anonymous.A", "TestPartial.Anonymous.A", "A", "A", "required")
  656. errs = validate.StructExcept(tPartial, p1...)
  657. NotEqual(t, errs, nil)
  658. AssertError(t, errs, "TestPartial.Anonymous.A", "TestPartial.Anonymous.A", "A", "A", "required")
  659. // reset nested struct and unset struct in slice
  660. tPartial.Anonymous.A = "Required"
  661. tPartial.SubSlice[0].Test = ""
  662. // these will pass as unset item is NOT tested
  663. errs = validate.StructPartial(tPartial, p1...)
  664. Equal(t, errs, nil)
  665. errs = validate.StructExcept(tPartial, p2...)
  666. Equal(t, errs, nil)
  667. // these will fail as unset item IS tested
  668. errs = validate.StructExcept(tPartial, p1...)
  669. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  670. Equal(t, len(errs.(ValidationErrors)), 1)
  671. errs = validate.StructPartial(tPartial, p2...)
  672. NotEqual(t, errs, nil)
  673. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  674. Equal(t, len(errs.(ValidationErrors)), 1)
  675. // Unset second slice member concurrently to test dive behavior:
  676. tPartial.SubSlice[1].Test = ""
  677. errs = validate.StructPartial(tPartial, p1...)
  678. Equal(t, errs, nil)
  679. // NOTE: When specifying nested items, it is still the users responsibility
  680. // to specify the dive tag, the library does not override this.
  681. errs = validate.StructExcept(tPartial, p2...)
  682. NotEqual(t, errs, nil)
  683. AssertError(t, errs, "TestPartial.SubSlice[1].Test", "TestPartial.SubSlice[1].Test", "Test", "Test", "required")
  684. errs = validate.StructExcept(tPartial, p1...)
  685. Equal(t, len(errs.(ValidationErrors)), 2)
  686. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  687. AssertError(t, errs, "TestPartial.SubSlice[1].Test", "TestPartial.SubSlice[1].Test", "Test", "Test", "required")
  688. errs = validate.StructPartial(tPartial, p2...)
  689. NotEqual(t, errs, nil)
  690. Equal(t, len(errs.(ValidationErrors)), 1)
  691. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  692. // reset struct in slice, and unset struct in slice in unset posistion
  693. tPartial.SubSlice[0].Test = "Required"
  694. // these will pass as the unset item is NOT tested
  695. errs = validate.StructPartial(tPartial, p1...)
  696. Equal(t, errs, nil)
  697. errs = validate.StructPartial(tPartial, p2...)
  698. Equal(t, errs, nil)
  699. // testing for missing item by exception, yes it dives and fails
  700. errs = validate.StructExcept(tPartial, p1...)
  701. NotEqual(t, errs, nil)
  702. Equal(t, len(errs.(ValidationErrors)), 1)
  703. AssertError(t, errs, "TestPartial.SubSlice[1].Test", "TestPartial.SubSlice[1].Test", "Test", "Test", "required")
  704. errs = validate.StructExcept(tPartial, p2...)
  705. NotEqual(t, errs, nil)
  706. AssertError(t, errs, "TestPartial.SubSlice[1].Test", "TestPartial.SubSlice[1].Test", "Test", "Test", "required")
  707. tPartial.SubSlice[1].Test = "Required"
  708. tPartial.Anonymous.SubAnonStruct[0].Test = ""
  709. // these will pass as the unset item is NOT tested
  710. errs = validate.StructPartial(tPartial, p1...)
  711. Equal(t, errs, nil)
  712. errs = validate.StructPartial(tPartial, p2...)
  713. Equal(t, errs, nil)
  714. errs = validate.StructExcept(tPartial, p1...)
  715. NotEqual(t, errs, nil)
  716. AssertError(t, errs, "TestPartial.Anonymous.SubAnonStruct[0].Test", "TestPartial.Anonymous.SubAnonStruct[0].Test", "Test", "Test", "required")
  717. errs = validate.StructExcept(tPartial, p2...)
  718. NotEqual(t, errs, nil)
  719. AssertError(t, errs, "TestPartial.Anonymous.SubAnonStruct[0].Test", "TestPartial.Anonymous.SubAnonStruct[0].Test", "Test", "Test", "required")
  720. }
  721. func TestCrossStructLteFieldValidation(t *testing.T) {
  722. type Inner struct {
  723. CreatedAt *time.Time
  724. String string
  725. Int int
  726. Uint uint
  727. Float float64
  728. Array []string
  729. }
  730. type Test struct {
  731. Inner *Inner
  732. CreatedAt *time.Time `validate:"ltecsfield=Inner.CreatedAt"`
  733. String string `validate:"ltecsfield=Inner.String"`
  734. Int int `validate:"ltecsfield=Inner.Int"`
  735. Uint uint `validate:"ltecsfield=Inner.Uint"`
  736. Float float64 `validate:"ltecsfield=Inner.Float"`
  737. Array []string `validate:"ltecsfield=Inner.Array"`
  738. }
  739. now := time.Now().UTC()
  740. then := now.Add(time.Hour * 5)
  741. inner := &Inner{
  742. CreatedAt: &then,
  743. String: "abcd",
  744. Int: 13,
  745. Uint: 13,
  746. Float: 1.13,
  747. Array: []string{"val1", "val2"},
  748. }
  749. test := &Test{
  750. Inner: inner,
  751. CreatedAt: &now,
  752. String: "abc",
  753. Int: 12,
  754. Uint: 12,
  755. Float: 1.12,
  756. Array: []string{"val1"},
  757. }
  758. validate := New()
  759. errs := validate.Struct(test)
  760. Equal(t, errs, nil)
  761. test.CreatedAt = &then
  762. test.String = "abcd"
  763. test.Int = 13
  764. test.Uint = 13
  765. test.Float = 1.13
  766. test.Array = []string{"val1", "val2"}
  767. errs = validate.Struct(test)
  768. Equal(t, errs, nil)
  769. after := now.Add(time.Hour * 10)
  770. test.CreatedAt = &after
  771. test.String = "abce"
  772. test.Int = 14
  773. test.Uint = 14
  774. test.Float = 1.14
  775. test.Array = []string{"val1", "val2", "val3"}
  776. errs = validate.Struct(test)
  777. NotEqual(t, errs, nil)
  778. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "ltecsfield")
  779. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "ltecsfield")
  780. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "ltecsfield")
  781. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "ltecsfield")
  782. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "ltecsfield")
  783. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "ltecsfield")
  784. errs = validate.VarWithValueCtx(context.Background(), 1, "", "ltecsfield")
  785. NotEqual(t, errs, nil)
  786. AssertError(t, errs, "", "", "", "", "ltecsfield")
  787. // this test is for the WARNING about unforeseen validation issues.
  788. errs = validate.VarWithValue(test, now, "ltecsfield")
  789. NotEqual(t, errs, nil)
  790. Equal(t, len(errs.(ValidationErrors)), 6)
  791. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "ltecsfield")
  792. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "ltecsfield")
  793. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "ltecsfield")
  794. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "ltecsfield")
  795. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "ltecsfield")
  796. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "ltecsfield")
  797. type Other struct {
  798. Value string
  799. }
  800. type Test2 struct {
  801. Value Other
  802. Time time.Time `validate:"ltecsfield=Value"`
  803. }
  804. tst := Test2{
  805. Value: Other{Value: "StringVal"},
  806. Time: then,
  807. }
  808. errs = validate.Struct(tst)
  809. NotEqual(t, errs, nil)
  810. AssertError(t, errs, "Test2.Time", "Test2.Time", "Time", "Time", "ltecsfield")
  811. }
  812. func TestCrossStructLtFieldValidation(t *testing.T) {
  813. type Inner struct {
  814. CreatedAt *time.Time
  815. String string
  816. Int int
  817. Uint uint
  818. Float float64
  819. Array []string
  820. }
  821. type Test struct {
  822. Inner *Inner
  823. CreatedAt *time.Time `validate:"ltcsfield=Inner.CreatedAt"`
  824. String string `validate:"ltcsfield=Inner.String"`
  825. Int int `validate:"ltcsfield=Inner.Int"`
  826. Uint uint `validate:"ltcsfield=Inner.Uint"`
  827. Float float64 `validate:"ltcsfield=Inner.Float"`
  828. Array []string `validate:"ltcsfield=Inner.Array"`
  829. }
  830. now := time.Now().UTC()
  831. then := now.Add(time.Hour * 5)
  832. inner := &Inner{
  833. CreatedAt: &then,
  834. String: "abcd",
  835. Int: 13,
  836. Uint: 13,
  837. Float: 1.13,
  838. Array: []string{"val1", "val2"},
  839. }
  840. test := &Test{
  841. Inner: inner,
  842. CreatedAt: &now,
  843. String: "abc",
  844. Int: 12,
  845. Uint: 12,
  846. Float: 1.12,
  847. Array: []string{"val1"},
  848. }
  849. validate := New()
  850. errs := validate.Struct(test)
  851. Equal(t, errs, nil)
  852. test.CreatedAt = &then
  853. test.String = "abcd"
  854. test.Int = 13
  855. test.Uint = 13
  856. test.Float = 1.13
  857. test.Array = []string{"val1", "val2"}
  858. errs = validate.Struct(test)
  859. NotEqual(t, errs, nil)
  860. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "ltcsfield")
  861. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "ltcsfield")
  862. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "ltcsfield")
  863. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "ltcsfield")
  864. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "ltcsfield")
  865. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "ltcsfield")
  866. errs = validate.VarWithValue(1, "", "ltcsfield")
  867. NotEqual(t, errs, nil)
  868. AssertError(t, errs, "", "", "", "", "ltcsfield")
  869. // this test is for the WARNING about unforeseen validation issues.
  870. errs = validate.VarWithValue(test, now, "ltcsfield")
  871. NotEqual(t, errs, nil)
  872. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "ltcsfield")
  873. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "ltcsfield")
  874. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "ltcsfield")
  875. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "ltcsfield")
  876. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "ltcsfield")
  877. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "ltcsfield")
  878. type Other struct {
  879. Value string
  880. }
  881. type Test2 struct {
  882. Value Other
  883. Time time.Time `validate:"ltcsfield=Value"`
  884. }
  885. tst := Test2{
  886. Value: Other{Value: "StringVal"},
  887. Time: then,
  888. }
  889. errs = validate.Struct(tst)
  890. NotEqual(t, errs, nil)
  891. AssertError(t, errs, "Test2.Time", "Test2.Time", "Time", "Time", "ltcsfield")
  892. }
  893. func TestCrossStructGteFieldValidation(t *testing.T) {
  894. type Inner struct {
  895. CreatedAt *time.Time
  896. String string
  897. Int int
  898. Uint uint
  899. Float float64
  900. Array []string
  901. }
  902. type Test struct {
  903. Inner *Inner
  904. CreatedAt *time.Time `validate:"gtecsfield=Inner.CreatedAt"`
  905. String string `validate:"gtecsfield=Inner.String"`
  906. Int int `validate:"gtecsfield=Inner.Int"`
  907. Uint uint `validate:"gtecsfield=Inner.Uint"`
  908. Float float64 `validate:"gtecsfield=Inner.Float"`
  909. Array []string `validate:"gtecsfield=Inner.Array"`
  910. }
  911. now := time.Now().UTC()
  912. then := now.Add(time.Hour * -5)
  913. inner := &Inner{
  914. CreatedAt: &then,
  915. String: "abcd",
  916. Int: 13,
  917. Uint: 13,
  918. Float: 1.13,
  919. Array: []string{"val1", "val2"},
  920. }
  921. test := &Test{
  922. Inner: inner,
  923. CreatedAt: &now,
  924. String: "abcde",
  925. Int: 14,
  926. Uint: 14,
  927. Float: 1.14,
  928. Array: []string{"val1", "val2", "val3"},
  929. }
  930. validate := New()
  931. errs := validate.Struct(test)
  932. Equal(t, errs, nil)
  933. test.CreatedAt = &then
  934. test.String = "abcd"
  935. test.Int = 13
  936. test.Uint = 13
  937. test.Float = 1.13
  938. test.Array = []string{"val1", "val2"}
  939. errs = validate.Struct(test)
  940. Equal(t, errs, nil)
  941. before := now.Add(time.Hour * -10)
  942. test.CreatedAt = &before
  943. test.String = "abc"
  944. test.Int = 12
  945. test.Uint = 12
  946. test.Float = 1.12
  947. test.Array = []string{"val1"}
  948. errs = validate.Struct(test)
  949. NotEqual(t, errs, nil)
  950. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "gtecsfield")
  951. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "gtecsfield")
  952. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "gtecsfield")
  953. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "gtecsfield")
  954. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "gtecsfield")
  955. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "gtecsfield")
  956. errs = validate.VarWithValue(1, "", "gtecsfield")
  957. NotEqual(t, errs, nil)
  958. AssertError(t, errs, "", "", "", "", "gtecsfield")
  959. // this test is for the WARNING about unforeseen validation issues.
  960. errs = validate.VarWithValue(test, now, "gtecsfield")
  961. NotEqual(t, errs, nil)
  962. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "gtecsfield")
  963. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "gtecsfield")
  964. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "gtecsfield")
  965. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "gtecsfield")
  966. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "gtecsfield")
  967. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "gtecsfield")
  968. type Other struct {
  969. Value string
  970. }
  971. type Test2 struct {
  972. Value Other
  973. Time time.Time `validate:"gtecsfield=Value"`
  974. }
  975. tst := Test2{
  976. Value: Other{Value: "StringVal"},
  977. Time: then,
  978. }
  979. errs = validate.Struct(tst)
  980. NotEqual(t, errs, nil)
  981. AssertError(t, errs, "Test2.Time", "Test2.Time", "Time", "Time", "gtecsfield")
  982. }
  983. func TestCrossStructGtFieldValidation(t *testing.T) {
  984. type Inner struct {
  985. CreatedAt *time.Time
  986. String string
  987. Int int
  988. Uint uint
  989. Float float64
  990. Array []string
  991. }
  992. type Test struct {
  993. Inner *Inner
  994. CreatedAt *time.Time `validate:"gtcsfield=Inner.CreatedAt"`
  995. String string `validate:"gtcsfield=Inner.String"`
  996. Int int `validate:"gtcsfield=Inner.Int"`
  997. Uint uint `validate:"gtcsfield=Inner.Uint"`
  998. Float float64 `validate:"gtcsfield=Inner.Float"`
  999. Array []string `validate:"gtcsfield=Inner.Array"`
  1000. }
  1001. now := time.Now().UTC()
  1002. then := now.Add(time.Hour * -5)
  1003. inner := &Inner{
  1004. CreatedAt: &then,
  1005. String: "abcd",
  1006. Int: 13,
  1007. Uint: 13,
  1008. Float: 1.13,
  1009. Array: []string{"val1", "val2"},
  1010. }
  1011. test := &Test{
  1012. Inner: inner,
  1013. CreatedAt: &now,
  1014. String: "abcde",
  1015. Int: 14,
  1016. Uint: 14,
  1017. Float: 1.14,
  1018. Array: []string{"val1", "val2", "val3"},
  1019. }
  1020. validate := New()
  1021. errs := validate.Struct(test)
  1022. Equal(t, errs, nil)
  1023. test.CreatedAt = &then
  1024. test.String = "abcd"
  1025. test.Int = 13
  1026. test.Uint = 13
  1027. test.Float = 1.13
  1028. test.Array = []string{"val1", "val2"}
  1029. errs = validate.Struct(test)
  1030. NotEqual(t, errs, nil)
  1031. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "gtcsfield")
  1032. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "gtcsfield")
  1033. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "gtcsfield")
  1034. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "gtcsfield")
  1035. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "gtcsfield")
  1036. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "gtcsfield")
  1037. errs = validate.VarWithValue(1, "", "gtcsfield")
  1038. NotEqual(t, errs, nil)
  1039. AssertError(t, errs, "", "", "", "", "gtcsfield")
  1040. // this test is for the WARNING about unforeseen validation issues.
  1041. errs = validate.VarWithValue(test, now, "gtcsfield")
  1042. NotEqual(t, errs, nil)
  1043. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "gtcsfield")
  1044. AssertError(t, errs, "Test.String", "Test.String", "String", "String", "gtcsfield")
  1045. AssertError(t, errs, "Test.Int", "Test.Int", "Int", "Int", "gtcsfield")
  1046. AssertError(t, errs, "Test.Uint", "Test.Uint", "Uint", "Uint", "gtcsfield")
  1047. AssertError(t, errs, "Test.Float", "Test.Float", "Float", "Float", "gtcsfield")
  1048. AssertError(t, errs, "Test.Array", "Test.Array", "Array", "Array", "gtcsfield")
  1049. type Other struct {
  1050. Value string
  1051. }
  1052. type Test2 struct {
  1053. Value Other
  1054. Time time.Time `validate:"gtcsfield=Value"`
  1055. }
  1056. tst := Test2{
  1057. Value: Other{Value: "StringVal"},
  1058. Time: then,
  1059. }
  1060. errs = validate.Struct(tst)
  1061. NotEqual(t, errs, nil)
  1062. AssertError(t, errs, "Test2.Time", "Test2.Time", "Time", "Time", "gtcsfield")
  1063. }
  1064. func TestCrossStructNeFieldValidation(t *testing.T) {
  1065. type Inner struct {
  1066. CreatedAt *time.Time
  1067. }
  1068. type Test struct {
  1069. Inner *Inner
  1070. CreatedAt *time.Time `validate:"necsfield=Inner.CreatedAt"`
  1071. }
  1072. now := time.Now().UTC()
  1073. then := now.Add(time.Hour * 5)
  1074. inner := &Inner{
  1075. CreatedAt: &then,
  1076. }
  1077. test := &Test{
  1078. Inner: inner,
  1079. CreatedAt: &now,
  1080. }
  1081. validate := New()
  1082. errs := validate.Struct(test)
  1083. Equal(t, errs, nil)
  1084. test.CreatedAt = &then
  1085. errs = validate.Struct(test)
  1086. NotEqual(t, errs, nil)
  1087. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "necsfield")
  1088. var j uint64
  1089. var k float64
  1090. var j2 uint64
  1091. var k2 float64
  1092. s := "abcd"
  1093. i := 1
  1094. j = 1
  1095. k = 1.543
  1096. arr := []string{"test"}
  1097. s2 := "abcd"
  1098. i2 := 1
  1099. j2 = 1
  1100. k2 = 1.543
  1101. arr2 := []string{"test"}
  1102. arr3 := []string{"test", "test2"}
  1103. now2 := now
  1104. errs = validate.VarWithValue(s, s2, "necsfield")
  1105. NotEqual(t, errs, nil)
  1106. AssertError(t, errs, "", "", "", "", "necsfield")
  1107. errs = validate.VarWithValue(i2, i, "necsfield")
  1108. NotEqual(t, errs, nil)
  1109. AssertError(t, errs, "", "", "", "", "necsfield")
  1110. errs = validate.VarWithValue(j2, j, "necsfield")
  1111. NotEqual(t, errs, nil)
  1112. AssertError(t, errs, "", "", "", "", "necsfield")
  1113. errs = validate.VarWithValue(k2, k, "necsfield")
  1114. NotEqual(t, errs, nil)
  1115. AssertError(t, errs, "", "", "", "", "necsfield")
  1116. errs = validate.VarWithValue(arr2, arr, "necsfield")
  1117. NotEqual(t, errs, nil)
  1118. AssertError(t, errs, "", "", "", "", "necsfield")
  1119. errs = validate.VarWithValue(now2, now, "necsfield")
  1120. NotEqual(t, errs, nil)
  1121. AssertError(t, errs, "", "", "", "", "necsfield")
  1122. errs = validate.VarWithValue(arr3, arr, "necsfield")
  1123. Equal(t, errs, nil)
  1124. type SInner struct {
  1125. Name string
  1126. }
  1127. type TStruct struct {
  1128. Inner *SInner
  1129. CreatedAt *time.Time `validate:"necsfield=Inner"`
  1130. }
  1131. sinner := &SInner{
  1132. Name: "NAME",
  1133. }
  1134. test2 := &TStruct{
  1135. Inner: sinner,
  1136. CreatedAt: &now,
  1137. }
  1138. errs = validate.Struct(test2)
  1139. Equal(t, errs, nil)
  1140. test2.Inner = nil
  1141. errs = validate.Struct(test2)
  1142. Equal(t, errs, nil)
  1143. errs = validate.VarWithValue(nil, 1, "necsfield")
  1144. NotEqual(t, errs, nil)
  1145. AssertError(t, errs, "", "", "", "", "necsfield")
  1146. }
  1147. func TestCrossStructEqFieldValidation(t *testing.T) {
  1148. type Inner struct {
  1149. CreatedAt *time.Time
  1150. }
  1151. type Test struct {
  1152. Inner *Inner
  1153. CreatedAt *time.Time `validate:"eqcsfield=Inner.CreatedAt"`
  1154. }
  1155. now := time.Now().UTC()
  1156. inner := &Inner{
  1157. CreatedAt: &now,
  1158. }
  1159. test := &Test{
  1160. Inner: inner,
  1161. CreatedAt: &now,
  1162. }
  1163. validate := New()
  1164. errs := validate.Struct(test)
  1165. Equal(t, errs, nil)
  1166. newTime := time.Now().UTC()
  1167. test.CreatedAt = &newTime
  1168. errs = validate.Struct(test)
  1169. NotEqual(t, errs, nil)
  1170. AssertError(t, errs, "Test.CreatedAt", "Test.CreatedAt", "CreatedAt", "CreatedAt", "eqcsfield")
  1171. var j uint64
  1172. var k float64
  1173. s := "abcd"
  1174. i := 1
  1175. j = 1
  1176. k = 1.543
  1177. arr := []string{"test"}
  1178. var j2 uint64
  1179. var k2 float64
  1180. s2 := "abcd"
  1181. i2 := 1
  1182. j2 = 1
  1183. k2 = 1.543
  1184. arr2 := []string{"test"}
  1185. arr3 := []string{"test", "test2"}
  1186. now2 := now
  1187. errs = validate.VarWithValue(s, s2, "eqcsfield")
  1188. Equal(t, errs, nil)
  1189. errs = validate.VarWithValue(i2, i, "eqcsfield")
  1190. Equal(t, errs, nil)
  1191. errs = validate.VarWithValue(j2, j, "eqcsfield")
  1192. Equal(t, errs, nil)
  1193. errs = validate.VarWithValue(k2, k, "eqcsfield")
  1194. Equal(t, errs, nil)
  1195. errs = validate.VarWithValue(arr2, arr, "eqcsfield")
  1196. Equal(t, errs, nil)
  1197. errs = validate.VarWithValue(now2, now, "eqcsfield")
  1198. Equal(t, errs, nil)
  1199. errs = validate.VarWithValue(arr3, arr, "eqcsfield")
  1200. NotEqual(t, errs, nil)
  1201. AssertError(t, errs, "", "", "", "", "eqcsfield")
  1202. type SInner struct {
  1203. Name string
  1204. }
  1205. type TStruct struct {
  1206. Inner *SInner
  1207. CreatedAt *time.Time `validate:"eqcsfield=Inner"`
  1208. }
  1209. sinner := &SInner{
  1210. Name: "NAME",
  1211. }
  1212. test2 := &TStruct{
  1213. Inner: sinner,
  1214. CreatedAt: &now,
  1215. }
  1216. errs = validate.Struct(test2)
  1217. NotEqual(t, errs, nil)
  1218. AssertError(t, errs, "TStruct.CreatedAt", "TStruct.CreatedAt", "CreatedAt", "CreatedAt", "eqcsfield")
  1219. test2.Inner = nil
  1220. errs = validate.Struct(test2)
  1221. NotEqual(t, errs, nil)
  1222. AssertError(t, errs, "TStruct.CreatedAt", "TStruct.CreatedAt", "CreatedAt", "CreatedAt", "eqcsfield")
  1223. errs = validate.VarWithValue(nil, 1, "eqcsfield")
  1224. NotEqual(t, errs, nil)
  1225. AssertError(t, errs, "", "", "", "", "eqcsfield")
  1226. }
  1227. func TestCrossNamespaceFieldValidation(t *testing.T) {
  1228. type SliceStruct struct {
  1229. Name string
  1230. }
  1231. type Inner struct {
  1232. CreatedAt *time.Time
  1233. Slice []string
  1234. SliceStructs []*SliceStruct
  1235. SliceSlice [][]string
  1236. SliceSliceStruct [][]*SliceStruct
  1237. SliceMap []map[string]string
  1238. Map map[string]string
  1239. MapMap map[string]map[string]string
  1240. MapStructs map[string]*SliceStruct
  1241. MapMapStruct map[string]map[string]*SliceStruct
  1242. MapSlice map[string][]string
  1243. MapInt map[int]string
  1244. MapInt8 map[int8]string
  1245. MapInt16 map[int16]string
  1246. MapInt32 map[int32]string
  1247. MapInt64 map[int64]string
  1248. MapUint map[uint]string
  1249. MapUint8 map[uint8]string
  1250. MapUint16 map[uint16]string
  1251. MapUint32 map[uint32]string
  1252. MapUint64 map[uint64]string
  1253. MapFloat32 map[float32]string
  1254. MapFloat64 map[float64]string
  1255. MapBool map[bool]string
  1256. }
  1257. type Test struct {
  1258. Inner *Inner
  1259. CreatedAt *time.Time
  1260. }
  1261. now := time.Now()
  1262. inner := &Inner{
  1263. CreatedAt: &now,
  1264. Slice: []string{"val1", "val2", "val3"},
  1265. SliceStructs: []*SliceStruct{{Name: "name1"}, {Name: "name2"}, {Name: "name3"}},
  1266. SliceSlice: [][]string{{"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}},
  1267. SliceSliceStruct: [][]*SliceStruct{{{Name: "name1"}, {Name: "name2"}, {Name: "name3"}}, {{Name: "name4"}, {Name: "name5"}, {Name: "name6"}}, {{Name: "name7"}, {Name: "name8"}, {Name: "name9"}}},
  1268. SliceMap: []map[string]string{{"key1": "val1", "key2": "val2", "key3": "val3"}, {"key4": "val4", "key5": "val5", "key6": "val6"}},
  1269. Map: map[string]string{"key1": "val1", "key2": "val2", "key3": "val3"},
  1270. MapStructs: map[string]*SliceStruct{"key1": {Name: "name1"}, "key2": {Name: "name2"}, "key3": {Name: "name3"}},
  1271. MapMap: map[string]map[string]string{"key1": {"key1-1": "val1"}, "key2": {"key2-1": "val2"}, "key3": {"key3-1": "val3"}},
  1272. MapMapStruct: map[string]map[string]*SliceStruct{"key1": {"key1-1": {Name: "name1"}}, "key2": {"key2-1": {Name: "name2"}}, "key3": {"key3-1": {Name: "name3"}}},
  1273. MapSlice: map[string][]string{"key1": {"1", "2", "3"}, "key2": {"4", "5", "6"}, "key3": {"7", "8", "9"}},
  1274. MapInt: map[int]string{1: "val1", 2: "val2", 3: "val3"},
  1275. MapInt8: map[int8]string{1: "val1", 2: "val2", 3: "val3"},
  1276. MapInt16: map[int16]string{1: "val1", 2: "val2", 3: "val3"},
  1277. MapInt32: map[int32]string{1: "val1", 2: "val2", 3: "val3"},
  1278. MapInt64: map[int64]string{1: "val1", 2: "val2", 3: "val3"},
  1279. MapUint: map[uint]string{1: "val1", 2: "val2", 3: "val3"},
  1280. MapUint8: map[uint8]string{1: "val1", 2: "val2", 3: "val3"},
  1281. MapUint16: map[uint16]string{1: "val1", 2: "val2", 3: "val3"},
  1282. MapUint32: map[uint32]string{1: "val1", 2: "val2", 3: "val3"},
  1283. MapUint64: map[uint64]string{1: "val1", 2: "val2", 3: "val3"},
  1284. MapFloat32: map[float32]string{1.01: "val1", 2.02: "val2", 3.03: "val3"},
  1285. MapFloat64: map[float64]string{1.01: "val1", 2.02: "val2", 3.03: "val3"},
  1286. MapBool: map[bool]string{true: "val1", false: "val2"},
  1287. }
  1288. test := &Test{
  1289. Inner: inner,
  1290. CreatedAt: &now,
  1291. }
  1292. val := reflect.ValueOf(test)
  1293. vd := New()
  1294. v := &validate{
  1295. v: vd,
  1296. }
  1297. current, kind, ok := v.getStructFieldOKInternal(val, "Inner.CreatedAt")
  1298. Equal(t, ok, true)
  1299. Equal(t, kind, reflect.Struct)
  1300. tm, ok := current.Interface().(time.Time)
  1301. Equal(t, ok, true)
  1302. Equal(t, tm, now)
  1303. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.Slice[1]")
  1304. Equal(t, ok, true)
  1305. Equal(t, kind, reflect.String)
  1306. Equal(t, current.String(), "val2")
  1307. current, _, ok = v.getStructFieldOKInternal(val, "Inner.CrazyNonExistantField")
  1308. Equal(t, ok, false)
  1309. current, _, ok = v.getStructFieldOKInternal(val, "Inner.Slice[101]")
  1310. Equal(t, ok, false)
  1311. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.Map[key3]")
  1312. Equal(t, ok, true)
  1313. Equal(t, kind, reflect.String)
  1314. Equal(t, current.String(), "val3")
  1315. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapMap[key2][key2-1]")
  1316. Equal(t, ok, true)
  1317. Equal(t, kind, reflect.String)
  1318. Equal(t, current.String(), "val2")
  1319. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapStructs[key2].Name")
  1320. Equal(t, ok, true)
  1321. Equal(t, kind, reflect.String)
  1322. Equal(t, current.String(), "name2")
  1323. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapMapStruct[key3][key3-1].Name")
  1324. Equal(t, ok, true)
  1325. Equal(t, kind, reflect.String)
  1326. Equal(t, current.String(), "name3")
  1327. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.SliceSlice[2][0]")
  1328. Equal(t, ok, true)
  1329. Equal(t, kind, reflect.String)
  1330. Equal(t, current.String(), "7")
  1331. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.SliceSliceStruct[2][1].Name")
  1332. Equal(t, ok, true)
  1333. Equal(t, kind, reflect.String)
  1334. Equal(t, current.String(), "name8")
  1335. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.SliceMap[1][key5]")
  1336. Equal(t, ok, true)
  1337. Equal(t, kind, reflect.String)
  1338. Equal(t, current.String(), "val5")
  1339. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapSlice[key3][2]")
  1340. Equal(t, ok, true)
  1341. Equal(t, kind, reflect.String)
  1342. Equal(t, current.String(), "9")
  1343. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapInt[2]")
  1344. Equal(t, ok, true)
  1345. Equal(t, kind, reflect.String)
  1346. Equal(t, current.String(), "val2")
  1347. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapInt8[2]")
  1348. Equal(t, ok, true)
  1349. Equal(t, kind, reflect.String)
  1350. Equal(t, current.String(), "val2")
  1351. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapInt16[2]")
  1352. Equal(t, ok, true)
  1353. Equal(t, kind, reflect.String)
  1354. Equal(t, current.String(), "val2")
  1355. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapInt32[2]")
  1356. Equal(t, ok, true)
  1357. Equal(t, kind, reflect.String)
  1358. Equal(t, current.String(), "val2")
  1359. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapInt64[2]")
  1360. Equal(t, ok, true)
  1361. Equal(t, kind, reflect.String)
  1362. Equal(t, current.String(), "val2")
  1363. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapUint[2]")
  1364. Equal(t, ok, true)
  1365. Equal(t, kind, reflect.String)
  1366. Equal(t, current.String(), "val2")
  1367. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapUint8[2]")
  1368. Equal(t, ok, true)
  1369. Equal(t, kind, reflect.String)
  1370. Equal(t, current.String(), "val2")
  1371. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapUint16[2]")
  1372. Equal(t, ok, true)
  1373. Equal(t, kind, reflect.String)
  1374. Equal(t, current.String(), "val2")
  1375. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapUint32[2]")
  1376. Equal(t, ok, true)
  1377. Equal(t, kind, reflect.String)
  1378. Equal(t, current.String(), "val2")
  1379. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapUint64[2]")
  1380. Equal(t, ok, true)
  1381. Equal(t, kind, reflect.String)
  1382. Equal(t, current.String(), "val2")
  1383. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapFloat32[3.03]")
  1384. Equal(t, ok, true)
  1385. Equal(t, kind, reflect.String)
  1386. Equal(t, current.String(), "val3")
  1387. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapFloat64[2.02]")
  1388. Equal(t, ok, true)
  1389. Equal(t, kind, reflect.String)
  1390. Equal(t, current.String(), "val2")
  1391. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.MapBool[true]")
  1392. Equal(t, ok, true)
  1393. Equal(t, kind, reflect.String)
  1394. Equal(t, current.String(), "val1")
  1395. inner = &Inner{
  1396. CreatedAt: &now,
  1397. Slice: []string{"val1", "val2", "val3"},
  1398. SliceStructs: []*SliceStruct{{Name: "name1"}, {Name: "name2"}, nil},
  1399. SliceSlice: [][]string{{"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}},
  1400. SliceSliceStruct: [][]*SliceStruct{{{Name: "name1"}, {Name: "name2"}, {Name: "name3"}}, {{Name: "name4"}, {Name: "name5"}, {Name: "name6"}}, {{Name: "name7"}, {Name: "name8"}, {Name: "name9"}}},
  1401. SliceMap: []map[string]string{{"key1": "val1", "key2": "val2", "key3": "val3"}, {"key4": "val4", "key5": "val5", "key6": "val6"}},
  1402. Map: map[string]string{"key1": "val1", "key2": "val2", "key3": "val3"},
  1403. MapStructs: map[string]*SliceStruct{"key1": {Name: "name1"}, "key2": {Name: "name2"}, "key3": {Name: "name3"}},
  1404. MapMap: map[string]map[string]string{"key1": {"key1-1": "val1"}, "key2": {"key2-1": "val2"}, "key3": {"key3-1": "val3"}},
  1405. MapMapStruct: map[string]map[string]*SliceStruct{"key1": {"key1-1": {Name: "name1"}}, "key2": {"key2-1": {Name: "name2"}}, "key3": {"key3-1": {Name: "name3"}}},
  1406. MapSlice: map[string][]string{"key1": {"1", "2", "3"}, "key2": {"4", "5", "6"}, "key3": {"7", "8", "9"}},
  1407. }
  1408. test = &Test{
  1409. Inner: inner,
  1410. CreatedAt: nil,
  1411. }
  1412. val = reflect.ValueOf(test)
  1413. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.SliceStructs[2]")
  1414. Equal(t, ok, true)
  1415. Equal(t, kind, reflect.Ptr)
  1416. Equal(t, current.String(), "<*validator.SliceStruct Value>")
  1417. Equal(t, current.IsNil(), true)
  1418. current, kind, ok = v.getStructFieldOKInternal(val, "Inner.SliceStructs[2].Name")
  1419. Equal(t, ok, false)
  1420. Equal(t, kind, reflect.Ptr)
  1421. Equal(t, current.String(), "<*validator.SliceStruct Value>")
  1422. Equal(t, current.IsNil(), true)
  1423. PanicMatches(t, func() { v.getStructFieldOKInternal(reflect.ValueOf(1), "crazyinput") }, "Invalid field namespace")
  1424. }
  1425. func TestExistsValidation(t *testing.T) {
  1426. jsonText := "{ \"truthiness2\": true }"
  1427. type Thing struct {
  1428. Truthiness *bool `json:"truthiness" validate:"required"`
  1429. }
  1430. var ting Thing
  1431. err := json.Unmarshal([]byte(jsonText), &ting)
  1432. Equal(t, err, nil)
  1433. NotEqual(t, ting, nil)
  1434. Equal(t, ting.Truthiness, nil)
  1435. validate := New()
  1436. errs := validate.Struct(ting)
  1437. NotEqual(t, errs, nil)
  1438. AssertError(t, errs, "Thing.Truthiness", "Thing.Truthiness", "Truthiness", "Truthiness", "required")
  1439. jsonText = "{ \"truthiness\": true }"
  1440. err = json.Unmarshal([]byte(jsonText), &ting)
  1441. Equal(t, err, nil)
  1442. NotEqual(t, ting, nil)
  1443. Equal(t, ting.Truthiness, true)
  1444. errs = validate.Struct(ting)
  1445. Equal(t, errs, nil)
  1446. }
  1447. func TestSQLValue2Validation(t *testing.T) {
  1448. validate := New()
  1449. validate.RegisterCustomTypeFunc(ValidateValuerType, valuer{}, (*driver.Valuer)(nil), sql.NullString{}, sql.NullInt64{}, sql.NullBool{}, sql.NullFloat64{})
  1450. validate.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{})
  1451. validate.RegisterCustomTypeFunc(OverrideIntTypeForSomeReason, 1)
  1452. val := valuer{
  1453. Name: "",
  1454. }
  1455. errs := validate.Var(val, "required")
  1456. NotEqual(t, errs, nil)
  1457. AssertError(t, errs, "", "", "", "", "required")
  1458. val.Name = "Valid Name"
  1459. errs = validate.VarCtx(context.Background(), val, "required")
  1460. Equal(t, errs, nil)
  1461. val.Name = "errorme"
  1462. PanicMatches(t, func() { _ = validate.Var(val, "required") }, "SQL Driver Valuer error: some kind of error")
  1463. myVal := valuer{
  1464. Name: "",
  1465. }
  1466. errs = validate.Var(myVal, "required")
  1467. NotEqual(t, errs, nil)
  1468. AssertError(t, errs, "", "", "", "", "required")
  1469. cust := MadeUpCustomType{
  1470. FirstName: "Joey",
  1471. LastName: "Bloggs",
  1472. }
  1473. c := CustomMadeUpStruct{MadeUp: cust, OverriddenInt: 2}
  1474. errs = validate.Struct(c)
  1475. Equal(t, errs, nil)
  1476. c.MadeUp.FirstName = ""
  1477. c.OverriddenInt = 1
  1478. errs = validate.Struct(c)
  1479. NotEqual(t, errs, nil)
  1480. Equal(t, len(errs.(ValidationErrors)), 2)
  1481. AssertError(t, errs, "CustomMadeUpStruct.MadeUp", "CustomMadeUpStruct.MadeUp", "MadeUp", "MadeUp", "required")
  1482. AssertError(t, errs, "CustomMadeUpStruct.OverriddenInt", "CustomMadeUpStruct.OverriddenInt", "OverriddenInt", "OverriddenInt", "gt")
  1483. }
  1484. func TestSQLValueValidation(t *testing.T) {
  1485. validate := New()
  1486. validate.RegisterCustomTypeFunc(ValidateValuerType, (*driver.Valuer)(nil), valuer{})
  1487. validate.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{})
  1488. validate.RegisterCustomTypeFunc(OverrideIntTypeForSomeReason, 1)
  1489. val := valuer{
  1490. Name: "",
  1491. }
  1492. errs := validate.Var(val, "required")
  1493. NotEqual(t, errs, nil)
  1494. AssertError(t, errs, "", "", "", "", "required")
  1495. val.Name = "Valid Name"
  1496. errs = validate.Var(val, "required")
  1497. Equal(t, errs, nil)
  1498. val.Name = "errorme"
  1499. PanicMatches(t, func() { errs = validate.Var(val, "required") }, "SQL Driver Valuer error: some kind of error")
  1500. myVal := valuer{
  1501. Name: "",
  1502. }
  1503. errs = validate.Var(myVal, "required")
  1504. NotEqual(t, errs, nil)
  1505. AssertError(t, errs, "", "", "", "", "required")
  1506. cust := MadeUpCustomType{
  1507. FirstName: "Joey",
  1508. LastName: "Bloggs",
  1509. }
  1510. c := CustomMadeUpStruct{MadeUp: cust, OverriddenInt: 2}
  1511. errs = validate.Struct(c)
  1512. Equal(t, errs, nil)
  1513. c.MadeUp.FirstName = ""
  1514. c.OverriddenInt = 1
  1515. errs = validate.Struct(c)
  1516. NotEqual(t, errs, nil)
  1517. Equal(t, len(errs.(ValidationErrors)), 2)
  1518. AssertError(t, errs, "CustomMadeUpStruct.MadeUp", "CustomMadeUpStruct.MadeUp", "MadeUp", "MadeUp", "required")
  1519. AssertError(t, errs, "CustomMadeUpStruct.OverriddenInt", "CustomMadeUpStruct.OverriddenInt", "OverriddenInt", "OverriddenInt", "gt")
  1520. }
  1521. func TestMACValidation(t *testing.T) {
  1522. tests := []struct {
  1523. param string
  1524. expected bool
  1525. }{
  1526. {"3D:F2:C9:A6:B3:4F", true},
  1527. {"3D-F2-C9-A6-B3:4F", false},
  1528. {"123", false},
  1529. {"", false},
  1530. {"abacaba", false},
  1531. {"00:25:96:FF:FE:12:34:56", true},
  1532. {"0025:96FF:FE12:3456", false},
  1533. }
  1534. validate := New()
  1535. for i, test := range tests {
  1536. errs := validate.Var(test.param, "mac")
  1537. if test.expected {
  1538. if !IsEqual(errs, nil) {
  1539. t.Fatalf("Index: %d mac failed Error: %s", i, errs)
  1540. }
  1541. } else {
  1542. if IsEqual(errs, nil) {
  1543. t.Fatalf("Index: %d mac failed Error: %s", i, errs)
  1544. } else {
  1545. val := getError(errs, "", "")
  1546. if val.Tag() != "mac" {
  1547. t.Fatalf("Index: %d mac failed Error: %s", i, errs)
  1548. }
  1549. }
  1550. }
  1551. }
  1552. }
  1553. func TestIPValidation(t *testing.T) {
  1554. tests := []struct {
  1555. param string
  1556. expected bool
  1557. }{
  1558. {"", false},
  1559. {"10.0.0.1", true},
  1560. {"172.16.0.1", true},
  1561. {"192.168.0.1", true},
  1562. {"192.168.255.254", true},
  1563. {"192.168.255.256", false},
  1564. {"172.16.255.254", true},
  1565. {"172.16.256.255", false},
  1566. {"2001:cdba:0000:0000:0000:0000:3257:9652", true},
  1567. {"2001:cdba:0:0:0:0:3257:9652", true},
  1568. {"2001:cdba::3257:9652", true},
  1569. }
  1570. validate := New()
  1571. for i, test := range tests {
  1572. errs := validate.Var(test.param, "ip")
  1573. if test.expected {
  1574. if !IsEqual(errs, nil) {
  1575. t.Fatalf("Index: %d ip failed Error: %s", i, errs)
  1576. }
  1577. } else {
  1578. if IsEqual(errs, nil) {
  1579. t.Fatalf("Index: %d ip failed Error: %s", i, errs)
  1580. } else {
  1581. val := getError(errs, "", "")
  1582. if val.Tag() != "ip" {
  1583. t.Fatalf("Index: %d ip failed Error: %s", i, errs)
  1584. }
  1585. }
  1586. }
  1587. }
  1588. }
  1589. func TestIPv6Validation(t *testing.T) {
  1590. tests := []struct {
  1591. param string
  1592. expected bool
  1593. }{
  1594. {"10.0.0.1", false},
  1595. {"172.16.0.1", false},
  1596. {"192.168.0.1", false},
  1597. {"192.168.255.254", false},
  1598. {"192.168.255.256", false},
  1599. {"172.16.255.254", false},
  1600. {"172.16.256.255", false},
  1601. {"2001:cdba:0000:0000:0000:0000:3257:9652", true},
  1602. {"2001:cdba:0:0:0:0:3257:9652", true},
  1603. {"2001:cdba::3257:9652", true},
  1604. }
  1605. validate := New()
  1606. for i, test := range tests {
  1607. errs := validate.Var(test.param, "ipv6")
  1608. if test.expected {
  1609. if !IsEqual(errs, nil) {
  1610. t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
  1611. }
  1612. } else {
  1613. if IsEqual(errs, nil) {
  1614. t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
  1615. } else {
  1616. val := getError(errs, "", "")
  1617. if val.Tag() != "ipv6" {
  1618. t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
  1619. }
  1620. }
  1621. }
  1622. }
  1623. }
  1624. func TestIPv4Validation(t *testing.T) {
  1625. tests := []struct {
  1626. param string
  1627. expected bool
  1628. }{
  1629. {"10.0.0.1", true},
  1630. {"172.16.0.1", true},
  1631. {"192.168.0.1", true},
  1632. {"192.168.255.254", true},
  1633. {"192.168.255.256", false},
  1634. {"172.16.255.254", true},
  1635. {"172.16.256.255", false},
  1636. {"2001:cdba:0000:0000:0000:0000:3257:9652", false},
  1637. {"2001:cdba:0:0:0:0:3257:9652", false},
  1638. {"2001:cdba::3257:9652", false},
  1639. }
  1640. validate := New()
  1641. for i, test := range tests {
  1642. errs := validate.Var(test.param, "ipv4")
  1643. if test.expected {
  1644. if !IsEqual(errs, nil) {
  1645. t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
  1646. }
  1647. } else {
  1648. if IsEqual(errs, nil) {
  1649. t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
  1650. } else {
  1651. val := getError(errs, "", "")
  1652. if val.Tag() != "ipv4" {
  1653. t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
  1654. }
  1655. }
  1656. }
  1657. }
  1658. }
  1659. func TestCIDRValidation(t *testing.T) {
  1660. tests := []struct {
  1661. param string
  1662. expected bool
  1663. }{
  1664. {"10.0.0.0/0", true},
  1665. {"10.0.0.1/8", true},
  1666. {"172.16.0.1/16", true},
  1667. {"192.168.0.1/24", true},
  1668. {"192.168.255.254/24", true},
  1669. {"192.168.255.254/48", false},
  1670. {"192.168.255.256/24", false},
  1671. {"172.16.255.254/16", true},
  1672. {"172.16.256.255/16", false},
  1673. {"2001:cdba:0000:0000:0000:0000:3257:9652/64", true},
  1674. {"2001:cdba:0000:0000:0000:0000:3257:9652/256", false},
  1675. {"2001:cdba:0:0:0:0:3257:9652/32", true},
  1676. {"2001:cdba::3257:9652/16", true},
  1677. }
  1678. validate := New()
  1679. for i, test := range tests {
  1680. errs := validate.Var(test.param, "cidr")
  1681. if test.expected {
  1682. if !IsEqual(errs, nil) {
  1683. t.Fatalf("Index: %d cidr failed Error: %s", i, errs)
  1684. }
  1685. } else {
  1686. if IsEqual(errs, nil) {
  1687. t.Fatalf("Index: %d cidr failed Error: %s", i, errs)
  1688. } else {
  1689. val := getError(errs, "", "")
  1690. if val.Tag() != "cidr" {
  1691. t.Fatalf("Index: %d cidr failed Error: %s", i, errs)
  1692. }
  1693. }
  1694. }
  1695. }
  1696. }
  1697. func TestCIDRv6Validation(t *testing.T) {
  1698. tests := []struct {
  1699. param string
  1700. expected bool
  1701. }{
  1702. {"10.0.0.0/0", false},
  1703. {"10.0.0.1/8", false},
  1704. {"172.16.0.1/16", false},
  1705. {"192.168.0.1/24", false},
  1706. {"192.168.255.254/24", false},
  1707. {"192.168.255.254/48", false},
  1708. {"192.168.255.256/24", false},
  1709. {"172.16.255.254/16", false},
  1710. {"172.16.256.255/16", false},
  1711. {"2001:cdba:0000:0000:0000:0000:3257:9652/64", true},
  1712. {"2001:cdba:0000:0000:0000:0000:3257:9652/256", false},
  1713. {"2001:cdba:0:0:0:0:3257:9652/32", true},
  1714. {"2001:cdba::3257:9652/16", true},
  1715. }
  1716. validate := New()
  1717. for i, test := range tests {
  1718. errs := validate.Var(test.param, "cidrv6")
  1719. if test.expected {
  1720. if !IsEqual(errs, nil) {
  1721. t.Fatalf("Index: %d cidrv6 failed Error: %s", i, errs)
  1722. }
  1723. } else {
  1724. if IsEqual(errs, nil) {
  1725. t.Fatalf("Index: %d cidrv6 failed Error: %s", i, errs)
  1726. } else {
  1727. val := getError(errs, "", "")
  1728. if val.Tag() != "cidrv6" {
  1729. t.Fatalf("Index: %d cidrv6 failed Error: %s", i, errs)
  1730. }
  1731. }
  1732. }
  1733. }
  1734. }
  1735. func TestCIDRv4Validation(t *testing.T) {
  1736. tests := []struct {
  1737. param string
  1738. expected bool
  1739. }{
  1740. {"10.0.0.0/0", true},
  1741. {"10.0.0.1/8", true},
  1742. {"172.16.0.1/16", true},
  1743. {"192.168.0.1/24", true},
  1744. {"192.168.255.254/24", true},
  1745. {"192.168.255.254/48", false},
  1746. {"192.168.255.256/24", false},
  1747. {"172.16.255.254/16", true},
  1748. {"172.16.256.255/16", false},
  1749. {"2001:cdba:0000:0000:0000:0000:3257:9652/64", false},
  1750. {"2001:cdba:0000:0000:0000:0000:3257:9652/256", false},
  1751. {"2001:cdba:0:0:0:0:3257:9652/32", false},
  1752. {"2001:cdba::3257:9652/16", false},
  1753. }
  1754. validate := New()
  1755. for i, test := range tests {
  1756. errs := validate.Var(test.param, "cidrv4")
  1757. if test.expected {
  1758. if !IsEqual(errs, nil) {
  1759. t.Fatalf("Index: %d cidrv4 failed Error: %s", i, errs)
  1760. }
  1761. } else {
  1762. if IsEqual(errs, nil) {
  1763. t.Fatalf("Index: %d cidrv4 failed Error: %s", i, errs)
  1764. } else {
  1765. val := getError(errs, "", "")
  1766. if val.Tag() != "cidrv4" {
  1767. t.Fatalf("Index: %d cidrv4 failed Error: %s", i, errs)
  1768. }
  1769. }
  1770. }
  1771. }
  1772. }
  1773. func TestTCPAddrValidation(t *testing.T) {
  1774. tests := []struct {
  1775. param string
  1776. expected bool
  1777. }{
  1778. {"", false},
  1779. {":80", false},
  1780. {"127.0.0.1:80", true},
  1781. {"[::1]:80", true},
  1782. {"256.0.0.0:1", false},
  1783. {"[::1]", false},
  1784. }
  1785. validate := New()
  1786. for i, test := range tests {
  1787. errs := validate.Var(test.param, "tcp_addr")
  1788. if test.expected {
  1789. if !IsEqual(errs, nil) {
  1790. t.Fatalf("Index: %d tcp_addr failed Error: %s", i, errs)
  1791. }
  1792. } else {
  1793. if IsEqual(errs, nil) {
  1794. t.Fatalf("Index: %d tcp_addr failed Error: %s", i, errs)
  1795. } else {
  1796. val := getError(errs, "", "")
  1797. if val.Tag() != "tcp_addr" {
  1798. t.Fatalf("Index: %d tcp_addr failed Error: %s", i, errs)
  1799. }
  1800. }
  1801. }
  1802. }
  1803. }
  1804. func TestTCP6AddrValidation(t *testing.T) {
  1805. tests := []struct {
  1806. param string
  1807. expected bool
  1808. }{
  1809. {"", false},
  1810. {":80", false},
  1811. {"127.0.0.1:80", false},
  1812. {"[::1]:80", true},
  1813. {"256.0.0.0:1", false},
  1814. {"[::1]", false},
  1815. }
  1816. validate := New()
  1817. for i, test := range tests {
  1818. errs := validate.Var(test.param, "tcp6_addr")
  1819. if test.expected {
  1820. if !IsEqual(errs, nil) {
  1821. t.Fatalf("Index: %d tcp6_addr failed Error: %s", i, errs)
  1822. }
  1823. } else {
  1824. if IsEqual(errs, nil) {
  1825. t.Fatalf("Index: %d tcp6_addr failed Error: %s", i, errs)
  1826. } else {
  1827. val := getError(errs, "", "")
  1828. if val.Tag() != "tcp6_addr" {
  1829. t.Fatalf("Index: %d tcp6_addr failed Error: %s", i, errs)
  1830. }
  1831. }
  1832. }
  1833. }
  1834. }
  1835. func TestTCP4AddrValidation(t *testing.T) {
  1836. tests := []struct {
  1837. param string
  1838. expected bool
  1839. }{
  1840. {"", false},
  1841. {":80", false},
  1842. {"127.0.0.1:80", true},
  1843. {"[::1]:80", false}, // https://github.com/golang/go/issues/14037
  1844. {"256.0.0.0:1", false},
  1845. {"[::1]", false},
  1846. }
  1847. validate := New()
  1848. for i, test := range tests {
  1849. errs := validate.Var(test.param, "tcp4_addr")
  1850. if test.expected {
  1851. if !IsEqual(errs, nil) {
  1852. t.Fatalf("Index: %d tcp4_addr failed Error: %s", i, errs)
  1853. }
  1854. } else {
  1855. if IsEqual(errs, nil) {
  1856. t.Log(test.param, IsEqual(errs, nil))
  1857. t.Fatalf("Index: %d tcp4_addr failed Error: %s", i, errs)
  1858. } else {
  1859. val := getError(errs, "", "")
  1860. if val.Tag() != "tcp4_addr" {
  1861. t.Fatalf("Index: %d tcp4_addr failed Error: %s", i, errs)
  1862. }
  1863. }
  1864. }
  1865. }
  1866. }
  1867. func TestUDPAddrValidation(t *testing.T) {
  1868. tests := []struct {
  1869. param string
  1870. expected bool
  1871. }{
  1872. {"", false},
  1873. {":80", false},
  1874. {"127.0.0.1:80", true},
  1875. {"[::1]:80", true},
  1876. {"256.0.0.0:1", false},
  1877. {"[::1]", false},
  1878. }
  1879. validate := New()
  1880. for i, test := range tests {
  1881. errs := validate.Var(test.param, "udp_addr")
  1882. if test.expected {
  1883. if !IsEqual(errs, nil) {
  1884. t.Fatalf("Index: %d udp_addr failed Error: %s", i, errs)
  1885. }
  1886. } else {
  1887. if IsEqual(errs, nil) {
  1888. t.Fatalf("Index: %d udp_addr failed Error: %s", i, errs)
  1889. } else {
  1890. val := getError(errs, "", "")
  1891. if val.Tag() != "udp_addr" {
  1892. t.Fatalf("Index: %d udp_addr failed Error: %s", i, errs)
  1893. }
  1894. }
  1895. }
  1896. }
  1897. }
  1898. func TestUDP6AddrValidation(t *testing.T) {
  1899. tests := []struct {
  1900. param string
  1901. expected bool
  1902. }{
  1903. {"", false},
  1904. {":80", false},
  1905. {"127.0.0.1:80", false},
  1906. {"[::1]:80", true},
  1907. {"256.0.0.0:1", false},
  1908. {"[::1]", false},
  1909. }
  1910. validate := New()
  1911. for i, test := range tests {
  1912. errs := validate.Var(test.param, "udp6_addr")
  1913. if test.expected {
  1914. if !IsEqual(errs, nil) {
  1915. t.Fatalf("Index: %d udp6_addr failed Error: %s", i, errs)
  1916. }
  1917. } else {
  1918. if IsEqual(errs, nil) {
  1919. t.Fatalf("Index: %d udp6_addr failed Error: %s", i, errs)
  1920. } else {
  1921. val := getError(errs, "", "")
  1922. if val.Tag() != "udp6_addr" {
  1923. t.Fatalf("Index: %d udp6_addr failed Error: %s", i, errs)
  1924. }
  1925. }
  1926. }
  1927. }
  1928. }
  1929. func TestUDP4AddrValidation(t *testing.T) {
  1930. tests := []struct {
  1931. param string
  1932. expected bool
  1933. }{
  1934. {"", false},
  1935. {":80", false},
  1936. {"127.0.0.1:80", true},
  1937. {"[::1]:80", false}, // https://github.com/golang/go/issues/14037
  1938. {"256.0.0.0:1", false},
  1939. {"[::1]", false},
  1940. }
  1941. validate := New()
  1942. for i, test := range tests {
  1943. errs := validate.Var(test.param, "udp4_addr")
  1944. if test.expected {
  1945. if !IsEqual(errs, nil) {
  1946. t.Fatalf("Index: %d udp4_addr failed Error: %s", i, errs)
  1947. }
  1948. } else {
  1949. if IsEqual(errs, nil) {
  1950. t.Log(test.param, IsEqual(errs, nil))
  1951. t.Fatalf("Index: %d udp4_addr failed Error: %s", i, errs)
  1952. } else {
  1953. val := getError(errs, "", "")
  1954. if val.Tag() != "udp4_addr" {
  1955. t.Fatalf("Index: %d udp4_addr failed Error: %s", i, errs)
  1956. }
  1957. }
  1958. }
  1959. }
  1960. }
  1961. func TestIPAddrValidation(t *testing.T) {
  1962. tests := []struct {
  1963. param string
  1964. expected bool
  1965. }{
  1966. {"", false},
  1967. {"127.0.0.1", true},
  1968. {"127.0.0.1:80", false},
  1969. {"::1", true},
  1970. {"256.0.0.0", false},
  1971. {"localhost", false},
  1972. }
  1973. validate := New()
  1974. for i, test := range tests {
  1975. errs := validate.Var(test.param, "ip_addr")
  1976. if test.expected {
  1977. if !IsEqual(errs, nil) {
  1978. t.Fatalf("Index: %d ip_addr failed Error: %s", i, errs)
  1979. }
  1980. } else {
  1981. if IsEqual(errs, nil) {
  1982. t.Fatalf("Index: %d ip_addr failed Error: %s", i, errs)
  1983. } else {
  1984. val := getError(errs, "", "")
  1985. if val.Tag() != "ip_addr" {
  1986. t.Fatalf("Index: %d ip_addr failed Error: %s", i, errs)
  1987. }
  1988. }
  1989. }
  1990. }
  1991. }
  1992. func TestIP6AddrValidation(t *testing.T) {
  1993. tests := []struct {
  1994. param string
  1995. expected bool
  1996. }{
  1997. {"", false},
  1998. {"127.0.0.1", false}, // https://github.com/golang/go/issues/14037
  1999. {"127.0.0.1:80", false},
  2000. {"::1", true},
  2001. {"0:0:0:0:0:0:0:1", true},
  2002. {"256.0.0.0", false},
  2003. }
  2004. validate := New()
  2005. for i, test := range tests {
  2006. errs := validate.Var(test.param, "ip6_addr")
  2007. if test.expected {
  2008. if !IsEqual(errs, nil) {
  2009. t.Fatalf("Index: %d ip6_addr failed Error: %s", i, errs)
  2010. }
  2011. } else {
  2012. if IsEqual(errs, nil) {
  2013. t.Fatalf("Index: %d ip6_addr failed Error: %s", i, errs)
  2014. } else {
  2015. val := getError(errs, "", "")
  2016. if val.Tag() != "ip6_addr" {
  2017. t.Fatalf("Index: %d ip6_addr failed Error: %s", i, errs)
  2018. }
  2019. }
  2020. }
  2021. }
  2022. }
  2023. func TestIP4AddrValidation(t *testing.T) {
  2024. tests := []struct {
  2025. param string
  2026. expected bool
  2027. }{
  2028. {"", false},
  2029. {"127.0.0.1", true},
  2030. {"127.0.0.1:80", false},
  2031. {"::1", false}, // https://github.com/golang/go/issues/14037
  2032. {"256.0.0.0", false},
  2033. {"localhost", false},
  2034. }
  2035. validate := New()
  2036. for i, test := range tests {
  2037. errs := validate.Var(test.param, "ip4_addr")
  2038. if test.expected {
  2039. if !IsEqual(errs, nil) {
  2040. t.Fatalf("Index: %d ip4_addr failed Error: %s", i, errs)
  2041. }
  2042. } else {
  2043. if IsEqual(errs, nil) {
  2044. t.Log(test.param, IsEqual(errs, nil))
  2045. t.Fatalf("Index: %d ip4_addr failed Error: %s", i, errs)
  2046. } else {
  2047. val := getError(errs, "", "")
  2048. if val.Tag() != "ip4_addr" {
  2049. t.Fatalf("Index: %d ip4_addr failed Error: %s", i, errs)
  2050. }
  2051. }
  2052. }
  2053. }
  2054. }
  2055. func TestUnixAddrValidation(t *testing.T) {
  2056. tests := []struct {
  2057. param string
  2058. expected bool
  2059. }{
  2060. {"", true},
  2061. {"v.sock", true},
  2062. }
  2063. validate := New()
  2064. for i, test := range tests {
  2065. errs := validate.Var(test.param, "unix_addr")
  2066. if test.expected {
  2067. if !IsEqual(errs, nil) {
  2068. t.Fatalf("Index: %d unix_addr failed Error: %s", i, errs)
  2069. }
  2070. } else {
  2071. if IsEqual(errs, nil) {
  2072. t.Log(test.param, IsEqual(errs, nil))
  2073. t.Fatalf("Index: %d unix_addr failed Error: %s", i, errs)
  2074. } else {
  2075. val := getError(errs, "", "")
  2076. if val.Tag() != "unix_addr" {
  2077. t.Fatalf("Index: %d unix_addr failed Error: %s", i, errs)
  2078. }
  2079. }
  2080. }
  2081. }
  2082. }
  2083. func TestSliceMapArrayChanFuncPtrInterfaceRequiredValidation(t *testing.T) {
  2084. validate := New()
  2085. var m map[string]string
  2086. errs := validate.Var(m, "required")
  2087. NotEqual(t, errs, nil)
  2088. AssertError(t, errs, "", "", "", "", "required")
  2089. m = map[string]string{}
  2090. errs = validate.Var(m, "required")
  2091. Equal(t, errs, nil)
  2092. var arr [5]string
  2093. errs = validate.Var(arr, "required")
  2094. NotEqual(t, errs, nil)
  2095. AssertError(t, errs, "", "", "", "", "required")
  2096. arr[0] = "ok"
  2097. errs = validate.Var(arr, "required")
  2098. Equal(t, errs, nil)
  2099. var s []string
  2100. errs = validate.Var(s, "required")
  2101. NotEqual(t, errs, nil)
  2102. AssertError(t, errs, "", "", "", "", "required")
  2103. s = []string{}
  2104. errs = validate.Var(s, "required")
  2105. Equal(t, errs, nil)
  2106. var c chan string
  2107. errs = validate.Var(c, "required")
  2108. NotEqual(t, errs, nil)
  2109. AssertError(t, errs, "", "", "", "", "required")
  2110. c = make(chan string)
  2111. errs = validate.Var(c, "required")
  2112. Equal(t, errs, nil)
  2113. var tst *int
  2114. errs = validate.Var(tst, "required")
  2115. NotEqual(t, errs, nil)
  2116. AssertError(t, errs, "", "", "", "", "required")
  2117. one := 1
  2118. tst = &one
  2119. errs = validate.Var(tst, "required")
  2120. Equal(t, errs, nil)
  2121. var iface interface{}
  2122. errs = validate.Var(iface, "required")
  2123. NotEqual(t, errs, nil)
  2124. AssertError(t, errs, "", "", "", "", "required")
  2125. errs = validate.Var(iface, "omitempty,required")
  2126. Equal(t, errs, nil)
  2127. errs = validate.Var(iface, "")
  2128. Equal(t, errs, nil)
  2129. errs = validate.VarWithValue(nil, iface, "")
  2130. Equal(t, errs, nil)
  2131. var f func(string)
  2132. errs = validate.Var(f, "required")
  2133. NotEqual(t, errs, nil)
  2134. AssertError(t, errs, "", "", "", "", "required")
  2135. f = func(name string) {}
  2136. errs = validate.Var(f, "required")
  2137. Equal(t, errs, nil)
  2138. }
  2139. func TestDatePtrValidationIssueValidation(t *testing.T) {
  2140. type Test struct {
  2141. LastViewed *time.Time
  2142. Reminder *time.Time
  2143. }
  2144. test := &Test{}
  2145. validate := New()
  2146. errs := validate.Struct(test)
  2147. Equal(t, errs, nil)
  2148. }
  2149. func TestCommaAndPipeObfuscationValidation(t *testing.T) {
  2150. s := "My Name Is, |joeybloggs|"
  2151. validate := New()
  2152. errs := validate.Var(s, "excludesall=0x2C")
  2153. NotEqual(t, errs, nil)
  2154. AssertError(t, errs, "", "", "", "", "excludesall")
  2155. errs = validate.Var(s, "excludesall=0x7C")
  2156. NotEqual(t, errs, nil)
  2157. AssertError(t, errs, "", "", "", "", "excludesall")
  2158. }
  2159. func TestBadKeyValidation(t *testing.T) {
  2160. type Test struct {
  2161. Name string `validate:"required, "`
  2162. }
  2163. tst := &Test{
  2164. Name: "test",
  2165. }
  2166. validate := New()
  2167. PanicMatches(t, func() { _ = validate.Struct(tst) }, "Undefined validation function ' ' on field 'Name'")
  2168. type Test2 struct {
  2169. Name string `validate:"required,,len=2"`
  2170. }
  2171. tst2 := &Test2{
  2172. Name: "test",
  2173. }
  2174. PanicMatches(t, func() { _ = validate.Struct(tst2) }, "Invalid validation tag on field 'Name'")
  2175. }
  2176. func TestInterfaceErrValidation(t *testing.T) {
  2177. var v2 interface{} = 1
  2178. var v1 interface{} = v2
  2179. validate := New()
  2180. errs := validate.Var(v1, "len=1")
  2181. Equal(t, errs, nil)
  2182. errs = validate.Var(v2, "len=1")
  2183. Equal(t, errs, nil)
  2184. type ExternalCMD struct {
  2185. Userid string `json:"userid"`
  2186. Action uint32 `json:"action"`
  2187. Data interface{} `json:"data,omitempty" validate:"required"`
  2188. }
  2189. s := &ExternalCMD{
  2190. Userid: "123456",
  2191. Action: 10000,
  2192. // Data: 1,
  2193. }
  2194. errs = validate.Struct(s)
  2195. NotEqual(t, errs, nil)
  2196. Equal(t, len(errs.(ValidationErrors)), 1)
  2197. AssertError(t, errs, "ExternalCMD.Data", "ExternalCMD.Data", "Data", "Data", "required")
  2198. type ExternalCMD2 struct {
  2199. Userid string `json:"userid"`
  2200. Action uint32 `json:"action"`
  2201. Data interface{} `json:"data,omitempty" validate:"len=1"`
  2202. }
  2203. s2 := &ExternalCMD2{
  2204. Userid: "123456",
  2205. Action: 10000,
  2206. // Data: 1,
  2207. }
  2208. errs = validate.Struct(s2)
  2209. NotEqual(t, errs, nil)
  2210. Equal(t, len(errs.(ValidationErrors)), 1)
  2211. AssertError(t, errs, "ExternalCMD2.Data", "ExternalCMD2.Data", "Data", "Data", "len")
  2212. s3 := &ExternalCMD2{
  2213. Userid: "123456",
  2214. Action: 10000,
  2215. Data: 2,
  2216. }
  2217. errs = validate.Struct(s3)
  2218. NotEqual(t, errs, nil)
  2219. Equal(t, len(errs.(ValidationErrors)), 1)
  2220. AssertError(t, errs, "ExternalCMD2.Data", "ExternalCMD2.Data", "Data", "Data", "len")
  2221. type Inner struct {
  2222. Name string `validate:"required"`
  2223. }
  2224. inner := &Inner{
  2225. Name: "",
  2226. }
  2227. s4 := &ExternalCMD{
  2228. Userid: "123456",
  2229. Action: 10000,
  2230. Data: inner,
  2231. }
  2232. errs = validate.Struct(s4)
  2233. NotEqual(t, errs, nil)
  2234. Equal(t, len(errs.(ValidationErrors)), 1)
  2235. AssertError(t, errs, "ExternalCMD.Data.Name", "ExternalCMD.Data.Name", "Name", "Name", "required")
  2236. type TestMapStructPtr struct {
  2237. Errs map[int]interface{} `validate:"gt=0,dive,len=2"`
  2238. }
  2239. mip := map[int]interface{}{0: &Inner{"ok"}, 3: nil, 4: &Inner{"ok"}}
  2240. msp := &TestMapStructPtr{
  2241. Errs: mip,
  2242. }
  2243. errs = validate.Struct(msp)
  2244. NotEqual(t, errs, nil)
  2245. Equal(t, len(errs.(ValidationErrors)), 1)
  2246. AssertError(t, errs, "TestMapStructPtr.Errs[3]", "TestMapStructPtr.Errs[3]", "Errs[3]", "Errs[3]", "len")
  2247. type TestMultiDimensionalStructs struct {
  2248. Errs [][]interface{} `validate:"gt=0,dive,dive"`
  2249. }
  2250. var errStructArray [][]interface{}
  2251. errStructArray = append(errStructArray, []interface{}{&Inner{"ok"}, &Inner{""}, &Inner{""}})
  2252. errStructArray = append(errStructArray, []interface{}{&Inner{"ok"}, &Inner{""}, &Inner{""}})
  2253. tms := &TestMultiDimensionalStructs{
  2254. Errs: errStructArray,
  2255. }
  2256. errs = validate.Struct(tms)
  2257. NotEqual(t, errs, nil)
  2258. Equal(t, len(errs.(ValidationErrors)), 4)
  2259. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[0][1].Name", "TestMultiDimensionalStructs.Errs[0][1].Name", "Name", "Name", "required")
  2260. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[0][2].Name", "TestMultiDimensionalStructs.Errs[0][2].Name", "Name", "Name", "required")
  2261. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[1][1].Name", "TestMultiDimensionalStructs.Errs[1][1].Name", "Name", "Name", "required")
  2262. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[1][2].Name", "TestMultiDimensionalStructs.Errs[1][2].Name", "Name", "Name", "required")
  2263. type TestMultiDimensionalStructsPtr2 struct {
  2264. Errs [][]*Inner `validate:"gt=0,dive,dive,required"`
  2265. }
  2266. var errStructPtr2Array [][]*Inner
  2267. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, {""}})
  2268. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, {""}})
  2269. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, nil})
  2270. tmsp2 := &TestMultiDimensionalStructsPtr2{
  2271. Errs: errStructPtr2Array,
  2272. }
  2273. errs = validate.Struct(tmsp2)
  2274. NotEqual(t, errs, nil)
  2275. Equal(t, len(errs.(ValidationErrors)), 6)
  2276. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[0][1].Name", "TestMultiDimensionalStructsPtr2.Errs[0][1].Name", "Name", "Name", "required")
  2277. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[0][2].Name", "TestMultiDimensionalStructsPtr2.Errs[0][2].Name", "Name", "Name", "required")
  2278. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[1][1].Name", "TestMultiDimensionalStructsPtr2.Errs[1][1].Name", "Name", "Name", "required")
  2279. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[1][2].Name", "TestMultiDimensionalStructsPtr2.Errs[1][2].Name", "Name", "Name", "required")
  2280. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[2][1].Name", "TestMultiDimensionalStructsPtr2.Errs[2][1].Name", "Name", "Name", "required")
  2281. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[2][2]", "TestMultiDimensionalStructsPtr2.Errs[2][2]", "Errs[2][2]", "Errs[2][2]", "required")
  2282. m := map[int]interface{}{0: "ok", 3: "", 4: "ok"}
  2283. errs = validate.Var(m, "len=3,dive,len=2")
  2284. NotEqual(t, errs, nil)
  2285. Equal(t, len(errs.(ValidationErrors)), 1)
  2286. AssertError(t, errs, "[3]", "[3]", "[3]", "[3]", "len")
  2287. errs = validate.Var(m, "len=2,dive,required")
  2288. NotEqual(t, errs, nil)
  2289. Equal(t, len(errs.(ValidationErrors)), 1)
  2290. AssertError(t, errs, "", "", "", "", "len")
  2291. arr := []interface{}{"ok", "", "ok"}
  2292. errs = validate.Var(arr, "len=3,dive,len=2")
  2293. NotEqual(t, errs, nil)
  2294. Equal(t, len(errs.(ValidationErrors)), 1)
  2295. AssertError(t, errs, "[1]", "[1]", "[1]", "[1]", "len")
  2296. errs = validate.Var(arr, "len=2,dive,required")
  2297. NotEqual(t, errs, nil)
  2298. Equal(t, len(errs.(ValidationErrors)), 1)
  2299. AssertError(t, errs, "", "", "", "", "len")
  2300. type MyStruct struct {
  2301. A, B string
  2302. C interface{}
  2303. }
  2304. var a MyStruct
  2305. a.A = "value"
  2306. a.C = "nu"
  2307. errs = validate.Struct(a)
  2308. Equal(t, errs, nil)
  2309. }
  2310. func TestMapDiveValidation(t *testing.T) {
  2311. validate := New()
  2312. n := map[int]interface{}{0: nil}
  2313. errs := validate.Var(n, "omitempty,required")
  2314. Equal(t, errs, nil)
  2315. m := map[int]string{0: "ok", 3: "", 4: "ok"}
  2316. errs = validate.Var(m, "len=3,dive,required")
  2317. NotEqual(t, errs, nil)
  2318. Equal(t, len(errs.(ValidationErrors)), 1)
  2319. AssertError(t, errs, "[3]", "[3]", "[3]", "[3]", "required")
  2320. errs = validate.Var(m, "len=2,dive,required")
  2321. NotEqual(t, errs, nil)
  2322. Equal(t, len(errs.(ValidationErrors)), 1)
  2323. AssertError(t, errs, "", "", "", "", "len")
  2324. type Inner struct {
  2325. Name string `validate:"required"`
  2326. }
  2327. type TestMapStruct struct {
  2328. Errs map[int]Inner `validate:"gt=0,dive"`
  2329. }
  2330. mi := map[int]Inner{0: {"ok"}, 3: {""}, 4: {"ok"}}
  2331. ms := &TestMapStruct{
  2332. Errs: mi,
  2333. }
  2334. errs = validate.Struct(ms)
  2335. NotEqual(t, errs, nil)
  2336. Equal(t, len(errs.(ValidationErrors)), 1)
  2337. AssertError(t, errs, "TestMapStruct.Errs[3].Name", "TestMapStruct.Errs[3].Name", "Name", "Name", "required")
  2338. // for full test coverage
  2339. s := fmt.Sprint(errs.Error())
  2340. NotEqual(t, s, "")
  2341. type TestMapTimeStruct struct {
  2342. Errs map[int]*time.Time `validate:"gt=0,dive,required"`
  2343. }
  2344. t1 := time.Now().UTC()
  2345. mta := map[int]*time.Time{0: &t1, 3: nil, 4: nil}
  2346. mt := &TestMapTimeStruct{
  2347. Errs: mta,
  2348. }
  2349. errs = validate.Struct(mt)
  2350. NotEqual(t, errs, nil)
  2351. Equal(t, len(errs.(ValidationErrors)), 2)
  2352. AssertError(t, errs, "TestMapTimeStruct.Errs[3]", "TestMapTimeStruct.Errs[3]", "Errs[3]", "Errs[3]", "required")
  2353. AssertError(t, errs, "TestMapTimeStruct.Errs[4]", "TestMapTimeStruct.Errs[4]", "Errs[4]", "Errs[4]", "required")
  2354. type TestMapStructPtr struct {
  2355. Errs map[int]*Inner `validate:"gt=0,dive,required"`
  2356. }
  2357. mip := map[int]*Inner{0: {"ok"}, 3: nil, 4: {"ok"}}
  2358. msp := &TestMapStructPtr{
  2359. Errs: mip,
  2360. }
  2361. errs = validate.Struct(msp)
  2362. NotEqual(t, errs, nil)
  2363. Equal(t, len(errs.(ValidationErrors)), 1)
  2364. AssertError(t, errs, "TestMapStructPtr.Errs[3]", "TestMapStructPtr.Errs[3]", "Errs[3]", "Errs[3]", "required")
  2365. type TestMapStructPtr2 struct {
  2366. Errs map[int]*Inner `validate:"gt=0,dive,omitempty,required"`
  2367. }
  2368. mip2 := map[int]*Inner{0: {"ok"}, 3: nil, 4: {"ok"}}
  2369. msp2 := &TestMapStructPtr2{
  2370. Errs: mip2,
  2371. }
  2372. errs = validate.Struct(msp2)
  2373. Equal(t, errs, nil)
  2374. v2 := New()
  2375. v2.RegisterTagNameFunc(func(fld reflect.StructField) string {
  2376. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  2377. if name == "-" {
  2378. return ""
  2379. }
  2380. return name
  2381. })
  2382. type MapDiveJSONTest struct {
  2383. Map map[string]string `validate:"required,gte=1,dive,gte=1" json:"MyName"`
  2384. }
  2385. mdjt := &MapDiveJSONTest{
  2386. Map: map[string]string{
  2387. "Key1": "Value1",
  2388. "Key2": "",
  2389. },
  2390. }
  2391. err := v2.Struct(mdjt)
  2392. NotEqual(t, err, nil)
  2393. errs = err.(ValidationErrors)
  2394. fe := getError(errs, "MapDiveJSONTest.MyName[Key2]", "MapDiveJSONTest.Map[Key2]")
  2395. NotEqual(t, fe, nil)
  2396. Equal(t, fe.Tag(), "gte")
  2397. Equal(t, fe.ActualTag(), "gte")
  2398. Equal(t, fe.Field(), "MyName[Key2]")
  2399. Equal(t, fe.StructField(), "Map[Key2]")
  2400. }
  2401. func TestArrayDiveValidation(t *testing.T) {
  2402. validate := New()
  2403. arr := []string{"ok", "", "ok"}
  2404. errs := validate.Var(arr, "len=3,dive,required")
  2405. NotEqual(t, errs, nil)
  2406. Equal(t, len(errs.(ValidationErrors)), 1)
  2407. AssertError(t, errs, "[1]", "[1]", "[1]", "[1]", "required")
  2408. errs = validate.Var(arr, "len=2,dive,required")
  2409. NotEqual(t, errs, nil)
  2410. Equal(t, len(errs.(ValidationErrors)), 1)
  2411. AssertError(t, errs, "", "", "", "", "len")
  2412. type BadDive struct {
  2413. Name string `validate:"dive"`
  2414. }
  2415. bd := &BadDive{
  2416. Name: "TEST",
  2417. }
  2418. PanicMatches(t, func() { _ = validate.Struct(bd) }, "dive error! can't dive on a non slice or map")
  2419. type Test struct {
  2420. Errs []string `validate:"gt=0,dive,required"`
  2421. }
  2422. test := &Test{
  2423. Errs: []string{"ok", "", "ok"},
  2424. }
  2425. errs = validate.Struct(test)
  2426. NotEqual(t, errs, nil)
  2427. Equal(t, len(errs.(ValidationErrors)), 1)
  2428. AssertError(t, errs, "Test.Errs[1]", "Test.Errs[1]", "Errs[1]", "Errs[1]", "required")
  2429. test = &Test{
  2430. Errs: []string{"ok", "ok", ""},
  2431. }
  2432. errs = validate.Struct(test)
  2433. NotEqual(t, errs, nil)
  2434. Equal(t, len(errs.(ValidationErrors)), 1)
  2435. AssertError(t, errs, "Test.Errs[2]", "Test.Errs[2]", "Errs[2]", "Errs[2]", "required")
  2436. type TestMultiDimensional struct {
  2437. Errs [][]string `validate:"gt=0,dive,dive,required"`
  2438. }
  2439. var errArray [][]string
  2440. errArray = append(errArray, []string{"ok", "", ""})
  2441. errArray = append(errArray, []string{"ok", "", ""})
  2442. tm := &TestMultiDimensional{
  2443. Errs: errArray,
  2444. }
  2445. errs = validate.Struct(tm)
  2446. NotEqual(t, errs, nil)
  2447. Equal(t, len(errs.(ValidationErrors)), 4)
  2448. AssertError(t, errs, "TestMultiDimensional.Errs[0][1]", "TestMultiDimensional.Errs[0][1]", "Errs[0][1]", "Errs[0][1]", "required")
  2449. AssertError(t, errs, "TestMultiDimensional.Errs[0][2]", "TestMultiDimensional.Errs[0][2]", "Errs[0][2]", "Errs[0][2]", "required")
  2450. AssertError(t, errs, "TestMultiDimensional.Errs[1][1]", "TestMultiDimensional.Errs[1][1]", "Errs[1][1]", "Errs[1][1]", "required")
  2451. AssertError(t, errs, "TestMultiDimensional.Errs[1][2]", "TestMultiDimensional.Errs[1][2]", "Errs[1][2]", "Errs[1][2]", "required")
  2452. type Inner struct {
  2453. Name string `validate:"required"`
  2454. }
  2455. type TestMultiDimensionalStructs struct {
  2456. Errs [][]Inner `validate:"gt=0,dive,dive"`
  2457. }
  2458. var errStructArray [][]Inner
  2459. errStructArray = append(errStructArray, []Inner{{"ok"}, {""}, {""}})
  2460. errStructArray = append(errStructArray, []Inner{{"ok"}, {""}, {""}})
  2461. tms := &TestMultiDimensionalStructs{
  2462. Errs: errStructArray,
  2463. }
  2464. errs = validate.Struct(tms)
  2465. NotEqual(t, errs, nil)
  2466. Equal(t, len(errs.(ValidationErrors)), 4)
  2467. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[0][1].Name", "TestMultiDimensionalStructs.Errs[0][1].Name", "Name", "Name", "required")
  2468. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[0][2].Name", "TestMultiDimensionalStructs.Errs[0][2].Name", "Name", "Name", "required")
  2469. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[1][1].Name", "TestMultiDimensionalStructs.Errs[1][1].Name", "Name", "Name", "required")
  2470. AssertError(t, errs, "TestMultiDimensionalStructs.Errs[1][2].Name", "TestMultiDimensionalStructs.Errs[1][2].Name", "Name", "Name", "required")
  2471. type TestMultiDimensionalStructsPtr struct {
  2472. Errs [][]*Inner `validate:"gt=0,dive,dive"`
  2473. }
  2474. var errStructPtrArray [][]*Inner
  2475. errStructPtrArray = append(errStructPtrArray, []*Inner{{"ok"}, {""}, {""}})
  2476. errStructPtrArray = append(errStructPtrArray, []*Inner{{"ok"}, {""}, {""}})
  2477. errStructPtrArray = append(errStructPtrArray, []*Inner{{"ok"}, {""}, nil})
  2478. tmsp := &TestMultiDimensionalStructsPtr{
  2479. Errs: errStructPtrArray,
  2480. }
  2481. errs = validate.Struct(tmsp)
  2482. NotEqual(t, errs, nil)
  2483. Equal(t, len(errs.(ValidationErrors)), 5)
  2484. AssertError(t, errs, "TestMultiDimensionalStructsPtr.Errs[0][1].Name", "TestMultiDimensionalStructsPtr.Errs[0][1].Name", "Name", "Name", "required")
  2485. AssertError(t, errs, "TestMultiDimensionalStructsPtr.Errs[0][2].Name", "TestMultiDimensionalStructsPtr.Errs[0][2].Name", "Name", "Name", "required")
  2486. AssertError(t, errs, "TestMultiDimensionalStructsPtr.Errs[1][1].Name", "TestMultiDimensionalStructsPtr.Errs[1][1].Name", "Name", "Name", "required")
  2487. AssertError(t, errs, "TestMultiDimensionalStructsPtr.Errs[1][2].Name", "TestMultiDimensionalStructsPtr.Errs[1][2].Name", "Name", "Name", "required")
  2488. AssertError(t, errs, "TestMultiDimensionalStructsPtr.Errs[2][1].Name", "TestMultiDimensionalStructsPtr.Errs[2][1].Name", "Name", "Name", "required")
  2489. // for full test coverage
  2490. s := fmt.Sprint(errs.Error())
  2491. NotEqual(t, s, "")
  2492. type TestMultiDimensionalStructsPtr2 struct {
  2493. Errs [][]*Inner `validate:"gt=0,dive,dive,required"`
  2494. }
  2495. var errStructPtr2Array [][]*Inner
  2496. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, {""}})
  2497. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, {""}})
  2498. errStructPtr2Array = append(errStructPtr2Array, []*Inner{{"ok"}, {""}, nil})
  2499. tmsp2 := &TestMultiDimensionalStructsPtr2{
  2500. Errs: errStructPtr2Array,
  2501. }
  2502. errs = validate.Struct(tmsp2)
  2503. NotEqual(t, errs, nil)
  2504. Equal(t, len(errs.(ValidationErrors)), 6)
  2505. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[0][1].Name", "TestMultiDimensionalStructsPtr2.Errs[0][1].Name", "Name", "Name", "required")
  2506. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[0][2].Name", "TestMultiDimensionalStructsPtr2.Errs[0][2].Name", "Name", "Name", "required")
  2507. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[1][1].Name", "TestMultiDimensionalStructsPtr2.Errs[1][1].Name", "Name", "Name", "required")
  2508. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[1][2].Name", "TestMultiDimensionalStructsPtr2.Errs[1][2].Name", "Name", "Name", "required")
  2509. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[2][1].Name", "TestMultiDimensionalStructsPtr2.Errs[2][1].Name", "Name", "Name", "required")
  2510. AssertError(t, errs, "TestMultiDimensionalStructsPtr2.Errs[2][2]", "TestMultiDimensionalStructsPtr2.Errs[2][2]", "Errs[2][2]", "Errs[2][2]", "required")
  2511. type TestMultiDimensionalStructsPtr3 struct {
  2512. Errs [][]*Inner `validate:"gt=0,dive,dive,omitempty"`
  2513. }
  2514. var errStructPtr3Array [][]*Inner
  2515. errStructPtr3Array = append(errStructPtr3Array, []*Inner{{"ok"}, {""}, {""}})
  2516. errStructPtr3Array = append(errStructPtr3Array, []*Inner{{"ok"}, {""}, {""}})
  2517. errStructPtr3Array = append(errStructPtr3Array, []*Inner{{"ok"}, {""}, nil})
  2518. tmsp3 := &TestMultiDimensionalStructsPtr3{
  2519. Errs: errStructPtr3Array,
  2520. }
  2521. errs = validate.Struct(tmsp3)
  2522. NotEqual(t, errs, nil)
  2523. Equal(t, len(errs.(ValidationErrors)), 5)
  2524. AssertError(t, errs, "TestMultiDimensionalStructsPtr3.Errs[0][1].Name", "TestMultiDimensionalStructsPtr3.Errs[0][1].Name", "Name", "Name", "required")
  2525. AssertError(t, errs, "TestMultiDimensionalStructsPtr3.Errs[0][2].Name", "TestMultiDimensionalStructsPtr3.Errs[0][2].Name", "Name", "Name", "required")
  2526. AssertError(t, errs, "TestMultiDimensionalStructsPtr3.Errs[1][1].Name", "TestMultiDimensionalStructsPtr3.Errs[1][1].Name", "Name", "Name", "required")
  2527. AssertError(t, errs, "TestMultiDimensionalStructsPtr3.Errs[1][2].Name", "TestMultiDimensionalStructsPtr3.Errs[1][2].Name", "Name", "Name", "required")
  2528. AssertError(t, errs, "TestMultiDimensionalStructsPtr3.Errs[2][1].Name", "TestMultiDimensionalStructsPtr3.Errs[2][1].Name", "Name", "Name", "required")
  2529. type TestMultiDimensionalTimeTime struct {
  2530. Errs [][]*time.Time `validate:"gt=0,dive,dive,required"`
  2531. }
  2532. var errTimePtr3Array [][]*time.Time
  2533. t1 := time.Now().UTC()
  2534. t2 := time.Now().UTC()
  2535. t3 := time.Now().UTC().Add(time.Hour * 24)
  2536. errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, &t3})
  2537. errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, nil})
  2538. errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, nil, nil})
  2539. tmtp3 := &TestMultiDimensionalTimeTime{
  2540. Errs: errTimePtr3Array,
  2541. }
  2542. errs = validate.Struct(tmtp3)
  2543. NotEqual(t, errs, nil)
  2544. Equal(t, len(errs.(ValidationErrors)), 3)
  2545. AssertError(t, errs, "TestMultiDimensionalTimeTime.Errs[1][2]", "TestMultiDimensionalTimeTime.Errs[1][2]", "Errs[1][2]", "Errs[1][2]", "required")
  2546. AssertError(t, errs, "TestMultiDimensionalTimeTime.Errs[2][1]", "TestMultiDimensionalTimeTime.Errs[2][1]", "Errs[2][1]", "Errs[2][1]", "required")
  2547. AssertError(t, errs, "TestMultiDimensionalTimeTime.Errs[2][2]", "TestMultiDimensionalTimeTime.Errs[2][2]", "Errs[2][2]", "Errs[2][2]", "required")
  2548. type TestMultiDimensionalTimeTime2 struct {
  2549. Errs [][]*time.Time `validate:"gt=0,dive,dive,required"`
  2550. }
  2551. var errTimeArray [][]*time.Time
  2552. t1 = time.Now().UTC()
  2553. t2 = time.Now().UTC()
  2554. t3 = time.Now().UTC().Add(time.Hour * 24)
  2555. errTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, &t3})
  2556. errTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, nil})
  2557. errTimeArray = append(errTimeArray, []*time.Time{&t1, nil, nil})
  2558. tmtp := &TestMultiDimensionalTimeTime2{
  2559. Errs: errTimeArray,
  2560. }
  2561. errs = validate.Struct(tmtp)
  2562. NotEqual(t, errs, nil)
  2563. Equal(t, len(errs.(ValidationErrors)), 3)
  2564. AssertError(t, errs, "TestMultiDimensionalTimeTime2.Errs[1][2]", "TestMultiDimensionalTimeTime2.Errs[1][2]", "Errs[1][2]", "Errs[1][2]", "required")
  2565. AssertError(t, errs, "TestMultiDimensionalTimeTime2.Errs[2][1]", "TestMultiDimensionalTimeTime2.Errs[2][1]", "Errs[2][1]", "Errs[2][1]", "required")
  2566. AssertError(t, errs, "TestMultiDimensionalTimeTime2.Errs[2][2]", "TestMultiDimensionalTimeTime2.Errs[2][2]", "Errs[2][2]", "Errs[2][2]", "required")
  2567. }
  2568. func TestNilStructPointerValidation(t *testing.T) {
  2569. type Inner struct {
  2570. Data string
  2571. }
  2572. type Outer struct {
  2573. Inner *Inner `validate:"omitempty"`
  2574. }
  2575. inner := &Inner{
  2576. Data: "test",
  2577. }
  2578. outer := &Outer{
  2579. Inner: inner,
  2580. }
  2581. validate := New()
  2582. errs := validate.Struct(outer)
  2583. Equal(t, errs, nil)
  2584. outer = &Outer{
  2585. Inner: nil,
  2586. }
  2587. errs = validate.Struct(outer)
  2588. Equal(t, errs, nil)
  2589. type Inner2 struct {
  2590. Data string
  2591. }
  2592. type Outer2 struct {
  2593. Inner2 *Inner2 `validate:"required"`
  2594. }
  2595. inner2 := &Inner2{
  2596. Data: "test",
  2597. }
  2598. outer2 := &Outer2{
  2599. Inner2: inner2,
  2600. }
  2601. errs = validate.Struct(outer2)
  2602. Equal(t, errs, nil)
  2603. outer2 = &Outer2{
  2604. Inner2: nil,
  2605. }
  2606. errs = validate.Struct(outer2)
  2607. NotEqual(t, errs, nil)
  2608. AssertError(t, errs, "Outer2.Inner2", "Outer2.Inner2", "Inner2", "Inner2", "required")
  2609. type Inner3 struct {
  2610. Data string
  2611. }
  2612. type Outer3 struct {
  2613. Inner3 *Inner3
  2614. }
  2615. inner3 := &Inner3{
  2616. Data: "test",
  2617. }
  2618. outer3 := &Outer3{
  2619. Inner3: inner3,
  2620. }
  2621. errs = validate.Struct(outer3)
  2622. Equal(t, errs, nil)
  2623. type Inner4 struct {
  2624. Data string
  2625. }
  2626. type Outer4 struct {
  2627. Inner4 *Inner4 `validate:"-"`
  2628. }
  2629. inner4 := &Inner4{
  2630. Data: "test",
  2631. }
  2632. outer4 := &Outer4{
  2633. Inner4: inner4,
  2634. }
  2635. errs = validate.Struct(outer4)
  2636. Equal(t, errs, nil)
  2637. }
  2638. func TestSSNValidation(t *testing.T) {
  2639. tests := []struct {
  2640. param string
  2641. expected bool
  2642. }{
  2643. {"", false},
  2644. {"00-90-8787", false},
  2645. {"66690-76", false},
  2646. {"191 60 2869", true},
  2647. {"191-60-2869", true},
  2648. }
  2649. validate := New()
  2650. for i, test := range tests {
  2651. errs := validate.Var(test.param, "ssn")
  2652. if test.expected {
  2653. if !IsEqual(errs, nil) {
  2654. t.Fatalf("Index: %d SSN failed Error: %s", i, errs)
  2655. }
  2656. } else {
  2657. if IsEqual(errs, nil) {
  2658. t.Fatalf("Index: %d SSN failed Error: %s", i, errs)
  2659. } else {
  2660. val := getError(errs, "", "")
  2661. if val.Tag() != "ssn" {
  2662. t.Fatalf("Index: %d Latitude failed Error: %s", i, errs)
  2663. }
  2664. }
  2665. }
  2666. }
  2667. }
  2668. func TestLongitudeValidation(t *testing.T) {
  2669. tests := []struct {
  2670. param interface{}
  2671. expected bool
  2672. }{
  2673. {"", false},
  2674. {"-180.000", true},
  2675. {"180.1", false},
  2676. {"+73.234", true},
  2677. {"+382.3811", false},
  2678. {"23.11111111", true},
  2679. {uint(180), true},
  2680. {float32(-180.0), true},
  2681. {-180, true},
  2682. {180.1, false},
  2683. }
  2684. validate := New()
  2685. for i, test := range tests {
  2686. errs := validate.Var(test.param, "longitude")
  2687. if test.expected {
  2688. if !IsEqual(errs, nil) {
  2689. t.Fatalf("Index: %d Longitude failed Error: %s", i, errs)
  2690. }
  2691. } else {
  2692. if IsEqual(errs, nil) {
  2693. t.Fatalf("Index: %d Longitude failed Error: %s", i, errs)
  2694. } else {
  2695. val := getError(errs, "", "")
  2696. if val.Tag() != "longitude" {
  2697. t.Fatalf("Index: %d Longitude failed Error: %s", i, errs)
  2698. }
  2699. }
  2700. }
  2701. }
  2702. PanicMatches(t, func() { _ = validate.Var(true, "longitude") }, "Bad field type bool")
  2703. }
  2704. func TestLatitudeValidation(t *testing.T) {
  2705. tests := []struct {
  2706. param interface{}
  2707. expected bool
  2708. }{
  2709. {"", false},
  2710. {"-90.000", true},
  2711. {"+90", true},
  2712. {"47.1231231", true},
  2713. {"+99.9", false},
  2714. {"108", false},
  2715. {uint(90), true},
  2716. {float32(-90.0), true},
  2717. {-90, true},
  2718. {90.1, false},
  2719. }
  2720. validate := New()
  2721. for i, test := range tests {
  2722. errs := validate.Var(test.param, "latitude")
  2723. if test.expected {
  2724. if !IsEqual(errs, nil) {
  2725. t.Fatalf("Index: %d Latitude failed Error: %s", i, errs)
  2726. }
  2727. } else {
  2728. if IsEqual(errs, nil) {
  2729. t.Fatalf("Index: %d Latitude failed Error: %s", i, errs)
  2730. } else {
  2731. val := getError(errs, "", "")
  2732. if val.Tag() != "latitude" {
  2733. t.Fatalf("Index: %d Latitude failed Error: %s", i, errs)
  2734. }
  2735. }
  2736. }
  2737. }
  2738. PanicMatches(t, func() { _ = validate.Var(true, "latitude") }, "Bad field type bool")
  2739. }
  2740. func TestDataURIValidation(t *testing.T) {
  2741. tests := []struct {
  2742. param string
  2743. expected bool
  2744. }{
  2745. {"data:image/png;base64,TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=", true},
  2746. {"data:text/plain;base64,Vml2YW11cyBmZXJtZW50dW0gc2VtcGVyIHBvcnRhLg==", true},
  2747. {"image/gif;base64,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==", false},
  2748. {"data:image/gif;base64,MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMPNS1Ufof9EW/M98FNw" +
  2749. "UAKrwflsqVxaxQjBQnHQmiI7Vac40t8x7pIb8gLGV6wL7sBTJiPovJ0V7y7oc0Ye" +
  2750. "rhKh0Rm4skP2z/jHwwZICgGzBvA0rH8xlhUiTvcwDCJ0kc+fh35hNt8srZQM4619" +
  2751. "FTgB66Xmp4EtVyhpQV+t02g6NzK72oZI0vnAvqhpkxLeLiMCyrI416wHm5Tkukhx" +
  2752. "QmcL2a6hNOyu0ixX/x2kSFXApEnVrJ+/IxGyfyw8kf4N2IZpW5nEP847lpfj0SZZ" +
  2753. "Fwrd1mnfnDbYohX2zRptLy2ZUn06Qo9pkG5ntvFEPo9bfZeULtjYzIl6K8gJ2uGZ" + "HQIDAQAB", true},
  2754. {"data:image/png;base64,12345", false},
  2755. {"", false},
  2756. {"data:text,:;base85,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==", false},
  2757. }
  2758. validate := New()
  2759. for i, test := range tests {
  2760. errs := validate.Var(test.param, "datauri")
  2761. if test.expected {
  2762. if !IsEqual(errs, nil) {
  2763. t.Fatalf("Index: %d DataURI failed Error: %s", i, errs)
  2764. }
  2765. } else {
  2766. if IsEqual(errs, nil) {
  2767. t.Fatalf("Index: %d DataURI failed Error: %s", i, errs)
  2768. } else {
  2769. val := getError(errs, "", "")
  2770. if val.Tag() != "datauri" {
  2771. t.Fatalf("Index: %d DataURI failed Error: %s", i, errs)
  2772. }
  2773. }
  2774. }
  2775. }
  2776. }
  2777. func TestMultibyteValidation(t *testing.T) {
  2778. tests := []struct {
  2779. param string
  2780. expected bool
  2781. }{
  2782. {"", true},
  2783. {"abc", false},
  2784. {"123", false},
  2785. {"<>@;.-=", false},
  2786. {"ひらがな・カタカナ、.漢字", true},
  2787. {"あいうえお foobar", true},
  2788. {"test@example.com", true},
  2789. {"test@example.com", true},
  2790. {"1234abcDExyz", true},
  2791. {"カタカナ", true},
  2792. }
  2793. validate := New()
  2794. for i, test := range tests {
  2795. errs := validate.Var(test.param, "multibyte")
  2796. if test.expected {
  2797. if !IsEqual(errs, nil) {
  2798. t.Fatalf("Index: %d Multibyte failed Error: %s", i, errs)
  2799. }
  2800. } else {
  2801. if IsEqual(errs, nil) {
  2802. t.Fatalf("Index: %d Multibyte failed Error: %s", i, errs)
  2803. } else {
  2804. val := getError(errs, "", "")
  2805. if val.Tag() != "multibyte" {
  2806. t.Fatalf("Index: %d Multibyte failed Error: %s", i, errs)
  2807. }
  2808. }
  2809. }
  2810. }
  2811. }
  2812. func TestPrintableASCIIValidation(t *testing.T) {
  2813. tests := []struct {
  2814. param string
  2815. expected bool
  2816. }{
  2817. {"", true},
  2818. {"foobar", false},
  2819. {"xyz098", false},
  2820. {"123456", false},
  2821. {"カタカナ", false},
  2822. {"foobar", true},
  2823. {"0987654321", true},
  2824. {"test@example.com", true},
  2825. {"1234abcDEF", true},
  2826. {"newline\n", false},
  2827. {"\x19test\x7F", false},
  2828. }
  2829. validate := New()
  2830. for i, test := range tests {
  2831. errs := validate.Var(test.param, "printascii")
  2832. if test.expected {
  2833. if !IsEqual(errs, nil) {
  2834. t.Fatalf("Index: %d Printable ASCII failed Error: %s", i, errs)
  2835. }
  2836. } else {
  2837. if IsEqual(errs, nil) {
  2838. t.Fatalf("Index: %d Printable ASCII failed Error: %s", i, errs)
  2839. } else {
  2840. val := getError(errs, "", "")
  2841. if val.Tag() != "printascii" {
  2842. t.Fatalf("Index: %d Printable ASCII failed Error: %s", i, errs)
  2843. }
  2844. }
  2845. }
  2846. }
  2847. }
  2848. func TestASCIIValidation(t *testing.T) {
  2849. tests := []struct {
  2850. param string
  2851. expected bool
  2852. }{
  2853. {"", true},
  2854. {"foobar", false},
  2855. {"xyz098", false},
  2856. {"123456", false},
  2857. {"カタカナ", false},
  2858. {"foobar", true},
  2859. {"0987654321", true},
  2860. {"test@example.com", true},
  2861. {"1234abcDEF", true},
  2862. {"", true},
  2863. }
  2864. validate := New()
  2865. for i, test := range tests {
  2866. errs := validate.Var(test.param, "ascii")
  2867. if test.expected {
  2868. if !IsEqual(errs, nil) {
  2869. t.Fatalf("Index: %d ASCII failed Error: %s", i, errs)
  2870. }
  2871. } else {
  2872. if IsEqual(errs, nil) {
  2873. t.Fatalf("Index: %d ASCII failed Error: %s", i, errs)
  2874. } else {
  2875. val := getError(errs, "", "")
  2876. if val.Tag() != "ascii" {
  2877. t.Fatalf("Index: %d ASCII failed Error: %s", i, errs)
  2878. }
  2879. }
  2880. }
  2881. }
  2882. }
  2883. func TestUUID5Validation(t *testing.T) {
  2884. tests := []struct {
  2885. param string
  2886. expected bool
  2887. }{
  2888. {"", false},
  2889. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  2890. {"9c858901-8a57-4791-81fe-4c455b099bc9", false},
  2891. {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  2892. {"987fbc97-4bed-5078-af07-9141ba07c9f3", true},
  2893. {"987fbc97-4bed-5078-9f07-9141ba07c9f3", true},
  2894. }
  2895. validate := New()
  2896. for i, test := range tests {
  2897. errs := validate.Var(test.param, "uuid5")
  2898. if test.expected {
  2899. if !IsEqual(errs, nil) {
  2900. t.Fatalf("Index: %d UUID5 failed Error: %s", i, errs)
  2901. }
  2902. } else {
  2903. if IsEqual(errs, nil) {
  2904. t.Fatalf("Index: %d UUID5 failed Error: %s", i, errs)
  2905. } else {
  2906. val := getError(errs, "", "")
  2907. if val.Tag() != "uuid5" {
  2908. t.Fatalf("Index: %d UUID5 failed Error: %s", i, errs)
  2909. }
  2910. }
  2911. }
  2912. }
  2913. }
  2914. func TestUUID4Validation(t *testing.T) {
  2915. tests := []struct {
  2916. param string
  2917. expected bool
  2918. }{
  2919. {"", false},
  2920. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  2921. {"a987fbc9-4bed-5078-af07-9141ba07c9f3", false},
  2922. {"934859", false},
  2923. {"57b73598-8764-4ad0-a76a-679bb6640eb1", true},
  2924. {"625e63f3-58f5-40b7-83a1-a72ad31acffb", true},
  2925. }
  2926. validate := New()
  2927. for i, test := range tests {
  2928. errs := validate.Var(test.param, "uuid4")
  2929. if test.expected {
  2930. if !IsEqual(errs, nil) {
  2931. t.Fatalf("Index: %d UUID4 failed Error: %s", i, errs)
  2932. }
  2933. } else {
  2934. if IsEqual(errs, nil) {
  2935. t.Fatalf("Index: %d UUID4 failed Error: %s", i, errs)
  2936. } else {
  2937. val := getError(errs, "", "")
  2938. if val.Tag() != "uuid4" {
  2939. t.Fatalf("Index: %d UUID4 failed Error: %s", i, errs)
  2940. }
  2941. }
  2942. }
  2943. }
  2944. }
  2945. func TestUUID3Validation(t *testing.T) {
  2946. tests := []struct {
  2947. param string
  2948. expected bool
  2949. }{
  2950. {"", false},
  2951. {"412452646", false},
  2952. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  2953. {"a987fbc9-4bed-4078-8f07-9141ba07c9f3", false},
  2954. {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", true},
  2955. }
  2956. validate := New()
  2957. for i, test := range tests {
  2958. errs := validate.Var(test.param, "uuid3")
  2959. if test.expected {
  2960. if !IsEqual(errs, nil) {
  2961. t.Fatalf("Index: %d UUID3 failed Error: %s", i, errs)
  2962. }
  2963. } else {
  2964. if IsEqual(errs, nil) {
  2965. t.Fatalf("Index: %d UUID3 failed Error: %s", i, errs)
  2966. } else {
  2967. val := getError(errs, "", "")
  2968. if val.Tag() != "uuid3" {
  2969. t.Fatalf("Index: %d UUID3 failed Error: %s", i, errs)
  2970. }
  2971. }
  2972. }
  2973. }
  2974. }
  2975. func TestUUIDValidation(t *testing.T) {
  2976. tests := []struct {
  2977. param string
  2978. expected bool
  2979. }{
  2980. {"", false},
  2981. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  2982. {"a987fbc9-4bed-3078-cf07-9141ba07c9f3xxx", false},
  2983. {"a987fbc94bed3078cf079141ba07c9f3", false},
  2984. {"934859", false},
  2985. {"987fbc9-4bed-3078-cf07a-9141ba07c9f3", false},
  2986. {"aaaaaaaa-1111-1111-aaag-111111111111", false},
  2987. {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", true},
  2988. }
  2989. validate := New()
  2990. for i, test := range tests {
  2991. errs := validate.Var(test.param, "uuid")
  2992. if test.expected {
  2993. if !IsEqual(errs, nil) {
  2994. t.Fatalf("Index: %d UUID failed Error: %s", i, errs)
  2995. }
  2996. } else {
  2997. if IsEqual(errs, nil) {
  2998. t.Fatalf("Index: %d UUID failed Error: %s", i, errs)
  2999. } else {
  3000. val := getError(errs, "", "")
  3001. if val.Tag() != "uuid" {
  3002. t.Fatalf("Index: %d UUID failed Error: %s", i, errs)
  3003. }
  3004. }
  3005. }
  3006. }
  3007. }
  3008. func TestUUID5RFC4122Validation(t *testing.T) {
  3009. tests := []struct {
  3010. param string
  3011. expected bool
  3012. }{
  3013. {"", false},
  3014. {"xxxa987Fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  3015. {"9c858901-8a57-4791-81Fe-4c455b099bc9", false},
  3016. {"a987Fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  3017. {"987Fbc97-4bed-5078-af07-9141ba07c9f3", true},
  3018. {"987Fbc97-4bed-5078-9f07-9141ba07c9f3", true},
  3019. }
  3020. validate := New()
  3021. for i, test := range tests {
  3022. errs := validate.Var(test.param, "uuid5_rfc4122")
  3023. if test.expected {
  3024. if !IsEqual(errs, nil) {
  3025. t.Fatalf("Index: %d UUID5RFC4122 failed Error: %s", i, errs)
  3026. }
  3027. } else {
  3028. if IsEqual(errs, nil) {
  3029. t.Fatalf("Index: %d UUID5RFC4122 failed Error: %s", i, errs)
  3030. } else {
  3031. val := getError(errs, "", "")
  3032. if val.Tag() != "uuid5_rfc4122" {
  3033. t.Fatalf("Index: %d UUID5RFC4122 failed Error: %s", i, errs)
  3034. }
  3035. }
  3036. }
  3037. }
  3038. }
  3039. func TestUUID4RFC4122Validation(t *testing.T) {
  3040. tests := []struct {
  3041. param string
  3042. expected bool
  3043. }{
  3044. {"", false},
  3045. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9F3", false},
  3046. {"a987fbc9-4bed-5078-af07-9141ba07c9F3", false},
  3047. {"934859", false},
  3048. {"57b73598-8764-4ad0-a76A-679bb6640eb1", true},
  3049. {"625e63f3-58f5-40b7-83a1-a72ad31acFfb", true},
  3050. }
  3051. validate := New()
  3052. for i, test := range tests {
  3053. errs := validate.Var(test.param, "uuid4_rfc4122")
  3054. if test.expected {
  3055. if !IsEqual(errs, nil) {
  3056. t.Fatalf("Index: %d UUID4RFC4122 failed Error: %s", i, errs)
  3057. }
  3058. } else {
  3059. if IsEqual(errs, nil) {
  3060. t.Fatalf("Index: %d UUID4RFC4122 failed Error: %s", i, errs)
  3061. } else {
  3062. val := getError(errs, "", "")
  3063. if val.Tag() != "uuid4_rfc4122" {
  3064. t.Fatalf("Index: %d UUID4RFC4122 failed Error: %s", i, errs)
  3065. }
  3066. }
  3067. }
  3068. }
  3069. }
  3070. func TestUUID3RFC4122Validation(t *testing.T) {
  3071. tests := []struct {
  3072. param string
  3073. expected bool
  3074. }{
  3075. {"", false},
  3076. {"412452646", false},
  3077. {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9F3", false},
  3078. {"a987fbc9-4bed-4078-8f07-9141ba07c9F3", false},
  3079. {"a987fbc9-4bed-3078-cf07-9141ba07c9F3", true},
  3080. }
  3081. validate := New()
  3082. for i, test := range tests {
  3083. errs := validate.Var(test.param, "uuid3_rfc4122")
  3084. if test.expected {
  3085. if !IsEqual(errs, nil) {
  3086. t.Fatalf("Index: %d UUID3RFC4122 failed Error: %s", i, errs)
  3087. }
  3088. } else {
  3089. if IsEqual(errs, nil) {
  3090. t.Fatalf("Index: %d UUID3RFC4122 failed Error: %s", i, errs)
  3091. } else {
  3092. val := getError(errs, "", "")
  3093. if val.Tag() != "uuid3_rfc4122" {
  3094. t.Fatalf("Index: %d UUID3RFC4122 failed Error: %s", i, errs)
  3095. }
  3096. }
  3097. }
  3098. }
  3099. }
  3100. func TestUUIDRFC4122Validation(t *testing.T) {
  3101. tests := []struct {
  3102. param string
  3103. expected bool
  3104. }{
  3105. {"", false},
  3106. {"xxxa987Fbc9-4bed-3078-cf07-9141ba07c9f3", false},
  3107. {"a987Fbc9-4bed-3078-cf07-9141ba07c9f3xxx", false},
  3108. {"a987Fbc94bed3078cf079141ba07c9f3", false},
  3109. {"934859", false},
  3110. {"987fbc9-4bed-3078-cf07a-9141ba07c9F3", false},
  3111. {"aaaaaaaa-1111-1111-aaaG-111111111111", false},
  3112. {"a987Fbc9-4bed-3078-cf07-9141ba07c9f3", true},
  3113. }
  3114. validate := New()
  3115. for i, test := range tests {
  3116. errs := validate.Var(test.param, "uuid_rfc4122")
  3117. if test.expected {
  3118. if !IsEqual(errs, nil) {
  3119. t.Fatalf("Index: %d UUIDRFC4122 failed Error: %s", i, errs)
  3120. }
  3121. } else {
  3122. if IsEqual(errs, nil) {
  3123. t.Fatalf("Index: %d UUIDRFC4122 failed Error: %s", i, errs)
  3124. } else {
  3125. val := getError(errs, "", "")
  3126. if val.Tag() != "uuid_rfc4122" {
  3127. t.Fatalf("Index: %d UUIDRFC4122 failed Error: %s", i, errs)
  3128. }
  3129. }
  3130. }
  3131. }
  3132. }
  3133. func TestISBNValidation(t *testing.T) {
  3134. tests := []struct {
  3135. param string
  3136. expected bool
  3137. }{
  3138. {"", false},
  3139. {"foo", false},
  3140. {"3836221195", true},
  3141. {"1-61729-085-8", true},
  3142. {"3 423 21412 0", true},
  3143. {"3 401 01319 X", true},
  3144. {"9784873113685", true},
  3145. {"978-4-87311-368-5", true},
  3146. {"978 3401013190", true},
  3147. {"978-3-8362-2119-1", true},
  3148. }
  3149. validate := New()
  3150. for i, test := range tests {
  3151. errs := validate.Var(test.param, "isbn")
  3152. if test.expected {
  3153. if !IsEqual(errs, nil) {
  3154. t.Fatalf("Index: %d ISBN failed Error: %s", i, errs)
  3155. }
  3156. } else {
  3157. if IsEqual(errs, nil) {
  3158. t.Fatalf("Index: %d ISBN failed Error: %s", i, errs)
  3159. } else {
  3160. val := getError(errs, "", "")
  3161. if val.Tag() != "isbn" {
  3162. t.Fatalf("Index: %d ISBN failed Error: %s", i, errs)
  3163. }
  3164. }
  3165. }
  3166. }
  3167. }
  3168. func TestISBN13Validation(t *testing.T) {
  3169. tests := []struct {
  3170. param string
  3171. expected bool
  3172. }{
  3173. {"", false},
  3174. {"foo", false},
  3175. {"3-8362-2119-5", false},
  3176. {"01234567890ab", false},
  3177. {"978 3 8362 2119 0", false},
  3178. {"9784873113685", true},
  3179. {"978-4-87311-368-5", true},
  3180. {"978 3401013190", true},
  3181. {"978-3-8362-2119-1", true},
  3182. }
  3183. validate := New()
  3184. for i, test := range tests {
  3185. errs := validate.Var(test.param, "isbn13")
  3186. if test.expected {
  3187. if !IsEqual(errs, nil) {
  3188. t.Fatalf("Index: %d ISBN13 failed Error: %s", i, errs)
  3189. }
  3190. } else {
  3191. if IsEqual(errs, nil) {
  3192. t.Fatalf("Index: %d ISBN13 failed Error: %s", i, errs)
  3193. } else {
  3194. val := getError(errs, "", "")
  3195. if val.Tag() != "isbn13" {
  3196. t.Fatalf("Index: %d ISBN13 failed Error: %s", i, errs)
  3197. }
  3198. }
  3199. }
  3200. }
  3201. }
  3202. func TestISBN10Validation(t *testing.T) {
  3203. tests := []struct {
  3204. param string
  3205. expected bool
  3206. }{
  3207. {"", false},
  3208. {"foo", false},
  3209. {"3423214121", false},
  3210. {"978-3836221191", false},
  3211. {"3-423-21412-1", false},
  3212. {"3 423 21412 1", false},
  3213. {"3836221195", true},
  3214. {"1-61729-085-8", true},
  3215. {"3 423 21412 0", true},
  3216. {"3 401 01319 X", true},
  3217. }
  3218. validate := New()
  3219. for i, test := range tests {
  3220. errs := validate.Var(test.param, "isbn10")
  3221. if test.expected {
  3222. if !IsEqual(errs, nil) {
  3223. t.Fatalf("Index: %d ISBN10 failed Error: %s", i, errs)
  3224. }
  3225. } else {
  3226. if IsEqual(errs, nil) {
  3227. t.Fatalf("Index: %d ISBN10 failed Error: %s", i, errs)
  3228. } else {
  3229. val := getError(errs, "", "")
  3230. if val.Tag() != "isbn10" {
  3231. t.Fatalf("Index: %d ISBN10 failed Error: %s", i, errs)
  3232. }
  3233. }
  3234. }
  3235. }
  3236. }
  3237. func TestExcludesRuneValidation(t *testing.T) {
  3238. tests := []struct {
  3239. Value string `validate:"excludesrune=☻"`
  3240. Tag string
  3241. ExpectedNil bool
  3242. }{
  3243. {Value: "a☺b☻c☹d", Tag: "excludesrune=☻", ExpectedNil: false},
  3244. {Value: "abcd", Tag: "excludesrune=☻", ExpectedNil: true},
  3245. }
  3246. validate := New()
  3247. for i, s := range tests {
  3248. errs := validate.Var(s.Value, s.Tag)
  3249. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3250. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3251. }
  3252. errs = validate.Struct(s)
  3253. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3254. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3255. }
  3256. }
  3257. }
  3258. func TestExcludesAllValidation(t *testing.T) {
  3259. tests := []struct {
  3260. Value string `validate:"excludesall=@!{}[]"`
  3261. Tag string
  3262. ExpectedNil bool
  3263. }{
  3264. {Value: "abcd@!jfk", Tag: "excludesall=@!{}[]", ExpectedNil: false},
  3265. {Value: "abcdefg", Tag: "excludesall=@!{}[]", ExpectedNil: true},
  3266. }
  3267. validate := New()
  3268. for i, s := range tests {
  3269. errs := validate.Var(s.Value, s.Tag)
  3270. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3271. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3272. }
  3273. errs = validate.Struct(s)
  3274. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3275. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3276. }
  3277. }
  3278. username := "joeybloggs "
  3279. errs := validate.Var(username, "excludesall=@ ")
  3280. NotEqual(t, errs, nil)
  3281. AssertError(t, errs, "", "", "", "", "excludesall")
  3282. excluded := ","
  3283. errs = validate.Var(excluded, "excludesall=!@#$%^&*()_+.0x2C?")
  3284. NotEqual(t, errs, nil)
  3285. AssertError(t, errs, "", "", "", "", "excludesall")
  3286. excluded = "="
  3287. errs = validate.Var(excluded, "excludesall=!@#$%^&*()_+.0x2C=?")
  3288. NotEqual(t, errs, nil)
  3289. AssertError(t, errs, "", "", "", "", "excludesall")
  3290. }
  3291. func TestExcludesValidation(t *testing.T) {
  3292. tests := []struct {
  3293. Value string `validate:"excludes=@"`
  3294. Tag string
  3295. ExpectedNil bool
  3296. }{
  3297. {Value: "abcd@!jfk", Tag: "excludes=@", ExpectedNil: false},
  3298. {Value: "abcdq!jfk", Tag: "excludes=@", ExpectedNil: true},
  3299. }
  3300. validate := New()
  3301. for i, s := range tests {
  3302. errs := validate.Var(s.Value, s.Tag)
  3303. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3304. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3305. }
  3306. errs = validate.Struct(s)
  3307. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3308. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3309. }
  3310. }
  3311. }
  3312. func TestContainsRuneValidation(t *testing.T) {
  3313. tests := []struct {
  3314. Value string `validate:"containsrune=☻"`
  3315. Tag string
  3316. ExpectedNil bool
  3317. }{
  3318. {Value: "a☺b☻c☹d", Tag: "containsrune=☻", ExpectedNil: true},
  3319. {Value: "abcd", Tag: "containsrune=☻", ExpectedNil: false},
  3320. }
  3321. validate := New()
  3322. for i, s := range tests {
  3323. errs := validate.Var(s.Value, s.Tag)
  3324. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3325. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3326. }
  3327. errs = validate.Struct(s)
  3328. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3329. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3330. }
  3331. }
  3332. }
  3333. func TestContainsAnyValidation(t *testing.T) {
  3334. tests := []struct {
  3335. Value string `validate:"containsany=@!{}[]"`
  3336. Tag string
  3337. ExpectedNil bool
  3338. }{
  3339. {Value: "abcd@!jfk", Tag: "containsany=@!{}[]", ExpectedNil: true},
  3340. {Value: "abcdefg", Tag: "containsany=@!{}[]", ExpectedNil: false},
  3341. }
  3342. validate := New()
  3343. for i, s := range tests {
  3344. errs := validate.Var(s.Value, s.Tag)
  3345. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3346. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3347. }
  3348. errs = validate.Struct(s)
  3349. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3350. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3351. }
  3352. }
  3353. }
  3354. func TestContainsValidation(t *testing.T) {
  3355. tests := []struct {
  3356. Value string `validate:"contains=@"`
  3357. Tag string
  3358. ExpectedNil bool
  3359. }{
  3360. {Value: "abcd@!jfk", Tag: "contains=@", ExpectedNil: true},
  3361. {Value: "abcdq!jfk", Tag: "contains=@", ExpectedNil: false},
  3362. }
  3363. validate := New()
  3364. for i, s := range tests {
  3365. errs := validate.Var(s.Value, s.Tag)
  3366. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3367. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3368. }
  3369. errs = validate.Struct(s)
  3370. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  3371. t.Fatalf("Index: %d failed Error: %s", i, errs)
  3372. }
  3373. }
  3374. }
  3375. func TestIsNeFieldValidation(t *testing.T) {
  3376. validate := New()
  3377. var j uint64
  3378. var k float64
  3379. s := "abcd"
  3380. i := 1
  3381. j = 1
  3382. k = 1.543
  3383. arr := []string{"test"}
  3384. now := time.Now().UTC()
  3385. var j2 uint64
  3386. var k2 float64
  3387. s2 := "abcdef"
  3388. i2 := 3
  3389. j2 = 2
  3390. k2 = 1.5434456
  3391. arr2 := []string{"test", "test2"}
  3392. arr3 := []string{"test"}
  3393. now2 := now
  3394. errs := validate.VarWithValue(s, s2, "nefield")
  3395. Equal(t, errs, nil)
  3396. errs = validate.VarWithValue(i2, i, "nefield")
  3397. Equal(t, errs, nil)
  3398. errs = validate.VarWithValue(j2, j, "nefield")
  3399. Equal(t, errs, nil)
  3400. errs = validate.VarWithValue(k2, k, "nefield")
  3401. Equal(t, errs, nil)
  3402. errs = validate.VarWithValue(arr2, arr, "nefield")
  3403. Equal(t, errs, nil)
  3404. errs = validate.VarWithValue(now2, now, "nefield")
  3405. NotEqual(t, errs, nil)
  3406. AssertError(t, errs, "", "", "", "", "nefield")
  3407. errs = validate.VarWithValue(arr3, arr, "nefield")
  3408. NotEqual(t, errs, nil)
  3409. AssertError(t, errs, "", "", "", "", "nefield")
  3410. type Test struct {
  3411. Start *time.Time `validate:"nefield=End"`
  3412. End *time.Time
  3413. }
  3414. sv := &Test{
  3415. Start: &now,
  3416. End: &now,
  3417. }
  3418. errs = validate.Struct(sv)
  3419. NotEqual(t, errs, nil)
  3420. AssertError(t, errs, "Test.Start", "Test.Start", "Start", "Start", "nefield")
  3421. now3 := time.Now().UTC()
  3422. sv = &Test{
  3423. Start: &now,
  3424. End: &now3,
  3425. }
  3426. errs = validate.Struct(sv)
  3427. Equal(t, errs, nil)
  3428. errs = validate.VarWithValue(nil, 1, "nefield")
  3429. NotEqual(t, errs, nil)
  3430. AssertError(t, errs, "", "", "", "", "nefield")
  3431. errs = validate.VarWithValue(sv, now, "nefield")
  3432. Equal(t, errs, nil)
  3433. type Test2 struct {
  3434. Start *time.Time `validate:"nefield=NonExistantField"`
  3435. End *time.Time
  3436. }
  3437. sv2 := &Test2{
  3438. Start: &now,
  3439. End: &now,
  3440. }
  3441. errs = validate.Struct(sv2)
  3442. Equal(t, errs, nil)
  3443. type Other struct {
  3444. Value string
  3445. }
  3446. type Test3 struct {
  3447. Value Other
  3448. Time time.Time `validate:"nefield=Value"`
  3449. }
  3450. tst := Test3{
  3451. Value: Other{Value: "StringVal"},
  3452. Time: now,
  3453. }
  3454. errs = validate.Struct(tst)
  3455. Equal(t, errs, nil)
  3456. }
  3457. func TestIsNeValidation(t *testing.T) {
  3458. validate := New()
  3459. var j uint64
  3460. var k float64
  3461. s := "abcdef"
  3462. i := 3
  3463. j = 2
  3464. k = 1.5434
  3465. arr := []string{"test"}
  3466. now := time.Now().UTC()
  3467. errs := validate.Var(s, "ne=abcd")
  3468. Equal(t, errs, nil)
  3469. errs = validate.Var(i, "ne=1")
  3470. Equal(t, errs, nil)
  3471. errs = validate.Var(j, "ne=1")
  3472. Equal(t, errs, nil)
  3473. errs = validate.Var(k, "ne=1.543")
  3474. Equal(t, errs, nil)
  3475. errs = validate.Var(arr, "ne=2")
  3476. Equal(t, errs, nil)
  3477. errs = validate.Var(arr, "ne=1")
  3478. NotEqual(t, errs, nil)
  3479. AssertError(t, errs, "", "", "", "", "ne")
  3480. PanicMatches(t, func() { _ = validate.Var(now, "ne=now") }, "Bad field type time.Time")
  3481. }
  3482. func TestIsEqFieldValidation(t *testing.T) {
  3483. validate := New()
  3484. var j uint64
  3485. var k float64
  3486. s := "abcd"
  3487. i := 1
  3488. j = 1
  3489. k = 1.543
  3490. arr := []string{"test"}
  3491. now := time.Now().UTC()
  3492. var j2 uint64
  3493. var k2 float64
  3494. s2 := "abcd"
  3495. i2 := 1
  3496. j2 = 1
  3497. k2 = 1.543
  3498. arr2 := []string{"test"}
  3499. arr3 := []string{"test", "test2"}
  3500. now2 := now
  3501. errs := validate.VarWithValue(s, s2, "eqfield")
  3502. Equal(t, errs, nil)
  3503. errs = validate.VarWithValue(i2, i, "eqfield")
  3504. Equal(t, errs, nil)
  3505. errs = validate.VarWithValue(j2, j, "eqfield")
  3506. Equal(t, errs, nil)
  3507. errs = validate.VarWithValue(k2, k, "eqfield")
  3508. Equal(t, errs, nil)
  3509. errs = validate.VarWithValue(arr2, arr, "eqfield")
  3510. Equal(t, errs, nil)
  3511. errs = validate.VarWithValue(now2, now, "eqfield")
  3512. Equal(t, errs, nil)
  3513. errs = validate.VarWithValue(arr3, arr, "eqfield")
  3514. NotEqual(t, errs, nil)
  3515. AssertError(t, errs, "", "", "", "", "eqfield")
  3516. type Test struct {
  3517. Start *time.Time `validate:"eqfield=End"`
  3518. End *time.Time
  3519. }
  3520. sv := &Test{
  3521. Start: &now,
  3522. End: &now,
  3523. }
  3524. errs = validate.Struct(sv)
  3525. Equal(t, errs, nil)
  3526. now3 := time.Now().UTC()
  3527. sv = &Test{
  3528. Start: &now,
  3529. End: &now3,
  3530. }
  3531. errs = validate.Struct(sv)
  3532. NotEqual(t, errs, nil)
  3533. AssertError(t, errs, "Test.Start", "Test.Start", "Start", "Start", "eqfield")
  3534. errs = validate.VarWithValue(nil, 1, "eqfield")
  3535. NotEqual(t, errs, nil)
  3536. AssertError(t, errs, "", "", "", "", "eqfield")
  3537. channel := make(chan string)
  3538. errs = validate.VarWithValue(5, channel, "eqfield")
  3539. NotEqual(t, errs, nil)
  3540. AssertError(t, errs, "", "", "", "", "eqfield")
  3541. errs = validate.VarWithValue(5, now, "eqfield")
  3542. NotEqual(t, errs, nil)
  3543. AssertError(t, errs, "", "", "", "", "eqfield")
  3544. type Test2 struct {
  3545. Start *time.Time `validate:"eqfield=NonExistantField"`
  3546. End *time.Time
  3547. }
  3548. sv2 := &Test2{
  3549. Start: &now,
  3550. End: &now,
  3551. }
  3552. errs = validate.Struct(sv2)
  3553. NotEqual(t, errs, nil)
  3554. AssertError(t, errs, "Test2.Start", "Test2.Start", "Start", "Start", "eqfield")
  3555. type Inner struct {
  3556. Name string
  3557. }
  3558. type TStruct struct {
  3559. Inner *Inner
  3560. CreatedAt *time.Time `validate:"eqfield=Inner"`
  3561. }
  3562. inner := &Inner{
  3563. Name: "NAME",
  3564. }
  3565. test := &TStruct{
  3566. Inner: inner,
  3567. CreatedAt: &now,
  3568. }
  3569. errs = validate.Struct(test)
  3570. NotEqual(t, errs, nil)
  3571. AssertError(t, errs, "TStruct.CreatedAt", "TStruct.CreatedAt", "CreatedAt", "CreatedAt", "eqfield")
  3572. }
  3573. func TestIsEqValidation(t *testing.T) {
  3574. validate := New()
  3575. var j uint64
  3576. var k float64
  3577. s := "abcd"
  3578. i := 1
  3579. j = 1
  3580. k = 1.543
  3581. arr := []string{"test"}
  3582. now := time.Now().UTC()
  3583. errs := validate.Var(s, "eq=abcd")
  3584. Equal(t, errs, nil)
  3585. errs = validate.Var(i, "eq=1")
  3586. Equal(t, errs, nil)
  3587. errs = validate.Var(j, "eq=1")
  3588. Equal(t, errs, nil)
  3589. errs = validate.Var(k, "eq=1.543")
  3590. Equal(t, errs, nil)
  3591. errs = validate.Var(arr, "eq=1")
  3592. Equal(t, errs, nil)
  3593. errs = validate.Var(arr, "eq=2")
  3594. NotEqual(t, errs, nil)
  3595. AssertError(t, errs, "", "", "", "", "eq")
  3596. PanicMatches(t, func() { _ = validate.Var(now, "eq=now") }, "Bad field type time.Time")
  3597. }
  3598. func TestOneOfValidation(t *testing.T) {
  3599. validate := New()
  3600. passSpecs := []struct {
  3601. f interface{}
  3602. t string
  3603. }{
  3604. {f: "red", t: "oneof=red green"},
  3605. {f: "green", t: "oneof=red green"},
  3606. {f: 5, t: "oneof=5 6"},
  3607. {f: 6, t: "oneof=5 6"},
  3608. {f: int8(6), t: "oneof=5 6"},
  3609. {f: int16(6), t: "oneof=5 6"},
  3610. {f: int32(6), t: "oneof=5 6"},
  3611. {f: int64(6), t: "oneof=5 6"},
  3612. {f: uint(6), t: "oneof=5 6"},
  3613. {f: uint8(6), t: "oneof=5 6"},
  3614. {f: uint16(6), t: "oneof=5 6"},
  3615. {f: uint32(6), t: "oneof=5 6"},
  3616. {f: uint64(6), t: "oneof=5 6"},
  3617. }
  3618. for _, spec := range passSpecs {
  3619. t.Logf("%#v", spec)
  3620. errs := validate.Var(spec.f, spec.t)
  3621. Equal(t, errs, nil)
  3622. }
  3623. failSpecs := []struct {
  3624. f interface{}
  3625. t string
  3626. }{
  3627. {f: "", t: "oneof=red green"},
  3628. {f: "yellow", t: "oneof=red green"},
  3629. {f: 5, t: "oneof=red green"},
  3630. {f: 6, t: "oneof=red green"},
  3631. {f: 6, t: "oneof=7"},
  3632. {f: uint(6), t: "oneof=7"},
  3633. {f: int8(5), t: "oneof=red green"},
  3634. {f: int16(5), t: "oneof=red green"},
  3635. {f: int32(5), t: "oneof=red green"},
  3636. {f: int64(5), t: "oneof=red green"},
  3637. {f: uint(5), t: "oneof=red green"},
  3638. {f: uint8(5), t: "oneof=red green"},
  3639. {f: uint16(5), t: "oneof=red green"},
  3640. {f: uint32(5), t: "oneof=red green"},
  3641. {f: uint64(5), t: "oneof=red green"},
  3642. }
  3643. for _, spec := range failSpecs {
  3644. t.Logf("%#v", spec)
  3645. errs := validate.Var(spec.f, spec.t)
  3646. AssertError(t, errs, "", "", "", "", "oneof")
  3647. }
  3648. PanicMatches(t, func() {
  3649. _ = validate.Var(3.14, "oneof=red green")
  3650. }, "Bad field type float64")
  3651. }
  3652. func TestBase64Validation(t *testing.T) {
  3653. validate := New()
  3654. s := "dW5pY29ybg=="
  3655. errs := validate.Var(s, "base64")
  3656. Equal(t, errs, nil)
  3657. s = "dGhpIGlzIGEgdGVzdCBiYXNlNjQ="
  3658. errs = validate.Var(s, "base64")
  3659. Equal(t, errs, nil)
  3660. s = ""
  3661. errs = validate.Var(s, "base64")
  3662. NotEqual(t, errs, nil)
  3663. AssertError(t, errs, "", "", "", "", "base64")
  3664. s = "dW5pY29ybg== foo bar"
  3665. errs = validate.Var(s, "base64")
  3666. NotEqual(t, errs, nil)
  3667. AssertError(t, errs, "", "", "", "", "base64")
  3668. }
  3669. func TestBase64URLValidation(t *testing.T) {
  3670. validate := New()
  3671. testCases := []struct {
  3672. decoded, encoded string
  3673. success bool
  3674. }{
  3675. // empty string, although a valid base64 string, should fail
  3676. {"", "", false},
  3677. // invalid length
  3678. {"", "a", false},
  3679. // base64 with padding
  3680. {"f", "Zg==", true},
  3681. {"fo", "Zm8=", true},
  3682. // base64 without padding
  3683. {"foo", "Zm9v", true},
  3684. {"", "Zg", false},
  3685. {"", "Zm8", false},
  3686. // base64 URL safe encoding with invalid, special characters '+' and '/'
  3687. {"\x14\xfb\x9c\x03\xd9\x7e", "FPucA9l+", false},
  3688. {"\x14\xfb\x9c\x03\xf9\x73", "FPucA/lz", false},
  3689. // base64 URL safe encoding with valid, special characters '-' and '_'
  3690. {"\x14\xfb\x9c\x03\xd9\x7e", "FPucA9l-", true},
  3691. {"\x14\xfb\x9c\x03\xf9\x73", "FPucA_lz", true},
  3692. // non base64 characters
  3693. {"", "@mc=", false},
  3694. {"", "Zm 9", false},
  3695. }
  3696. for _, tc := range testCases {
  3697. err := validate.Var(tc.encoded, "base64url")
  3698. if tc.success {
  3699. Equal(t, err, nil)
  3700. // make sure encoded value is decoded back to the expected value
  3701. d, innerErr := base64.URLEncoding.DecodeString(tc.encoded)
  3702. Equal(t, innerErr, nil)
  3703. Equal(t, tc.decoded, string(d))
  3704. } else {
  3705. NotEqual(t, err, nil)
  3706. if len(tc.encoded) > 0 {
  3707. // make sure that indeed the encoded value was faulty
  3708. _, err := base64.URLEncoding.DecodeString(tc.encoded)
  3709. NotEqual(t, err, nil)
  3710. }
  3711. }
  3712. }
  3713. }
  3714. func TestFileValidation(t *testing.T) {
  3715. validate := New()
  3716. tests := []struct {
  3717. title string
  3718. param string
  3719. expected bool
  3720. }{
  3721. {"empty path", "", false},
  3722. {"regular file", filepath.Join("testdata", "a.go"), true},
  3723. {"missing file", filepath.Join("testdata", "no.go"), false},
  3724. {"directory, not a file", "testdata", false},
  3725. }
  3726. for _, test := range tests {
  3727. errs := validate.Var(test.param, "file")
  3728. if test.expected {
  3729. if !IsEqual(errs, nil) {
  3730. t.Fatalf("Test: '%s' failed Error: %s", test.title, errs)
  3731. }
  3732. } else {
  3733. if IsEqual(errs, nil) {
  3734. t.Fatalf("Test: '%s' failed Error: %s", test.title, errs)
  3735. }
  3736. }
  3737. }
  3738. PanicMatches(t, func() {
  3739. _ = validate.Var(6, "file")
  3740. }, "Bad field type int")
  3741. }
  3742. func TestEthereumAddressValidation(t *testing.T) {
  3743. validate := New()
  3744. tests := []struct {
  3745. param string
  3746. expected bool
  3747. }{
  3748. {"", false},
  3749. {"0x02F9AE5f22EA3fA88F05780B30385bEC", false},
  3750. {"123f681646d4a755815f9cb19e1acc8565a0c2ac", false},
  3751. {"0x02F9AE5f22EA3fA88F05780B30385bECFacbf130", true},
  3752. {"0x123f681646d4a755815f9cb19e1acc8565a0c2ac", true},
  3753. }
  3754. for i, test := range tests {
  3755. errs := validate.Var(test.param, "eth_addr")
  3756. if test.expected {
  3757. if !IsEqual(errs, nil) {
  3758. t.Fatalf("Index: %d eth_addr failed Error: %s", i, errs)
  3759. }
  3760. } else {
  3761. if IsEqual(errs, nil) {
  3762. t.Fatalf("Index: %d eth_addr failed Error: %s", i, errs)
  3763. } else {
  3764. val := getError(errs, "", "")
  3765. if val.Tag() != "eth_addr" {
  3766. t.Fatalf("Index: %d Latitude failed Error: %s", i, errs)
  3767. }
  3768. }
  3769. }
  3770. }
  3771. }
  3772. func TestBitcoinAddressValidation(t *testing.T) {
  3773. validate := New()
  3774. tests := []struct {
  3775. param string
  3776. expected bool
  3777. }{
  3778. {"", false},
  3779. {"x", false},
  3780. {"0x02F9AE5f22EA3fA88F05780B30385bEC", false},
  3781. {"1A1zP1ePQGefi2DMPTifTL5SLmv7DivfNa", false},
  3782. {"1P9RQEr2XeE3PEb44ZE35sfZRRW1JH8Uqx", false},
  3783. {"3P14159I73E4gFr7JterCCQh9QjiTjiZrG", false},
  3784. {"3P141597f3E4gFr7JterCCQh9QjiTjiZrG", false},
  3785. {"37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y", false},
  3786. {"dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv", false},
  3787. {"MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S", false},
  3788. {"rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf", false},
  3789. {"4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq", false},
  3790. {"7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb", false},
  3791. {"17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs", false},
  3792. {"KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3", false},
  3793. {"7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th", false},
  3794. {"cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va", false},
  3795. {"gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk", false},
  3796. {"emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs", false},
  3797. {"7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo", false},
  3798. {"1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso", false},
  3799. {"31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq", false},
  3800. {"DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN", false},
  3801. {"2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i", false},
  3802. {"7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos", false},
  3803. {"1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu", false},
  3804. {"2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb", false},
  3805. {"8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ", false},
  3806. {"163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ", false},
  3807. {"2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu", false},
  3808. {"461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU", false},
  3809. {"2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs", false},
  3810. {"cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn", false},
  3811. {"gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj", false},
  3812. {"nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny", false},
  3813. {"L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc", false},
  3814. {"7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ ", false},
  3815. {"2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP", false},
  3816. {"dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw", false},
  3817. {"HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX", false},
  3818. {"4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB", false},
  3819. {"31uEbMgunupShBVTewXjtqbBv5MndwfXhb", false},
  3820. {"175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W", false},
  3821. {"Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ", false},
  3822. {"Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs", false},
  3823. {"6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ", false},
  3824. {"giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4", false},
  3825. {"cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK", false},
  3826. {"37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig", false},
  3827. {"EsYbG4tWWWY45G31nox838qNdzksbPySWc", false},
  3828. {"nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT", false},
  3829. {"cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx", false},
  3830. {"1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde", false},
  3831. {"2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU", false},
  3832. {"ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf", false},
  3833. {"Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd", false},
  3834. {"2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED", false},
  3835. {"1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true},
  3836. {"1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ", true},
  3837. {"1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv", true},
  3838. {"1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu", true},
  3839. {"1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4", true},
  3840. {"19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r", true},
  3841. {"13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE", true},
  3842. {"1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2", true},
  3843. {"3P14159f73E4gFr7JterCCQh9QjiTjiZrG", true},
  3844. {"3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou", true},
  3845. {"3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy", true},
  3846. {"3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks", true},
  3847. {"33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk", true},
  3848. {"3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y", true},
  3849. {"37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3", true},
  3850. {"3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G", true},
  3851. {"12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP", true},
  3852. {"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y", true},
  3853. {"1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs", true},
  3854. {"1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez", true},
  3855. {"116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd", true},
  3856. {"3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt", true},
  3857. }
  3858. for i, test := range tests {
  3859. errs := validate.Var(test.param, "btc_addr")
  3860. if test.expected {
  3861. if !IsEqual(errs, nil) {
  3862. t.Fatalf("Index: %d btc_addr failed with Error: %s", i, errs)
  3863. }
  3864. } else {
  3865. if IsEqual(errs, nil) {
  3866. t.Fatalf("Index: %d btc_addr failed with Error: %s", i, errs)
  3867. } else {
  3868. val := getError(errs, "", "")
  3869. if val.Tag() != "btc_addr" {
  3870. t.Fatalf("Index: %d Latitude failed with Error: %s", i, errs)
  3871. }
  3872. }
  3873. }
  3874. }
  3875. }
  3876. func TestBitcoinBech32AddressValidation(t *testing.T) {
  3877. validate := New()
  3878. tests := []struct {
  3879. param string
  3880. expected bool
  3881. }{
  3882. {"", false},
  3883. {"bc1rw5uspcuh", false},
  3884. {"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", false},
  3885. {"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", false},
  3886. {"qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", false},
  3887. {"bc1rw5uspcuh", false},
  3888. {"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", false},
  3889. {"BC1QW508d6QEJxTDG4y5R3ZArVARY0C5XW7KV8F3T4", false},
  3890. {"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", false},
  3891. {"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", false},
  3892. {"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", false},
  3893. {"bc1pw508d6qejxtdg4y5r3zarqfsj6c3", false},
  3894. {"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", false},
  3895. {"bc1gmk9yu", false},
  3896. {"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", false},
  3897. {"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", true},
  3898. {"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", true},
  3899. {"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", true},
  3900. {"BC1SW50QA3JX3S", true},
  3901. {"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", true},
  3902. }
  3903. for i, test := range tests {
  3904. errs := validate.Var(test.param, "btc_addr_bech32")
  3905. if test.expected {
  3906. if !IsEqual(errs, nil) {
  3907. t.Fatalf("Index: %d btc_addr_bech32 failed with Error: %s", i, errs)
  3908. }
  3909. } else {
  3910. if IsEqual(errs, nil) {
  3911. t.Fatalf("Index: %d btc_addr_bech32 failed with Error: %s", i, errs)
  3912. } else {
  3913. val := getError(errs, "", "")
  3914. if val.Tag() != "btc_addr_bech32" {
  3915. t.Fatalf("Index: %d Latitude failed with Error: %s", i, errs)
  3916. }
  3917. }
  3918. }
  3919. }
  3920. }
  3921. func TestNoStructLevelValidation(t *testing.T) {
  3922. type Inner struct {
  3923. Test string `validate:"len=5"`
  3924. }
  3925. type Outer struct {
  3926. InnerStruct *Inner `validate:"required,nostructlevel"`
  3927. }
  3928. outer := &Outer{
  3929. InnerStruct: nil,
  3930. }
  3931. validate := New()
  3932. errs := validate.Struct(outer)
  3933. NotEqual(t, errs, nil)
  3934. AssertError(t, errs, "Outer.InnerStruct", "Outer.InnerStruct", "InnerStruct", "InnerStruct", "required")
  3935. inner := &Inner{
  3936. Test: "1234",
  3937. }
  3938. outer = &Outer{
  3939. InnerStruct: inner,
  3940. }
  3941. errs = validate.Struct(outer)
  3942. Equal(t, errs, nil)
  3943. }
  3944. func TestStructOnlyValidation(t *testing.T) {
  3945. type Inner struct {
  3946. Test string `validate:"len=5"`
  3947. }
  3948. type Outer struct {
  3949. InnerStruct *Inner `validate:"required,structonly"`
  3950. }
  3951. outer := &Outer{
  3952. InnerStruct: nil,
  3953. }
  3954. validate := New()
  3955. errs := validate.Struct(outer)
  3956. NotEqual(t, errs, nil)
  3957. AssertError(t, errs, "Outer.InnerStruct", "Outer.InnerStruct", "InnerStruct", "InnerStruct", "required")
  3958. inner := &Inner{
  3959. Test: "1234",
  3960. }
  3961. outer = &Outer{
  3962. InnerStruct: inner,
  3963. }
  3964. errs = validate.Struct(outer)
  3965. Equal(t, errs, nil)
  3966. // Address houses a users address information
  3967. type Address struct {
  3968. Street string `validate:"required"`
  3969. City string `validate:"required"`
  3970. Planet string `validate:"required"`
  3971. Phone string `validate:"required"`
  3972. }
  3973. type User struct {
  3974. FirstName string `json:"fname"`
  3975. LastName string `json:"lname"`
  3976. Age uint8 `validate:"gte=0,lte=130"`
  3977. Email string `validate:"required,email"`
  3978. FavouriteColor string `validate:"hexcolor|rgb|rgba"`
  3979. Addresses []*Address `validate:"required"` // a person can have a home and cottage...
  3980. Address Address `validate:"structonly"` // a person can have a home and cottage...
  3981. }
  3982. address := &Address{
  3983. Street: "Eavesdown Docks",
  3984. Planet: "Persphone",
  3985. Phone: "none",
  3986. City: "Unknown",
  3987. }
  3988. user := &User{
  3989. FirstName: "",
  3990. LastName: "",
  3991. Age: 45,
  3992. Email: "Badger.Smith@gmail.com",
  3993. FavouriteColor: "#000",
  3994. Addresses: []*Address{address},
  3995. Address: Address{
  3996. // Street: "Eavesdown Docks",
  3997. Planet: "Persphone",
  3998. Phone: "none",
  3999. City: "Unknown",
  4000. },
  4001. }
  4002. errs = validate.Struct(user)
  4003. Equal(t, errs, nil)
  4004. }
  4005. func TestGtField(t *testing.T) {
  4006. validate := New()
  4007. type TimeTest struct {
  4008. Start *time.Time `validate:"required,gt"`
  4009. End *time.Time `validate:"required,gt,gtfield=Start"`
  4010. }
  4011. now := time.Now()
  4012. start := now.Add(time.Hour * 24)
  4013. end := start.Add(time.Hour * 24)
  4014. timeTest := &TimeTest{
  4015. Start: &start,
  4016. End: &end,
  4017. }
  4018. errs := validate.Struct(timeTest)
  4019. Equal(t, errs, nil)
  4020. timeTest = &TimeTest{
  4021. Start: &end,
  4022. End: &start,
  4023. }
  4024. errs = validate.Struct(timeTest)
  4025. NotEqual(t, errs, nil)
  4026. AssertError(t, errs, "TimeTest.End", "TimeTest.End", "End", "End", "gtfield")
  4027. errs = validate.VarWithValue(&end, &start, "gtfield")
  4028. Equal(t, errs, nil)
  4029. errs = validate.VarWithValue(&start, &end, "gtfield")
  4030. NotEqual(t, errs, nil)
  4031. AssertError(t, errs, "", "", "", "", "gtfield")
  4032. errs = validate.VarWithValue(&end, &start, "gtfield")
  4033. Equal(t, errs, nil)
  4034. errs = validate.VarWithValue(&timeTest, &end, "gtfield")
  4035. NotEqual(t, errs, nil)
  4036. errs = validate.VarWithValue("test bigger", "test", "gtfield")
  4037. Equal(t, errs, nil)
  4038. type IntTest struct {
  4039. Val1 int `validate:"required"`
  4040. Val2 int `validate:"required,gtfield=Val1"`
  4041. }
  4042. intTest := &IntTest{
  4043. Val1: 1,
  4044. Val2: 5,
  4045. }
  4046. errs = validate.Struct(intTest)
  4047. Equal(t, errs, nil)
  4048. intTest = &IntTest{
  4049. Val1: 5,
  4050. Val2: 1,
  4051. }
  4052. errs = validate.Struct(intTest)
  4053. NotEqual(t, errs, nil)
  4054. AssertError(t, errs, "IntTest.Val2", "IntTest.Val2", "Val2", "Val2", "gtfield")
  4055. errs = validate.VarWithValue(int(5), int(1), "gtfield")
  4056. Equal(t, errs, nil)
  4057. errs = validate.VarWithValue(int(1), int(5), "gtfield")
  4058. NotEqual(t, errs, nil)
  4059. AssertError(t, errs, "", "", "", "", "gtfield")
  4060. type UIntTest struct {
  4061. Val1 uint `validate:"required"`
  4062. Val2 uint `validate:"required,gtfield=Val1"`
  4063. }
  4064. uIntTest := &UIntTest{
  4065. Val1: 1,
  4066. Val2: 5,
  4067. }
  4068. errs = validate.Struct(uIntTest)
  4069. Equal(t, errs, nil)
  4070. uIntTest = &UIntTest{
  4071. Val1: 5,
  4072. Val2: 1,
  4073. }
  4074. errs = validate.Struct(uIntTest)
  4075. NotEqual(t, errs, nil)
  4076. AssertError(t, errs, "UIntTest.Val2", "UIntTest.Val2", "Val2", "Val2", "gtfield")
  4077. errs = validate.VarWithValue(uint(5), uint(1), "gtfield")
  4078. Equal(t, errs, nil)
  4079. errs = validate.VarWithValue(uint(1), uint(5), "gtfield")
  4080. NotEqual(t, errs, nil)
  4081. AssertError(t, errs, "", "", "", "", "gtfield")
  4082. type FloatTest struct {
  4083. Val1 float64 `validate:"required"`
  4084. Val2 float64 `validate:"required,gtfield=Val1"`
  4085. }
  4086. floatTest := &FloatTest{
  4087. Val1: 1,
  4088. Val2: 5,
  4089. }
  4090. errs = validate.Struct(floatTest)
  4091. Equal(t, errs, nil)
  4092. floatTest = &FloatTest{
  4093. Val1: 5,
  4094. Val2: 1,
  4095. }
  4096. errs = validate.Struct(floatTest)
  4097. NotEqual(t, errs, nil)
  4098. AssertError(t, errs, "FloatTest.Val2", "FloatTest.Val2", "Val2", "Val2", "gtfield")
  4099. errs = validate.VarWithValue(float32(5), float32(1), "gtfield")
  4100. Equal(t, errs, nil)
  4101. errs = validate.VarWithValue(float32(1), float32(5), "gtfield")
  4102. NotEqual(t, errs, nil)
  4103. AssertError(t, errs, "", "", "", "", "gtfield")
  4104. errs = validate.VarWithValue(nil, 1, "gtfield")
  4105. NotEqual(t, errs, nil)
  4106. AssertError(t, errs, "", "", "", "", "gtfield")
  4107. errs = validate.VarWithValue(5, "T", "gtfield")
  4108. NotEqual(t, errs, nil)
  4109. AssertError(t, errs, "", "", "", "", "gtfield")
  4110. errs = validate.VarWithValue(5, start, "gtfield")
  4111. NotEqual(t, errs, nil)
  4112. AssertError(t, errs, "", "", "", "", "gtfield")
  4113. type TimeTest2 struct {
  4114. Start *time.Time `validate:"required"`
  4115. End *time.Time `validate:"required,gtfield=NonExistantField"`
  4116. }
  4117. timeTest2 := &TimeTest2{
  4118. Start: &start,
  4119. End: &end,
  4120. }
  4121. errs = validate.Struct(timeTest2)
  4122. NotEqual(t, errs, nil)
  4123. AssertError(t, errs, "TimeTest2.End", "TimeTest2.End", "End", "End", "gtfield")
  4124. type Other struct {
  4125. Value string
  4126. }
  4127. type Test struct {
  4128. Value Other
  4129. Time time.Time `validate:"gtfield=Value"`
  4130. }
  4131. tst := Test{
  4132. Value: Other{Value: "StringVal"},
  4133. Time: end,
  4134. }
  4135. errs = validate.Struct(tst)
  4136. NotEqual(t, errs, nil)
  4137. AssertError(t, errs, "Test.Time", "Test.Time", "Time", "Time", "gtfield")
  4138. }
  4139. func TestLtField(t *testing.T) {
  4140. validate := New()
  4141. type TimeTest struct {
  4142. Start *time.Time `validate:"required,lt,ltfield=End"`
  4143. End *time.Time `validate:"required,lt"`
  4144. }
  4145. now := time.Now()
  4146. start := now.Add(time.Hour * 24 * -1 * 2)
  4147. end := start.Add(time.Hour * 24)
  4148. timeTest := &TimeTest{
  4149. Start: &start,
  4150. End: &end,
  4151. }
  4152. errs := validate.Struct(timeTest)
  4153. Equal(t, errs, nil)
  4154. timeTest = &TimeTest{
  4155. Start: &end,
  4156. End: &start,
  4157. }
  4158. errs = validate.Struct(timeTest)
  4159. NotEqual(t, errs, nil)
  4160. AssertError(t, errs, "TimeTest.Start", "TimeTest.Start", "Start", "Start", "ltfield")
  4161. errs = validate.VarWithValue(&start, &end, "ltfield")
  4162. Equal(t, errs, nil)
  4163. errs = validate.VarWithValue(&end, &start, "ltfield")
  4164. NotEqual(t, errs, nil)
  4165. AssertError(t, errs, "", "", "", "", "ltfield")
  4166. errs = validate.VarWithValue(&end, timeTest, "ltfield")
  4167. NotEqual(t, errs, nil)
  4168. AssertError(t, errs, "", "", "", "", "ltfield")
  4169. errs = validate.VarWithValue("tes", "test", "ltfield")
  4170. Equal(t, errs, nil)
  4171. type IntTest struct {
  4172. Val1 int `validate:"required"`
  4173. Val2 int `validate:"required,ltfield=Val1"`
  4174. }
  4175. intTest := &IntTest{
  4176. Val1: 5,
  4177. Val2: 1,
  4178. }
  4179. errs = validate.Struct(intTest)
  4180. Equal(t, errs, nil)
  4181. intTest = &IntTest{
  4182. Val1: 1,
  4183. Val2: 5,
  4184. }
  4185. errs = validate.Struct(intTest)
  4186. NotEqual(t, errs, nil)
  4187. AssertError(t, errs, "IntTest.Val2", "IntTest.Val2", "Val2", "Val2", "ltfield")
  4188. errs = validate.VarWithValue(int(1), int(5), "ltfield")
  4189. Equal(t, errs, nil)
  4190. errs = validate.VarWithValue(int(5), int(1), "ltfield")
  4191. NotEqual(t, errs, nil)
  4192. AssertError(t, errs, "", "", "", "", "ltfield")
  4193. type UIntTest struct {
  4194. Val1 uint `validate:"required"`
  4195. Val2 uint `validate:"required,ltfield=Val1"`
  4196. }
  4197. uIntTest := &UIntTest{
  4198. Val1: 5,
  4199. Val2: 1,
  4200. }
  4201. errs = validate.Struct(uIntTest)
  4202. Equal(t, errs, nil)
  4203. uIntTest = &UIntTest{
  4204. Val1: 1,
  4205. Val2: 5,
  4206. }
  4207. errs = validate.Struct(uIntTest)
  4208. NotEqual(t, errs, nil)
  4209. AssertError(t, errs, "UIntTest.Val2", "UIntTest.Val2", "Val2", "Val2", "ltfield")
  4210. errs = validate.VarWithValue(uint(1), uint(5), "ltfield")
  4211. Equal(t, errs, nil)
  4212. errs = validate.VarWithValue(uint(5), uint(1), "ltfield")
  4213. NotEqual(t, errs, nil)
  4214. AssertError(t, errs, "", "", "", "", "ltfield")
  4215. type FloatTest struct {
  4216. Val1 float64 `validate:"required"`
  4217. Val2 float64 `validate:"required,ltfield=Val1"`
  4218. }
  4219. floatTest := &FloatTest{
  4220. Val1: 5,
  4221. Val2: 1,
  4222. }
  4223. errs = validate.Struct(floatTest)
  4224. Equal(t, errs, nil)
  4225. floatTest = &FloatTest{
  4226. Val1: 1,
  4227. Val2: 5,
  4228. }
  4229. errs = validate.Struct(floatTest)
  4230. NotEqual(t, errs, nil)
  4231. AssertError(t, errs, "FloatTest.Val2", "FloatTest.Val2", "Val2", "Val2", "ltfield")
  4232. errs = validate.VarWithValue(float32(1), float32(5), "ltfield")
  4233. Equal(t, errs, nil)
  4234. errs = validate.VarWithValue(float32(5), float32(1), "ltfield")
  4235. NotEqual(t, errs, nil)
  4236. AssertError(t, errs, "", "", "", "", "ltfield")
  4237. errs = validate.VarWithValue(nil, 5, "ltfield")
  4238. NotEqual(t, errs, nil)
  4239. AssertError(t, errs, "", "", "", "", "ltfield")
  4240. errs = validate.VarWithValue(1, "T", "ltfield")
  4241. NotEqual(t, errs, nil)
  4242. AssertError(t, errs, "", "", "", "", "ltfield")
  4243. errs = validate.VarWithValue(1, end, "ltfield")
  4244. NotEqual(t, errs, nil)
  4245. AssertError(t, errs, "", "", "", "", "ltfield")
  4246. type TimeTest2 struct {
  4247. Start *time.Time `validate:"required"`
  4248. End *time.Time `validate:"required,ltfield=NonExistantField"`
  4249. }
  4250. timeTest2 := &TimeTest2{
  4251. Start: &end,
  4252. End: &start,
  4253. }
  4254. errs = validate.Struct(timeTest2)
  4255. NotEqual(t, errs, nil)
  4256. AssertError(t, errs, "TimeTest2.End", "TimeTest2.End", "End", "End", "ltfield")
  4257. }
  4258. func TestFieldContains(t *testing.T) {
  4259. validate := New()
  4260. type StringTest struct {
  4261. Foo string `validate:"fieldcontains=Bar"`
  4262. Bar string
  4263. }
  4264. stringTest := &StringTest{
  4265. Foo: "foobar",
  4266. Bar: "bar",
  4267. }
  4268. errs := validate.Struct(stringTest)
  4269. Equal(t, errs, nil)
  4270. stringTest = &StringTest{
  4271. Foo: "foo",
  4272. Bar: "bar",
  4273. }
  4274. errs = validate.Struct(stringTest)
  4275. NotEqual(t, errs, nil)
  4276. AssertError(t, errs, "StringTest.Foo", "StringTest.Foo", "Foo", "Foo", "fieldcontains")
  4277. errs = validate.VarWithValue("foo", "bar", "fieldcontains")
  4278. NotEqual(t, errs, nil)
  4279. AssertError(t, errs, "", "", "", "", "fieldcontains")
  4280. errs = validate.VarWithValue("bar", "foobarfoo", "fieldcontains")
  4281. NotEqual(t, errs, nil)
  4282. AssertError(t, errs, "", "", "", "", "fieldcontains")
  4283. errs = validate.VarWithValue("foobarfoo", "bar", "fieldcontains")
  4284. Equal(t, errs, nil)
  4285. type StringTestMissingField struct {
  4286. Foo string `validate:"fieldcontains=Bar"`
  4287. }
  4288. stringTestMissingField := &StringTestMissingField{
  4289. Foo: "foo",
  4290. }
  4291. errs = validate.Struct(stringTestMissingField)
  4292. NotEqual(t, errs, nil)
  4293. AssertError(t, errs, "StringTestMissingField.Foo", "StringTestMissingField.Foo", "Foo", "Foo", "fieldcontains")
  4294. }
  4295. func TestFieldExcludes(t *testing.T) {
  4296. validate := New()
  4297. type StringTest struct {
  4298. Foo string `validate:"fieldexcludes=Bar"`
  4299. Bar string
  4300. }
  4301. stringTest := &StringTest{
  4302. Foo: "foobar",
  4303. Bar: "bar",
  4304. }
  4305. errs := validate.Struct(stringTest)
  4306. NotEqual(t, errs, nil)
  4307. AssertError(t, errs, "StringTest.Foo", "StringTest.Foo", "Foo", "Foo", "fieldexcludes")
  4308. stringTest = &StringTest{
  4309. Foo: "foo",
  4310. Bar: "bar",
  4311. }
  4312. errs = validate.Struct(stringTest)
  4313. Equal(t, errs, nil)
  4314. errs = validate.VarWithValue("foo", "bar", "fieldexcludes")
  4315. Equal(t, errs, nil)
  4316. errs = validate.VarWithValue("bar", "foobarfoo", "fieldexcludes")
  4317. Equal(t, errs, nil)
  4318. errs = validate.VarWithValue("foobarfoo", "bar", "fieldexcludes")
  4319. NotEqual(t, errs, nil)
  4320. AssertError(t, errs, "", "", "", "", "fieldexcludes")
  4321. type StringTestMissingField struct {
  4322. Foo string `validate:"fieldexcludes=Bar"`
  4323. }
  4324. stringTestMissingField := &StringTestMissingField{
  4325. Foo: "foo",
  4326. }
  4327. errs = validate.Struct(stringTestMissingField)
  4328. Equal(t, errs, nil)
  4329. }
  4330. func TestContainsAndExcludes(t *testing.T) {
  4331. validate := New()
  4332. type ImpossibleStringTest struct {
  4333. Foo string `validate:"fieldcontains=Bar"`
  4334. Bar string `validate:"fieldexcludes=Foo"`
  4335. }
  4336. impossibleStringTest := &ImpossibleStringTest{
  4337. Foo: "foo",
  4338. Bar: "bar",
  4339. }
  4340. errs := validate.Struct(impossibleStringTest)
  4341. NotEqual(t, errs, nil)
  4342. AssertError(t, errs, "ImpossibleStringTest.Foo", "ImpossibleStringTest.Foo", "Foo", "Foo", "fieldcontains")
  4343. impossibleStringTest = &ImpossibleStringTest{
  4344. Foo: "bar",
  4345. Bar: "foo",
  4346. }
  4347. errs = validate.Struct(impossibleStringTest)
  4348. NotEqual(t, errs, nil)
  4349. AssertError(t, errs, "ImpossibleStringTest.Foo", "ImpossibleStringTest.Foo", "Foo", "Foo", "fieldcontains")
  4350. }
  4351. func TestLteField(t *testing.T) {
  4352. validate := New()
  4353. type TimeTest struct {
  4354. Start *time.Time `validate:"required,lte,ltefield=End"`
  4355. End *time.Time `validate:"required,lte"`
  4356. }
  4357. now := time.Now()
  4358. start := now.Add(time.Hour * 24 * -1 * 2)
  4359. end := start.Add(time.Hour * 24)
  4360. timeTest := &TimeTest{
  4361. Start: &start,
  4362. End: &end,
  4363. }
  4364. errs := validate.Struct(timeTest)
  4365. Equal(t, errs, nil)
  4366. timeTest = &TimeTest{
  4367. Start: &end,
  4368. End: &start,
  4369. }
  4370. errs = validate.Struct(timeTest)
  4371. NotEqual(t, errs, nil)
  4372. AssertError(t, errs, "TimeTest.Start", "TimeTest.Start", "Start", "Start", "ltefield")
  4373. errs = validate.VarWithValue(&start, &end, "ltefield")
  4374. Equal(t, errs, nil)
  4375. errs = validate.VarWithValue(&end, &start, "ltefield")
  4376. NotEqual(t, errs, nil)
  4377. AssertError(t, errs, "", "", "", "", "ltefield")
  4378. errs = validate.VarWithValue(&end, timeTest, "ltefield")
  4379. NotEqual(t, errs, nil)
  4380. AssertError(t, errs, "", "", "", "", "ltefield")
  4381. errs = validate.VarWithValue("tes", "test", "ltefield")
  4382. Equal(t, errs, nil)
  4383. errs = validate.VarWithValue("test", "test", "ltefield")
  4384. Equal(t, errs, nil)
  4385. type IntTest struct {
  4386. Val1 int `validate:"required"`
  4387. Val2 int `validate:"required,ltefield=Val1"`
  4388. }
  4389. intTest := &IntTest{
  4390. Val1: 5,
  4391. Val2: 1,
  4392. }
  4393. errs = validate.Struct(intTest)
  4394. Equal(t, errs, nil)
  4395. intTest = &IntTest{
  4396. Val1: 1,
  4397. Val2: 5,
  4398. }
  4399. errs = validate.Struct(intTest)
  4400. NotEqual(t, errs, nil)
  4401. AssertError(t, errs, "IntTest.Val2", "IntTest.Val2", "Val2", "Val2", "ltefield")
  4402. errs = validate.VarWithValue(int(1), int(5), "ltefield")
  4403. Equal(t, errs, nil)
  4404. errs = validate.VarWithValue(int(5), int(1), "ltefield")
  4405. NotEqual(t, errs, nil)
  4406. AssertError(t, errs, "", "", "", "", "ltefield")
  4407. type UIntTest struct {
  4408. Val1 uint `validate:"required"`
  4409. Val2 uint `validate:"required,ltefield=Val1"`
  4410. }
  4411. uIntTest := &UIntTest{
  4412. Val1: 5,
  4413. Val2: 1,
  4414. }
  4415. errs = validate.Struct(uIntTest)
  4416. Equal(t, errs, nil)
  4417. uIntTest = &UIntTest{
  4418. Val1: 1,
  4419. Val2: 5,
  4420. }
  4421. errs = validate.Struct(uIntTest)
  4422. NotEqual(t, errs, nil)
  4423. AssertError(t, errs, "UIntTest.Val2", "UIntTest.Val2", "Val2", "Val2", "ltefield")
  4424. errs = validate.VarWithValue(uint(1), uint(5), "ltefield")
  4425. Equal(t, errs, nil)
  4426. errs = validate.VarWithValue(uint(5), uint(1), "ltefield")
  4427. NotEqual(t, errs, nil)
  4428. AssertError(t, errs, "", "", "", "", "ltefield")
  4429. type FloatTest struct {
  4430. Val1 float64 `validate:"required"`
  4431. Val2 float64 `validate:"required,ltefield=Val1"`
  4432. }
  4433. floatTest := &FloatTest{
  4434. Val1: 5,
  4435. Val2: 1,
  4436. }
  4437. errs = validate.Struct(floatTest)
  4438. Equal(t, errs, nil)
  4439. floatTest = &FloatTest{
  4440. Val1: 1,
  4441. Val2: 5,
  4442. }
  4443. errs = validate.Struct(floatTest)
  4444. NotEqual(t, errs, nil)
  4445. AssertError(t, errs, "FloatTest.Val2", "FloatTest.Val2", "Val2", "Val2", "ltefield")
  4446. errs = validate.VarWithValue(float32(1), float32(5), "ltefield")
  4447. Equal(t, errs, nil)
  4448. errs = validate.VarWithValue(float32(5), float32(1), "ltefield")
  4449. NotEqual(t, errs, nil)
  4450. AssertError(t, errs, "", "", "", "", "ltefield")
  4451. errs = validate.VarWithValue(nil, 5, "ltefield")
  4452. NotEqual(t, errs, nil)
  4453. AssertError(t, errs, "", "", "", "", "ltefield")
  4454. errs = validate.VarWithValue(1, "T", "ltefield")
  4455. NotEqual(t, errs, nil)
  4456. AssertError(t, errs, "", "", "", "", "ltefield")
  4457. errs = validate.VarWithValue(1, end, "ltefield")
  4458. NotEqual(t, errs, nil)
  4459. AssertError(t, errs, "", "", "", "", "ltefield")
  4460. type TimeTest2 struct {
  4461. Start *time.Time `validate:"required"`
  4462. End *time.Time `validate:"required,ltefield=NonExistantField"`
  4463. }
  4464. timeTest2 := &TimeTest2{
  4465. Start: &end,
  4466. End: &start,
  4467. }
  4468. errs = validate.Struct(timeTest2)
  4469. NotEqual(t, errs, nil)
  4470. AssertError(t, errs, "TimeTest2.End", "TimeTest2.End", "End", "End", "ltefield")
  4471. }
  4472. func TestGteField(t *testing.T) {
  4473. validate := New()
  4474. type TimeTest struct {
  4475. Start *time.Time `validate:"required,gte"`
  4476. End *time.Time `validate:"required,gte,gtefield=Start"`
  4477. }
  4478. now := time.Now()
  4479. start := now.Add(time.Hour * 24)
  4480. end := start.Add(time.Hour * 24)
  4481. timeTest := &TimeTest{
  4482. Start: &start,
  4483. End: &end,
  4484. }
  4485. errs := validate.Struct(timeTest)
  4486. Equal(t, errs, nil)
  4487. timeTest = &TimeTest{
  4488. Start: &end,
  4489. End: &start,
  4490. }
  4491. errs = validate.Struct(timeTest)
  4492. NotEqual(t, errs, nil)
  4493. AssertError(t, errs, "TimeTest.End", "TimeTest.End", "End", "End", "gtefield")
  4494. errs = validate.VarWithValue(&end, &start, "gtefield")
  4495. Equal(t, errs, nil)
  4496. errs = validate.VarWithValue(&start, &end, "gtefield")
  4497. NotEqual(t, errs, nil)
  4498. AssertError(t, errs, "", "", "", "", "gtefield")
  4499. errs = validate.VarWithValue(&start, timeTest, "gtefield")
  4500. NotEqual(t, errs, nil)
  4501. AssertError(t, errs, "", "", "", "", "gtefield")
  4502. errs = validate.VarWithValue("test", "test", "gtefield")
  4503. Equal(t, errs, nil)
  4504. errs = validate.VarWithValue("test bigger", "test", "gtefield")
  4505. Equal(t, errs, nil)
  4506. type IntTest struct {
  4507. Val1 int `validate:"required"`
  4508. Val2 int `validate:"required,gtefield=Val1"`
  4509. }
  4510. intTest := &IntTest{
  4511. Val1: 1,
  4512. Val2: 5,
  4513. }
  4514. errs = validate.Struct(intTest)
  4515. Equal(t, errs, nil)
  4516. intTest = &IntTest{
  4517. Val1: 5,
  4518. Val2: 1,
  4519. }
  4520. errs = validate.Struct(intTest)
  4521. NotEqual(t, errs, nil)
  4522. AssertError(t, errs, "IntTest.Val2", "IntTest.Val2", "Val2", "Val2", "gtefield")
  4523. errs = validate.VarWithValue(int(5), int(1), "gtefield")
  4524. Equal(t, errs, nil)
  4525. errs = validate.VarWithValue(int(1), int(5), "gtefield")
  4526. NotEqual(t, errs, nil)
  4527. AssertError(t, errs, "", "", "", "", "gtefield")
  4528. type UIntTest struct {
  4529. Val1 uint `validate:"required"`
  4530. Val2 uint `validate:"required,gtefield=Val1"`
  4531. }
  4532. uIntTest := &UIntTest{
  4533. Val1: 1,
  4534. Val2: 5,
  4535. }
  4536. errs = validate.Struct(uIntTest)
  4537. Equal(t, errs, nil)
  4538. uIntTest = &UIntTest{
  4539. Val1: 5,
  4540. Val2: 1,
  4541. }
  4542. errs = validate.Struct(uIntTest)
  4543. NotEqual(t, errs, nil)
  4544. AssertError(t, errs, "UIntTest.Val2", "UIntTest.Val2", "Val2", "Val2", "gtefield")
  4545. errs = validate.VarWithValue(uint(5), uint(1), "gtefield")
  4546. Equal(t, errs, nil)
  4547. errs = validate.VarWithValue(uint(1), uint(5), "gtefield")
  4548. NotEqual(t, errs, nil)
  4549. AssertError(t, errs, "", "", "", "", "gtefield")
  4550. type FloatTest struct {
  4551. Val1 float64 `validate:"required"`
  4552. Val2 float64 `validate:"required,gtefield=Val1"`
  4553. }
  4554. floatTest := &FloatTest{
  4555. Val1: 1,
  4556. Val2: 5,
  4557. }
  4558. errs = validate.Struct(floatTest)
  4559. Equal(t, errs, nil)
  4560. floatTest = &FloatTest{
  4561. Val1: 5,
  4562. Val2: 1,
  4563. }
  4564. errs = validate.Struct(floatTest)
  4565. NotEqual(t, errs, nil)
  4566. AssertError(t, errs, "FloatTest.Val2", "FloatTest.Val2", "Val2", "Val2", "gtefield")
  4567. errs = validate.VarWithValue(float32(5), float32(1), "gtefield")
  4568. Equal(t, errs, nil)
  4569. errs = validate.VarWithValue(float32(1), float32(5), "gtefield")
  4570. NotEqual(t, errs, nil)
  4571. AssertError(t, errs, "", "", "", "", "gtefield")
  4572. errs = validate.VarWithValue(nil, 1, "gtefield")
  4573. NotEqual(t, errs, nil)
  4574. AssertError(t, errs, "", "", "", "", "gtefield")
  4575. errs = validate.VarWithValue(5, "T", "gtefield")
  4576. NotEqual(t, errs, nil)
  4577. AssertError(t, errs, "", "", "", "", "gtefield")
  4578. errs = validate.VarWithValue(5, start, "gtefield")
  4579. NotEqual(t, errs, nil)
  4580. AssertError(t, errs, "", "", "", "", "gtefield")
  4581. type TimeTest2 struct {
  4582. Start *time.Time `validate:"required"`
  4583. End *time.Time `validate:"required,gtefield=NonExistantField"`
  4584. }
  4585. timeTest2 := &TimeTest2{
  4586. Start: &start,
  4587. End: &end,
  4588. }
  4589. errs = validate.Struct(timeTest2)
  4590. NotEqual(t, errs, nil)
  4591. AssertError(t, errs, "TimeTest2.End", "TimeTest2.End", "End", "End", "gtefield")
  4592. }
  4593. func TestValidateByTagAndValue(t *testing.T) {
  4594. validate := New()
  4595. val := "test"
  4596. field := "test"
  4597. errs := validate.VarWithValue(val, field, "required")
  4598. Equal(t, errs, nil)
  4599. fn := func(fl FieldLevel) bool {
  4600. return fl.Parent().String() == fl.Field().String()
  4601. }
  4602. errs = validate.RegisterValidation("isequaltestfunc", fn)
  4603. Equal(t, errs, nil)
  4604. errs = validate.VarWithValue(val, field, "isequaltestfunc")
  4605. Equal(t, errs, nil)
  4606. val = "unequal"
  4607. errs = validate.VarWithValue(val, field, "isequaltestfunc")
  4608. NotEqual(t, errs, nil)
  4609. AssertError(t, errs, "", "", "", "", "isequaltestfunc")
  4610. }
  4611. func TestAddFunctions(t *testing.T) {
  4612. fn := func(fl FieldLevel) bool {
  4613. return true
  4614. }
  4615. fnCtx := func(ctx context.Context, fl FieldLevel) bool {
  4616. return true
  4617. }
  4618. validate := New()
  4619. errs := validate.RegisterValidation("new", fn)
  4620. Equal(t, errs, nil)
  4621. errs = validate.RegisterValidation("", fn)
  4622. NotEqual(t, errs, nil)
  4623. errs = validate.RegisterValidation("new", nil)
  4624. NotEqual(t, errs, nil)
  4625. errs = validate.RegisterValidation("new", fn)
  4626. Equal(t, errs, nil)
  4627. errs = validate.RegisterValidationCtx("new", fnCtx)
  4628. Equal(t, errs, nil)
  4629. PanicMatches(t, func() { _ = validate.RegisterValidation("dive", fn) }, "Tag 'dive' either contains restricted characters or is the same as a restricted tag needed for normal operation")
  4630. }
  4631. func TestChangeTag(t *testing.T) {
  4632. validate := New()
  4633. validate.SetTagName("val")
  4634. type Test struct {
  4635. Name string `val:"len=4"`
  4636. }
  4637. s := &Test{
  4638. Name: "TEST",
  4639. }
  4640. errs := validate.Struct(s)
  4641. Equal(t, errs, nil)
  4642. s.Name = ""
  4643. errs = validate.Struct(s)
  4644. NotEqual(t, errs, nil)
  4645. AssertError(t, errs, "Test.Name", "Test.Name", "Name", "Name", "len")
  4646. }
  4647. func TestUnexposedStruct(t *testing.T) {
  4648. validate := New()
  4649. type Test struct {
  4650. Name string
  4651. unexposed struct {
  4652. A string `validate:"required"`
  4653. }
  4654. }
  4655. s := &Test{
  4656. Name: "TEST",
  4657. }
  4658. Equal(t, s.unexposed.A, "")
  4659. errs := validate.Struct(s)
  4660. Equal(t, errs, nil)
  4661. }
  4662. func TestBadParams(t *testing.T) {
  4663. validate := New()
  4664. i := 1
  4665. errs := validate.Var(i, "-")
  4666. Equal(t, errs, nil)
  4667. PanicMatches(t, func() { _ = validate.Var(i, "len=a") }, "strconv.ParseInt: parsing \"a\": invalid syntax")
  4668. PanicMatches(t, func() { _ = validate.Var(i, "len=a") }, "strconv.ParseInt: parsing \"a\": invalid syntax")
  4669. var ui uint = 1
  4670. PanicMatches(t, func() { _ = validate.Var(ui, "len=a") }, "strconv.ParseUint: parsing \"a\": invalid syntax")
  4671. f := 1.23
  4672. PanicMatches(t, func() { _ = validate.Var(f, "len=a") }, "strconv.ParseFloat: parsing \"a\": invalid syntax")
  4673. }
  4674. func TestLength(t *testing.T) {
  4675. validate := New()
  4676. i := true
  4677. PanicMatches(t, func() { _ = validate.Var(i, "len") }, "Bad field type bool")
  4678. }
  4679. func TestIsGt(t *testing.T) {
  4680. validate := New()
  4681. myMap := map[string]string{}
  4682. errs := validate.Var(myMap, "gt=0")
  4683. NotEqual(t, errs, nil)
  4684. f := 1.23
  4685. errs = validate.Var(f, "gt=5")
  4686. NotEqual(t, errs, nil)
  4687. AssertError(t, errs, "", "", "", "", "gt")
  4688. var ui uint = 5
  4689. errs = validate.Var(ui, "gt=10")
  4690. NotEqual(t, errs, nil)
  4691. AssertError(t, errs, "", "", "", "", "gt")
  4692. i := true
  4693. PanicMatches(t, func() { _ = validate.Var(i, "gt") }, "Bad field type bool")
  4694. tm := time.Now().UTC()
  4695. tm = tm.Add(time.Hour * 24)
  4696. errs = validate.Var(tm, "gt")
  4697. Equal(t, errs, nil)
  4698. t2 := time.Now().UTC().Add(-time.Hour)
  4699. errs = validate.Var(t2, "gt")
  4700. NotEqual(t, errs, nil)
  4701. AssertError(t, errs, "", "", "", "", "gt")
  4702. type Test struct {
  4703. Now *time.Time `validate:"gt"`
  4704. }
  4705. s := &Test{
  4706. Now: &tm,
  4707. }
  4708. errs = validate.Struct(s)
  4709. Equal(t, errs, nil)
  4710. s = &Test{
  4711. Now: &t2,
  4712. }
  4713. errs = validate.Struct(s)
  4714. NotEqual(t, errs, nil)
  4715. AssertError(t, errs, "Test.Now", "Test.Now", "Now", "Now", "gt")
  4716. }
  4717. func TestIsGte(t *testing.T) {
  4718. validate := New()
  4719. i := true
  4720. PanicMatches(t, func() { _ = validate.Var(i, "gte") }, "Bad field type bool")
  4721. t1 := time.Now().UTC()
  4722. t1 = t1.Add(time.Hour * 24)
  4723. errs := validate.Var(t1, "gte")
  4724. Equal(t, errs, nil)
  4725. t2 := time.Now().UTC().Add(-time.Hour)
  4726. errs = validate.Var(t2, "gte")
  4727. NotEqual(t, errs, nil)
  4728. AssertError(t, errs, "", "", "", "", "gte")
  4729. type Test struct {
  4730. Now *time.Time `validate:"gte"`
  4731. }
  4732. s := &Test{
  4733. Now: &t1,
  4734. }
  4735. errs = validate.Struct(s)
  4736. Equal(t, errs, nil)
  4737. s = &Test{
  4738. Now: &t2,
  4739. }
  4740. errs = validate.Struct(s)
  4741. NotEqual(t, errs, nil)
  4742. AssertError(t, errs, "Test.Now", "Test.Now", "Now", "Now", "gte")
  4743. }
  4744. func TestIsLt(t *testing.T) {
  4745. validate := New()
  4746. myMap := map[string]string{}
  4747. errs := validate.Var(myMap, "lt=0")
  4748. NotEqual(t, errs, nil)
  4749. AssertError(t, errs, "", "", "", "", "lt")
  4750. f := 1.23
  4751. errs = validate.Var(f, "lt=0")
  4752. NotEqual(t, errs, nil)
  4753. AssertError(t, errs, "", "", "", "", "lt")
  4754. var ui uint = 5
  4755. errs = validate.Var(ui, "lt=0")
  4756. NotEqual(t, errs, nil)
  4757. AssertError(t, errs, "", "", "", "", "lt")
  4758. i := true
  4759. PanicMatches(t, func() { _ = validate.Var(i, "lt") }, "Bad field type bool")
  4760. t1 := time.Now().UTC().Add(-time.Hour)
  4761. errs = validate.Var(t1, "lt")
  4762. Equal(t, errs, nil)
  4763. t2 := time.Now().UTC()
  4764. t2 = t2.Add(time.Hour * 24)
  4765. errs = validate.Var(t2, "lt")
  4766. NotEqual(t, errs, nil)
  4767. AssertError(t, errs, "", "", "", "", "lt")
  4768. type Test struct {
  4769. Now *time.Time `validate:"lt"`
  4770. }
  4771. s := &Test{
  4772. Now: &t1,
  4773. }
  4774. errs = validate.Struct(s)
  4775. Equal(t, errs, nil)
  4776. s = &Test{
  4777. Now: &t2,
  4778. }
  4779. errs = validate.Struct(s)
  4780. NotEqual(t, errs, nil)
  4781. AssertError(t, errs, "Test.Now", "Test.Now", "Now", "Now", "lt")
  4782. }
  4783. func TestIsLte(t *testing.T) {
  4784. validate := New()
  4785. i := true
  4786. PanicMatches(t, func() { _ = validate.Var(i, "lte") }, "Bad field type bool")
  4787. t1 := time.Now().UTC().Add(-time.Hour)
  4788. errs := validate.Var(t1, "lte")
  4789. Equal(t, errs, nil)
  4790. t2 := time.Now().UTC()
  4791. t2 = t2.Add(time.Hour * 24)
  4792. errs = validate.Var(t2, "lte")
  4793. NotEqual(t, errs, nil)
  4794. AssertError(t, errs, "", "", "", "", "lte")
  4795. type Test struct {
  4796. Now *time.Time `validate:"lte"`
  4797. }
  4798. s := &Test{
  4799. Now: &t1,
  4800. }
  4801. errs = validate.Struct(s)
  4802. Equal(t, errs, nil)
  4803. s = &Test{
  4804. Now: &t2,
  4805. }
  4806. errs = validate.Struct(s)
  4807. NotEqual(t, errs, nil)
  4808. }
  4809. func TestUrnRFC2141(t *testing.T) {
  4810. var tests = []struct {
  4811. param string
  4812. expected bool
  4813. }{
  4814. {"urn:a:b", true},
  4815. {"urn:a::", true},
  4816. {"urn:a:-", true},
  4817. {"URN:simple:simple", true},
  4818. {"urn:urna:simple", true},
  4819. {"urn:burnout:nss", true},
  4820. {"urn:burn:nss", true},
  4821. {"urn:urnurnurn:x", true},
  4822. {"urn:abcdefghilmnopqrstuvzabcdefghilm:x", true},
  4823. {"URN:123:x", true},
  4824. {"URN:abcd-:x", true},
  4825. {"URN:abcd-abcd:x", true},
  4826. {"urn:urnx:urn", true},
  4827. {"urn:ciao:a:b:c", true},
  4828. {"urn:aaa:x:y:", true},
  4829. {"urn:ciao:-", true},
  4830. {"urn:colon:::::nss", true},
  4831. {"urn:ciao:@!=%2C(xyz)+a,b.*@g=$_'", true},
  4832. {"URN:hexes:%25", true},
  4833. {"URN:x:abc%1Dz%2F%3az", true},
  4834. {"URN:foo:a123,456", true},
  4835. {"urn:foo:a123,456", true},
  4836. {"urn:FOO:a123,456", true},
  4837. {"urn:foo:A123,456", true},
  4838. {"urn:foo:a123%2C456", true},
  4839. {"URN:FOO:a123%2c456", true},
  4840. {"URN:FOO:ABC%FFabc123%2c456", true},
  4841. {"URN:FOO:ABC%FFabc123%2C456%9A", true},
  4842. {"urn:ietf:params:scim:schemas:core:2.0:User", true},
  4843. {"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:meta.lastModified", true},
  4844. {"URN:-xxx:x", false},
  4845. {"urn::colon:nss", false},
  4846. {"urn:abcdefghilmnopqrstuvzabcdefghilmn:specificstring", false},
  4847. {"URN:a!?:x", false},
  4848. {"URN:#,:x", false},
  4849. {"urn:urn:NSS", false},
  4850. {"urn:URN:NSS", false},
  4851. {"urn:white space:NSS", false},
  4852. {"urn:concat:no spaces", false},
  4853. {"urn:a:%", false},
  4854. {"urn:", false},
  4855. }
  4856. tag := "urn_rfc2141"
  4857. validate := New()
  4858. for i, test := range tests {
  4859. errs := validate.Var(test.param, tag)
  4860. if test.expected {
  4861. if !IsEqual(errs, nil) {
  4862. t.Fatalf("Index: %d URN failed Error: %s", i, errs)
  4863. }
  4864. } else {
  4865. if IsEqual(errs, nil) {
  4866. t.Fatalf("Index: %d URN failed Error: %s", i, errs)
  4867. } else {
  4868. val := getError(errs, "", "")
  4869. if val.Tag() != tag {
  4870. t.Fatalf("Index: %d URN failed Error: %s", i, errs)
  4871. }
  4872. }
  4873. }
  4874. }
  4875. i := 1
  4876. PanicMatches(t, func() { _ = validate.Var(i, tag) }, "Bad field type int")
  4877. }
  4878. func TestUrl(t *testing.T) {
  4879. var tests = []struct {
  4880. param string
  4881. expected bool
  4882. }{
  4883. {"http://foo.bar#com", true},
  4884. {"http://foobar.com", true},
  4885. {"https://foobar.com", true},
  4886. {"foobar.com", false},
  4887. {"http://foobar.coffee/", true},
  4888. {"http://foobar.中文网/", true},
  4889. {"http://foobar.org/", true},
  4890. {"http://foobar.org:8080/", true},
  4891. {"ftp://foobar.ru/", true},
  4892. {"http://user:pass@www.foobar.com/", true},
  4893. {"http://127.0.0.1/", true},
  4894. {"http://duckduckgo.com/?q=%2F", true},
  4895. {"http://localhost:3000/", true},
  4896. {"http://foobar.com/?foo=bar#baz=qux", true},
  4897. {"http://foobar.com?foo=bar", true},
  4898. {"http://www.xn--froschgrn-x9a.net/", true},
  4899. {"", false},
  4900. {"xyz://foobar.com", true},
  4901. {"invalid.", false},
  4902. {".com", false},
  4903. {"rtmp://foobar.com", true},
  4904. {"http://www.foo_bar.com/", true},
  4905. {"http://localhost:3000/", true},
  4906. {"http://foobar.com/#baz", true},
  4907. {"http://foobar.com#baz=qux", true},
  4908. {"http://foobar.com/t$-_.+!*\\'(),", true},
  4909. {"http://www.foobar.com/~foobar", true},
  4910. {"http://www.-foobar.com/", true},
  4911. {"http://www.foo---bar.com/", true},
  4912. {"mailto:someone@example.com", true},
  4913. {"irc://irc.server.org/channel", true},
  4914. {"irc://#channel@network", true},
  4915. {"/abs/test/dir", false},
  4916. {"./rel/test/dir", false},
  4917. }
  4918. validate := New()
  4919. for i, test := range tests {
  4920. errs := validate.Var(test.param, "url")
  4921. if test.expected {
  4922. if !IsEqual(errs, nil) {
  4923. t.Fatalf("Index: %d URL failed Error: %s", i, errs)
  4924. }
  4925. } else {
  4926. if IsEqual(errs, nil) {
  4927. t.Fatalf("Index: %d URL failed Error: %s", i, errs)
  4928. } else {
  4929. val := getError(errs, "", "")
  4930. if val.Tag() != "url" {
  4931. t.Fatalf("Index: %d URL failed Error: %s", i, errs)
  4932. }
  4933. }
  4934. }
  4935. }
  4936. i := 1
  4937. PanicMatches(t, func() { _ = validate.Var(i, "url") }, "Bad field type int")
  4938. }
  4939. func TestUri(t *testing.T) {
  4940. var tests = []struct {
  4941. param string
  4942. expected bool
  4943. }{
  4944. {"http://foo.bar#com", true},
  4945. {"http://foobar.com", true},
  4946. {"https://foobar.com", true},
  4947. {"foobar.com", false},
  4948. {"http://foobar.coffee/", true},
  4949. {"http://foobar.中文网/", true},
  4950. {"http://foobar.org/", true},
  4951. {"http://foobar.org:8080/", true},
  4952. {"ftp://foobar.ru/", true},
  4953. {"http://user:pass@www.foobar.com/", true},
  4954. {"http://127.0.0.1/", true},
  4955. {"http://duckduckgo.com/?q=%2F", true},
  4956. {"http://localhost:3000/", true},
  4957. {"http://foobar.com/?foo=bar#baz=qux", true},
  4958. {"http://foobar.com?foo=bar", true},
  4959. {"http://www.xn--froschgrn-x9a.net/", true},
  4960. {"", false},
  4961. {"xyz://foobar.com", true},
  4962. {"invalid.", false},
  4963. {".com", false},
  4964. {"rtmp://foobar.com", true},
  4965. {"http://www.foo_bar.com/", true},
  4966. {"http://localhost:3000/", true},
  4967. {"http://foobar.com#baz=qux", true},
  4968. {"http://foobar.com/t$-_.+!*\\'(),", true},
  4969. {"http://www.foobar.com/~foobar", true},
  4970. {"http://www.-foobar.com/", true},
  4971. {"http://www.foo---bar.com/", true},
  4972. {"mailto:someone@example.com", true},
  4973. {"irc://irc.server.org/channel", true},
  4974. {"irc://#channel@network", true},
  4975. {"/abs/test/dir", true},
  4976. {"./rel/test/dir", false},
  4977. }
  4978. validate := New()
  4979. for i, test := range tests {
  4980. errs := validate.Var(test.param, "uri")
  4981. if test.expected {
  4982. if !IsEqual(errs, nil) {
  4983. t.Fatalf("Index: %d URI failed Error: %s", i, errs)
  4984. }
  4985. } else {
  4986. if IsEqual(errs, nil) {
  4987. t.Fatalf("Index: %d URI failed Error: %s", i, errs)
  4988. } else {
  4989. val := getError(errs, "", "")
  4990. if val.Tag() != "uri" {
  4991. t.Fatalf("Index: %d URI failed Error: %s", i, errs)
  4992. }
  4993. }
  4994. }
  4995. }
  4996. i := 1
  4997. PanicMatches(t, func() { _ = validate.Var(i, "uri") }, "Bad field type int")
  4998. }
  4999. func TestOrTag(t *testing.T) {
  5000. validate := New()
  5001. s := "rgba(0,31,255,0.5)"
  5002. errs := validate.Var(s, "rgb|rgba")
  5003. Equal(t, errs, nil)
  5004. s = "rgba(0,31,255,0.5)"
  5005. errs = validate.Var(s, "rgb|rgba|len=18")
  5006. Equal(t, errs, nil)
  5007. s = "this ain't right"
  5008. errs = validate.Var(s, "rgb|rgba")
  5009. NotEqual(t, errs, nil)
  5010. AssertError(t, errs, "", "", "", "", "rgb|rgba")
  5011. s = "this ain't right"
  5012. errs = validate.Var(s, "rgb|rgba|len=10")
  5013. NotEqual(t, errs, nil)
  5014. AssertError(t, errs, "", "", "", "", "rgb|rgba|len=10")
  5015. s = "this is right"
  5016. errs = validate.Var(s, "rgb|rgba|len=13")
  5017. Equal(t, errs, nil)
  5018. s = ""
  5019. errs = validate.Var(s, "omitempty,rgb|rgba")
  5020. Equal(t, errs, nil)
  5021. s = "green"
  5022. errs = validate.Var(s, "eq=|eq=blue,rgb|rgba") //should fail on first validation block
  5023. NotEqual(t, errs, nil)
  5024. ve := errs.(ValidationErrors)
  5025. Equal(t, len(ve), 1)
  5026. Equal(t, ve[0].Tag(), "eq=|eq=blue")
  5027. s = "this is right, but a blank or isn't"
  5028. PanicMatches(t, func() { _ = validate.Var(s, "rgb||len=13") }, "Invalid validation tag on field ''")
  5029. PanicMatches(t, func() { _ = validate.Var(s, "rgb|rgbaa|len=13") }, "Undefined validation function 'rgbaa' on field ''")
  5030. v2 := New()
  5031. v2.RegisterTagNameFunc(func(fld reflect.StructField) string {
  5032. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  5033. if name == "-" {
  5034. return ""
  5035. }
  5036. return name
  5037. })
  5038. type Colors struct {
  5039. Fav string `validate:"rgb|rgba" json:"fc"`
  5040. }
  5041. c := Colors{Fav: "this ain't right"}
  5042. err := v2.Struct(c)
  5043. NotEqual(t, err, nil)
  5044. errs = err.(ValidationErrors)
  5045. fe := getError(errs, "Colors.fc", "Colors.Fav")
  5046. NotEqual(t, fe, nil)
  5047. }
  5048. func TestHsla(t *testing.T) {
  5049. validate := New()
  5050. s := "hsla(360,100%,100%,1)"
  5051. errs := validate.Var(s, "hsla")
  5052. Equal(t, errs, nil)
  5053. s = "hsla(360,100%,100%,0.5)"
  5054. errs = validate.Var(s, "hsla")
  5055. Equal(t, errs, nil)
  5056. s = "hsla(0,0%,0%, 0)"
  5057. errs = validate.Var(s, "hsla")
  5058. Equal(t, errs, nil)
  5059. s = "hsl(361,100%,50%,1)"
  5060. errs = validate.Var(s, "hsla")
  5061. NotEqual(t, errs, nil)
  5062. AssertError(t, errs, "", "", "", "", "hsla")
  5063. s = "hsl(361,100%,50%)"
  5064. errs = validate.Var(s, "hsla")
  5065. NotEqual(t, errs, nil)
  5066. AssertError(t, errs, "", "", "", "", "hsla")
  5067. s = "hsla(361,100%,50%)"
  5068. errs = validate.Var(s, "hsla")
  5069. NotEqual(t, errs, nil)
  5070. AssertError(t, errs, "", "", "", "", "hsla")
  5071. s = "hsla(360,101%,50%)"
  5072. errs = validate.Var(s, "hsla")
  5073. NotEqual(t, errs, nil)
  5074. AssertError(t, errs, "", "", "", "", "hsla")
  5075. s = "hsla(360,100%,101%)"
  5076. errs = validate.Var(s, "hsla")
  5077. NotEqual(t, errs, nil)
  5078. AssertError(t, errs, "", "", "", "", "hsla")
  5079. i := 1
  5080. errs = validate.Var(i, "hsla")
  5081. NotEqual(t, errs, nil)
  5082. AssertError(t, errs, "", "", "", "", "hsla")
  5083. }
  5084. func TestHsl(t *testing.T) {
  5085. validate := New()
  5086. s := "hsl(360,100%,50%)"
  5087. errs := validate.Var(s, "hsl")
  5088. Equal(t, errs, nil)
  5089. s = "hsl(0,0%,0%)"
  5090. errs = validate.Var(s, "hsl")
  5091. Equal(t, errs, nil)
  5092. s = "hsl(361,100%,50%)"
  5093. errs = validate.Var(s, "hsl")
  5094. NotEqual(t, errs, nil)
  5095. AssertError(t, errs, "", "", "", "", "hsl")
  5096. s = "hsl(361,101%,50%)"
  5097. errs = validate.Var(s, "hsl")
  5098. NotEqual(t, errs, nil)
  5099. AssertError(t, errs, "", "", "", "", "hsl")
  5100. s = "hsl(361,100%,101%)"
  5101. errs = validate.Var(s, "hsl")
  5102. NotEqual(t, errs, nil)
  5103. AssertError(t, errs, "", "", "", "", "hsl")
  5104. s = "hsl(-10,100%,100%)"
  5105. errs = validate.Var(s, "hsl")
  5106. NotEqual(t, errs, nil)
  5107. AssertError(t, errs, "", "", "", "", "hsl")
  5108. i := 1
  5109. errs = validate.Var(i, "hsl")
  5110. NotEqual(t, errs, nil)
  5111. AssertError(t, errs, "", "", "", "", "hsl")
  5112. }
  5113. func TestRgba(t *testing.T) {
  5114. validate := New()
  5115. s := "rgba(0,31,255,0.5)"
  5116. errs := validate.Var(s, "rgba")
  5117. Equal(t, errs, nil)
  5118. s = "rgba(0,31,255,0.12)"
  5119. errs = validate.Var(s, "rgba")
  5120. Equal(t, errs, nil)
  5121. s = "rgba(12%,55%,100%,0.12)"
  5122. errs = validate.Var(s, "rgba")
  5123. Equal(t, errs, nil)
  5124. s = "rgba( 0, 31, 255, 0.5)"
  5125. errs = validate.Var(s, "rgba")
  5126. Equal(t, errs, nil)
  5127. s = "rgba(12%,55,100%,0.12)"
  5128. errs = validate.Var(s, "rgba")
  5129. NotEqual(t, errs, nil)
  5130. AssertError(t, errs, "", "", "", "", "rgba")
  5131. s = "rgb(0, 31, 255)"
  5132. errs = validate.Var(s, "rgba")
  5133. NotEqual(t, errs, nil)
  5134. AssertError(t, errs, "", "", "", "", "rgba")
  5135. s = "rgb(1,349,275,0.5)"
  5136. errs = validate.Var(s, "rgba")
  5137. NotEqual(t, errs, nil)
  5138. AssertError(t, errs, "", "", "", "", "rgba")
  5139. s = "rgb(01,31,255,0.5)"
  5140. errs = validate.Var(s, "rgba")
  5141. NotEqual(t, errs, nil)
  5142. AssertError(t, errs, "", "", "", "", "rgba")
  5143. i := 1
  5144. errs = validate.Var(i, "rgba")
  5145. NotEqual(t, errs, nil)
  5146. AssertError(t, errs, "", "", "", "", "rgba")
  5147. }
  5148. func TestRgb(t *testing.T) {
  5149. validate := New()
  5150. s := "rgb(0,31,255)"
  5151. errs := validate.Var(s, "rgb")
  5152. Equal(t, errs, nil)
  5153. s = "rgb(0, 31, 255)"
  5154. errs = validate.Var(s, "rgb")
  5155. Equal(t, errs, nil)
  5156. s = "rgb(10%, 50%, 100%)"
  5157. errs = validate.Var(s, "rgb")
  5158. Equal(t, errs, nil)
  5159. s = "rgb(10%, 50%, 55)"
  5160. errs = validate.Var(s, "rgb")
  5161. NotEqual(t, errs, nil)
  5162. AssertError(t, errs, "", "", "", "", "rgb")
  5163. s = "rgb(1,349,275)"
  5164. errs = validate.Var(s, "rgb")
  5165. NotEqual(t, errs, nil)
  5166. AssertError(t, errs, "", "", "", "", "rgb")
  5167. s = "rgb(01,31,255)"
  5168. errs = validate.Var(s, "rgb")
  5169. NotEqual(t, errs, nil)
  5170. AssertError(t, errs, "", "", "", "", "rgb")
  5171. s = "rgba(0,31,255)"
  5172. errs = validate.Var(s, "rgb")
  5173. NotEqual(t, errs, nil)
  5174. AssertError(t, errs, "", "", "", "", "rgb")
  5175. i := 1
  5176. errs = validate.Var(i, "rgb")
  5177. NotEqual(t, errs, nil)
  5178. AssertError(t, errs, "", "", "", "", "rgb")
  5179. }
  5180. func TestEmail(t *testing.T) {
  5181. validate := New()
  5182. s := "test@mail.com"
  5183. errs := validate.Var(s, "email")
  5184. Equal(t, errs, nil)
  5185. s = "Dörte@Sörensen.example.com"
  5186. errs = validate.Var(s, "email")
  5187. Equal(t, errs, nil)
  5188. s = "θσερ@εχαμπλε.ψομ"
  5189. errs = validate.Var(s, "email")
  5190. Equal(t, errs, nil)
  5191. s = "юзер@екзампл.ком"
  5192. errs = validate.Var(s, "email")
  5193. Equal(t, errs, nil)
  5194. s = "उपयोगकर्ता@उदाहरण.कॉम"
  5195. errs = validate.Var(s, "email")
  5196. Equal(t, errs, nil)
  5197. s = "用户@例子.广告"
  5198. errs = validate.Var(s, "email")
  5199. Equal(t, errs, nil)
  5200. s = "mail@domain_with_underscores.org"
  5201. errs = validate.Var(s, "email")
  5202. NotEqual(t, errs, nil)
  5203. AssertError(t, errs, "", "", "", "", "email")
  5204. s = ""
  5205. errs = validate.Var(s, "email")
  5206. NotEqual(t, errs, nil)
  5207. AssertError(t, errs, "", "", "", "", "email")
  5208. s = "test@email"
  5209. errs = validate.Var(s, "email")
  5210. NotEqual(t, errs, nil)
  5211. AssertError(t, errs, "", "", "", "", "email")
  5212. s = "test@email."
  5213. errs = validate.Var(s, "email")
  5214. NotEqual(t, errs, nil)
  5215. AssertError(t, errs, "", "", "", "", "email")
  5216. s = "@email.com"
  5217. errs = validate.Var(s, "email")
  5218. NotEqual(t, errs, nil)
  5219. AssertError(t, errs, "", "", "", "", "email")
  5220. s = `"test test"@email.com`
  5221. errs = validate.Var(s, "email")
  5222. Equal(t, errs, nil)
  5223. s = `"@email.com`
  5224. errs = validate.Var(s, "email")
  5225. NotEqual(t, errs, nil)
  5226. AssertError(t, errs, "", "", "", "", "email")
  5227. i := true
  5228. errs = validate.Var(i, "email")
  5229. NotEqual(t, errs, nil)
  5230. AssertError(t, errs, "", "", "", "", "email")
  5231. }
  5232. func TestHexColor(t *testing.T) {
  5233. validate := New()
  5234. s := "#fff"
  5235. errs := validate.Var(s, "hexcolor")
  5236. Equal(t, errs, nil)
  5237. s = "#c2c2c2"
  5238. errs = validate.Var(s, "hexcolor")
  5239. Equal(t, errs, nil)
  5240. s = "fff"
  5241. errs = validate.Var(s, "hexcolor")
  5242. NotEqual(t, errs, nil)
  5243. AssertError(t, errs, "", "", "", "", "hexcolor")
  5244. s = "fffFF"
  5245. errs = validate.Var(s, "hexcolor")
  5246. NotEqual(t, errs, nil)
  5247. AssertError(t, errs, "", "", "", "", "hexcolor")
  5248. i := true
  5249. errs = validate.Var(i, "hexcolor")
  5250. NotEqual(t, errs, nil)
  5251. AssertError(t, errs, "", "", "", "", "hexcolor")
  5252. }
  5253. func TestHexadecimal(t *testing.T) {
  5254. validate := New()
  5255. s := "ff0044"
  5256. errs := validate.Var(s, "hexadecimal")
  5257. Equal(t, errs, nil)
  5258. s = "abcdefg"
  5259. errs = validate.Var(s, "hexadecimal")
  5260. NotEqual(t, errs, nil)
  5261. AssertError(t, errs, "", "", "", "", "hexadecimal")
  5262. i := true
  5263. errs = validate.Var(i, "hexadecimal")
  5264. NotEqual(t, errs, nil)
  5265. AssertError(t, errs, "", "", "", "", "hexadecimal")
  5266. }
  5267. func TestNumber(t *testing.T) {
  5268. validate := New()
  5269. s := "1"
  5270. errs := validate.Var(s, "number")
  5271. Equal(t, errs, nil)
  5272. s = "+1"
  5273. errs = validate.Var(s, "number")
  5274. NotEqual(t, errs, nil)
  5275. AssertError(t, errs, "", "", "", "", "number")
  5276. s = "-1"
  5277. errs = validate.Var(s, "number")
  5278. NotEqual(t, errs, nil)
  5279. AssertError(t, errs, "", "", "", "", "number")
  5280. s = "1.12"
  5281. errs = validate.Var(s, "number")
  5282. NotEqual(t, errs, nil)
  5283. AssertError(t, errs, "", "", "", "", "number")
  5284. s = "+1.12"
  5285. errs = validate.Var(s, "number")
  5286. NotEqual(t, errs, nil)
  5287. AssertError(t, errs, "", "", "", "", "number")
  5288. s = "-1.12"
  5289. errs = validate.Var(s, "number")
  5290. NotEqual(t, errs, nil)
  5291. AssertError(t, errs, "", "", "", "", "number")
  5292. s = "1."
  5293. errs = validate.Var(s, "number")
  5294. NotEqual(t, errs, nil)
  5295. AssertError(t, errs, "", "", "", "", "number")
  5296. s = "1.o"
  5297. errs = validate.Var(s, "number")
  5298. NotEqual(t, errs, nil)
  5299. AssertError(t, errs, "", "", "", "", "number")
  5300. i := 1
  5301. errs = validate.Var(i, "number")
  5302. Equal(t, errs, nil)
  5303. }
  5304. func TestNumeric(t *testing.T) {
  5305. validate := New()
  5306. s := "1"
  5307. errs := validate.Var(s, "numeric")
  5308. Equal(t, errs, nil)
  5309. s = "+1"
  5310. errs = validate.Var(s, "numeric")
  5311. Equal(t, errs, nil)
  5312. s = "-1"
  5313. errs = validate.Var(s, "numeric")
  5314. Equal(t, errs, nil)
  5315. s = "1.12"
  5316. errs = validate.Var(s, "numeric")
  5317. Equal(t, errs, nil)
  5318. s = "+1.12"
  5319. errs = validate.Var(s, "numeric")
  5320. Equal(t, errs, nil)
  5321. s = "-1.12"
  5322. errs = validate.Var(s, "numeric")
  5323. Equal(t, errs, nil)
  5324. s = "1."
  5325. errs = validate.Var(s, "numeric")
  5326. NotEqual(t, errs, nil)
  5327. AssertError(t, errs, "", "", "", "", "numeric")
  5328. s = "1.o"
  5329. errs = validate.Var(s, "numeric")
  5330. NotEqual(t, errs, nil)
  5331. AssertError(t, errs, "", "", "", "", "numeric")
  5332. i := 1
  5333. errs = validate.Var(i, "numeric")
  5334. Equal(t, errs, nil)
  5335. }
  5336. func TestAlphaNumeric(t *testing.T) {
  5337. validate := New()
  5338. s := "abcd123"
  5339. errs := validate.Var(s, "alphanum")
  5340. Equal(t, errs, nil)
  5341. s = "abc!23"
  5342. errs = validate.Var(s, "alphanum")
  5343. NotEqual(t, errs, nil)
  5344. AssertError(t, errs, "", "", "", "", "alphanum")
  5345. errs = validate.Var(1, "alphanum")
  5346. NotEqual(t, errs, nil)
  5347. AssertError(t, errs, "", "", "", "", "alphanum")
  5348. }
  5349. func TestAlpha(t *testing.T) {
  5350. validate := New()
  5351. s := "abcd"
  5352. errs := validate.Var(s, "alpha")
  5353. Equal(t, errs, nil)
  5354. s = "abc®"
  5355. errs = validate.Var(s, "alpha")
  5356. NotEqual(t, errs, nil)
  5357. AssertError(t, errs, "", "", "", "", "alpha")
  5358. s = "abc÷"
  5359. errs = validate.Var(s, "alpha")
  5360. NotEqual(t, errs, nil)
  5361. AssertError(t, errs, "", "", "", "", "alpha")
  5362. s = "abc1"
  5363. errs = validate.Var(s, "alpha")
  5364. NotEqual(t, errs, nil)
  5365. AssertError(t, errs, "", "", "", "", "alpha")
  5366. s = "this is a test string"
  5367. errs = validate.Var(s, "alpha")
  5368. NotEqual(t, errs, nil)
  5369. AssertError(t, errs, "", "", "", "", "alpha")
  5370. errs = validate.Var(1, "alpha")
  5371. NotEqual(t, errs, nil)
  5372. AssertError(t, errs, "", "", "", "", "alpha")
  5373. }
  5374. func TestStructStringValidation(t *testing.T) {
  5375. validate := New()
  5376. tSuccess := &TestString{
  5377. Required: "Required",
  5378. Len: "length==10",
  5379. Min: "min=1",
  5380. Max: "1234567890",
  5381. MinMax: "12345",
  5382. Lt: "012345678",
  5383. Lte: "0123456789",
  5384. Gt: "01234567890",
  5385. Gte: "0123456789",
  5386. OmitEmpty: "",
  5387. Sub: &SubTest{
  5388. Test: "1",
  5389. },
  5390. SubIgnore: &SubTest{
  5391. Test: "",
  5392. },
  5393. Anonymous: struct {
  5394. A string `validate:"required"`
  5395. }{
  5396. A: "1",
  5397. },
  5398. Iface: &Impl{
  5399. F: "123",
  5400. },
  5401. }
  5402. errs := validate.Struct(tSuccess)
  5403. Equal(t, errs, nil)
  5404. tFail := &TestString{
  5405. Required: "",
  5406. Len: "",
  5407. Min: "",
  5408. Max: "12345678901",
  5409. MinMax: "",
  5410. Lt: "0123456789",
  5411. Lte: "01234567890",
  5412. Gt: "1",
  5413. Gte: "1",
  5414. OmitEmpty: "12345678901",
  5415. Sub: &SubTest{
  5416. Test: "",
  5417. },
  5418. Anonymous: struct {
  5419. A string `validate:"required"`
  5420. }{
  5421. A: "",
  5422. },
  5423. Iface: &Impl{
  5424. F: "12",
  5425. },
  5426. }
  5427. errs = validate.Struct(tFail)
  5428. // Assert Top Level
  5429. NotEqual(t, errs, nil)
  5430. Equal(t, len(errs.(ValidationErrors)), 13)
  5431. // Assert Fields
  5432. AssertError(t, errs, "TestString.Required", "TestString.Required", "Required", "Required", "required")
  5433. AssertError(t, errs, "TestString.Len", "TestString.Len", "Len", "Len", "len")
  5434. AssertError(t, errs, "TestString.Min", "TestString.Min", "Min", "Min", "min")
  5435. AssertError(t, errs, "TestString.Max", "TestString.Max", "Max", "Max", "max")
  5436. AssertError(t, errs, "TestString.MinMax", "TestString.MinMax", "MinMax", "MinMax", "min")
  5437. AssertError(t, errs, "TestString.Lt", "TestString.Lt", "Lt", "Lt", "lt")
  5438. AssertError(t, errs, "TestString.Lte", "TestString.Lte", "Lte", "Lte", "lte")
  5439. AssertError(t, errs, "TestString.Gt", "TestString.Gt", "Gt", "Gt", "gt")
  5440. AssertError(t, errs, "TestString.Gte", "TestString.Gte", "Gte", "Gte", "gte")
  5441. AssertError(t, errs, "TestString.OmitEmpty", "TestString.OmitEmpty", "OmitEmpty", "OmitEmpty", "max")
  5442. // Nested Struct Field Errs
  5443. AssertError(t, errs, "TestString.Anonymous.A", "TestString.Anonymous.A", "A", "A", "required")
  5444. AssertError(t, errs, "TestString.Sub.Test", "TestString.Sub.Test", "Test", "Test", "required")
  5445. AssertError(t, errs, "TestString.Iface.F", "TestString.Iface.F", "F", "F", "len")
  5446. }
  5447. func TestStructInt32Validation(t *testing.T) {
  5448. type TestInt32 struct {
  5449. Required int `validate:"required"`
  5450. Len int `validate:"len=10"`
  5451. Min int `validate:"min=1"`
  5452. Max int `validate:"max=10"`
  5453. MinMax int `validate:"min=1,max=10"`
  5454. Lt int `validate:"lt=10"`
  5455. Lte int `validate:"lte=10"`
  5456. Gt int `validate:"gt=10"`
  5457. Gte int `validate:"gte=10"`
  5458. OmitEmpty int `validate:"omitempty,min=1,max=10"`
  5459. }
  5460. tSuccess := &TestInt32{
  5461. Required: 1,
  5462. Len: 10,
  5463. Min: 1,
  5464. Max: 10,
  5465. MinMax: 5,
  5466. Lt: 9,
  5467. Lte: 10,
  5468. Gt: 11,
  5469. Gte: 10,
  5470. OmitEmpty: 0,
  5471. }
  5472. validate := New()
  5473. errs := validate.Struct(tSuccess)
  5474. Equal(t, errs, nil)
  5475. tFail := &TestInt32{
  5476. Required: 0,
  5477. Len: 11,
  5478. Min: -1,
  5479. Max: 11,
  5480. MinMax: -1,
  5481. Lt: 10,
  5482. Lte: 11,
  5483. Gt: 10,
  5484. Gte: 9,
  5485. OmitEmpty: 11,
  5486. }
  5487. errs = validate.Struct(tFail)
  5488. // Assert Top Level
  5489. NotEqual(t, errs, nil)
  5490. Equal(t, len(errs.(ValidationErrors)), 10)
  5491. // Assert Fields
  5492. AssertError(t, errs, "TestInt32.Required", "TestInt32.Required", "Required", "Required", "required")
  5493. AssertError(t, errs, "TestInt32.Len", "TestInt32.Len", "Len", "Len", "len")
  5494. AssertError(t, errs, "TestInt32.Min", "TestInt32.Min", "Min", "Min", "min")
  5495. AssertError(t, errs, "TestInt32.Max", "TestInt32.Max", "Max", "Max", "max")
  5496. AssertError(t, errs, "TestInt32.MinMax", "TestInt32.MinMax", "MinMax", "MinMax", "min")
  5497. AssertError(t, errs, "TestInt32.Lt", "TestInt32.Lt", "Lt", "Lt", "lt")
  5498. AssertError(t, errs, "TestInt32.Lte", "TestInt32.Lte", "Lte", "Lte", "lte")
  5499. AssertError(t, errs, "TestInt32.Gt", "TestInt32.Gt", "Gt", "Gt", "gt")
  5500. AssertError(t, errs, "TestInt32.Gte", "TestInt32.Gte", "Gte", "Gte", "gte")
  5501. AssertError(t, errs, "TestInt32.OmitEmpty", "TestInt32.OmitEmpty", "OmitEmpty", "OmitEmpty", "max")
  5502. }
  5503. func TestStructUint64Validation(t *testing.T) {
  5504. validate := New()
  5505. tSuccess := &TestUint64{
  5506. Required: 1,
  5507. Len: 10,
  5508. Min: 1,
  5509. Max: 10,
  5510. MinMax: 5,
  5511. OmitEmpty: 0,
  5512. }
  5513. errs := validate.Struct(tSuccess)
  5514. Equal(t, errs, nil)
  5515. tFail := &TestUint64{
  5516. Required: 0,
  5517. Len: 11,
  5518. Min: 0,
  5519. Max: 11,
  5520. MinMax: 0,
  5521. OmitEmpty: 11,
  5522. }
  5523. errs = validate.Struct(tFail)
  5524. // Assert Top Level
  5525. NotEqual(t, errs, nil)
  5526. Equal(t, len(errs.(ValidationErrors)), 6)
  5527. // Assert Fields
  5528. AssertError(t, errs, "TestUint64.Required", "TestUint64.Required", "Required", "Required", "required")
  5529. AssertError(t, errs, "TestUint64.Len", "TestUint64.Len", "Len", "Len", "len")
  5530. AssertError(t, errs, "TestUint64.Min", "TestUint64.Min", "Min", "Min", "min")
  5531. AssertError(t, errs, "TestUint64.Max", "TestUint64.Max", "Max", "Max", "max")
  5532. AssertError(t, errs, "TestUint64.MinMax", "TestUint64.MinMax", "MinMax", "MinMax", "min")
  5533. AssertError(t, errs, "TestUint64.OmitEmpty", "TestUint64.OmitEmpty", "OmitEmpty", "OmitEmpty", "max")
  5534. }
  5535. func TestStructFloat64Validation(t *testing.T) {
  5536. validate := New()
  5537. tSuccess := &TestFloat64{
  5538. Required: 1,
  5539. Len: 10,
  5540. Min: 1,
  5541. Max: 10,
  5542. MinMax: 5,
  5543. OmitEmpty: 0,
  5544. }
  5545. errs := validate.Struct(tSuccess)
  5546. Equal(t, errs, nil)
  5547. tFail := &TestFloat64{
  5548. Required: 0,
  5549. Len: 11,
  5550. Min: 0,
  5551. Max: 11,
  5552. MinMax: 0,
  5553. OmitEmpty: 11,
  5554. }
  5555. errs = validate.Struct(tFail)
  5556. // Assert Top Level
  5557. NotEqual(t, errs, nil)
  5558. Equal(t, len(errs.(ValidationErrors)), 6)
  5559. // Assert Fields
  5560. AssertError(t, errs, "TestFloat64.Required", "TestFloat64.Required", "Required", "Required", "required")
  5561. AssertError(t, errs, "TestFloat64.Len", "TestFloat64.Len", "Len", "Len", "len")
  5562. AssertError(t, errs, "TestFloat64.Min", "TestFloat64.Min", "Min", "Min", "min")
  5563. AssertError(t, errs, "TestFloat64.Max", "TestFloat64.Max", "Max", "Max", "max")
  5564. AssertError(t, errs, "TestFloat64.MinMax", "TestFloat64.MinMax", "MinMax", "MinMax", "min")
  5565. AssertError(t, errs, "TestFloat64.OmitEmpty", "TestFloat64.OmitEmpty", "OmitEmpty", "OmitEmpty", "max")
  5566. }
  5567. func TestStructSliceValidation(t *testing.T) {
  5568. validate := New()
  5569. tSuccess := &TestSlice{
  5570. Required: []int{1},
  5571. Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
  5572. Min: []int{1, 2},
  5573. Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
  5574. MinMax: []int{1, 2, 3, 4, 5},
  5575. OmitEmpty: nil,
  5576. }
  5577. errs := validate.Struct(tSuccess)
  5578. Equal(t, errs, nil)
  5579. tFail := &TestSlice{
  5580. Required: nil,
  5581. Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  5582. Min: []int{},
  5583. Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  5584. MinMax: []int{},
  5585. OmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  5586. }
  5587. errs = validate.Struct(tFail)
  5588. NotEqual(t, errs, nil)
  5589. Equal(t, len(errs.(ValidationErrors)), 6)
  5590. // Assert Field Errors
  5591. AssertError(t, errs, "TestSlice.Required", "TestSlice.Required", "Required", "Required", "required")
  5592. AssertError(t, errs, "TestSlice.Len", "TestSlice.Len", "Len", "Len", "len")
  5593. AssertError(t, errs, "TestSlice.Min", "TestSlice.Min", "Min", "Min", "min")
  5594. AssertError(t, errs, "TestSlice.Max", "TestSlice.Max", "Max", "Max", "max")
  5595. AssertError(t, errs, "TestSlice.MinMax", "TestSlice.MinMax", "MinMax", "MinMax", "min")
  5596. AssertError(t, errs, "TestSlice.OmitEmpty", "TestSlice.OmitEmpty", "OmitEmpty", "OmitEmpty", "max")
  5597. fe := getError(errs, "TestSlice.Len", "TestSlice.Len")
  5598. NotEqual(t, fe, nil)
  5599. Equal(t, fe.Field(), "Len")
  5600. Equal(t, fe.StructField(), "Len")
  5601. Equal(t, fe.Namespace(), "TestSlice.Len")
  5602. Equal(t, fe.StructNamespace(), "TestSlice.Len")
  5603. Equal(t, fe.Tag(), "len")
  5604. Equal(t, fe.ActualTag(), "len")
  5605. Equal(t, fe.Param(), "10")
  5606. Equal(t, fe.Kind(), reflect.Slice)
  5607. Equal(t, fe.Type(), reflect.TypeOf([]int{}))
  5608. _, ok := fe.Value().([]int)
  5609. Equal(t, ok, true)
  5610. }
  5611. func TestInvalidStruct(t *testing.T) {
  5612. validate := New()
  5613. s := &SubTest{
  5614. Test: "1",
  5615. }
  5616. err := validate.Struct(s.Test)
  5617. NotEqual(t, err, nil)
  5618. Equal(t, err.Error(), "validator: (nil string)")
  5619. err = validate.Struct(nil)
  5620. NotEqual(t, err, nil)
  5621. Equal(t, err.Error(), "validator: (nil)")
  5622. err = validate.StructPartial(nil, "SubTest.Test")
  5623. NotEqual(t, err, nil)
  5624. Equal(t, err.Error(), "validator: (nil)")
  5625. err = validate.StructExcept(nil, "SubTest.Test")
  5626. NotEqual(t, err, nil)
  5627. Equal(t, err.Error(), "validator: (nil)")
  5628. }
  5629. func TestInvalidValidatorFunction(t *testing.T) {
  5630. validate := New()
  5631. s := &SubTest{
  5632. Test: "1",
  5633. }
  5634. PanicMatches(t, func() { _ = validate.Var(s.Test, "zzxxBadFunction") }, "Undefined validation function 'zzxxBadFunction' on field ''")
  5635. }
  5636. func TestCustomFieldName(t *testing.T) {
  5637. validate := New()
  5638. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  5639. name := strings.SplitN(fld.Tag.Get("schema"), ",", 2)[0]
  5640. if name == "-" {
  5641. return ""
  5642. }
  5643. return name
  5644. })
  5645. type A struct {
  5646. B string `schema:"b" validate:"required"`
  5647. C string `schema:"c" validate:"required"`
  5648. D []bool `schema:"d" validate:"required"`
  5649. E string `schema:"-" validate:"required"`
  5650. }
  5651. a := &A{}
  5652. err := validate.Struct(a)
  5653. NotEqual(t, err, nil)
  5654. errs := err.(ValidationErrors)
  5655. Equal(t, len(errs), 4)
  5656. Equal(t, getError(errs, "A.b", "A.B").Field(), "b")
  5657. Equal(t, getError(errs, "A.c", "A.C").Field(), "c")
  5658. Equal(t, getError(errs, "A.d", "A.D").Field(), "d")
  5659. Equal(t, getError(errs, "A.E", "A.E").Field(), "E")
  5660. v2 := New()
  5661. err = v2.Struct(a)
  5662. NotEqual(t, err, nil)
  5663. errs = err.(ValidationErrors)
  5664. Equal(t, len(errs), 4)
  5665. Equal(t, getError(errs, "A.B", "A.B").Field(), "B")
  5666. Equal(t, getError(errs, "A.C", "A.C").Field(), "C")
  5667. Equal(t, getError(errs, "A.D", "A.D").Field(), "D")
  5668. Equal(t, getError(errs, "A.E", "A.E").Field(), "E")
  5669. }
  5670. func TestMutipleRecursiveExtractStructCache(t *testing.T) {
  5671. validate := New()
  5672. type Recursive struct {
  5673. Field *string `validate:"required,len=5,ne=string"`
  5674. }
  5675. var test Recursive
  5676. current := reflect.ValueOf(test)
  5677. name := "Recursive"
  5678. proceed := make(chan struct{})
  5679. sc := validate.extractStructCache(current, name)
  5680. ptr := fmt.Sprintf("%p", sc)
  5681. for i := 0; i < 100; i++ {
  5682. go func() {
  5683. <-proceed
  5684. sc := validate.extractStructCache(current, name)
  5685. Equal(t, ptr, fmt.Sprintf("%p", sc))
  5686. }()
  5687. }
  5688. close(proceed)
  5689. }
  5690. // Thanks @robbrockbank, see https://github.com/go-playground/validator/issues/249
  5691. func TestPointerAndOmitEmpty(t *testing.T) {
  5692. validate := New()
  5693. type Test struct {
  5694. MyInt *int `validate:"omitempty,gte=2,lte=255"`
  5695. }
  5696. val1 := 0
  5697. val2 := 256
  5698. t1 := Test{MyInt: &val1} // This should fail validation on gte because value is 0
  5699. t2 := Test{MyInt: &val2} // This should fail validate on lte because value is 256
  5700. t3 := Test{MyInt: nil} // This should succeed validation because pointer is nil
  5701. errs := validate.Struct(t1)
  5702. NotEqual(t, errs, nil)
  5703. AssertError(t, errs, "Test.MyInt", "Test.MyInt", "MyInt", "MyInt", "gte")
  5704. errs = validate.Struct(t2)
  5705. NotEqual(t, errs, nil)
  5706. AssertError(t, errs, "Test.MyInt", "Test.MyInt", "MyInt", "MyInt", "lte")
  5707. errs = validate.Struct(t3)
  5708. Equal(t, errs, nil)
  5709. type TestIface struct {
  5710. MyInt interface{} `validate:"omitempty,gte=2,lte=255"`
  5711. }
  5712. ti1 := TestIface{MyInt: &val1} // This should fail validation on gte because value is 0
  5713. ti2 := TestIface{MyInt: &val2} // This should fail validate on lte because value is 256
  5714. ti3 := TestIface{MyInt: nil} // This should succeed validation because pointer is nil
  5715. errs = validate.Struct(ti1)
  5716. NotEqual(t, errs, nil)
  5717. AssertError(t, errs, "TestIface.MyInt", "TestIface.MyInt", "MyInt", "MyInt", "gte")
  5718. errs = validate.Struct(ti2)
  5719. NotEqual(t, errs, nil)
  5720. AssertError(t, errs, "TestIface.MyInt", "TestIface.MyInt", "MyInt", "MyInt", "lte")
  5721. errs = validate.Struct(ti3)
  5722. Equal(t, errs, nil)
  5723. }
  5724. func TestRequired(t *testing.T) {
  5725. validate := New()
  5726. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  5727. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  5728. if name == "-" {
  5729. return ""
  5730. }
  5731. return name
  5732. })
  5733. type Test struct {
  5734. Value interface{} `validate:"required"`
  5735. }
  5736. var test Test
  5737. err := validate.Struct(test)
  5738. NotEqual(t, err, nil)
  5739. AssertError(t, err.(ValidationErrors), "Test.Value", "Test.Value", "Value", "Value", "required")
  5740. }
  5741. func TestTranslations(t *testing.T) {
  5742. en := en.New()
  5743. uni := ut.New(en, en, fr.New())
  5744. trans, _ := uni.GetTranslator("en")
  5745. fr, _ := uni.GetTranslator("fr")
  5746. validate := New()
  5747. err := validate.RegisterTranslation("required", trans,
  5748. func(ut ut.Translator) (err error) {
  5749. // using this stype because multiple translation may have to be added for the full translation
  5750. if err = ut.Add("required", "{0} is a required field", false); err != nil {
  5751. return
  5752. }
  5753. return
  5754. }, func(ut ut.Translator, fe FieldError) string {
  5755. t, err := ut.T(fe.Tag(), fe.Field())
  5756. if err != nil {
  5757. fmt.Printf("warning: error translating FieldError: %#v", fe.(*fieldError))
  5758. return fe.(*fieldError).Error()
  5759. }
  5760. return t
  5761. })
  5762. Equal(t, err, nil)
  5763. err = validate.RegisterTranslation("required", fr,
  5764. func(ut ut.Translator) (err error) {
  5765. // using this stype because multiple translation may have to be added for the full translation
  5766. if err = ut.Add("required", "{0} est un champ obligatoire", false); err != nil {
  5767. return
  5768. }
  5769. return
  5770. }, func(ut ut.Translator, fe FieldError) string {
  5771. t, transErr := ut.T(fe.Tag(), fe.Field())
  5772. if transErr != nil {
  5773. fmt.Printf("warning: error translating FieldError: %#v", fe.(*fieldError))
  5774. return fe.(*fieldError).Error()
  5775. }
  5776. return t
  5777. })
  5778. Equal(t, err, nil)
  5779. type Test struct {
  5780. Value interface{} `validate:"required"`
  5781. }
  5782. var test Test
  5783. err = validate.Struct(test)
  5784. NotEqual(t, err, nil)
  5785. errs := err.(ValidationErrors)
  5786. Equal(t, len(errs), 1)
  5787. fe := errs[0]
  5788. Equal(t, fe.Tag(), "required")
  5789. Equal(t, fe.Namespace(), "Test.Value")
  5790. Equal(t, fe.Translate(trans), fmt.Sprintf("%s is a required field", fe.Field()))
  5791. Equal(t, fe.Translate(fr), fmt.Sprintf("%s est un champ obligatoire", fe.Field()))
  5792. nl := nl.New()
  5793. uni2 := ut.New(nl, nl)
  5794. trans2, _ := uni2.GetTranslator("nl")
  5795. Equal(t, fe.Translate(trans2), "Key: 'Test.Value' Error:Field validation for 'Value' failed on the 'required' tag")
  5796. terrs := errs.Translate(trans)
  5797. Equal(t, len(terrs), 1)
  5798. v, ok := terrs["Test.Value"]
  5799. Equal(t, ok, true)
  5800. Equal(t, v, fmt.Sprintf("%s is a required field", fe.Field()))
  5801. terrs = errs.Translate(fr)
  5802. Equal(t, len(terrs), 1)
  5803. v, ok = terrs["Test.Value"]
  5804. Equal(t, ok, true)
  5805. Equal(t, v, fmt.Sprintf("%s est un champ obligatoire", fe.Field()))
  5806. type Test2 struct {
  5807. Value string `validate:"gt=1"`
  5808. }
  5809. var t2 Test2
  5810. err = validate.Struct(t2)
  5811. NotEqual(t, err, nil)
  5812. errs = err.(ValidationErrors)
  5813. Equal(t, len(errs), 1)
  5814. fe = errs[0]
  5815. Equal(t, fe.Tag(), "gt")
  5816. Equal(t, fe.Namespace(), "Test2.Value")
  5817. Equal(t, fe.Translate(trans), "Key: 'Test2.Value' Error:Field validation for 'Value' failed on the 'gt' tag")
  5818. }
  5819. func TestTranslationErrors(t *testing.T) {
  5820. en := en.New()
  5821. uni := ut.New(en, en, fr.New())
  5822. trans, _ := uni.GetTranslator("en")
  5823. err := trans.Add("required", "{0} is a required field", false) // using translator outside of validator also
  5824. Equal(t, err, nil)
  5825. validate := New()
  5826. err = validate.RegisterTranslation("required", trans,
  5827. func(ut ut.Translator) (err error) {
  5828. // using this stype because multiple translation may have to be added for the full translation
  5829. if err = ut.Add("required", "{0} is a required field", false); err != nil {
  5830. return
  5831. }
  5832. return
  5833. }, func(ut ut.Translator, fe FieldError) string {
  5834. t, err := ut.T(fe.Tag(), fe.Field())
  5835. if err != nil {
  5836. fmt.Printf("warning: error translating FieldError: %#v", fe.(*fieldError))
  5837. return fe.(*fieldError).Error()
  5838. }
  5839. return t
  5840. })
  5841. NotEqual(t, err, nil)
  5842. Equal(t, err.Error(), "error: conflicting key 'required' rule 'Unknown' with text '{0} is a required field' for locale 'en', value being ignored")
  5843. }
  5844. func TestStructFiltered(t *testing.T) {
  5845. p1 := func(ns []byte) bool {
  5846. if bytes.HasSuffix(ns, []byte("NoTag")) || bytes.HasSuffix(ns, []byte("Required")) {
  5847. return false
  5848. }
  5849. return true
  5850. }
  5851. p2 := func(ns []byte) bool {
  5852. if bytes.HasSuffix(ns, []byte("SubSlice[0].Test")) ||
  5853. bytes.HasSuffix(ns, []byte("SubSlice[0]")) ||
  5854. bytes.HasSuffix(ns, []byte("SubSlice")) ||
  5855. bytes.HasSuffix(ns, []byte("Sub")) ||
  5856. bytes.HasSuffix(ns, []byte("SubIgnore")) ||
  5857. bytes.HasSuffix(ns, []byte("Anonymous")) ||
  5858. bytes.HasSuffix(ns, []byte("Anonymous.A")) {
  5859. return false
  5860. }
  5861. return true
  5862. }
  5863. p3 := func(ns []byte) bool {
  5864. return !bytes.HasSuffix(ns, []byte("SubTest.Test"))
  5865. }
  5866. // p4 := []string{
  5867. // "A",
  5868. // }
  5869. tPartial := &TestPartial{
  5870. NoTag: "NoTag",
  5871. Required: "Required",
  5872. SubSlice: []*SubTest{
  5873. {
  5874. Test: "Required",
  5875. },
  5876. {
  5877. Test: "Required",
  5878. },
  5879. },
  5880. Sub: &SubTest{
  5881. Test: "1",
  5882. },
  5883. SubIgnore: &SubTest{
  5884. Test: "",
  5885. },
  5886. Anonymous: struct {
  5887. A string `validate:"required"`
  5888. ASubSlice []*SubTest `validate:"required,dive"`
  5889. SubAnonStruct []struct {
  5890. Test string `validate:"required"`
  5891. OtherTest string `validate:"required"`
  5892. } `validate:"required,dive"`
  5893. }{
  5894. A: "1",
  5895. ASubSlice: []*SubTest{
  5896. {
  5897. Test: "Required",
  5898. },
  5899. {
  5900. Test: "Required",
  5901. },
  5902. },
  5903. SubAnonStruct: []struct {
  5904. Test string `validate:"required"`
  5905. OtherTest string `validate:"required"`
  5906. }{
  5907. {"Required", "RequiredOther"},
  5908. {"Required", "RequiredOther"},
  5909. },
  5910. },
  5911. }
  5912. validate := New()
  5913. // the following should all return no errors as everything is valid in
  5914. // the default state
  5915. errs := validate.StructFilteredCtx(context.Background(), tPartial, p1)
  5916. Equal(t, errs, nil)
  5917. errs = validate.StructFiltered(tPartial, p2)
  5918. Equal(t, errs, nil)
  5919. // this isn't really a robust test, but is ment to illustrate the ANON CASE below
  5920. errs = validate.StructFiltered(tPartial.SubSlice[0], p3)
  5921. Equal(t, errs, nil)
  5922. // mod tParial for required feild and re-test making sure invalid fields are NOT required:
  5923. tPartial.Required = ""
  5924. // inversion and retesting Partial to generate failures:
  5925. errs = validate.StructFiltered(tPartial, p1)
  5926. NotEqual(t, errs, nil)
  5927. AssertError(t, errs, "TestPartial.Required", "TestPartial.Required", "Required", "Required", "required")
  5928. // reset Required field, and set nested struct
  5929. tPartial.Required = "Required"
  5930. tPartial.Anonymous.A = ""
  5931. // will pass as unset feilds is not going to be tested
  5932. errs = validate.StructFiltered(tPartial, p1)
  5933. Equal(t, errs, nil)
  5934. // will fail as unset feild is tested
  5935. errs = validate.StructFiltered(tPartial, p2)
  5936. NotEqual(t, errs, nil)
  5937. AssertError(t, errs, "TestPartial.Anonymous.A", "TestPartial.Anonymous.A", "A", "A", "required")
  5938. // reset nested struct and unset struct in slice
  5939. tPartial.Anonymous.A = "Required"
  5940. tPartial.SubSlice[0].Test = ""
  5941. // these will pass as unset item is NOT tested
  5942. errs = validate.StructFiltered(tPartial, p1)
  5943. Equal(t, errs, nil)
  5944. errs = validate.StructFiltered(tPartial, p2)
  5945. NotEqual(t, errs, nil)
  5946. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  5947. Equal(t, len(errs.(ValidationErrors)), 1)
  5948. // Unset second slice member concurrently to test dive behavior:
  5949. tPartial.SubSlice[1].Test = ""
  5950. errs = validate.StructFiltered(tPartial, p1)
  5951. Equal(t, errs, nil)
  5952. errs = validate.StructFiltered(tPartial, p2)
  5953. NotEqual(t, errs, nil)
  5954. Equal(t, len(errs.(ValidationErrors)), 1)
  5955. AssertError(t, errs, "TestPartial.SubSlice[0].Test", "TestPartial.SubSlice[0].Test", "Test", "Test", "required")
  5956. // reset struct in slice, and unset struct in slice in unset posistion
  5957. tPartial.SubSlice[0].Test = "Required"
  5958. // these will pass as the unset item is NOT tested
  5959. errs = validate.StructFiltered(tPartial, p1)
  5960. Equal(t, errs, nil)
  5961. errs = validate.StructFiltered(tPartial, p2)
  5962. Equal(t, errs, nil)
  5963. tPartial.SubSlice[1].Test = "Required"
  5964. tPartial.Anonymous.SubAnonStruct[0].Test = ""
  5965. // these will pass as the unset item is NOT tested
  5966. errs = validate.StructFiltered(tPartial, p1)
  5967. Equal(t, errs, nil)
  5968. errs = validate.StructFiltered(tPartial, p2)
  5969. Equal(t, errs, nil)
  5970. dt := time.Now()
  5971. err := validate.StructFiltered(&dt, func(ns []byte) bool { return true })
  5972. NotEqual(t, err, nil)
  5973. Equal(t, err.Error(), "validator: (nil *time.Time)")
  5974. }
  5975. func TestRequiredPtr(t *testing.T) {
  5976. type Test struct {
  5977. Bool *bool `validate:"required"`
  5978. }
  5979. validate := New()
  5980. f := false
  5981. test := Test{
  5982. Bool: &f,
  5983. }
  5984. err := validate.Struct(test)
  5985. Equal(t, err, nil)
  5986. tr := true
  5987. test.Bool = &tr
  5988. err = validate.Struct(test)
  5989. Equal(t, err, nil)
  5990. test.Bool = nil
  5991. err = validate.Struct(test)
  5992. NotEqual(t, err, nil)
  5993. errs, ok := err.(ValidationErrors)
  5994. Equal(t, ok, true)
  5995. Equal(t, len(errs), 1)
  5996. AssertError(t, errs, "Test.Bool", "Test.Bool", "Bool", "Bool", "required")
  5997. type Test2 struct {
  5998. Bool bool `validate:"required"`
  5999. }
  6000. var test2 Test2
  6001. err = validate.Struct(test2)
  6002. NotEqual(t, err, nil)
  6003. errs, ok = err.(ValidationErrors)
  6004. Equal(t, ok, true)
  6005. Equal(t, len(errs), 1)
  6006. AssertError(t, errs, "Test2.Bool", "Test2.Bool", "Bool", "Bool", "required")
  6007. test2.Bool = true
  6008. err = validate.Struct(test2)
  6009. Equal(t, err, nil)
  6010. type Test3 struct {
  6011. Arr []string `validate:"required"`
  6012. }
  6013. var test3 Test3
  6014. err = validate.Struct(test3)
  6015. NotEqual(t, err, nil)
  6016. errs, ok = err.(ValidationErrors)
  6017. Equal(t, ok, true)
  6018. Equal(t, len(errs), 1)
  6019. AssertError(t, errs, "Test3.Arr", "Test3.Arr", "Arr", "Arr", "required")
  6020. test3.Arr = make([]string, 0)
  6021. err = validate.Struct(test3)
  6022. Equal(t, err, nil)
  6023. type Test4 struct {
  6024. Arr *[]string `validate:"required"` // I know I know pointer to array, just making sure validation works as expected...
  6025. }
  6026. var test4 Test4
  6027. err = validate.Struct(test4)
  6028. NotEqual(t, err, nil)
  6029. errs, ok = err.(ValidationErrors)
  6030. Equal(t, ok, true)
  6031. Equal(t, len(errs), 1)
  6032. AssertError(t, errs, "Test4.Arr", "Test4.Arr", "Arr", "Arr", "required")
  6033. arr := make([]string, 0)
  6034. test4.Arr = &arr
  6035. err = validate.Struct(test4)
  6036. Equal(t, err, nil)
  6037. }
  6038. func TestAlphaUnicodeValidation(t *testing.T) {
  6039. tests := []struct {
  6040. param string
  6041. expected bool
  6042. }{
  6043. {"", false},
  6044. {"abc", true},
  6045. {"this is a test string", false},
  6046. {"这是一个测试字符串", true},
  6047. {"123", false},
  6048. {"<>@;.-=", false},
  6049. {"ひらがな・カタカナ、.漢字", false},
  6050. {"あいうえおfoobar", true},
  6051. {"test@example.com", false},
  6052. {"1234abcDE", false},
  6053. {"カタカナ", true},
  6054. }
  6055. validate := New()
  6056. for i, test := range tests {
  6057. errs := validate.Var(test.param, "alphaunicode")
  6058. if test.expected {
  6059. if !IsEqual(errs, nil) {
  6060. t.Fatalf("Index: %d Alpha Unicode failed Error: %s", i, errs)
  6061. }
  6062. } else {
  6063. if IsEqual(errs, nil) {
  6064. t.Fatalf("Index: %d Alpha Unicode failed Error: %s", i, errs)
  6065. } else {
  6066. val := getError(errs, "", "")
  6067. if val.Tag() != "alphaunicode" {
  6068. t.Fatalf("Index: %d Alpha Unicode failed Error: %s", i, errs)
  6069. }
  6070. }
  6071. }
  6072. }
  6073. }
  6074. func TestAlphanumericUnicodeValidation(t *testing.T) {
  6075. tests := []struct {
  6076. param string
  6077. expected bool
  6078. }{
  6079. {"", false},
  6080. {"abc", true},
  6081. {"this is a test string", false},
  6082. {"这是一个测试字符串", true},
  6083. {"\u0031\u0032\u0033", true}, // unicode 5
  6084. {"123", true},
  6085. {"<>@;.-=", false},
  6086. {"ひらがな・カタカナ、.漢字", false},
  6087. {"あいうえおfoobar", true},
  6088. {"test@example.com", false},
  6089. {"1234abcDE", true},
  6090. {"カタカナ", true},
  6091. }
  6092. validate := New()
  6093. for i, test := range tests {
  6094. errs := validate.Var(test.param, "alphanumunicode")
  6095. if test.expected {
  6096. if !IsEqual(errs, nil) {
  6097. t.Fatalf("Index: %d Alphanum Unicode failed Error: %s", i, errs)
  6098. }
  6099. } else {
  6100. if IsEqual(errs, nil) {
  6101. t.Fatalf("Index: %d Alphanum Unicode failed Error: %s", i, errs)
  6102. } else {
  6103. val := getError(errs, "", "")
  6104. if val.Tag() != "alphanumunicode" {
  6105. t.Fatalf("Index: %d Alphanum Unicode failed Error: %s", i, errs)
  6106. }
  6107. }
  6108. }
  6109. }
  6110. }
  6111. func TestArrayStructNamespace(t *testing.T) {
  6112. validate := New()
  6113. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  6114. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  6115. if name == "-" {
  6116. return ""
  6117. }
  6118. return name
  6119. })
  6120. type child struct {
  6121. Name string `json:"name" validate:"required"`
  6122. }
  6123. var input struct {
  6124. Children []child `json:"children" validate:"required,gt=0,dive"`
  6125. }
  6126. input.Children = []child{{"ok"}, {""}}
  6127. errs := validate.Struct(input)
  6128. NotEqual(t, errs, nil)
  6129. ve := errs.(ValidationErrors)
  6130. Equal(t, len(ve), 1)
  6131. AssertError(t, errs, "children[1].name", "Children[1].Name", "name", "Name", "required")
  6132. }
  6133. func TestMapStructNamespace(t *testing.T) {
  6134. validate := New()
  6135. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  6136. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  6137. if name == "-" {
  6138. return ""
  6139. }
  6140. return name
  6141. })
  6142. type child struct {
  6143. Name string `json:"name" validate:"required"`
  6144. }
  6145. var input struct {
  6146. Children map[int]child `json:"children" validate:"required,gt=0,dive"`
  6147. }
  6148. input.Children = map[int]child{
  6149. 0: {Name: "ok"},
  6150. 1: {Name: ""},
  6151. }
  6152. errs := validate.Struct(input)
  6153. NotEqual(t, errs, nil)
  6154. ve := errs.(ValidationErrors)
  6155. Equal(t, len(ve), 1)
  6156. AssertError(t, errs, "children[1].name", "Children[1].Name", "name", "Name", "required")
  6157. }
  6158. func TestFieldLevelName(t *testing.T) {
  6159. type Test struct {
  6160. String string `validate:"custom1" json:"json1"`
  6161. Array []string `validate:"dive,custom2" json:"json2"`
  6162. Map map[string]string `validate:"dive,custom3" json:"json3"`
  6163. Array2 []string `validate:"custom4" json:"json4"`
  6164. Map2 map[string]string `validate:"custom5" json:"json5"`
  6165. }
  6166. var res1, res2, res3, res4, res5, alt1, alt2, alt3, alt4, alt5 string
  6167. validate := New()
  6168. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  6169. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  6170. if name == "-" {
  6171. return ""
  6172. }
  6173. return name
  6174. })
  6175. err := validate.RegisterValidation("custom1", func(fl FieldLevel) bool {
  6176. res1 = fl.FieldName()
  6177. alt1 = fl.StructFieldName()
  6178. return true
  6179. })
  6180. Equal(t, err, nil)
  6181. err = validate.RegisterValidation("custom2", func(fl FieldLevel) bool {
  6182. res2 = fl.FieldName()
  6183. alt2 = fl.StructFieldName()
  6184. return true
  6185. })
  6186. Equal(t, err, nil)
  6187. err = validate.RegisterValidation("custom3", func(fl FieldLevel) bool {
  6188. res3 = fl.FieldName()
  6189. alt3 = fl.StructFieldName()
  6190. return true
  6191. })
  6192. Equal(t, err, nil)
  6193. err = validate.RegisterValidation("custom4", func(fl FieldLevel) bool {
  6194. res4 = fl.FieldName()
  6195. alt4 = fl.StructFieldName()
  6196. return true
  6197. })
  6198. Equal(t, err, nil)
  6199. err = validate.RegisterValidation("custom5", func(fl FieldLevel) bool {
  6200. res5 = fl.FieldName()
  6201. alt5 = fl.StructFieldName()
  6202. return true
  6203. })
  6204. Equal(t, err, nil)
  6205. test := Test{
  6206. String: "test",
  6207. Array: []string{"1"},
  6208. Map: map[string]string{"test": "test"},
  6209. }
  6210. errs := validate.Struct(test)
  6211. Equal(t, errs, nil)
  6212. Equal(t, res1, "json1")
  6213. Equal(t, alt1, "String")
  6214. Equal(t, res2, "json2[0]")
  6215. Equal(t, alt2, "Array[0]")
  6216. Equal(t, res3, "json3[test]")
  6217. Equal(t, alt3, "Map[test]")
  6218. Equal(t, res4, "json4")
  6219. Equal(t, alt4, "Array2")
  6220. Equal(t, res5, "json5")
  6221. Equal(t, alt5, "Map2")
  6222. }
  6223. func TestValidateStructRegisterCtx(t *testing.T) {
  6224. var ctxVal string
  6225. fnCtx := func(ctx context.Context, fl FieldLevel) bool {
  6226. ctxVal = ctx.Value(&ctxVal).(string)
  6227. return true
  6228. }
  6229. var ctxSlVal string
  6230. slFn := func(ctx context.Context, sl StructLevel) {
  6231. ctxSlVal = ctx.Value(&ctxSlVal).(string)
  6232. }
  6233. type Test struct {
  6234. Field string `validate:"val"`
  6235. }
  6236. var tst Test
  6237. validate := New()
  6238. err := validate.RegisterValidationCtx("val", fnCtx)
  6239. Equal(t, err, nil)
  6240. validate.RegisterStructValidationCtx(slFn, Test{})
  6241. ctx := context.WithValue(context.Background(), &ctxVal, "testval")
  6242. ctx = context.WithValue(ctx, &ctxSlVal, "slVal")
  6243. errs := validate.StructCtx(ctx, tst)
  6244. Equal(t, errs, nil)
  6245. Equal(t, ctxVal, "testval")
  6246. Equal(t, ctxSlVal, "slVal")
  6247. }
  6248. func TestHostnameRFC952Validation(t *testing.T) {
  6249. tests := []struct {
  6250. param string
  6251. expected bool
  6252. }{
  6253. {"test.example.com", true},
  6254. {"example.com", true},
  6255. {"example24.com", true},
  6256. {"test.example24.com", true},
  6257. {"test24.example24.com", true},
  6258. {"example", true},
  6259. {"EXAMPLE", true},
  6260. {"1.foo.com", false},
  6261. {"test.example.com.", false},
  6262. {"example.com.", false},
  6263. {"example24.com.", false},
  6264. {"test.example24.com.", false},
  6265. {"test24.example24.com.", false},
  6266. {"example.", false},
  6267. {"192.168.0.1", false},
  6268. {"email@example.com", false},
  6269. {"2001:cdba:0000:0000:0000:0000:3257:9652", false},
  6270. {"2001:cdba:0:0:0:0:3257:9652", false},
  6271. {"2001:cdba::3257:9652", false},
  6272. }
  6273. validate := New()
  6274. for i, test := range tests {
  6275. errs := validate.Var(test.param, "hostname")
  6276. if test.expected {
  6277. if !IsEqual(errs, nil) {
  6278. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6279. }
  6280. } else {
  6281. if IsEqual(errs, nil) {
  6282. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6283. } else {
  6284. val := getError(errs, "", "")
  6285. if val.Tag() != "hostname" {
  6286. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6287. }
  6288. }
  6289. }
  6290. }
  6291. }
  6292. func TestHostnameRFC1123Validation(t *testing.T) {
  6293. tests := []struct {
  6294. param string
  6295. expected bool
  6296. }{
  6297. {"test.example.com", true},
  6298. {"example.com", true},
  6299. {"example24.com", true},
  6300. {"test.example24.com", true},
  6301. {"test24.example24.com", true},
  6302. {"example", true},
  6303. {"1.foo.com", true},
  6304. {"test.example.com.", false},
  6305. {"example.com.", false},
  6306. {"example24.com.", false},
  6307. {"test.example24.com.", false},
  6308. {"test24.example24.com.", false},
  6309. {"example.", false},
  6310. {"192.168.0.1", true},
  6311. {"email@example.com", false},
  6312. {"2001:cdba:0000:0000:0000:0000:3257:9652", false},
  6313. {"2001:cdba:0:0:0:0:3257:9652", false},
  6314. {"2001:cdba::3257:9652", false},
  6315. }
  6316. validate := New()
  6317. for i, test := range tests {
  6318. errs := validate.Var(test.param, "hostname_rfc1123")
  6319. if test.expected {
  6320. if !IsEqual(errs, nil) {
  6321. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6322. }
  6323. } else {
  6324. if IsEqual(errs, nil) {
  6325. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6326. } else {
  6327. val := getError(errs, "", "")
  6328. if val.Tag() != "hostname_rfc1123" {
  6329. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6330. }
  6331. }
  6332. }
  6333. }
  6334. }
  6335. func TestHostnameRFC1123AliasValidation(t *testing.T) {
  6336. tests := []struct {
  6337. param string
  6338. expected bool
  6339. }{
  6340. {"test.example.com", true},
  6341. {"example.com", true},
  6342. {"example24.com", true},
  6343. {"test.example24.com", true},
  6344. {"test24.example24.com", true},
  6345. {"example", true},
  6346. {"1.foo.com", true},
  6347. {"test.example.com.", false},
  6348. {"example.com.", false},
  6349. {"example24.com.", false},
  6350. {"test.example24.com.", false},
  6351. {"test24.example24.com.", false},
  6352. {"example.", false},
  6353. {"192.168.0.1", true},
  6354. {"email@example.com", false},
  6355. {"2001:cdba:0000:0000:0000:0000:3257:9652", false},
  6356. {"2001:cdba:0:0:0:0:3257:9652", false},
  6357. {"2001:cdba::3257:9652", false},
  6358. }
  6359. validate := New()
  6360. validate.RegisterAlias("hostname", "hostname_rfc1123")
  6361. for i, test := range tests {
  6362. errs := validate.Var(test.param, "hostname")
  6363. if test.expected {
  6364. if !IsEqual(errs, nil) {
  6365. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6366. }
  6367. } else {
  6368. if IsEqual(errs, nil) {
  6369. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6370. } else {
  6371. val := getError(errs, "", "")
  6372. if val.Tag() != "hostname" {
  6373. t.Fatalf("Index: %d hostname failed Error: %v", i, errs)
  6374. }
  6375. }
  6376. }
  6377. }
  6378. }
  6379. func TestFQDNValidation(t *testing.T) {
  6380. tests := []struct {
  6381. param string
  6382. expected bool
  6383. }{
  6384. {"test.example.com", true},
  6385. {"example.com", true},
  6386. {"example24.com", true},
  6387. {"test.example24.com", true},
  6388. {"test24.example24.com", true},
  6389. {"test.example.com.", true},
  6390. {"example.com.", true},
  6391. {"example24.com.", true},
  6392. {"test.example24.com.", true},
  6393. {"test24.example24.com.", true},
  6394. {"test24.example24.com..", false},
  6395. {"example", false},
  6396. {"192.168.0.1", false},
  6397. {"email@example.com", false},
  6398. {"2001:cdba:0000:0000:0000:0000:3257:9652", false},
  6399. {"2001:cdba:0:0:0:0:3257:9652", false},
  6400. {"2001:cdba::3257:9652", false},
  6401. {"", false},
  6402. }
  6403. validate := New()
  6404. for i, test := range tests {
  6405. errs := validate.Var(test.param, "fqdn")
  6406. if test.expected {
  6407. if !IsEqual(errs, nil) {
  6408. t.Fatalf("Index: %d fqdn failed Error: %v", i, errs)
  6409. }
  6410. } else {
  6411. if IsEqual(errs, nil) {
  6412. t.Fatalf("Index: %d fqdn failed Error: %v", i, errs)
  6413. } else {
  6414. val := getError(errs, "", "")
  6415. if val.Tag() != "fqdn" {
  6416. t.Fatalf("Index: %d fqdn failed Error: %v", i, errs)
  6417. }
  6418. }
  6419. }
  6420. }
  6421. }
  6422. func TestIsDefault(t *testing.T) {
  6423. validate := New()
  6424. type Inner struct {
  6425. String string `validate:"isdefault"`
  6426. }
  6427. type Test struct {
  6428. String string `validate:"isdefault"`
  6429. Inner *Inner `validate:"isdefault"`
  6430. }
  6431. var tt Test
  6432. errs := validate.Struct(tt)
  6433. Equal(t, errs, nil)
  6434. tt.Inner = &Inner{String: ""}
  6435. errs = validate.Struct(tt)
  6436. NotEqual(t, errs, nil)
  6437. fe := errs.(ValidationErrors)[0]
  6438. Equal(t, fe.Field(), "Inner")
  6439. Equal(t, fe.Namespace(), "Test.Inner")
  6440. Equal(t, fe.Tag(), "isdefault")
  6441. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  6442. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  6443. if name == "-" {
  6444. return ""
  6445. }
  6446. return name
  6447. })
  6448. type Inner2 struct {
  6449. String string `validate:"isdefault"`
  6450. }
  6451. type Test2 struct {
  6452. Inner Inner2 `validate:"isdefault" json:"inner"`
  6453. }
  6454. var t2 Test2
  6455. errs = validate.Struct(t2)
  6456. Equal(t, errs, nil)
  6457. t2.Inner.String = "Changed"
  6458. errs = validate.Struct(t2)
  6459. NotEqual(t, errs, nil)
  6460. fe = errs.(ValidationErrors)[0]
  6461. Equal(t, fe.Field(), "inner")
  6462. Equal(t, fe.Namespace(), "Test2.inner")
  6463. Equal(t, fe.Tag(), "isdefault")
  6464. }
  6465. func TestUniqueValidation(t *testing.T) {
  6466. tests := []struct {
  6467. param interface{}
  6468. expected bool
  6469. }{
  6470. // Arrays
  6471. {[2]string{"a", "b"}, true},
  6472. {[2]int{1, 2}, true},
  6473. {[2]float64{1, 2}, true},
  6474. {[2]interface{}{"a", "b"}, true},
  6475. {[2]interface{}{"a", 1}, true},
  6476. {[2]float64{1, 1}, false},
  6477. {[2]int{1, 1}, false},
  6478. {[2]string{"a", "a"}, false},
  6479. {[2]interface{}{"a", "a"}, false},
  6480. {[4]interface{}{"a", 1, "b", 1}, false},
  6481. // Slices
  6482. {[]string{"a", "b"}, true},
  6483. {[]int{1, 2}, true},
  6484. {[]float64{1, 2}, true},
  6485. {[]interface{}{"a", "b"}, true},
  6486. {[]interface{}{"a", 1}, true},
  6487. {[]float64{1, 1}, false},
  6488. {[]int{1, 1}, false},
  6489. {[]string{"a", "a"}, false},
  6490. {[]interface{}{"a", "a"}, false},
  6491. {[]interface{}{"a", 1, "b", 1}, false},
  6492. // Maps
  6493. {map[string]string{"one": "a", "two": "b"}, true},
  6494. {map[string]int{"one": 1, "two": 2}, true},
  6495. {map[string]float64{"one": 1, "two": 2}, true},
  6496. {map[string]interface{}{"one": "a", "two": "b"}, true},
  6497. {map[string]interface{}{"one": "a", "two": 1}, true},
  6498. {map[string]float64{"one": 1, "two": 1}, false},
  6499. {map[string]int{"one": 1, "two": 1}, false},
  6500. {map[string]string{"one": "a", "two": "a"}, false},
  6501. {map[string]interface{}{"one": "a", "two": "a"}, false},
  6502. {map[string]interface{}{"one": "a", "two": 1, "three": "b", "four": 1}, false},
  6503. }
  6504. validate := New()
  6505. for i, test := range tests {
  6506. errs := validate.Var(test.param, "unique")
  6507. if test.expected {
  6508. if !IsEqual(errs, nil) {
  6509. t.Fatalf("Index: %d unique failed Error: %v", i, errs)
  6510. }
  6511. } else {
  6512. if IsEqual(errs, nil) {
  6513. t.Fatalf("Index: %d unique failed Error: %v", i, errs)
  6514. } else {
  6515. val := getError(errs, "", "")
  6516. if val.Tag() != "unique" {
  6517. t.Fatalf("Index: %d unique failed Error: %v", i, errs)
  6518. }
  6519. }
  6520. }
  6521. }
  6522. PanicMatches(t, func() { _ = validate.Var(1.0, "unique") }, "Bad field type float64")
  6523. }
  6524. func TestHTMLValidation(t *testing.T) {
  6525. tests := []struct {
  6526. param string
  6527. expected bool
  6528. }{
  6529. {"<html>", true},
  6530. {"<script>", true},
  6531. {"<stillworks>", true},
  6532. {"</html", false},
  6533. {"</script>", true},
  6534. {"<//script>", false},
  6535. {"<123nonsense>", false},
  6536. {"test", false},
  6537. {"&example", false},
  6538. }
  6539. validate := New()
  6540. for i, test := range tests {
  6541. errs := validate.Var(test.param, "html")
  6542. if test.expected {
  6543. if !IsEqual(errs, nil) {
  6544. t.Fatalf("Index: %d html failed Error: %v", i, errs)
  6545. }
  6546. } else {
  6547. if IsEqual(errs, nil) {
  6548. t.Fatalf("Index: %d html failed Error: %v", i, errs)
  6549. } else {
  6550. val := getError(errs, "", "")
  6551. if val.Tag() != "html" {
  6552. t.Fatalf("Index: %d html failed Error: %v", i, errs)
  6553. }
  6554. }
  6555. }
  6556. }
  6557. }
  6558. func TestHTMLEncodedValidation(t *testing.T) {
  6559. tests := []struct {
  6560. param string
  6561. expected bool
  6562. }{
  6563. {"&#x3c;", true},
  6564. {"&#xaf;", true},
  6565. {"&#x00;", true},
  6566. {"&#xf0;", true},
  6567. {"&#x3c", true},
  6568. {"&#xaf", true},
  6569. {"&#x00", true},
  6570. {"&#xf0", true},
  6571. {"&#ab", true},
  6572. {"&lt;", true},
  6573. {"&gt;", true},
  6574. {"&quot;", true},
  6575. {"&amp;", true},
  6576. {"#x0a", false},
  6577. {"&x00", false},
  6578. {"&#x1z", false},
  6579. }
  6580. validate := New()
  6581. for i, test := range tests {
  6582. errs := validate.Var(test.param, "html_encoded")
  6583. if test.expected {
  6584. if !IsEqual(errs, nil) {
  6585. t.Fatalf("Index: %d html_encoded failed Error: %v", i, errs)
  6586. }
  6587. } else {
  6588. if IsEqual(errs, nil) {
  6589. t.Fatalf("Index: %d html_enocded failed Error: %v", i, errs)
  6590. } else {
  6591. val := getError(errs, "", "")
  6592. if val.Tag() != "html_encoded" {
  6593. t.Fatalf("Index: %d html_encoded failed Error: %v", i, errs)
  6594. }
  6595. }
  6596. }
  6597. }
  6598. }
  6599. func TestURLEncodedValidation(t *testing.T) {
  6600. tests := []struct {
  6601. param string
  6602. expected bool
  6603. }{
  6604. {"%20", true},
  6605. {"%af", true},
  6606. {"%ff", true},
  6607. {"<%az", false},
  6608. {"%test%", false},
  6609. {"a%b", false},
  6610. {"1%2", false},
  6611. {"%%a%%", false},
  6612. }
  6613. validate := New()
  6614. for i, test := range tests {
  6615. errs := validate.Var(test.param, "url_encoded")
  6616. if test.expected {
  6617. if !IsEqual(errs, nil) {
  6618. t.Fatalf("Index: %d url_encoded failed Error: %v", i, errs)
  6619. }
  6620. } else {
  6621. if IsEqual(errs, nil) {
  6622. t.Fatalf("Index: %d url_enocded failed Error: %v", i, errs)
  6623. } else {
  6624. val := getError(errs, "", "")
  6625. if val.Tag() != "url_encoded" {
  6626. t.Fatalf("Index: %d url_encoded failed Error: %v", i, errs)
  6627. }
  6628. }
  6629. }
  6630. }
  6631. }
  6632. func TestKeys(t *testing.T) {
  6633. type Test struct {
  6634. Test1 map[string]string `validate:"gt=0,dive,keys,eq=testkey,endkeys,eq=testval" json:"test1"`
  6635. Test2 map[int]int `validate:"gt=0,dive,keys,eq=3,endkeys,eq=4" json:"test2"`
  6636. Test3 map[int]int `validate:"gt=0,dive,keys,eq=3,endkeys" json:"test3"`
  6637. }
  6638. var tst Test
  6639. validate := New()
  6640. err := validate.Struct(tst)
  6641. NotEqual(t, err, nil)
  6642. Equal(t, len(err.(ValidationErrors)), 3)
  6643. AssertError(t, err.(ValidationErrors), "Test.Test1", "Test.Test1", "Test1", "Test1", "gt")
  6644. AssertError(t, err.(ValidationErrors), "Test.Test2", "Test.Test2", "Test2", "Test2", "gt")
  6645. AssertError(t, err.(ValidationErrors), "Test.Test3", "Test.Test3", "Test3", "Test3", "gt")
  6646. tst.Test1 = map[string]string{
  6647. "testkey": "testval",
  6648. }
  6649. tst.Test2 = map[int]int{
  6650. 3: 4,
  6651. }
  6652. tst.Test3 = map[int]int{
  6653. 3: 4,
  6654. }
  6655. err = validate.Struct(tst)
  6656. Equal(t, err, nil)
  6657. tst.Test1["badtestkey"] = "badtestvalue"
  6658. tst.Test2[10] = 11
  6659. err = validate.Struct(tst)
  6660. NotEqual(t, err, nil)
  6661. errs := err.(ValidationErrors)
  6662. Equal(t, len(errs), 4)
  6663. AssertDeepError(t, errs, "Test.Test1[badtestkey]", "Test.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6664. AssertDeepError(t, errs, "Test.Test1[badtestkey]", "Test.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6665. AssertDeepError(t, errs, "Test.Test2[10]", "Test.Test2[10]", "Test2[10]", "Test2[10]", "eq", "eq")
  6666. AssertDeepError(t, errs, "Test.Test2[10]", "Test.Test2[10]", "Test2[10]", "Test2[10]", "eq", "eq")
  6667. type Test2 struct {
  6668. NestedKeys map[[1]string]string `validate:"gt=0,dive,keys,dive,eq=innertestkey,endkeys,eq=outertestval"`
  6669. }
  6670. var tst2 Test2
  6671. err = validate.Struct(tst2)
  6672. NotEqual(t, err, nil)
  6673. Equal(t, len(err.(ValidationErrors)), 1)
  6674. AssertError(t, err.(ValidationErrors), "Test2.NestedKeys", "Test2.NestedKeys", "NestedKeys", "NestedKeys", "gt")
  6675. tst2.NestedKeys = map[[1]string]string{
  6676. [1]string{"innertestkey"}: "outertestval",
  6677. }
  6678. err = validate.Struct(tst2)
  6679. Equal(t, err, nil)
  6680. tst2.NestedKeys[[1]string{"badtestkey"}] = "badtestvalue"
  6681. err = validate.Struct(tst2)
  6682. NotEqual(t, err, nil)
  6683. errs = err.(ValidationErrors)
  6684. Equal(t, len(errs), 2)
  6685. AssertDeepError(t, errs, "Test2.NestedKeys[[badtestkey]][0]", "Test2.NestedKeys[[badtestkey]][0]", "NestedKeys[[badtestkey]][0]", "NestedKeys[[badtestkey]][0]", "eq", "eq")
  6686. AssertDeepError(t, errs, "Test2.NestedKeys[[badtestkey]]", "Test2.NestedKeys[[badtestkey]]", "NestedKeys[[badtestkey]]", "NestedKeys[[badtestkey]]", "eq", "eq")
  6687. // test bad tag definitions
  6688. PanicMatches(t, func() { _ = validate.Var(map[string]string{"key": "val"}, "endkeys,dive,eq=val") }, "'endkeys' tag encountered without a corresponding 'keys' tag")
  6689. PanicMatches(t, func() { _ = validate.Var(1, "keys,eq=1,endkeys") }, "'keys' tag must be immediately preceded by the 'dive' tag")
  6690. // test custom tag name
  6691. validate = New()
  6692. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  6693. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  6694. if name == "-" {
  6695. return ""
  6696. }
  6697. return name
  6698. })
  6699. err = validate.Struct(tst)
  6700. NotEqual(t, err, nil)
  6701. errs = err.(ValidationErrors)
  6702. Equal(t, len(errs), 4)
  6703. AssertDeepError(t, errs, "Test.test1[badtestkey]", "Test.Test1[badtestkey]", "test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6704. AssertDeepError(t, errs, "Test.test1[badtestkey]", "Test.Test1[badtestkey]", "test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6705. AssertDeepError(t, errs, "Test.test2[10]", "Test.Test2[10]", "test2[10]", "Test2[10]", "eq", "eq")
  6706. AssertDeepError(t, errs, "Test.test2[10]", "Test.Test2[10]", "test2[10]", "Test2[10]", "eq", "eq")
  6707. }
  6708. // Thanks @adrian-sgn specific test for your specific scenario
  6709. func TestKeysCustomValidation(t *testing.T) {
  6710. type LangCode string
  6711. type Label map[LangCode]string
  6712. type TestMapStructPtr struct {
  6713. Label Label `validate:"dive,keys,lang_code,endkeys,required"`
  6714. }
  6715. validate := New()
  6716. err := validate.RegisterValidation("lang_code", func(fl FieldLevel) bool {
  6717. validLangCodes := map[LangCode]struct{}{
  6718. "en": {},
  6719. "es": {},
  6720. "pt": {},
  6721. }
  6722. _, ok := validLangCodes[fl.Field().Interface().(LangCode)]
  6723. return ok
  6724. })
  6725. Equal(t, err, nil)
  6726. label := Label{
  6727. "en": "Good morning!",
  6728. "pt": "",
  6729. "es": "¡Buenos días!",
  6730. "xx": "Bad key",
  6731. "xxx": "",
  6732. }
  6733. err = validate.Struct(TestMapStructPtr{label})
  6734. NotEqual(t, err, nil)
  6735. errs := err.(ValidationErrors)
  6736. Equal(t, len(errs), 4)
  6737. AssertDeepError(t, errs, "TestMapStructPtr.Label[xx]", "TestMapStructPtr.Label[xx]", "Label[xx]", "Label[xx]", "lang_code", "lang_code")
  6738. AssertDeepError(t, errs, "TestMapStructPtr.Label[pt]", "TestMapStructPtr.Label[pt]", "Label[pt]", "Label[pt]", "required", "required")
  6739. AssertDeepError(t, errs, "TestMapStructPtr.Label[xxx]", "TestMapStructPtr.Label[xxx]", "Label[xxx]", "Label[xxx]", "lang_code", "lang_code")
  6740. AssertDeepError(t, errs, "TestMapStructPtr.Label[xxx]", "TestMapStructPtr.Label[xxx]", "Label[xxx]", "Label[xxx]", "required", "required")
  6741. // find specific error
  6742. var e FieldError
  6743. for _, e = range errs {
  6744. if e.Namespace() == "TestMapStructPtr.Label[xxx]" {
  6745. break
  6746. }
  6747. }
  6748. Equal(t, e.Param(), "")
  6749. Equal(t, e.Value().(LangCode), LangCode("xxx"))
  6750. for _, e = range errs {
  6751. if e.Namespace() == "TestMapStructPtr.Label[xxx]" && e.Tag() == "required" {
  6752. break
  6753. }
  6754. }
  6755. Equal(t, e.Param(), "")
  6756. Equal(t, e.Value().(string), "")
  6757. }
  6758. func TestKeyOrs(t *testing.T) {
  6759. type Test struct {
  6760. Test1 map[string]string `validate:"gt=0,dive,keys,eq=testkey|eq=testkeyok,endkeys,eq=testval" json:"test1"`
  6761. }
  6762. var tst Test
  6763. validate := New()
  6764. err := validate.Struct(tst)
  6765. NotEqual(t, err, nil)
  6766. Equal(t, len(err.(ValidationErrors)), 1)
  6767. AssertError(t, err.(ValidationErrors), "Test.Test1", "Test.Test1", "Test1", "Test1", "gt")
  6768. tst.Test1 = map[string]string{
  6769. "testkey": "testval",
  6770. }
  6771. err = validate.Struct(tst)
  6772. Equal(t, err, nil)
  6773. tst.Test1["badtestkey"] = "badtestval"
  6774. err = validate.Struct(tst)
  6775. NotEqual(t, err, nil)
  6776. errs := err.(ValidationErrors)
  6777. Equal(t, len(errs), 2)
  6778. AssertDeepError(t, errs, "Test.Test1[badtestkey]", "Test.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq=testkey|eq=testkeyok", "eq=testkey|eq=testkeyok")
  6779. AssertDeepError(t, errs, "Test.Test1[badtestkey]", "Test.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6780. validate.RegisterAlias("okkey", "eq=testkey|eq=testkeyok")
  6781. type Test2 struct {
  6782. Test1 map[string]string `validate:"gt=0,dive,keys,okkey,endkeys,eq=testval" json:"test1"`
  6783. }
  6784. var tst2 Test2
  6785. err = validate.Struct(tst2)
  6786. NotEqual(t, err, nil)
  6787. Equal(t, len(err.(ValidationErrors)), 1)
  6788. AssertError(t, err.(ValidationErrors), "Test2.Test1", "Test2.Test1", "Test1", "Test1", "gt")
  6789. tst2.Test1 = map[string]string{
  6790. "testkey": "testval",
  6791. }
  6792. err = validate.Struct(tst2)
  6793. Equal(t, err, nil)
  6794. tst2.Test1["badtestkey"] = "badtestval"
  6795. err = validate.Struct(tst2)
  6796. NotEqual(t, err, nil)
  6797. errs = err.(ValidationErrors)
  6798. Equal(t, len(errs), 2)
  6799. AssertDeepError(t, errs, "Test2.Test1[badtestkey]", "Test2.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "okkey", "eq=testkey|eq=testkeyok")
  6800. AssertDeepError(t, errs, "Test2.Test1[badtestkey]", "Test2.Test1[badtestkey]", "Test1[badtestkey]", "Test1[badtestkey]", "eq", "eq")
  6801. }
  6802. func TestStructLevelValidationsPointerPassing(t *testing.T) {
  6803. v1 := New()
  6804. v1.RegisterStructValidation(StructValidationTestStruct, &TestStruct{})
  6805. tst := &TestStruct{
  6806. String: "good value",
  6807. }
  6808. errs := v1.Struct(tst)
  6809. NotEqual(t, errs, nil)
  6810. AssertError(t, errs, "TestStruct.StringVal", "TestStruct.String", "StringVal", "String", "badvalueteststruct")
  6811. }
  6812. func TestDirValidation(t *testing.T) {
  6813. validate := New()
  6814. tests := []struct {
  6815. title string
  6816. param string
  6817. expected bool
  6818. }{
  6819. {"existing dir", "testdata", true},
  6820. {"existing self dir", ".", true},
  6821. {"existing parent dir", "..", true},
  6822. {"empty dir", "", false},
  6823. {"missing dir", "non_existing_testdata", false},
  6824. {"a file not a directory", filepath.Join("testdata", "a.go"), false},
  6825. }
  6826. for _, test := range tests {
  6827. errs := validate.Var(test.param, "dir")
  6828. if test.expected {
  6829. if !IsEqual(errs, nil) {
  6830. t.Fatalf("Test: '%s' failed Error: %s", test.title, errs)
  6831. }
  6832. } else {
  6833. if IsEqual(errs, nil) {
  6834. t.Fatalf("Test: '%s' failed Error: %s", test.title, errs)
  6835. }
  6836. }
  6837. }
  6838. PanicMatches(t, func() {
  6839. _ = validate.Var(2, "dir")
  6840. }, "Bad field type int")
  6841. }
  6842. func TestStartsWithValidation(t *testing.T) {
  6843. tests := []struct {
  6844. Value string `validate:"startswith=(/^ヮ^)/*:・゚✧"`
  6845. Tag string
  6846. ExpectedNil bool
  6847. }{
  6848. {Value: "(/^ヮ^)/*:・゚✧ glitter", Tag: "startswith=(/^ヮ^)/*:・゚✧", ExpectedNil: true},
  6849. {Value: "abcd", Tag: "startswith=(/^ヮ^)/*:・゚✧", ExpectedNil: false},
  6850. }
  6851. validate := New()
  6852. for i, s := range tests {
  6853. errs := validate.Var(s.Value, s.Tag)
  6854. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  6855. t.Fatalf("Index: %d failed Error: %s", i, errs)
  6856. }
  6857. errs = validate.Struct(s)
  6858. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  6859. t.Fatalf("Index: %d failed Error: %s", i, errs)
  6860. }
  6861. }
  6862. }
  6863. func TestEndsWithValidation(t *testing.T) {
  6864. tests := []struct {
  6865. Value string `validate:"endswith=(/^ヮ^)/*:・゚✧"`
  6866. Tag string
  6867. ExpectedNil bool
  6868. }{
  6869. {Value: "glitter (/^ヮ^)/*:・゚✧", Tag: "endswith=(/^ヮ^)/*:・゚✧", ExpectedNil: true},
  6870. {Value: "(/^ヮ^)/*:・゚✧ glitter", Tag: "endswith=(/^ヮ^)/*:・゚✧", ExpectedNil: false},
  6871. }
  6872. validate := New()
  6873. for i, s := range tests {
  6874. errs := validate.Var(s.Value, s.Tag)
  6875. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  6876. t.Fatalf("Index: %d failed Error: %s", i, errs)
  6877. }
  6878. errs = validate.Struct(s)
  6879. if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
  6880. t.Fatalf("Index: %d failed Error: %s", i, errs)
  6881. }
  6882. }
  6883. }
  6884. func TestRequiredWith(t *testing.T) {
  6885. type Inner struct {
  6886. Field *string
  6887. }
  6888. fieldVal := "test"
  6889. test := struct {
  6890. Inner *Inner
  6891. FieldE string `validate:"omitempty" json:"field_e"`
  6892. FieldER string `validate:"required_with=FieldE" json:"field_er"`
  6893. Field1 string `validate:"omitempty" json:"field_1"`
  6894. Field2 *string `validate:"required_with=Field1" json:"field_2"`
  6895. Field3 map[string]string `validate:"required_with=Field2" json:"field_3"`
  6896. Field4 interface{} `validate:"required_with=Field3" json:"field_4"`
  6897. Field5 string `validate:"required_with=Inner.Field" json:"field_5"`
  6898. }{
  6899. Inner: &Inner{Field: &fieldVal},
  6900. Field2: &fieldVal,
  6901. Field3: map[string]string{"key": "val"},
  6902. Field4: "test",
  6903. Field5: "test",
  6904. }
  6905. validate := New()
  6906. errs := validate.Struct(test)
  6907. Equal(t, errs, nil)
  6908. test2 := struct {
  6909. Inner *Inner
  6910. Inner2 *Inner
  6911. FieldE string `validate:"omitempty" json:"field_e"`
  6912. FieldER string `validate:"required_with=FieldE" json:"field_er"`
  6913. Field1 string `validate:"omitempty" json:"field_1"`
  6914. Field2 *string `validate:"required_with=Field1" json:"field_2"`
  6915. Field3 map[string]string `validate:"required_with=Field2" json:"field_3"`
  6916. Field4 interface{} `validate:"required_with=Field2" json:"field_4"`
  6917. Field5 string `validate:"required_with=Field3" json:"field_5"`
  6918. Field6 string `validate:"required_with=Inner.Field" json:"field_6"`
  6919. Field7 string `validate:"required_with=Inner2.Field" json:"field_7"`
  6920. }{
  6921. Inner: &Inner{Field: &fieldVal},
  6922. Field2: &fieldVal,
  6923. }
  6924. errs = validate.Struct(test2)
  6925. NotEqual(t, errs, nil)
  6926. ve := errs.(ValidationErrors)
  6927. Equal(t, len(ve), 3)
  6928. AssertError(t, errs, "Field3", "Field3", "Field3", "Field3", "required_with")
  6929. AssertError(t, errs, "Field4", "Field4", "Field4", "Field4", "required_with")
  6930. AssertError(t, errs, "Field6", "Field6", "Field6", "Field6", "required_with")
  6931. }
  6932. func TestRequiredWithAll(t *testing.T) {
  6933. type Inner struct {
  6934. Field *string
  6935. }
  6936. fieldVal := "test"
  6937. test := struct {
  6938. Inner *Inner
  6939. FieldE string `validate:"omitempty" json:"field_e"`
  6940. FieldER string `validate:"required_with_all=FieldE" json:"field_er"`
  6941. Field1 string `validate:"omitempty" json:"field_1"`
  6942. Field2 *string `validate:"required_with_all=Field1" json:"field_2"`
  6943. Field3 map[string]string `validate:"required_with_all=Field2" json:"field_3"`
  6944. Field4 interface{} `validate:"required_with_all=Field3" json:"field_4"`
  6945. Field5 string `validate:"required_with_all=Inner.Field" json:"field_5"`
  6946. }{
  6947. Inner: &Inner{Field: &fieldVal},
  6948. Field1: "test_field1",
  6949. Field2: &fieldVal,
  6950. Field3: map[string]string{"key": "val"},
  6951. Field4: "test",
  6952. Field5: "test",
  6953. }
  6954. validate := New()
  6955. errs := validate.Struct(test)
  6956. Equal(t, errs, nil)
  6957. test2 := struct {
  6958. Inner *Inner
  6959. Inner2 *Inner
  6960. FieldE string `validate:"omitempty" json:"field_e"`
  6961. FieldER string `validate:"required_with_all=FieldE" json:"field_er"`
  6962. Field1 string `validate:"omitempty" json:"field_1"`
  6963. Field2 *string `validate:"required_with_all=Field1" json:"field_2"`
  6964. Field3 map[string]string `validate:"required_with_all=Field2" json:"field_3"`
  6965. Field4 interface{} `validate:"required_with_all=Field1 FieldE" json:"field_4"`
  6966. Field5 string `validate:"required_with_all=Inner.Field Field2" json:"field_5"`
  6967. Field6 string `validate:"required_with_all=Inner2.Field Field2" json:"field_6"`
  6968. }{
  6969. Inner: &Inner{Field: &fieldVal},
  6970. Field2: &fieldVal,
  6971. }
  6972. errs = validate.Struct(test2)
  6973. NotEqual(t, errs, nil)
  6974. ve := errs.(ValidationErrors)
  6975. Equal(t, len(ve), 2)
  6976. AssertError(t, errs, "Field3", "Field3", "Field3", "Field3", "required_with_all")
  6977. AssertError(t, errs, "Field5", "Field5", "Field5", "Field5", "required_with_all")
  6978. }
  6979. func TestRequiredWithout(t *testing.T) {
  6980. type Inner struct {
  6981. Field *string
  6982. }
  6983. fieldVal := "test"
  6984. test := struct {
  6985. Inner *Inner
  6986. Field1 string `validate:"omitempty" json:"field_1"`
  6987. Field2 *string `validate:"required_without=Field1" json:"field_2"`
  6988. Field3 map[string]string `validate:"required_without=Field2" json:"field_3"`
  6989. Field4 interface{} `validate:"required_without=Field3" json:"field_4"`
  6990. Field5 string `validate:"required_without=Field3" json:"field_5"`
  6991. }{
  6992. Inner: &Inner{Field: &fieldVal},
  6993. Field2: &fieldVal,
  6994. Field3: map[string]string{"key": "val"},
  6995. Field4: "test",
  6996. Field5: "test",
  6997. }
  6998. validate := New()
  6999. errs := validate.Struct(test)
  7000. Equal(t, errs, nil)
  7001. test2 := struct {
  7002. Inner *Inner
  7003. Inner2 *Inner
  7004. Field1 string `json:"field_1"`
  7005. Field2 *string `validate:"required_without=Field1" json:"field_2"`
  7006. Field3 map[string]string `validate:"required_without=Field2" json:"field_3"`
  7007. Field4 interface{} `validate:"required_without=Field3" json:"field_4"`
  7008. Field5 string `validate:"required_without=Field3" json:"field_5"`
  7009. Field6 string `validate:"required_without=Field1" json:"field_6"`
  7010. Field7 string `validate:"required_without=Inner.Field" json:"field_7"`
  7011. Field8 string `validate:"required_without=Inner.Field" json:"field_8"`
  7012. }{
  7013. Inner: &Inner{},
  7014. Field3: map[string]string{"key": "val"},
  7015. Field4: "test",
  7016. Field5: "test",
  7017. }
  7018. errs = validate.Struct(&test2)
  7019. NotEqual(t, errs, nil)
  7020. ve := errs.(ValidationErrors)
  7021. Equal(t, len(ve), 4)
  7022. AssertError(t, errs, "Field2", "Field2", "Field2", "Field2", "required_without")
  7023. AssertError(t, errs, "Field6", "Field6", "Field6", "Field6", "required_without")
  7024. AssertError(t, errs, "Field7", "Field7", "Field7", "Field7", "required_without")
  7025. AssertError(t, errs, "Field8", "Field8", "Field8", "Field8", "required_without")
  7026. }
  7027. func TestRequiredWithoutAll(t *testing.T) {
  7028. fieldVal := "test"
  7029. test := struct {
  7030. Field1 string `validate:"omitempty" json:"field_1"`
  7031. Field2 *string `validate:"required_without_all=Field1" json:"field_2"`
  7032. Field3 map[string]string `validate:"required_without_all=Field2" json:"field_3"`
  7033. Field4 interface{} `validate:"required_without_all=Field3" json:"field_4"`
  7034. Field5 string `validate:"required_without_all=Field3" json:"field_5"`
  7035. }{
  7036. Field1: "",
  7037. Field2: &fieldVal,
  7038. Field3: map[string]string{"key": "val"},
  7039. Field4: "test",
  7040. Field5: "test",
  7041. }
  7042. validate := New()
  7043. errs := validate.Struct(test)
  7044. Equal(t, errs, nil)
  7045. test2 := struct {
  7046. Field1 string `validate:"omitempty" json:"field_1"`
  7047. Field2 *string `validate:"required_without_all=Field1" json:"field_2"`
  7048. Field3 map[string]string `validate:"required_without_all=Field2" json:"field_3"`
  7049. Field4 interface{} `validate:"required_without_all=Field3" json:"field_4"`
  7050. Field5 string `validate:"required_without_all=Field3" json:"field_5"`
  7051. Field6 string `validate:"required_without_all=Field1 Field3" json:"field_6"`
  7052. }{
  7053. Field3: map[string]string{"key": "val"},
  7054. Field4: "test",
  7055. Field5: "test",
  7056. }
  7057. errs = validate.Struct(test2)
  7058. NotEqual(t, errs, nil)
  7059. ve := errs.(ValidationErrors)
  7060. Equal(t, len(ve), 1)
  7061. AssertError(t, errs, "Field2", "Field2", "Field2", "Field2", "required_without_all")
  7062. }
  7063. func TestLookup(t *testing.T) {
  7064. type Lookup struct {
  7065. FieldA *string `json:"fieldA,omitempty" validate:"required_without=FieldB"`
  7066. FieldB *string `json:"fieldB,omitempty" validate:"required_without=FieldA"`
  7067. }
  7068. fieldAValue := "1232"
  7069. lookup := Lookup{
  7070. FieldA: &fieldAValue,
  7071. FieldB: nil,
  7072. }
  7073. Equal(t, New().Struct(lookup), nil)
  7074. }
  7075. func TestAbilityToValidateNils(t *testing.T) {
  7076. type TestStruct struct {
  7077. Test *string `validate:"nil"`
  7078. }
  7079. ts := TestStruct{}
  7080. val := New()
  7081. fn := func(fl FieldLevel) bool {
  7082. return fl.Field().Kind() == reflect.Ptr && fl.Field().IsNil()
  7083. }
  7084. err := val.RegisterValidation("nil", fn, true)
  7085. Equal(t, err, nil)
  7086. errs := val.Struct(ts)
  7087. Equal(t, errs, nil)
  7088. str := "string"
  7089. ts.Test = &str
  7090. errs = val.Struct(ts)
  7091. NotEqual(t, errs, nil)
  7092. }