From 1d2a9c3ad6d52b90e76112085583c4f422749586 Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Thu, 14 Mar 2024 13:18:05 +0100 Subject: [PATCH 001/197] Add e2e tests --- .env.test | 41 ++++++++++ bun.lockb | Bin 584813 -> 586271 bytes e2e/tests/index.spec.ts | 104 +++++++++++++++++++++++++ package.json | 4 + playwright-report/index.html | 68 ++++++++++++++++ playwright.config.ts | 39 ++++++++++ pnpm-lock.yaml | 40 ++++++++++ src/components/ConnectButton.tsx | 1 + src/features/ballot/hooks/useBallot.ts | 8 +- src/providers/index.tsx | 27 +++++-- src/providers/testWallet.ts | 40 ++++++++++ testServer.mjs | 39 ++++++++++ tsconfig.json | 6 +- 13 files changed, 408 insertions(+), 9 deletions(-) create mode 100644 .env.test create mode 100644 e2e/tests/index.spec.ts create mode 100644 playwright-report/index.html create mode 100644 playwright.config.ts create mode 100644 src/providers/testWallet.ts create mode 100644 testServer.mjs diff --git a/.env.test b/.env.test new file mode 100644 index 00000000..dc634013 --- /dev/null +++ b/.env.test @@ -0,0 +1,41 @@ + + + +# ----------------- +# APP CONFIGURATION +# ----------------- + + + +# Voting periods +# Determine when users can register applications, admins review them, voters vote, and results are published +NEXT_PUBLIC_START_DATE=2024-01-01T00:00:00.000Z +NEXT_PUBLIC_REGISTRATION_END_DATE=2024-01-01T00:00:00.000Z +NEXT_PUBLIC_REVIEW_END_DATE=2024-01-01T00:00:00.000Z +NEXT_PUBLIC_VOTING_END_DATE=2026-01-01T00:00:00.000Z +NEXT_PUBLIC_RESULTS_DATE=2026-01-01T00:00:00.000Z + +# EAS Configuration +# Comma-separated list of addresses that will approve applications and create attestations for badgeholders +NEXT_PUBLIC_ADMIN_ADDRESSES=0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9,0x277D95C4646827Ea5996E998B31704C0964F79b1 +# Unique identifier for your applications and lists - this is the metadataSchemaAttestation.type value +NEXT_PUBLIC_ROUND_ID="open-rpgf-1" +NEXT_PUBLIC_TOKEN_NAME="OP2" + + +# ----------------- +# EAS CONFIGURATION +# ----------------- + +# Set to true to let anyone vote without an approval attestation +NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK=true + +# ---------------------- +# Advanced Configuration +# ---------------------- + +# You can register schemas by running the script: npm run eas:registerSchemas +# Do this if the schemas doesn't exist on the network you're using. +NEXT_PUBLIC_TEST_WALLET_PRIVATE_KEY="0xfddf5e311800c2fad48651979111a9600434b34d5646924d377b9a1d22856d61" + +NEXT_PUBLIC_E2E_TEST=true \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 0c2740b87c3dfdc7fe4424d924cb8926c96fd282..d5d20609cbc05d2a5c3fe1dca4e20dd5f0599538 100755 GIT binary patch delta 88995 zcmeF4cVHD&xAtd31~MShK~Oq~0Rjer69{rdv4J9>B2t8q1UQgJiZmfnRO||)jvW;N zgQ7%K>f`Pg^-J$|&51{rocC2#zuEoE3io*MyTfu8-thc`eMb*DCu@G+A>QQ|ZclS`U9sYX z&MCK@y<)+B?sY4!>s49hInExAQ}xe=j?)C31#b$LTlpl*M}lpUm*(f>mQ&9Rs#CcK zKp#vaU*!*jv;c>IswZbgqI_XVzB9D39F=XpBx` zQB`?aL1G4aKeaME1skN-i+mcaYG-j9DDyr>k7Q-l1iUOe8^VMIiE?${0W)To7Zw!L zNwTW?f-;~Ts0teIWd^7b!uIf!a|*D?aXz3dU9QS4D~kr=A~Iz_C8+whry9S-;7u8i zs(moC6B)nn?Ku2j_3J*Sf{Ko&z${QboC>N(M}jiwYxE?45mfo42R6Y`sk#!x#;T8O zy(e^W97I)*f-<-gvdSmi03E&w}b^%l!;a1c`;J z^3s8Wajla^rn>)Vy3udi+qf&~wvEV@pMP?GQF$2--nWl2t0Ymx@HozyeNDF}gBqw) zKsERgdg8O-8sI}g&A`E+0=OHfikpCPQ&|ZiGQe?q^fwW_8QcT;jiB^T*k9w*gaL~Z z3`np&wcU_kXhw1H4cG)s12ue$s7e!|1e7@yGmB-dQ#>=jJa@L^d>f4L+PR+vCwlSr zTL&4P!h(W@(m69`%03m;p!0a}lozk`hM4fkEiEo9n_uSqnq|$TtjybB>qwLh9>|*E z+@I|@%!#T*S;qXb0>>FY%X6NQP~jG0B# zkmH8lRV6v)voq%AFFe)=sz!mT=s-|mbpWW2?ibWFY*(3ikTENDgvm{oz8o{<^|z5r zyW7F0mKmivx%p*|b2(h{_dv~t%tK5*-I!HSJi}QJSN>MYtMzki_a8je%(m;nj#>wn zkx)G5f?dFa!LDErP~+p-{4YnEczzKibgMRlnod`OngyrY{4!7m%?9PCL~&_;UZTty zFxqrzUr^!FAwt3=jf4XI=isGAo&DNTW^%nA{M@K>W$Q7fvW6Br9AkoL$I+(poT7z= zIfTi#z0I7zI^7J?Tktm2c?Mi-K{=@4JARz;_IS(Rg-hOVylH1RTrvI-oGD&em1`A` zI@T0C1gRK;6C>3{AU@5Uw=?{);WI;5On^lt#=wUwZp zQBkDuubk~HL?AbBnP@WFo@jf5ya#e3Ji4Bz0abX&B*$UpsJa!dVNJ@fgtvxQlqU#s z$GL5asV8HqG4M373Hh^%OY)Sz1KzX}0jpZ^{36FW_9PRa(?RO08f9^2acKs7_3U$} znF@MPQ2AY^o1R?)Y6$iO)w5GU8L}sOT4uh_F^1oOLGr+bpoVT4=qXS}1nnDluI!9e zVsk;M&CSov&6(>s|Fk?Ab^|CThxf469XHdM@%UsDrp=M7`I5xUg$~!uS;pK2<@rVG z_#1GUIT@5c{-7KKIkc|8cGe^{upnU+%JK_O&M$SG&jy%^7UmQbB+AO!M~%TZ2ir0K zXiSw?W)x|MaGdQ_t8RP<*01da21oKH4Gp@Wrg23@Le@E_*!(F)rdxAz7MAHaaD1`R zE1z9jTrq35b0u8u9SjnWld1-h(CU-FP^$+qVtJQ&rW<+r1vzp^XIrqX#aofd4~Ni2 z`9I13pivomPf**WbLF?xNi$U&Fi)+_;LwvOnpO5pxtYzYtl6_FOl^gc4UTgTat(I! zG`OgutUQNtcrMjMck2cwf6ja}YQLZCINi}-N4_@Cfgqz(S#_yvN24OQG^Z@z8NDbu z%%wTy^tceNtM_7~S3WzxND|Jy0n;6zcPB&V$GO}PB}^b#{} zotMfDoMv9K8FwMj;ov4v6(-MlN&M?^GI`8Q9w*Ll)t4NX?ikn(zUDNu zE}R4It$EsXnaQX?AeWZrmlYSBobTkEZWe+QKth zl_PWJpJ_TU7rDw6^b;sfFG-@d8Fnk06FtJRsoOMABSUnI`NCI{R1?3GByc=BH4;|oo0MQI{Kv$v$8 zXrb;ZUO+Ba=akHfLFG>b+km|Om5!cq6C^E(2BYEKsg<=~gT7sVhxG(Q!Bi^p!A-w zxE}1NwIr2>G=d*uu^j(2sGbeoXa?v)Q1Tw23}_BY|JPd$eqUqci{>YyBXr?yMt>Tp z0sEMI#pNmJ%hO+gEy4Y7r(;@6I+2i|@g1fI|Aa@b1y#W@cN#nt)Q}7WRbj8q#=!P) z4N)=za&wC-ipm}5B^qjv{C;cbDzFp$Y_Ki(IT2Oagv1*pnt@N)d0CQCz%jerx&0n9 zhMSQ$C%>RLcWyDEH{o70G;e~@+~H)NkvGG62CjOpxz8A!Q?{@ucP?JZ;lJ7W&g%P3 z{!gIV9r1t@9MUSoO$75=b*?OX$mDJX<)X{|(C-8~(YJIX;>ld!c+17*dbv@X4y zu~y}Z@)zI)$C>k}apyQt?udaMz|K~l1`-&RRbOv08Lxs;d>CvE-UP~D*MVy2?k7wG z$+i1Z5Y-9`jBF({wz>lo>iJtGJ9TubKG+#(3b|at@~G=mST+U`I3pkH$au{_OkKb zQ*e3jcCZaNaH}z>F2FHR-{Hp$-=I7Ga9j6;uONE+ddm)zrxdmklG<>DD+ZCK~aube| z{if;ujDJ@6XTLSa35@P*2BwX+}PU0a1js|H@SSZHnPr;nI5s-V?k7lm`y}+DwFG zi0=p2g#MKgl}Cyz%JXI#oDXq&(0~o9j+d(1LeBrR49HK z4R!?oItP+5|JS*&@t?+kq+yM|H=&-K0-73?iuu?7WhPBB)*pbY2gx~LCsS2&4s9o2 zJ%9ZtGh`2eGVn%=0jQW-0!nZ6FQ$X*Kza63P(#KXEc)9?m|Q&)^jxz#`!_RbC&Lvh zC8de7!W<6vznhq;1?90P?R%$%v4 zxg=i~_#Jw+NNOjgUj`#Ov}>Q-b8;3WiZ$&Qcy2U?hXwOGv>UOwp&NDZj7Dy>h|B|J z&(JhCa=UD*x1;QTfWM@z$&( zZN|oCZsf+5U?&t0BVSv<9nIZnyps(NvE{nk{A7b~v~Z(gd>T|k?a7y6$?}a_87HP8 zZ{Zxk^L@rye(7SzzbU9i`E%Dy!IGTl0N@YtEoe7Pwp5O!PVbWKt*Y? zr}N;l?d;%#j{RMIbJ5OEp25n3%uemv=b|AiCtA%iJS|U73UWHN%ba7`%(4v5KBYN} z`4!8In3Nr5t z3=kIP4T>J)JV|~ew-vk%%J3!w4Z5HVo>7o9H=jGlXUW$x{~)NKZj3>iJxRmNmt<^6 z$>$--Z^vF6WC{+j{>(3$SCJ^qFHL$qH<3XQ7CZae3X^f4lUJCrC{g0HMXrXE4gTKF zG+a?I+|(V5K$ae6F$T)zU9t`Kh06n7K=tHpD((hu zKhSmhfe(S1;6>p6;55qzfEjQH8~{Ey%w@LoG#RXvV73(u0sF%rpkggJJq|HLQN1tmWpOan1%VG!%fiSgWBPSSR4nc;`=~tOwBTlv^B-@u;jSpI}08Ca3|L3TpD@@_dd>c-H^*{FE=U3g}+uL=%Bk zpdzh@68PG@J^5+T+(!ehU<%X9gsXe}Dc#?z~d^yPM-mY@g6jNPtri_3q zHwJ3T{xz=t8b8}78~^-1&5fSJzXf)u+?}9~hAXYS(DI`|nbjL)f>c&DAt48Tev&De zSIiUWlO5+qDwc!4$u$P$<(dBTEo6ClBENJjTm!Qr-^eRL>GP#)f`fxIc%~VMEucE$ z&ochL3oifljpVE`MHJK#ELpJ6Y%@TeK}}_&xbsoy2pZPZe+$E8z<;!+cb#Jld%!g( zu#*$q7L{u^%quQrKnE6LFeCdPe$&|#1vS*xVsgXu;4=8<0%PEYV&kDdK&?^RK}A+_ zlPS^Hd0bxynLXRN9|cGD>|D8pvR%;m(}D-zgj@^cHK4-(Vo=^Y7mT8`OkZmk#e6q9s80lS2bOJkWmPv4ninac4EgwEGs_=T*jA?;=-qpTgDbQ#Tl%SDahU?v|f3C#u9be~lTP zGEn!|Pol3e-2f^czFTXYu^O&!2B4hv>bj`j%Bp@hng+Up8n*jDHM|H#`C$sE3OQ{= zhV)r){Lux}s5Am)UD~oYJ$rzfrh_Rbti9RDUjsEtuWpb&>&I0jRKW$en2a(| zmOmIN@ck{Q3U36pe%wk0`+-YA8K9&8ApAKizeo>boil4pJ@Y{gTyj8uzResg-Uju^ z<6$uRqHDHQycR)MG8)6>qB-V!EN2p2Bb^OuB|ZL5W8e@_an=F3%3Z$McxpMQ9)7>k zELf{S4b9mYtdmVgJR;Bf_mHm&pS#-}g+2j$!1oVE^zB@^?|o(!Q=zo$>Wq z@2)ubk1y`ce)F5)^%KXshX(1B;%<46;Ag9#nxB^iwfuY~NS_>c+Xo4Ljt;8%xge`(x=6FgD5dA?!^ex!-K+U+3s0E zEz*~Q^yzW8EJ#d`d-oIi!-9;d+3wFl?ew^R07HXAsC(Yzn423Ua^mjlpgJe+HzNjz zk<&1kmlN}kx6BJNYqQcI6Ub^HgZ$56!(nL=>&YBA2$mADeAxITb2kTx+<1!HJXoJQ z+&w&~&5ip3Bc;Mo-~5*>qZNAEjPS_{w&i9^H!tolfe$d1O^x}tTGlXX=nI&91S79M z^TE`*Jul`hf*l+b=48u1Gvj^=+k@&ctqg<>4+2u>=A;CIIL*{KJHCh9klF~l- zV(xHvWRPAE_pfDI4W?*=VEgx3L3Kgg-7Ba?K9yBq0&+Ll{tK~H824MU&>bH&qJeAA zYI01HrKEKXdKV4%&txu-N(%iKVIxfy?_{O1E-NCaFE{3n4bqEg8<`Zm08jfL!&JW; z#mo>En*$=2SrqdNV8Z~*lons*lf_YP7-a6R9LB_mnzm`;8=iDQM+S0gJ$qmk^VB4H*_l+P?7Wccd z`i-M(6sz8H*dbB#9|!5>aW8{ycT8B=&K(w1m&e^rK`p}15FRZhKhD~!7)y~i{Ie`0 zrl!P*v)YQd->H}5u*J$>4Cw_y;^esdkD&VGxWCVS#*_fPC?CR(Fl-t<_?<-LRT^N0J{eYih~s?u;2!w!L^ zg!9(Y3@j7YD5#kqbAzCIVch>mUsH*rPIzrIGy#Z4Z#=1k8i@Do^#FDtzAG7xlwoT3Ur;$?sST4`cN`oj=ov5LAU>Xl*0bSpl zDH}y%m|5Vmj4qA)j}VJyL1T!#-(mftI{Q+gsdM|Bm_MDQDkX%c#r*X!Gx=E_y|-cg zG!y;CgUqtsILLgC+N^aV&I6u zeAt*Mw(cXP$T7Rj4=`Df7EO|~4>UDIdERTV;o2ztHbj8hF`L3@n0jPvSO$~d%u==G zPkB3RUP@SV3Kqp}%f?GEc{SQD{LL^-v37h1qbPHV`0yuDy^WTVn15a!(_;GoO!00! z&|-wC)Aa3FnCy(Ew|_3|2%|~td~q-kI(7t$^o%;T9yXdJY0FmFeO8%}kHrIL#FbpLu%>Z%viOo{o2jW)}bS+g&NF)Aj&ynl#Ale;a8v00A^ zNPh-N4V+odZiLC@Q4Q|fLG8tHe^0iizDCCM9tzX&MU&k-4aU~bd235hdr92yM%-(t zDL*HcGHFck#U;c2l?XLfCK~=>nK7~to0!%koX=`n0n@k;!!)%CX5)rg`6Y~#$CPYu z;8>kYw3?QYVo)`2S!?bLsxOQCe<(MSZT~JSZCvvFsi0W}vsrINS%xTU7-PVaU~2L! zVED^0??u>w;fDK&8+Q1eWhTRz>bA_Ke`4<^SvapBGmcTjQ&zJIMz&=QS;y=8;2#My zE!4c8l?JJ6z}o_w6l|EE?M)nCT|lp8qP0*;wUP~y<|SYQb;9+pu9FiW-g_{!X|$ha7Jz75^^b)qaM-No#N11R+SPIYm7N+V#k>QU z#w^1G(*{x#BU`*2JQXeT<4BDS3TI~f*OAf;q+UujW4cd?Hio%D?V7l|F-Tt<_Z#Gz zd4{dbr$b;0=qT9T^Ml&8arcoReO=uBXOLJI_xj{%oC?db-GxEzy14%UTr-aCk})`# z1C<%OOg8H?En}(>3=p}qVRRsCJ~OGv+UU)KjnNwC-$9C)(0pQ5ZZgX(2ws>um?4G9 z#b%{n1+!}{4Sxw6Kptx*Yi-BbCTPsON(AXQ#l3aNI9=X2EG=O-SvBG94;vP2yCmCN zM#_xk^Q6?LM#1(=Vt&dT(~#M;hQVwE&WpLFLHdTcdq=06UT$zE7fqBGDfareL={nohqPLQ~jLujG#5PJeAgXu8VdG&oQ zX91Ymb>_{E`Cr52mozP+E+>wSabGWOE66!~6~(+~U<0Eacv`V3i3tyLGg8CZ28l6B zdse3svvae8aU%&)6ysEum|I|KhC>sFpm%LvG#GB5AbnHZPt3DDl4sp3gX&E>QP*yY zr}(8o@7ssF#{`Mnbu(Pe&!>ah+v8qZ8QVv6o|r^R)tko7f!VOSjNKU~S2;n=$uX}% zc@!;7zj36vb;RWXDNPwpo{MANTd*UdTDw;y<4p2W*zjm5Hj*-%!aREYHcUa!l0&ag zPOe&-eK|qmuDBZp)py0cuJg5oZ@4SlJBQTaQR*d9`B7@{0-ok6P1YjJy<=w{ zXX)=?c9fXEgHADBVSvw!xfcf2_u=FvtcAh0rP=;OQgRbF8BCgsU>bTqiqkh>tZF&g zUdB?KrZvT#7o8SB=IaYwl}Zce&B0E~%+aMbnHOw-Gb^pi#2V8G!=_ng z9#~unJBUimPFV|+t5|r8V}7qw&6t@Rhq*B2G5t6qRKv7=>nxU)29YI%3=Q--&Gel3 ztcke~1l146-5x>h!*Or^vS{ja?0uM&79lsxEM?ABKf(iq(|LnVqF~-xS!obWtZ2RT zyPaVs9qZS+m^&+|-hwZX4Mf8n27ZN&ghicl4+;{G#=XL)l`sXoIk!CmQ(w#>^H-Ri;5jkx(6gc%**}(((lXF2I*fk-i|Y6GJ)63M zZF$-L1X5$sFgxU0n4D*<{TQY;Qp~~roTOv5WKMyZ_H`1w6Q*8rTSB~j0gD^9DaQSF z`co`0=bDIQ!VyVpV6rPEy3PLqX3lDdo@f27n8@em}vC*EReD z&o_A-jbF`5gN#6tWroK)Jogi)z8NLuaKF} z)GUhmT`n}!yJb{kUXXY$?yo{-hC+8*zrhAk2ZMTg%pZP{nU<`si(~GbAn|2sT`n?dOwHTezQ&T@KT9!{JA`S*frif(p6U=vLqd&@1bNigODx5;Uj7&Dk` zr^Wo!Va7zQC3nH(Fh-7zIQ>%1eBB_PO3KcJi(~HnL1Js%{~6igk*+qOgF>^(QgUX@ zJugUqCGJ0kOct8eVBlrRIyA~9FwMQ_M$&&8rZ_e6)8X>ueS>1L6qXg`soZ*)EMd*W z`cGj)V6?g_=6AlL-r##D!lDz9zlM})iyGW7gY?(p{?IE;C^4H?$Na^xG1P-kIO(Te z6@2m9aDT*Arn=^u@cv?$;*8}Hckh3-*@Mjbbs0=wHeFr-z+QARF*2qomvn*r5VhOy` zGMvNx?h7y*)!6X|?2xE-X^y$hoamcI<-UL!XUP7n>y5)r(3QhZGIo&HdUf6H9&F~H z*j+I7&DC>z0Zgyes!;VYV z22sFy)zX?|z5zo!OX{z;;H?tFV#M3~PFEz_`<}luPCrqP2h!J3lLxoKaC925&YV zNC~&MXPt$e6v^KtrBNpa*T%focd2i>4LgF=BqPVm*TdvxW6M8bd39{U-AV5#TGzvd zlNUX;aX$~zzhYCr$FxB&S*(`A21gpinfD-!^CnN;ej{~+If376))6yfSHOm%AC0j4 zaZtN0?sg5*zm9to@1sw8yzbphDteyhe@iM0ZI(iwHtcu5nL90`b>=phS@IO&4IVI- zn#eiIGPVQuw{u|qsHI`JeJL)54TPD6_y?F;z`<72r@@S!T8G|;9bA{!?crpddYUpFHj2FHDC@6>DJr5! z^S*{1VaEOuQ-+vhgvw#EBZ^h`#vt)8_J6Cvmdbe{w#C@CXY}m%;zyn6S%zVs!H%c2 zVZ$Ed*AMGh06VsheF_^_$6}Ay*Sr9>vzCuwqw6&LJz?(4Obbh33TNVpx%V+_c(_3) ztlA&r?ukMAPx|gM@l)J?@5$sK>29F&Q|9n<DOHQ;@;EE9PGT8B1(VAeRCc~5&jfRR8SYPc#*7M<;Kl109iFe-V+v#5)v$rl z{n|^UG=EGqHhQ6M2jd1Q22*UBo1kKwXGV1u%*4v}_qdn-o%`CCOdoI(k$m*a$>>qk zt$=AyCXYG$25dZx*d;y=+?rf7xPkKLTV{@2HLwYhCbt-VqgRqG=x}=|Y)&-SUm$f- zl*)J&e?+M=QWK)oQ>4a5srLVfR%%vRERkXtt7R7WHeoO9|_YvH=fe)&2WzA4);dA$+N-e>GEMA6iSJB5WwN zM&?^igy=yZumGU`7~N={l=e}X>AT^V=beN z=~=0eC?fslpPR;r8oD?hHqjV@bJxQTf$^BXoNo=o^p=d`h*~p>Y&DZ&{&JXFMCHz` zG>Dn$(O&jNU1yoQ$HLS_mM@}fMOfX6y0#+J=*gy7O0zG+-mTr?ZdsUU?Z(|V!)m}g z^ecI(a7ng*At|-R(m{ZK1UsmXb>C(l2N3SW>FqExZft<=`C)on8hie0a}HxDTDviC zpKtWF|F+Yzy;-DqhW$*o?|*BSG1EdEc2s0t&4XEKmY86A4W>aMl(|u95vK1&11D}b z-H(=0Zv~9^MR@Pw^{`giE&iFj4bxgS5hhPlA8X{JusLcftl^8*wC~K>JzBlI^I)9$ z80fc2nFrY2{-yCNylPk)iNliBxZT6_y=iIQ_vEU!D5Rf&DV(C(eE$b?rZp@98(Wum zH_UXHspWY;MpJ|@D{--b#x+>S@=X&M5BC#+- zflP`s0qvyzlJpSIN4?3g>>y)qwtqJ%EkaK8$TbaiVAP^E)j>Ow(~TJQ&W240Hq0BA zMq;`#i!D0-s}@@|aUCgZE`#tT%ygg4#+&e)ol)-ku(~Uu_dS9^;fAhmwm0N=OfbnG zNM@U4<{vy+G|5GE$@X89Tuj@Z6a79VKh3oz9MRqFB4;ZnU_u^Rw{9U_&Dnp0v92!s?!=tf>>~ z4*WgKc!s!`^|pce4GVK~FdC+bOE~jnW0_?v3G6)ghUvYi?0baK5@o(wN;U17C@O@R zY0Mb-)i5pd(ep$1tuV14u598_ASf)%_75dxHl~_ML&DzaO!$|=L^@5ZYG|zB>D6N~ z?={$9J)H5HHlq44qYt4%>Yy;AHv{q$$%CV$e^i<=%@1qJS=q&m&XXh$Gs!*qmA3=K z!gM#=pHEVqWhGjYl?G90LpXkSZEQRp_1rr_Oq(n#NNryXd;x*HZ04okgrZ?#6TY7# zr5epC`V3g46=wE!WB!9sIgTe5__om=##OBCOo>Ba3TzI+984~PDX>`*IPO0OJJgiB zIF{0~X*fr&Ixnp5k0p;Zb)%VT%-(a)WG7VVc$n#*)|qo)Y69B`@z-DnM)!%WnSGvu%@RQa~}#5SxEQdcLbw(qC<{5A*@B{ZVJV=8!r(>S+yo{cSMK+Ne|B*DwwdW!c`oo#;VyGR-5UT5&8^TnsZ& zzMTWxvoQ6A&@G9jH0&I%KhPcSkLqm9Vhg0iQdlf1pUL-Kcfd?}4n|%|7c|w1J2xKzh^hI#x#!R+`TYG zgvt8@X4_$U#JihvW*IGp$tC6#dJ{}tq%+LiPhbkg*7}CV-?xWpp?P$AJrSnXsfCT} zY#47?>U#@PW+~Kk`VOYrxq;_fjI^G{Dqg+8jxv~rzd<-}ipd)*&1h9>v9Ga%+8NH# zF!Nf@)ug0FkmSZ1?AX^0zRW$)%j}i(PJ&e5$UB#il6^c3|2!)VqG&SD19rgVXw%e? z{mdAdym>HbnoVLIOqx-1{wFXsZd^4eJ?Q`~qxmqq0`VC8YM9*593D#7V5)@$kjAgtGyx7;aziEbu`kg21ut}6Oo9NT9XmN;khSdG* zOdvXj!sHelzyt0=*mxKdmr1ryW^!)Spg9GmTF~Tyz@?TkNpoTiUd$vy$`ACK4nQX? zT+ha(6xz`Md*{HI_&h}1YErx$+u{IC)503|ZBiOIbEsSfQ^{zydiTSkdFZttsFV(? zQ%Obd{d$*^8XSFn`vNJ=A*?HldCdp0M`)h7qr=3pguxjI_*R+e{23|TTH+cy)nzb> zhCP&(3KDM8favmsp?(mWO4};Z0|hWb;|14 zO4!0A^P0q6XMUJ5$sOj#!#R`Ocp8Fv$!x#iAU8VCnuBLZ?L!vw9tB&PceDVJ(2E6;tRnn7U7_QAPYP<8(H8zN;*Q9T{n|^?Kuvh+>@c z%bBEj<*Fy=%Pk~1YRsl9N4m+oU|ygY4KqbKY5N!diM<0;KyouoUZ+v!Bx6_tX78oR zyBT&&oo2>pH+sevX?lxboNRJwnbgj1dIvtJ!-3c6ihU-k`J5 z5}9)}?D)DSuZNvj$9BN#40nfxwRz0OiZQI|(f!vNQqxd25u19987aOCE7841Z9c>I zAVN(rFWi0%Ya(nG%p7L&#+sSI-30-E1#Do{vW`8=#?|lQv#`3Z_|3-GchX5Pl`{+W zO4v@#SL-uxuVd*=SeS!rNa?_1hTvM*PIuPAblNs~`yOY!V=P__%Ox+0SFgkIED+iN zyviu0r#ugmnuLZ~yW3B&TU>O*eLAe}_~k!q^N2%s@8%~E%F%b}qew+tPMA3fk4YX` zqse+7%xt`3|AgrjVP4W5K9L)rsO3yz{#=;+&Zb6OKUJ4UTYkqA&A~gmoADDc&4=i~ z=D!Au&KuF$rst$&G-$3Yg=y_#L7bNr))o;9JtoU+mUZ`}Fj35S--AF)59|N3nD0$7 z7P8v02_FxWP0_C624SLv0?#AdxjLs!H7jDYG5I55X71~lv=(Lq6}AIrCbja$oRpl@ zV%0FMjw~ds$K9seC=KVe!l5wTyO_LpVL5dyo|BAcmAeKO<(cgqrio$7O`MTjL#4S1 zCd*7-T5kOo@?nF>Yi{oPu7GMr@!XUVY?Nm@AHC}3&x2_Mi7syP9|@}~@K2|FbDrWM z=S#eFXEe-F<$aiLpqOxs_`x$xY;Z)I8uJ#wc(0F$e2$bkyK3y)%`y>bYM2buh%kY9 zWO6yoYBJid!pu&kE@sb8&Q)!V^I(c(^IYI=m^Ml?1Am687IQcplrRTCZa^5Ad{}gA z7jDne-3e5;vTPu{7pBp;V?~ha~>~&*>fr7ZnThZ&1p-ITWF@Lr8Us}ow;onndQLdR{WX10@Xrda=pyOD2LllXLBJ{&!AeU z7BQp8k+ym{0de$F9V0d@=R~oRBs;T`Z;<4l9{@w9<_vt?rLI6^2#SDV#y_ zXj8+>JEeP{%8qHIb4Xf+%_MDQzmv309DZ6|!{?E-(pO2^V%?V26-$sDZR)+9q}Bb6 zq}3gDdYv>NX?o0q@9Ohe+8Ui<$2^>;#~v{4+#RD+$<44Ku;{fe{}Y&IZO7}lQ(3gS;98L-A-&dEhkI+r@*v_nn=6NGK$@jl?KsljI!MQ z!rF^yCUKUT2;AS?o0XO%=AIR%Fl8RF>I^>H%-2-i?EB>~(~P$2^)NdRcw6H`X-1Eo zyPRVt0WG366Q<3V9J!(qng?Hu~g4ilGA z(TfPROyTof-sV~vesLKOkzy;&*{Z45Ztpr+^f=0WFRZ?tLcN3J4Y#~^t>=1E9BnxX=v1SjtCRtwJYAu0j-k?g*ZGc6asosL|YQ>_50zFrm{fJh0&7l}( z!jFgG-WnLc`Gy0&Bqhf%dOTC=bFJ%?MwV$uyBem^iO(KL5KkHIwk&57_2nC`Y1 zFyiEh>f}*^!FL}Et8b?Hq3g}67%eq^6-@4Bm1UiO0H%| zFm6@M{Wwg&g^C8>oSc}Nz701R72^Aun0sVci;DLp!ZG2tTi9}k+!BSw#%%vuQaitz z_zE^L%xKMbL?dryYois;K}$G|!iEJKDDWXE-M2RiGmql=WM){qk-G2Ss1;E8Yig2v zRSjPhycSm1U|s9m>bEi-#<$HVciv>iu!)}PxhI6xx3R=N7S;lO*W0nh7(n+I!lE+X z-K6rvLTq$9g|(Z|Ox%%dlE>-|uDrtyZrXUD_Xg7G;kJ!*x8zQBYujxUc`{7D1ADt~ zcAdO%+a@wMlRPQRXi2ioU5tiFPF7McDSFqD;tSP{+1`(&ilQ3*{JZT0if;b0?lH?5 z4>gzZ`tGXLrs3cI#ICu&o*C};F#R4})%O7-WJlVGnT>Y0{gi(edHrBU`@0 z^^0LPkGEV!m#w7 z2GbhHYB4p|^c9%SRj$LIM8)TQf-aNNnznd!7gB#JQu&{g(v(=!OJLDgMs+2p-{bQg zbnge!G?N6jbrh|jfHXt5a7RUaF`S>>a0Wy<6d zs-ANGxJi_#kd#Ze*V0>nz>~>JqBqn=IZ!`%!^gEp7yL{T<3fck)rgck$6Bl>7k^ zE}U-`66JPS(U1wQJ*i+pqmCEvlri5{kddM-{%oM|yAb z(X}g-{yR~wK@2|3`3ON8pD+2SqHp-<`gc%0;1wOm2{RsX+f}OmfANv{2R^!lvg>C) z%Kydk-z@(f)Ft%zG?0=-B~vXIHiqvB%F(SswbRz-gBr^}38MaVKtVctTScJ^>IAC4 z-9Tk^=Z7lnX|b1tT=j8J_#ouU8f^20s%I#F-7>Q5Ae$jng$IM097lu78lxW;l|07s ze+O0HIIAyI!^c~G{2nCKvxyRf&uy_IGTG+u3RQj@`R%}ytzLapb=>Gj*WY1FG`NR~ zE}_a@;5uR1qi%~REH1Q}^-+y;9}+2FYV-dNHT>72r!e7M7G3`aPO4K>8IEw#RUc(7 zXRBy*I5I_-P)UwT5pp_;E}_=K7Hl>@(3NRPr&)>tl1|uUh&4Aa;uy{<{kO@Q%mb{^8q? zyJ=n3{`=O5U13`I{p0*gj;iwu)TH?(KjeUIpd9k8m2bE5?<{_A^M3+$303YFP@)}H zE>!YY%Y~}<56i*INRUElWq7K^q86YgaEbJ1vxUv{!=fU!JzRm(&0-(01$>y*6Dm2} za-r%S397xrQ|P}EqY!ASi~;%I8EbL82$xXF<19`9)zBDP-JW!o01$7C<%WVDv z%NN@Gg_X%fJyd~3mJ8K@^kn%Npz_bOxExdm&awPlP?u18=UF@-RMv$SS6HkJNJ#Nw zic>mLGyKxkD-bGEdzh~8j;_qAh0MvMVZ1aW6|HR^_RxWhIj?dT) zs@95y^6EBFqHp-2VfvSdMOF7bT=)a1te^PN7TlAz8-ZfP=&Fx0;2>N6;7Y4-uoa91B|6;7cZC`v{rf7q>Z1%g+RBB}8waYv z@mBssPDu1$-3niaw~EKawWV=EM@p62)b)3$@+U`njK30c)goI^s7?AD%l{oz!{?!|edkhJPN?MN z{80XtR$d?7aLw~>v*_$_ja9qWstIN1b(YshRkzy8|2wFnYxyCpPEJA+(NcAX&A1Cx zL-&9(=sUjwE1x>Xb^`IhDN zQ3kwY<@HhJ-$gEb57YpE1Zpk*#>&67@_%U(O7VM8mr(o%P#bw8N~?k<{E&PPi%mfp z(9B{BP?6IW)Fo7vJwS=}v)I?-{-E+J404v5^C2u#L7on`L0mw+$i#O3pw8E z31!%EmJ3z?@s~>B^ z>Rbg?v8yd!qip!KpsonR^IztOEVVT@TmN*Y#&bQ`8hpU2|4*Qrf5_G+R6AQzWmS0K zR(lWhn9UbzcwYup?iDK+D*3wQ{}og}-=Lh@ecP57O8!o&J*vNNGlXjRL(A)^gYc7A>_{AD<@Hgb(fm;Pqd;~1 zSWxnbR(>L=_Hsbklc&u81l8Y}wmkp13ZCH7zp|o+W`lY*un3d`mVzo!1?t)rD(eh> zsQj50ms>mwRQYo(KNr*`RQ(rfB$NnjhEP4Z)N-NnuK-oiRaP!kgI8PmD$B36{CZHE z!%bFxGpKrRwfQxmu9`|K*kl#%1Xb~7t56>$zsu&|ZS#ey_&&>pGV}qS4 zQ1PlClBa@_Hv;uYsS_w0dV+d(b^s{7SVKEwhaymc11%l|%FRcDYIqc=3dVu_@0`F7 z?MyR4<Z$zBCcXz%@CQ(eJ3uM^ZsmV~x`c{>CX9#l z_t3alluAp>g(~01a-r(&VC5Y_^gB7-ZN`3}Doh7;3El9yHwe_P-f)|T|9ZpSE86G! zS%vzju^DFNLUnDpDgfhFE)+k=a-sAN24&gdRxXs@5uilJSUG4`H3=k}zz@x}98eYI zO86I4Fcn&PeUzx2A2R$jP~}et)$kc0|2yaD$Dfc;l*0LB3;-VlQ^JmK*&FCBR$r+4 z9c!?szzt;ERI?meu2eQXe3{WcC)HOwwO@)Z7i>k(Oj_l`&hk>7CTw&4C>kiHjb99UQ!4Te8=wh=~ll!Y7X|b za-r#TwoQKT6qRlRUB*;gfe89<-$(zNucznfeQ5^P!3%T z>JqBKC7|}zvq3d{9;o_Of*RSYK>l~u=%2Ht)6NE%D!K<$f%}#F7gUcPMXm-OxB0t5 z_3R0oFI0U`gEIUDD;H`?Y^@}r09X!#>g$?zd$}}qw%ECNQ70kABp&FcHxlk@F1UrDsK|LzJ z+U5&W!uvmR+wnc(b3h903)RQ_K#jr^peE8k8r!9gM0EXcqV8h0*>-lKS!#EYVGP=- z_`k%5{a+US=M8Bkes@E4SRW8}gn zHeaZbZEE>0a0b~%K?V1;ib54^Zn;qTEkN1d#`3l{U#O7iX}M74dw~tZo}bxGxgS*3 z^tWn4sbyOE04olcbsD>xnitD4~ldN30 zXV~#`+pmNb*GKhp4szjKiv?CsxG(aRmJ8MVWtI!o+!dh8UuosLKr;h&kwLLt7gU8; z*@~|Q<;ZI-zs}^Q~=!y>e>~mzT0em zebf$fFLKp;zsJ654Ss^RynT&M!?gOYy;YN~9v`MW}QP%zSAA3ids(?qyaT9ux>(*V%4htQ&@rMns0R9gQp}7L z3`#!0^7^QX2O`%wY6Pfyj6Xus0z4PgwJTJ) ze5*Ip>Iv20Tu}LiR$d=fZxQlJDU?`+`X~im$JtLZttkEJo~V zTm0X9uhgtRyL`b^!FRniU^S@gzk~Adny9ovb!;sk;X1Xi#EpD(3DxjT7H3`|{({A$F-@dTA`@K^0 zW%e+w`dmUKcfVJ<`@PcL@0Dss?0&CwkWPAB^-*iY?)OS}zgPNq@0Th@cE49@p5*L) zuXOi&rS;!4)!q8;_eycX|I>S>T45g2a|?^wsCK_s%2PnyH1B?|)H;IKNzDU45|L+i zzgN2Zy;3H~?)OS}zgN2Zz0&ACQ+?UE`@K?mfvf)erP@e$zgKFu&0V}t8u<(P?)OS{ zpx^yoDc^*1#&UMQSIQUWx;feXUTOXJOSQi4ey{ZZ7NPazgV? z7pI&s?W%7t`A4hAM#p;`a%Sr0&d;9G;I6VeuRn0YDSdP|?mE9W`<+Dcck
    hL|> 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 b4()*Szwyzs3Y(w3FxjLVbhIcf`_cag?BFBa delta 87940 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

    Z`jcSk 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 gZNEv0<+QsJ%M}=KgdT { + try { + await db.ballot.delete({ where: { voterId: account.address } }); + } catch (error) {} + await page.goto("http://localhost:3000/projects"); +}); + +test.afterEach(async () => { + try { + await db.ballot.delete({ where: { voterId: account.address } }); + } catch (error) {} +}); + +test("Submit Ballot flow", async ({ page }) => { + // Make sure page has loaded + await expect( + page.locator("a").filter({ hasText: "Alpha InsidersBringing you" }), + ).toBeVisible(); + + // Connect wallet + await page.waitForSelector(`[data-testid="connect-wallet"]`); + await page.getByTestId("connect-wallet").click(); + await page.getByTestId("rk-auth-message-button").click(); + + await expect(page.getByRole("button", { name: "0x39…dBEC" })).toBeVisible(); + + await page.waitForTimeout(500); + // Select 2 projects to add to ballot + await page + .locator("a") + .filter({ hasText: "Alpha InsidersBringing you" }) + .getByRole("button") + .click(); + await page + .locator("a") + .filter({ hasText: "Bankless AcademyBankless" }) + .getByRole("button") + .click(); + + await page.waitForTimeout(1000); + await page.getByRole("button", { name: "Add 2 projects to ballot" }).click(); + await page.getByRole("link", { name: "View ballot", exact: true }).click(); + + // Ballot page + await page + .getByRole("row", { name: "Alpha Insiders" }) + .getByLabel("allocation-input") + .click(); + await page + .getByRole("row", { name: "Alpha Insiders" }) + .getByLabel("allocation-input") + .fill("5000"); + await page + .getByRole("row", { name: "Alpha Insiders" }) + .getByLabel("allocation-input") + .press("Tab"); + await page + .getByRole("row", { name: "Bankless Academy" }) + .getByLabel("allocation-input") + .fill("2000"); + await page + .getByRole("row", { name: "Bankless Academy" }) + .getByLabel("allocation-input") + .blur(); + + await page.getByRole("button", { name: "Submit ballot" }).click(); + await page.waitForTimeout(500); + await page.getByRole("button", { name: "Submit ballot" }).click(); + + await expect( + page.getByRole("heading", { name: "Your vote has been received 🥳" }), + ).toBeVisible(); + + /* + + + - Distribute + - Create profile + - Create pool + - + + - Select projects + - Add to ballot + - Edit ballot + - Submit ballot + + - Add list to ballot + - Edit list votes + + - Create application + - Approve application + + - Add voters + + */ +}); diff --git a/package.json b/package.json index 3d69138b..d3ecfc3f 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,9 @@ "lint": "next lint", "start": "next start", "test": "vitest", + "test:e2e": "playwright test --project=chromium", + "test:server": "node testServer.mjs", + "test:codegen": "playwright codegen", "eas:registerSchemas": "npx tsx src/lib/eas/registerSchemas" }, "dependencies": { @@ -68,6 +71,7 @@ }, "devDependencies": { "@next/eslint-plugin-next": "^14.1.0", + "@playwright/test": "^1.42.1", "@tailwindcss/typography": "^0.5.10", "@testing-library/jest-dom": "^6.3.0", "@types/eslint": "^8.56.2", diff --git a/playwright-report/index.html b/playwright-report/index.html new file mode 100644 index 00000000..34ff8f75 --- /dev/null +++ b/playwright-report/index.html @@ -0,0 +1,68 @@ + + + + + + + + + Playwright Test Report + + + + +

    + + + \ No newline at end of file diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..89525168 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,39 @@ +import { defineConfig, devices } from "@playwright/test"; +import Dotenv from "dotenv"; + +Dotenv.config({ path: [".env", ".env.test"], override: true }); + +export default defineConfig({ + testDir: "./e2e/tests", + timeout: 60 * 1000, + expect: { + timeout: 10000, + }, + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + workers: 1, + reporter: "html", + use: { + actionTimeout: 0, + baseURL: "http://localhost:3000", + trace: "on-first-retry", + headless: false, + }, + // start local web server before tests + webServer: [ + { + command: "npm run test:server", + url: "http://localhost:3000", + timeout: 60000, + reuseExistingServer: true, + }, + ], + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], + outputDir: "test-results", +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25507058..9819df76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,6 +160,9 @@ devDependencies: '@next/eslint-plugin-next': specifier: ^14.1.0 version: 14.1.3 + '@playwright/test': + specifier: ^1.42.1 + version: 1.42.1 '@tailwindcss/typography': specifier: ^0.5.10 version: 0.5.10(tailwindcss@3.4.1) @@ -2289,6 +2292,7 @@ packages: dependencies: is-glob: 4.0.3 micromatch: 4.0.5 + napi-wasm: 1.1.0 dev: false bundledDependencies: - napi-wasm @@ -2360,6 +2364,14 @@ packages: requiresBuild: true optional: true + /@playwright/test@1.42.1: + resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: 1.42.1 + dev: true + /@prisma/client@5.10.2(prisma@5.10.2): resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} engines: {node: '>=16.13'} @@ -6928,6 +6940,14 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -8949,6 +8969,10 @@ packages: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} dev: false + /napi-wasm@1.1.0: + resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -9443,6 +9467,22 @@ packages: mlly: 1.6.1 pathe: 1.1.2 + /playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.42.1: + resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.42.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} diff --git a/src/components/ConnectButton.tsx b/src/components/ConnectButton.tsx index 783a03a4..30dc36a6 100644 --- a/src/components/ConnectButton.tsx +++ b/src/components/ConnectButton.tsx @@ -56,6 +56,7 @@ export const ConnectButton = () => { onClick={openConnectModal} className="rounded-full" variant="primary" + data-testid="connect-wallet" > {isMobile ? "Connect" : "Connect wallet"} diff --git a/src/features/ballot/hooks/useBallot.ts b/src/features/ballot/hooks/useBallot.ts index b0d25ead..04aa4a6e 100644 --- a/src/features/ballot/hooks/useBallot.ts +++ b/src/features/ballot/hooks/useBallot.ts @@ -24,12 +24,17 @@ export function useSaveBallot(opts?: { onSuccess?: () => void }) { } export function useAddToBallot() { + const utils = api.useUtils(); const { data: ballot } = useBallot(); const { mutate } = useSaveBallot(); return useMutation(async (votes: Vote[]) => { if (ballot) { - return mutate(mergeBallot(ballot as unknown as Ballot, votes)); + return mutate(mergeBallot(ballot as unknown as Ballot, votes), { + onSuccess() { + utils.ballot.invalidate().catch(console.log); + }, + }); } }); } @@ -78,6 +83,7 @@ export function useSubmitBallot({ project_count: BigInt(ballot?.votes?.length ?? 0), hashed_votes: keccak256(Buffer.from(JSON.stringify(ballot?.votes))), }; + const signature = await signTypedDataAsync({ ...ballotTypedData(chain?.id), message, diff --git a/src/providers/index.tsx b/src/providers/index.tsx index 5e962982..81ade32d 100644 --- a/src/providers/index.tsx +++ b/src/providers/index.tsx @@ -16,7 +16,7 @@ import { safeWallet, coinbaseWallet, } from "@rainbow-me/rainbowkit/wallets"; -import { configureChains, createConfig, WagmiConfig } from "wagmi"; +import { configureChains, Connector, createConfig, WagmiConfig } from "wagmi"; import * as wagmiChains from "wagmi/chains"; import { publicProvider } from "wagmi/providers/public"; import { alchemyProvider } from "wagmi/providers/alchemy"; @@ -30,6 +30,19 @@ import { import * as appConfig from "~/config"; import { Toaster } from "~/components/Toaster"; +import { MockConnector } from "wagmi/connectors/mock"; +import { + generatePrivateKey, + mnemonicToAccount, + privateKeyToAccount, +} from "viem/accounts"; +import { Wallet } from "ethers"; +import { createWalletClient, http } from "viem"; +import { + connectorsForTestWallet, + createTestWallet, + getTestWallet, +} from "./testWallet"; const getSiweMessageOptions: GetSiweMessageOptions = () => ({ statement: process.env.NEXT_PUBLIC_SIGN_STATEMENT ?? "Sign in to OpenPGF", @@ -84,11 +97,13 @@ function createWagmiConfig() { const appInfo = { appName }; - const connectors = projectId - ? connectorsForWallets( - getDefaultWallets({ appName, chains, projectId }).wallets, - ) - : connectorsForWallets(getInjectedWallets({ appName, chains })); + const connectors = connectorsForWallets( + process.env.NEXT_PUBLIC_E2E_TEST + ? getTestWallet() + : projectId + ? getDefaultWallets({ appName, chains, projectId }).wallets + : getInjectedWallets({ appName, chains }), + ); const config = createConfig({ autoConnect: true, diff --git a/src/providers/testWallet.ts b/src/providers/testWallet.ts new file mode 100644 index 00000000..0a521e84 --- /dev/null +++ b/src/providers/testWallet.ts @@ -0,0 +1,40 @@ +import * as wagmiChains from "wagmi/chains"; + +import * as appConfig from "~/config"; +import { MockConnector } from "wagmi/connectors/mock"; +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; +import { createWalletClient, http } from "viem"; + +export function getTestWallet() { + const walletClient = createWalletClient({ + account: privateKeyToAccount( + (process.env.NEXT_PUBLIC_TEST_WALLET_PRIVATE_KEY as `0x${string}`) ?? + generatePrivateKey(), + ), + chain: wagmiChains.mainnet, + transport: http(), + }); + + const connector = { + createConnector: () => ({ + connector: new MockConnector({ + chains: [appConfig.config.network], + options: { + walletClient, + flags: { + failConnect: false, + failSwitchChain: false, + isAuthorized: true, + noSwitchChain: false, + }, + }, + }), + }), + id: "mock", + iconBackground: "tomato", + iconUrl: async () => "http://placekitten.com/100/100", + name: "Mock Wallet", + }; + + return [{ groupName: "Testing", wallets: [connector] }]; +} diff --git a/testServer.mjs b/testServer.mjs new file mode 100644 index 00000000..9c3386be --- /dev/null +++ b/testServer.mjs @@ -0,0 +1,39 @@ +import { createServer } from "http"; +import { parse } from "url"; +import next from "next"; + +import Dotenv from "dotenv"; + +Dotenv.config({ path: [".env", ".env.test"], debug: true, override: true }); + +console.log(process.env.NEXT_PUBLIC_METADATA_SCHEMA); +const dev = process.env.NODE_ENV !== "production"; +const hostname = "localhost"; +const port = 3000; +const app = next({ dev, hostname, port }); +const handle = app.getRequestHandler(); + +app + .prepare() + .then(() => { + createServer(async (req, res) => { + try { + // Be sure to pass `true` as the second argument to `url.parse`. + // This tells it to parse the query portion of the URL. + const parsedUrl = parse(req.url, true); + await handle(req, res, parsedUrl); + } catch (err) { + console.error("Error occurred handling", req.url, err); + res.statusCode = 500; + res.end("internal server error"); + } + }) + .once("error", (err) => { + console.error(err); + process.exit(1); + }) + .listen(port, () => { + console.log(`> Ready on http://${hostname}:${port}`); + }); + }) + .catch(console.log); diff --git a/tsconfig.json b/tsconfig.json index c03c6330..e38a1962 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,7 +36,9 @@ "**/*.tsx", "**/*.cjs", "**/*.js", - ".next/types/**/*.ts" -, "src/pages/api/indexer/webhook._ts" ], + ".next/types/**/*.ts", + "src/pages/api/indexer/webhook._ts", + "testServer.mjs" + ], "exclude": ["node_modules"] } From 7818006d047f1f3ac1dbd4a7302733e0c58931c7 Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Thu, 14 Mar 2024 13:22:07 +0100 Subject: [PATCH 002/197] Update .env.test --- .env.test | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.env.test b/.env.test index dc634013..240701ad 100644 --- a/.env.test +++ b/.env.test @@ -15,12 +15,6 @@ NEXT_PUBLIC_REVIEW_END_DATE=2024-01-01T00:00:00.000Z NEXT_PUBLIC_VOTING_END_DATE=2026-01-01T00:00:00.000Z NEXT_PUBLIC_RESULTS_DATE=2026-01-01T00:00:00.000Z -# EAS Configuration -# Comma-separated list of addresses that will approve applications and create attestations for badgeholders -NEXT_PUBLIC_ADMIN_ADDRESSES=0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9,0x277D95C4646827Ea5996E998B31704C0964F79b1 -# Unique identifier for your applications and lists - this is the metadataSchemaAttestation.type value -NEXT_PUBLIC_ROUND_ID="open-rpgf-1" -NEXT_PUBLIC_TOKEN_NAME="OP2" # ----------------- From d2230e69a093cc47c94ab2e5162640568aa14b2d Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Thu, 14 Mar 2024 13:23:15 +0100 Subject: [PATCH 003/197] Update .env.test --- .env.test | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/.env.test b/.env.test index 240701ad..48c3b482 100644 --- a/.env.test +++ b/.env.test @@ -1,14 +1,8 @@ - - - -# ----------------- -# APP CONFIGURATION -# ----------------- - - +# ------------------ +# TEST CONFIGURATION +# ------------------ # Voting periods -# Determine when users can register applications, admins review them, voters vote, and results are published NEXT_PUBLIC_START_DATE=2024-01-01T00:00:00.000Z NEXT_PUBLIC_REGISTRATION_END_DATE=2024-01-01T00:00:00.000Z NEXT_PUBLIC_REVIEW_END_DATE=2024-01-01T00:00:00.000Z @@ -16,20 +10,9 @@ NEXT_PUBLIC_VOTING_END_DATE=2026-01-01T00:00:00.000Z NEXT_PUBLIC_RESULTS_DATE=2026-01-01T00:00:00.000Z - -# ----------------- -# EAS CONFIGURATION -# ----------------- - # Set to true to let anyone vote without an approval attestation NEXT_PUBLIC_SKIP_APPROVED_VOTER_CHECK=true -# ---------------------- -# Advanced Configuration -# ---------------------- - -# You can register schemas by running the script: npm run eas:registerSchemas -# Do this if the schemas doesn't exist on the network you're using. -NEXT_PUBLIC_TEST_WALLET_PRIVATE_KEY="0xfddf5e311800c2fad48651979111a9600434b34d5646924d377b9a1d22856d61" -NEXT_PUBLIC_E2E_TEST=true \ No newline at end of file +NEXT_PUBLIC_E2E_TEST=true +NEXT_PUBLIC_TEST_WALLET_PRIVATE_KEY="0xfddf5e311800c2fad48651979111a9600434b34d5646924d377b9a1d22856d61" \ No newline at end of file From d454a8bbd078bbfe83142c33f2b65959dacc9cca Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Thu, 14 Mar 2024 14:10:02 +0100 Subject: [PATCH 004/197] Update test --- e2e/tests/index.spec.ts | 17 +++++++++++++++++ playwright-report/index.html | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/e2e/tests/index.spec.ts b/e2e/tests/index.spec.ts index 1ec9010f..81faaa43 100644 --- a/e2e/tests/index.spec.ts +++ b/e2e/tests/index.spec.ts @@ -47,6 +47,23 @@ test("Submit Ballot flow", async ({ page }) => { await page.waitForTimeout(1000); await page.getByRole("button", { name: "Add 2 projects to ballot" }).click(); + + await page + .locator("a") + .filter({ hasText: "Castle CapitalCastle Capital" }) + .click(); + await expect(page.getByText("0x516272...82308bEE0")).toBeVisible(); + await expect( + page.getByRole("link", { name: "https://www.castlecapital.vc/" }), + ).toBeVisible(); + await expect( + page.getByRole("heading", { name: "Castle Capital" }), + ).toBeVisible(); + + await page.getByRole("button", { name: "Add to ballot" }).click(); + await page.getByLabel("allocation-input").fill("5000"); + await page.getByLabel("allocation-input").press("Enter"); + await page.getByRole("link", { name: "View ballot", exact: true }).click(); // Ballot page diff --git a/playwright-report/index.html b/playwright-report/index.html index 34ff8f75..0726d218 100644 --- a/playwright-report/index.html +++ b/playwright-report/index.html @@ -65,4 +65,4 @@ \ No newline at end of file +window.playwrightReportBase64 = "data:application/zip;base64,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"; \ No newline at end of file From 19e80ff4c2a459ee9bbe5ea9b90c88e261ee294f Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Thu, 14 Mar 2024 14:14:15 +0100 Subject: [PATCH 005/197] Remove playwright-report --- .gitignore | 2 ++ playwright-report/index.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2971a0bd..40678357 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ yarn-error.log* # typescript *.tsbuildinfo + +/playwright-report \ No newline at end of file diff --git a/playwright-report/index.html b/playwright-report/index.html index 0726d218..08868f39 100644 --- a/playwright-report/index.html +++ b/playwright-report/index.html @@ -65,4 +65,4 @@ \ No newline at end of file +window.playwrightReportBase64 = "data:application/zip;base64,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"; \ No newline at end of file From 5f9a724e27c62e019da70f49ce204d60f61e8c21 Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Fri, 21 Jun 2024 13:01:30 +0200 Subject: [PATCH 006/197] Fix #57 update prisma schema --- prisma/schema.prisma | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7dd5ce84..683f9764 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -83,6 +83,7 @@ model Round { description String? bannerImageUrl String? domain String @unique + type String @default("project") network String? admins String[] @@ -94,6 +95,7 @@ model Round { payoutAt DateTime? categories Json[] + metrics Json[] maxVotesTotal Int? maxVotesProject Int? From fbe69d89a811ee7d17a734123ca79c765aa3e6e0 Mon Sep 17 00:00:00 2001 From: Carl Barrdahl Date: Fri, 21 Jun 2024 14:02:28 +0200 Subject: [PATCH 007/197] Fix #59 Select Round type --- src/features/admin/layouts/AdminLayout.tsx | 1 - src/features/rounds/types/index.ts | 6 +++ src/pages/[domain]/admin/index.tsx | 46 ++++++++++++++++++++-- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/features/admin/layouts/AdminLayout.tsx b/src/features/admin/layouts/AdminLayout.tsx index 2ac07b17..0ba438c4 100644 --- a/src/features/admin/layouts/AdminLayout.tsx +++ b/src/features/admin/layouts/AdminLayout.tsx @@ -34,7 +34,6 @@ export function RoundAdminLayout({ }) { const { address } = useAccount(); const round = useCurrentRound(); - return ( } sidebar="left" {...props}>
    diff --git a/src/features/rounds/types/index.ts b/src/features/rounds/types/index.ts index 7c73e046..77252605 100644 --- a/src/features/rounds/types/index.ts +++ b/src/features/rounds/types/index.ts @@ -72,11 +72,17 @@ export const RoundDatesSchema = RoundDates.superRefine( } }, ); + +export const roundTypes = { + impact: "Impact", + project: "Project", +}; export const RoundSchema = z .object({ id: z.string(), name: RoundNameSchema, domain: z.string(), + type: z.enum(Object.keys(roundTypes) as [string, ...string[]]), creatorId: z.string(), admins: z.array(EthAddressSchema), description: z.string().nullable(), diff --git a/src/pages/[domain]/admin/index.tsx b/src/pages/[domain]/admin/index.tsx index b8d30b8e..c79e32a8 100644 --- a/src/pages/[domain]/admin/index.tsx +++ b/src/pages/[domain]/admin/index.tsx @@ -1,5 +1,5 @@ -import { Plus, Trash } from "lucide-react"; -import { useFieldArray, useFormContext } from "react-hook-form"; +import { CandlestickChart, LayoutGrid, Plus, Trash } from "lucide-react"; +import { useController, useFieldArray, useFormContext } from "react-hook-form"; import { isAfter } from "date-fns"; import { Form, @@ -11,11 +11,14 @@ import { } from "~/components/ui/Form"; import { RoundAdminLayout } from "~/features/admin/layouts/AdminLayout"; import { Button } from "~/components/ui/Button"; -import { RoundSchema } from "~/features/rounds/types"; +import { RoundSchema, roundTypes } from "~/features/rounds/types"; import { useUpdateRound } from "~/features/rounds/hooks/useRound"; import { api } from "~/utils/api"; import { useRouter } from "next/router"; import { ImageUpload } from "~/components/ImageUpload"; +import { createComponent } from "~/components/ui"; +import { tv } from "tailwind-variants"; +import { createElement } from "react"; export default function AdminPage() { return ( @@ -30,7 +33,6 @@ function RoundForm({ round }: { round: RoundSchema }) { const router = useRouter(); const update = useUpdateRound(); - console.group(round); return (