From 9edebe0e26796b332838912cda2b93bae1c85d6d Mon Sep 17 00:00:00 2001 From: Mike Gouline <1960272+gouline@users.noreply.github.com> Date: Thu, 4 Jul 2024 16:13:49 +1000 Subject: [PATCH] Tests for handling hidden tables (#266) --- sandbox/metabase/metabase.db.mv.db | Bin 249856 -> 258048 bytes sandbox/models/staging/schema.yml | 2 + tests/_mocks.py | 42 +++++++++++++++----- tests/fixtures/api/card/27.json | 4 +- tests/fixtures/api/card/28.json | 4 +- tests/fixtures/api/card/29.json | 4 +- tests/fixtures/api/card/30.json | 4 +- tests/fixtures/api/card/31.json | 4 +- tests/fixtures/api/card/32.json | 4 +- tests/fixtures/api/dashboard/2.json | 8 ++-- tests/fixtures/api/database.json | 2 +- tests/fixtures/api/database/2/metadata.json | 20 +++++----- tests/fixtures/api/table.json | 34 ++++++++-------- tests/fixtures/api/user/1.json | 4 +- tests/test_manifest.py | 33 ++++----------- tests/test_models.py | 19 ++++++++- 16 files changed, 104 insertions(+), 84 deletions(-) diff --git a/sandbox/metabase/metabase.db.mv.db b/sandbox/metabase/metabase.db.mv.db index 9f6850fb1f0f8142ae57923242dbd2c3a5499840..d642d7c5795561dc8bf4ba3648f7ce721895a773 100644 GIT binary patch delta 40415 zcmbSz2Y3`!_x{|O-A%G-8z6MZowA#{FufpU6FLM$Kt)7lDj-#gifw5M0t&jqBBG*# zf(TO7U`OS%BBCf_Pf$@o6gz&l|C!xj`9A%9Jb#{t+qIq!MTnX|TdPGj+M zmDg;A*EHL%@up6nY|iW^)?DmPpD|(Tlx~tP)OeHJnf7>hdN;U2(;UeQZ@Xw&@eOnG zZ;br^--=5IJ2jKdY29?kfb!CAvcca(v9JEp~eU1e6mnv{py^@zW;oo$TddV5!jd4?%V$TLNS&( zwd$FrI_BY3e2MS<@QBJqbF! zj6~g0EWL+BWr$6GPNE*DEL}yRPI)6jUhaxWF)63dpwN|q7UyNmw^q6-ayMD+A{d%( zXw^L5>FgOZ&FNz=EQ5gPTC1TQHS)xI@DuK~x(E)rL2RZ;7PIFglHCop0pd76}qLL@tp> zgo%9r_Yp4@K5TT9TKfodQJXo7cb-%bIZB4Rd-gctGcIZW7X!WcH62RsCu<} zfAt&HKUV)%J+~%^8mT#GNFzn8C31tPfn0}%G>~hHaU|VTi0aOnHtWi@PHYR~4ZPsL&HFX0*H~lK!X!?F`-Dl54dwlD?}2 z+8Aopx~6nfq+vu$R75fzTMuh}Uj)V-6K3+60;Z5DVv3mv11}Dp)@DSTEs=(+OOb*? zOWRboy+4wEsx`VM8EH$m+XizJ!R++^HMIS{{q{&v_G5&4?1n=LB2?d8p4(hr*j&zT zE*CwUy>3k?TW)JEpKUJRX)cdv%bZ|y*&a7nx;B@6!fpTZuRQ%h8^jd6O8UQ|d)pT~ zY>%Y#+afj8yc9E*A?>GPsCRFN`iDlgkJ3iLjCQV>)nvOlnp}q*}IU_rM zRA}<};ExLNZ55=5vxcMlxTJ%$Fo{oMgTtnXgIa8TtLebQ7S8#1%!5suMJ2>c13vN*zEV#WpquwZ%>VKub-rmz0oi-Hqnf|aq z2M>g1O&d4ebX?jdU3+3<&Z6v|)D}m(J{t)U9f*!ZC!#Y^MqvMi5E0y$f8~$f5Z&=P z!ajJFW&Y>Hw~G5C>1j|;Cg@wGHzGw8+>#)27Zzp9eb;BoybgP_<+x^fd$asYRt^tn zE>qd#;SYvpuFtP7%9a;r&*wjtEei^p%TaqX=L_yCS^k$1*tWbyx(i0DI_EBZ`~L8T zHATd$V+(Vher<2~;8(5T78GMoli!FmyoC`)p*S-|c_Z==gUV5;YqVB{6J1zT2`9Mi z8VKie{+a6XCLM&OQ4~d?n%FxA2s>ja2A5S7bpzq!a{sa})niWsp=BkifYz!;bO)iX z%5SYpe0~oQrdRuCYHEJy3BnyUegk|LtrrM;`R4%E>`RuaXO2zoS=rxPVg07Hc1-iTBBcAKlUGqo-5hMf*DtAB-&| ze#C`=<4?0hz_%5m*3cmXoBN6!|@H9MdA?DpM?6sB|7mTT=V?DQsL+CZ$W%C zwh+yK7FSY@H1RQ9^AKEfVp{=m80wEF3aMACiBF(<5DxF$MiZYVL3js*Prnd|&!GMT z)Q|5iBaT2ji=V@VRAW2hC>;M8j?ek6lK33zzd`-PlLB!Ju37LrUP2u!C%%B=OX2vw zCDp{2P+tM{=Xd85$DwZxFQmd-x3wa^g5!tb_=c}L5MRUbIWMNd$;P)4@eQ1q2PYOS zk%(`hem&GryjM4rwmOG?x>b%gYwQ*lW|aEpA5(^g!CAXVY+FcX@uF1F*IfwM9(2`@3Yz zP3v4*;Z;-_6Z^bm|R4Mtk$wx_*x`iFnB0FgdRL>X9%vTh@K%!jv;6w z&ugNrD~6)@H@51Y9Pyd2Y|<$3;S3FyDRw7&;wj@=vL=%)z7e7;KDSF)E4K*$(iY;3+2!@PAz6Cd1jEkLa1F(qdKWwtCvt5^R^yKA2(%jz zwYa6?q5?tDWY5(MffwZK@X(;ZOO9&dfjO38$#Ged@U5h%$oS5%s_32oFHMmy#jzqu zu|-AbYQ;@i)#9>ApI)Myk`}i;#Z-A-RZYWag<}CtmL&~8LRh#2A4Tc@-4Tb()N!Hp zq9JWa4H(THn~O1B_I*~GD8$&P!Ps0y~JOEPaMI7XOE8$!cv7>X_l3!)S^WKE9i z4m}OdL@7-Xb$E~^xsrl+22IP;<8rMOwiHc@yPoCfCT*sVcSr4$3`co}r8D86Y#6+I zE{;*QEAY565Z5H$V0IBMj^#+M5w|r%q7i+NR5fF4jF9pAfDjiA0eWLIl_jRDcyZp; z981-0#kRb1Xv*bXli7pf25yaq5GGqhI)=xLhM!&^;uY0%(u;ebqS$>XE+;<9H$;bz zE0Soqf{2f?r$GZA&)f6?GA@d}i_%Z@K(Tm$H{-g-+*+i{yyOb1D!3kBS;#TNkYU&E zXWk=J`rk;DnTeDkrAvCEN|NoC?%op_XnyKvsY7lO$BO$+M3}II<%BRWCH8CSZ8pO)!A-TtzYrO^xenqP*1dhoo%samj?y zV#$s!@_LKZUZpjeBNS0+#y8L-j~2^4Eh zlSCUFOI#ebZ6&Ta8XuRP#L@IO3A8{-CyoSk!8R1kAW5U$kSy|Y+%WKh0+ScuTbZJ3 z%VG=!Z zXR4YAvrLsWW>)~#M4<@BdNOTDMX~6vgii0tl|4m_o06r{2g0r*2$BFJUh0Wsq@r7N zL7o{mT^O6P>(MO`uQ8+3x7DGx$zKSq_xT}Mu5?%@>Za#Oo-2vEthvh)YXYt-I2xS` z^IWN04IMukkaaWeGGmyV!(e8+YDFQZiVE9~J)H!@8^`cCR?AVnxZp~X!{i4vQM1p4 z!}F1?v6mAXQ$x35Ta_4wYQ#-LG2OJ@8?{P~B~?{oAIgDs$uTU?Vk-lZ?n=X;^P1|g z!JrryEJJ61A`E&95+yvFGBrhIFAcbsqqKzw+(qh!#e7Pr%y?2(dA429R@Jzs(f8)q zF02TSDZ=}=L_9QL0%D-n?m%!oOX{A%rh4|d0^dT}wqPe>0ZDOOm;M2nF0%~g>ULyl z9F5melEOQ97pV!;;Ua*kY=fCZDuRUrsbxlKx>FxikbIAj@Y6xtft6ZhSgv=TWqFe6 zITjDg5b|8w;4soHt~Dt;64xK!of}tdR~AKG;Lb1NokC9ICBd|GBQ7|-i;(3pHOMj9 zZiLQl%F#_rHXUmL{d!R2ZQFLhq_9*Q4^14&H*`sex058*H8dewK`I*TZNUqMj2-3A z^{x$1_d#!<Lfq>ih*6qsEA;U6*#4+>H@X-$C=4rN5vh0zejL_Tx`cwIB+mSZXA?Zr6oJt%TB2QC z$QhyysH4Fwfz9XH^j3Ieo6*RXnAN21y0yO`)k@4H?YP38mTu~gTDD$CdY*@ekb>Z_ zDqDTGqG!e>!D8=2yhWGL>zTDI#D9y5X%hhw>(1Vi6(<1V{~nI6#m zB?4E6Bv=VW7?)l1WFx1LGetpEn4e%u3Cy6n%L$|IU$}^pVO@YR!FyLGVmYEKj$}x%2niCX zHn5U=aXL`s!MZ8iqGM|^uS@-KEMGBf#g(kM1G*for`f@1P?9bQnXvNfwn6Lo(Oi+Y zOvP4p*kWPEmxo|uife{UUr;KWM%=I^F)j+Gr|6>Xh`JVq%Pjml;oy&9L4-zgM9@ie z(UkDL@CF4}r*9xNZ8_{Vj%`W~o<&K5>d{*Wll~bN4mC+%7&b*)Gd)$aooTS>yPhJL z1`G;Wr44#F88?1mFDh~TSk=`~GbtR+y(}#wl^5h$^QNXw} zVIEzK?7ldbCu_E4Ic8i?>6ZyPIs`w7T%Eg_y&ZH3I!r23zQ0Gi3M^oJ+>@jCa~H97 z+>gc zK4^8O>~?9k;U3Ko==D|h0lkCoX3qEfG28HfH?#K*%FmXAyN=47uYW6h|LNni4;*$& z_W1BRNX+mh3ALi@^>UIfD8GV;Yh=!Tldr-N`VM=lA3 zHdK|)0O42#d1olp-8g3^2rIjiYB;pVm^=%F{Ra7LAXL$(@5Laj?MX7B(31Mjmw@m> zAM)xz=&8X?mx6HSK=RR0a>t0_v%iQGXNU2b(e{~9aCS|0be+RyN6YAS+0ixT{kJpc zFCem`#O#^9-o7wfy31E*&X0REdw#-iZ)fC5?X&Go{vmtaG*Eth#9;c1dD#nQ9)CN1 z^DweH+;PmJ%f5(|lDD-3KT+$3kB5;z=Y-xrcgp2oL>fLFMIOuv1+2wafbiT{^4DPK zGwbpzLD=JwALfRxx%`)_KzL{>IVU&t!_4oKAoRGD{5m(Zbif=0f-;x9H@EO=aV`k0 z$bYvhTaHpg4s>n^FD9qvhHm?8o_|sDMsj^_DE-@fU#Pl;EXWJpzjA>ubYDl>xuJ%R zSNp>H`^YId`A>X(4G5*=HSNn%y*_K-pg%z7<%M3VUg%%a|8cTIIP}bpMZPfpIr7Hb z(7`XS1>vE6WGp}S{x6HsmjKitf=o{ zyObW{m@~#(Q}NOQ#)lU_er-kg#Fj$;wjLieE=Aw}3FT^)Y%IJE{op&(m|Q07)PUt(T^wb;Y-J4@!L!9$l|w`9vcc5C5YKZbGaaUeD*8XXO3Uip}8EFJ$~7aqU`bC zvgPFiv&S!Av9}^~;_{~Ki7RTZ&&XF?8fpC(fVi?n`ipnTRb{!00UvJM*M-;z`0y)_ z>WF{O7x&)c3!9FD5bpBTnl&J`CA&1d`#FhGJHPus zAMbc89IPaV746Gl#Qsl92fiS?1_E2xbVw^-kkgYbc3vGKKFA=(*8np7>32aNCC(tO zTQ{}Npu`UXIJ$Ou&_{`L{{_hKhU;4TC~*e4-L<5|M~QQHJPU~N&rAj-ei*Jlu|vtA z#CxH>^J|58AFh8D>WwSf5}!i-TmPDM-H0T>#AwlT0Q)}F-iL`Z4?e!NGJ`AM3=s3R zs*e(*dCy~wdOX)hiHU3B-sMMe1|_}`>RVsS^HE~-;0w4fb$if9iHVQk_}Z0J1||Ll z>iZteqQr9nC0=z$#|%ik2#$~0^$yNJ(u+aZus4em-{#*uH=IF<@9}T`7@%xubQ9Ef z-5<=L%J)J2)BWAxJrhL9H!t6Ye)0Vy2{HjPG4Pvpx1(Pp>F2*7>xTCK_M)|Den~T+ zd}Y~axFA6!r(_qNxvR3}{3o*I)lJ!QQQq5`v0Bzn7--HWh`gS^^u7a{X&Cw?spo~h zYk8+HEImQqnHw%TaTf?}$v1OS8=vXeFcMMIb3>t->-;PBppbGEl5=t53(O~>IK3v?PwjLQlS7>1{p0jj8Ls>Fl(Dk@efCkeWs zdjR_YSPBTAQ>Fr{1ePD@wXSGbpptot6lpze_RR59r^Khb7v-iOLsX|U*OJr`qnxK8O5H&&o+Zj;M~w%M$ZK-+r<=yy)Z7#JmF0vm^jL!4Pu6 z=o{0)1^mSV^cY||S#c!MQFOhO1FIXbU_7tApew#*?08@vfZ5?GmTrQ^YG{hqi02WP zC+4AfpW}IGMJO>Zs5*uu>xnnYED2s~7H*J|0CyPX?|=imebqAyWZAR80`mYEc6hv@ z*s}nH^T3h>fXK6K(Qo_;=y>Coo5O1#!-;ud2c5JWJ-o0?=0zTmYzHhMu$TnE?;J~4 zN;%JP1l6?#GH$4~U<93Il!?^PsX=VvMGu54#azOun24mRZtxh#*Jiq zj^FlG@K#>>fexa%;l#XTP}D4d&*@PJEXAuR*>NmpJm6VzO*MTWmbP+v7?h%+dKPpF zP*Hf}0#gd;84AP&-nMW%fHh>{5S>pX;fjw=Y!2_-#3ttD8-|&IyTIzy@kaqqQ{o0q zptwsf%mI8twmnTsGWlV{QY6Vo{Q-O2P*<8~X^H_Dv?to|a&$wMn{W`#L5caHJ%T5UL!r9m^*fU=*2zvhqwL|P0SD402(L?7bYzB$D+8L0d*xSYaHT_ zDc?9`mgh^FA~?DXAiZMN#yRjKz~qcOmc*3?WyN(}z6s}~i#k)Ck|7aHbcK&|*8zkF zkg8(1PASK0mLbS0mqNTuvtizp0MV2IVN%!?K~phg(fW{XMa+l3J@oqh;Z^$;=vx-S z!dLkS7M%lN9D4=QC3bo^3t<5kt!V73kZL;yZ<_4=G@C0Y9l?w1mMU_$f%(Y2AK)d8 zH=uXK0%-gBgZGDbF5naMN!@ayS29QG6TlYH4Kr>TsuTxI3XjeKPiul!DP3W;?B|a8VB`t^vCW}{ zckc*qeLPZ|LwNX1Bzv(A6yW*-v}zg5C546%=Uop#RbF%jjb1``CY)rfFHIuTi4Gzy zn9bJ}x-#H%wk`o80!aKJx|mo9FJk$mZ&qu>J(Xg|Q@XTD}Ua01Gu6-Q^D@b3K3? zbi>x-OlSB!O7sl?^s9+@pEjf(HxwHMXPj-T?1vmR=!(XJjJ@a2dUg+n?h|vTCQ3G}Ss8%;F)5*9ZjwD%hj( zRR}=v;~^=Fhg9Ab>q@DTWLG&9z&=`^7ZA^Ll}sWxF7XcdE_I&1p0NFofBo3`!5i1V z7oKx;!gH}HB=`j2<%`S&d>$c>Jue450)_&6eymsdn@oz5!0|cgnI!4)0^5V&2M#4{ zZaX1V!jh{hisp!)(oYpEL%vz?!md>K;A*Kh2OK#*FvosNNRZE9UYkE)ccnIcz8 z`JfzAj5N9OIl^Fg_6FP`k2kzHcwF4LiFZ<E{Q*zL;)Gav2SAHwS3N}e=wvJmNEK69{vIL5YNFuki2kd3Le-!= z&~xH2hdo^b@3|o~(Lv${_)=f&S`mJJV=MSldkML`bNK?ot(%Axi7A9BFT|^#9q@Lt z>MU@W%!l#09`Rz;mjsWyR=ij77`v3)3P2&VEnpauuE4t>ZiE)Ud2U5`=QA*8^W@*% zQgzb+Q4W!@l? zDQI=;o)zIww|0b~dK-SO@@7(375bA2eUWUkKLoR$J?;khwp3VU(XsftOhSh`xik37ULo--__QZ*vp#Yc>;7RZI9;CkU&&m~hKiRldN5 zkY-m;3h0KInslxeC(&&W05gLrB1RD?Wg!lOP2}^xItl?XG!aMR?KO zRb%IaTNpg)vHJ+V-*O~dUBzqMs0xO1mgrUXjXs1dq2@Ir9$!RngYi*05!|$T<(JiO1szcD zH0fyPGqbb}x_aC_=<1R%K@mY9lNJyWq7~7azywV&zKuX^u6}+4y0#=ef}!pS)d(BW z;*ymt)ge^#;=Sm)k~GayKZN4No6z+o>CPObg(~m94=pPJ42Bwj$lt2d>!Z{V@)|1r zZIoI>{#c#9Dn?bJXVM#D)H~$dn)KD>R1JDMy}g_|gWO-84pvZIP^Yw9L2>Af^f?vO zYVy_U^mi3hO!oOim14`y=*E&}D(BKwS&Mn;p)5Feee4iwQ8C~WFe+nG|1EG~!|9b2 zMj>_8{k|}(iYf?(FY55wR*)*l_tQ(dQsuGR(H-b6v<|IDccXjI2DA~~i#DPA&}Os+ z-Cu^bqHSn9dZ6K8SL(YKNwlk$zUZ?+52>ZP6vLK?d%i+HOyUU+f1H>=uMAAbK#d2- zIG*+z%^fXx7Y!SX+x^sL%Gla|dlP-$co9vRb;0?_n^=Acnm$f_8c(lzq3^|O+l?*$ zJopx=%QcCP^oq|5mp=7VwHbW^$NSHuCRh_Db#J{VrCf|Ao5{L~$3kaZ@+gT1_QBmh z$9Io9{(0Fwgs|rxN>sXtr%Cl2!Clow!{JGrz`>Ki_4h?Yy^H2==b*;PI*{kZiqfTz z3@IEsx9;0ruk_yANSqk(Zd0(4=%>0hQ*!Y{cQ&3m70*EA2++#?Pmo-p?=@w=ql69tiBZZpEj}d)jEr=`59ND{){tTHjaUebgO?U8* z=n_+Ynw(_X7k}0i`jVKEv=@IE`4`uYn8{T=Ak&Aps$)kH7sPL!SJ%|;-*d(_<^POy zF}il>+Q8K5=A?LIXj=3Ig88uU%fuIWnf*DvsoMOI`+RNB5Ahe^v7LD+Qk%nTUeM#S9rIZ{8W#)|d)DLs_B@;tF%zJrmqAB$F0z~wt zuR-Icj=Que^86hQE9&s|P0Eh$rHN%tku~H<_tLtW+BLYUiCJ@N6yM&2S4DdRnQ81b z6<1T!-061gZ8Co0jA3eYVEpv8Ezqp#=PYQXO2p@g35_`|YgPKavE}(DgjYbILwu4u zW!&iAln$E<4{z+lqMc)xe4KYz&d8}V!5w5y9)K12 z+I=!-*w`K)%C~?nRr<-duG z#}YKn?AB-CT+*72SF;2jHY6SIPjwQ>-qYP0gmCX34-t5-K!*%sDQ4e3FQZ2Q`=;jx;}jy0>6v%{K*Wz9=pw20nn&hX+u1lKgk+#RIASc*d9PIUj{O5mUa6_gGNg zh(;Wi%L#?){B3d1A6vYCxHx@$AcccxAFAt;NVgkAjU?BsOkXsJD(y(jJiqJrZ62C4 zp1feHH?QMa_#+^V>F4)4fAJA6y?zk2ArNy88R^ppQ{R(SV!D4l)sw7j+pw^n>Wl)! zY-eD@#v#<`Ah~j3`sF&R9a+;Z{b?OlMqc(%I|7FC4>QMTJDynl1 zSx-O`LQOxmobs-&9p(WU+x&W)+whF1LdA|L2L2Rbr=PH;(J z^r#8jQMx3pj-ak1*H)$fHG=Am?o8*6r23G@cLG3Z>gp`k_m#K*+hV-Uwapt1U*4FjeF@KbZ1FHmY;j`&slhM^`N0}GC`~c zf^4QdvNu!S(zCg|<@&7rb+%kHAbWhxoz3#Uv+}L=5rQa$hHl+HEOWzcWeqQ#M*)cG zz1RScZTS9tNX1KKj(~;@KbY{vJ%=j0znOF59+FC*Z36lB~ z4YK{b`j^nQ%wb@}W!RAvxG>?HzCM5F9<-yRkVs!3BixXlP2Gn=3rb%`50s<_UQV5k z7tGy@9?#xM(M*EB6IEx6?sw7Vp|^Ky!7w_wjc^ekM3Xn1g@ClePed=))clK$>; z%1vIKcn!VacbD!+ccMGfWi-yTQF67pAH7%t$R~8zZ?xUjx4n+`_*ec1g}lwx*S>*X zDFK%NolED@VLCt4{k03)96+y@Hkcs4L-g5DG0U; z?&(Gl@7O@kBBhqMjQSXDEN=eZ*)MlX?P0X3_`kj!dS>+lpP((pJBDyO zQT}-7*{oY@KSd7~r;1}!67z12e}*0^4rZ5>dzNIEgnJGa!F35@1DjnMHcV|UAI+8< zb0b-BJ14axR#ldJcQX(@8~iWFcV+=z7~A6QWk;a#9bW>}k<<0I`lG&pD=JV9f5&5= z`@+!5N)XmAJ?0BnR#l*UB;57h7a+AI<2&xJW>G101YNuS-Y?-;8F_lqY}$vBQwM5R zP}HyC)Z}VbGPxeOQO|6#%s%jXp3HrtxS4Nz}35s4e2-fY|vDX2G_WW-HS zZ?>g~6;N-se~6WHihR4Ji2B|j(r`R$Ze(H>iTd@2kE4d-jBj8-g4lRvpUivPxO73b zyk&Q`+!V-`k2Ifu!DpMdZCmyivU!j7FMS1#{fTX!)8p=fui+5T%~hzM@eR~{!nqc@ z`^Inmx=%RI?Q!>;-(~Le8Rr>~o_$Zh@8L*UmU2GupD5?hCu03QU4KA3i>d6yxi^1h zrlXtA%X;hY+mbaPwzOTvva#ya)~=W22m5cn@C4k#k~k&sulM*{2KI_mWMHS-3l+(m zPK|&aKP3Y8(o-a0UxH(0Sps%ywNR0Jl3ks8N#HW%YA*RtbZQxRKmU_X4b;p3L8qo9 z-C}{csA#5SC)yB(&rJhQ13?v@pW6;$9o_K_C z>16>^5{#>Wkl9SL?$OM!2Kw$_7}lv7@_!MmQ(wz`L9q7*<;TpJjFrJ4#i=3671chG zI(2G9>eS0h8+1YHV}-8#dm8m3JgdNmSRLT6gEs&m(-x_&s_t{CTmLtgI(4Or@j_%f z^o68g%6L;4AYs=6c+e0AkB#|wD!noFxZ1|t3`8=o8aPQB@Ci*xi3=jV56H-PPeAvb zc({9>4Sp$ER#k1~sd2NT|H;j+{1Yvksn0#h%AVnmxBtb;zVXyp*&Y8cRyIy%S=ptD ze`IB|L=FU$_@r!@1*byFPM;zvyAVcDo8Jy|G>>Y{UkS=^10c41|se6sM&4) zPil6mtI=lApNZHfdDs>#RR5EQeGy#rpFHf&HBpH)EGb$5z+evWz5mL>hTSH3Z$rty zVeZCAsVsHI5WM4rQ9&keI7y5KltFWuDqsdO^(8EOq+R*(Uxze>h-SZEw zbdvVD(q*T@l`i@Zt~9uLYze*~4-C$(xxm@AHHh))2TlD0e>zu{MOXJUZ34_I)ns3% z*O9IMj!d1pp$9#HZJ*&%N09`)=Rk%_%^oLxF7+m#OC6!tF}Jg2__hp}dH`&Lb{__! ziZWDc&8Je&^r_T8<){ALqYN|Pi2I#MJsf;$e`ZqO!d#T<*0b}7f3ueXVR~TQWk8tT zeUdPJ7zoo>{FyL)9e$b+x!VzVS~c*=LJ)_8za@30MIr_qZHa3j0e)u}fLr6zXntyQ z&oX+9|55G(KJ^5jPt67_2odY)PjbPGRuBp|C3UQ4o6c7wr8waetcxK=I7_hZ0?tCg ziYt6Ho#J}&;aN|#`UwVSHQ6;)GO^8$nZ2-2u3mm>v%KA`Y#mgssBW=PED(AGx;xsY7z+5 z%ruyGK&Z|E>U)Mz&0I~zf$G4l%J;OtVN?ebr$DIo$>sk+sGfUjgz91b4EqbAI-2ED zr!KAg2P(C6YE@4XBPWg6`wwJ| z*R4!*Ir;jGO|$jkp_y`9FnfI48O=s4m3pvm<)4h$M8ThpSpJELzd++Vj`syqwaZiM zfAxj3{^elN?ppnuFVqhJi?-`CFU%o9xNKlK7_t1n%IAXAmTbLa(;x=<9vZZ8_pW(x ztc(;3GgPS5tAn#P?D+bu4SRom$7JiQS2slb#T`p52a4YBwk*_tw`HOJyDba#-)&i_ z|8C1d{dZdyXm()B7G`W&IQ}PF7PWcqgZY)@qbE(lZ6{V|Ue^Oxw$GFeR91fY@s7== zV0o%~$kPSk7B7FZ0B&Q+MF{M{jyqZo-GI)?bs%Kb6%4Qghx|Dbm!4bpw~@FR7a}mP zfUy7`yRoYYoBlSU0Mp6$A{v6~dl9v1xV|*iS!kWa`yi^1ZUKR}5SLKOIS}b+OZ0A} z@pTSB z&oWh4#`T2BRfD?GgZ+x>KnV1QBm^bM-ts5N)Oy!)t#On)pAuy; z&fOby6ho|&RC*RM+8+TBFwN+cA25w)(5FWyA=jWMK(h}+c+A?6ssRs?*P>&hHzHM} zFD7JW8!)0w?xxg{;hmCP55nv%0julx&}sGv>DdR8tlVcL7f@_zQ|}L zy%SeKlp@a^fuJe9y>T}923=fA0y@BLXWprO9%dtRYex{qRHrcv0GS3TH+JFNbuZqX<$6yVIhbIasW=?wh~4x zk{Ua*wC;Uq=L&o?rF*cI^u#@)GjSBTUTg&JicGWboj_Nk1IRrOUM_^6snGO9cx&T= zs;0$txvnubD)q=ni7X$H`f_9!CN_f9VX}Y24T4W{K zjxC38SAJINzB6miE-woJHP2OI8%dyear!Dw z)Sw}X5P*dj6Kd^fumQQR2&;lfU3b=Lr&s8Bdd06WY}N9GfehgnPiJ})m*M(~73>Yn zo5*!4RwB)fHY8^F(d(7x1TwVP*cl|yV#~MCmmonOcvc`oime=yYJ0XqRynED&t?k4 z?cX_eb!HcshcXDvjx}fJp=1P-fq9C{Luv#|5@iSAm?3|TYai0;Z{yl&IjjTO7sA3J z8keVK7*Q7PS}a3q1Ve!7E%^Kwy#&{XJ;)az0KZcL$YdrZs&X7}>I6ZtvdqhtlX`Ph zDNXk%fVgg<2;~XI`k{4 z8_p?9ZY)q?2?m<8qe-gl(1&wi6SH)Pm4^Uw4FWyuk*d*hp5nk%H5DLmP%CR6*h{c{>0`L|PpAF!nNunLsfZee(H%ht?&u6y0fMBS6g>J#LayD5yPr&%z+gYQ1m&kpV8#c1 zrZPl>?uJ!}tqdx>0ztO)ee`U~)m)j`M+)|hwenx`Dy)XQ3iP}{Ca(fh9mwQWz&+X9 zAQK-j*kC&a76X0=Ua14$I{6*bE3cWuW{Vy1>byU4FEINlS@(EOr+YKQA`SDd-{BzS zcVKS=<@5DWCci_{)1n0IiICrcekI5Q`~!4zhXkrTo&j;9CXN~c5uL{~C@M%2u48o&-Lx$An!H@-+ zP&`9R6c9aNyH=9A#k9r~0+~D!>?1^+>&o4PrxS9l2Llx6=p&#k<8vT^!8#o}{bQj4 z=?{P&>6)N>%MyE>m<{7-H0)0PSCHttVAo=IQGQ~HKCk7RjIn@sr*gXhU|ELZPOLa~ zdAYx-(G!A_mh>Ymq6a95u(-Zf&Ssxre3EULh(~`0ZCPfkK?zzJEu(xoKI~^F zy&;me_a!hRx08l#axEwbVNlB-0Of6BAcK5zD+w)@%A}~M$8SXs(LW)9ZgzJ(I-( zW1z`{E^frWq+D5cV&9aHgbj2u@F=;tghk&-FNswm&nllvLed?0&#GnPQHi>`hk*OE z1V-YsBxJq7T#QZnA_=N`^jT2$9wp4^yFj1a!|tXh(A_h+H|VS2d%}FD_d}|f%2CMl zdLQX`I)YR|4>Df>t$HyVA}#BpM12+%=JwRR2CQd?UQBAH5}O09J{2%{&-IvbFaUFq zY|zhCjt6aUTTWbeO%d`Dn3X?PE)2+?Dqaq2YbMBsxt;_#nVv(~mB;8`XepQtvEgQe znlr7uJ!yi%G!eNxo95nQlQ6U1goG3#^DPpj@&NMPw&BAEj$Q-0N{n0sx{8lDuN*rx z0EqKyKNSZvJcBrMZDFh6u0cSTUke$1mWG;BaWEI=K)NLb2w*NmcbIgMANMdfSA>`< z&_zUrD~3cVid+Cw0dQ$fYsRJ7+aO^F)9^>a4(38YGw~;RkO&BZt{_cR(q*Fbvtb+J zjUYP#FxVxgEi4%p-b*Y1M!psYU(QS5jE-avm( zD7}Y6kUazzWy2>R<)Pz^!K>*fax&;PEc)zh&{O@aANVTf=N!PclNoS3It2nR1W4Zm zX)ZiZqzhr!kKP7*!dwbIl)$WpjbS$e2pkL`5kCYOEa>5VAN8r)oe(TCMUV-{HF@qQ z(gZH!ynrM@RtWA03~ZO)z`YK!Ndjv^q={-llt&$`^kDSWQ$VTKndA$Qv`OvTAFSTD z{B$GqHF^;0{=g2jZLQ*YM#G&@)v~ zt;)mTdD%ov@RdpvCS|`&GL@SNAzJ4@DhK=7RJi>~$ZEjDbhg>oAftm=z8-X`$w1}i zx&3qjkpJ_zF_5#v;*-9T;|E`{W%TQ`4!AzeTui~PqsChJ-h)^t_Vj?{$6fV_AVG*d zP5BXTu}x7(T4Z>1EToBk+|@W}CgWfz-{U(N%1@gb023i@vi+jbSQ}a;Azcf;8LSY4 z9#wu--4}kugd4A51Ayy54yKW~CuHj~2H^VWUQk>$d=sQ|;eI5XS}+A|7JM=eXoM2| z7=kzq34H9}^N1cGWnRf>D8+=Cnmaz4*vp^}0FbbO3>9+aDI_Y%=-082z?D? zkqLEg({qsFB`&FW$k*&EBJdTiNYs}%!GZ`lRqO{C?P6t1_{p%43iMv^j?f1ohE4+g zC>8}RZV+MgehiuxnD)_EA+^VhfZ_)PR{WAgR*M9vVB8axXZS7@*lBI{>B_H|Tj@tb z!1@OqL4>y_*n;d;u=GV>NW2X$&vMFCEe*@y#=n`6E5Jx~@?jc7Jfl|Lp1Zxz7{ZGA z8AfwPu(!j8zqv1BqAa`lOt;d^l)Ggx9B665%M z`a8-`ki!&(|CAsHKM#ti3(4^udN*?#Y&|dzYJUx8Lr~}*_*DqK>5J?0{>Y$%FAPF5 zKfvJVDfxgVNumh|nc{+C?C-?ig&-a&6n7zi-h-+8Cqqb;%q$D)kYvxc@SuDRv_+Tq z<1N7`6p<^?m%tV~oe*nB!_WcS_5h?E6I{!4E%VZh-XgIo<~r~zdBg$aX>%IJOToS--}-*=zqd%iy^Z>r8#r?zvd&hPiW0gHcX zr#-YLC{;?|$oxQ3c?p(#+{V|W?m54a0~MHDcH>!rzxtItCKXb%NBTxBJ0f8W9Ywh# z5)BWQ=HAXAWb9WmnKKAQq}LcIgp3b^pN~@rVcpGO7D7&2*!Za_fu{^!otS`B#&Jcy(F^3P(XeTEUnPry}Zx0t~P6f(IwEj7X=7qbet zX(z^JXO2H)^IL9xHFK9{E1%7#X8r!ztfUj?o8v@8C4$=Rv~s2?DM(#@bk7=eZ@ z8rwX$Y2rtIG*fy<1A?>%1*7Okr~FL(pIult7#mZ++?R#(^=~9muxZ3 z$%3Ji;?){3ZdA!$tv$S00l-`v(^-eR^E{JJh(ra4G9IfzV3^?!VXF7lhbjViS z`RCq77npZS4Hu2a%Su55=P~K2`)R4WL>Nc}(cwH{yn+YI)R-S(MF~qS0r>i0UB_Z9 zgvWLugw^YZGD8SU$Sbp4zcDg(vWa*v$G}&CM-Uz>7?hV% zkGUkuu*Pj_54OLMJ?t5cK2>8Y(_nBE7-*ZyJLQ?08n)$t;}Uj98Ta0j9t`fi#`Dri zoWPsJg+7W2L(4mECFZ*YVkuXZd<Nv)My@V!)IdZ8( z40y2MQQnjc$K!^7J1wh`hG7J{Y8r$-mtmkP?JsZ!D!iE07~2tBS%=brn3KWl$6R)S zI9hj%4IXBUR1A^!;mIb`P_-Uz+`!;=X%r2QmlLe&nlWL;qE>bJO;Pr`EH}`g7Vj%E zQB}ok42^f)OB`Ls6U#lH;x(!f2w$<(XYX}7mbj2*>oGt6YQ8G7qK-s|>AZFxGLn zC9(ud!kq?SNrRsq6Z&xJcgCWU2_+r5Sxuy@H;H=ZV!|^8c^Zr*ZA+;URdRpjL#ULj z$`N={aL@JfN$@I_rW%*yEu%)l$FRG;QrCo>AWRM3>n*#kfjdjCDGYAB`6$09Y1nR9 zfj&~Qompb%hG#{Hv+TW+bNGDXx7lnZXDEJ1#ZVNQ(>Rm4&E`t52U^VdAlC&m*$2b` zp6=D9R>Shji1Y#GC#`eKvpCDvd5kALvATb=BGP&uTJ1Zg3C8=4YAp3)d9U;kUSm!Z z9V*{Z@eSNo&7~8nsw+M!^R@1|v8n=Ngw@u%hR=74&{4opfKlIr4=NS2%YQMx%c{+; zvUSvDttw;z+jy+*giGqm^E!>brwop_Ka@%?BXkBt+!BX_r>vE5HMZ(VsO<~;|Q zE#Tu5@HUunS63R0UGVyWaRlGhictA*6>q&amiKpCWow7=E7Lm6n_pLfOuz~**Dmld zwpdDD!?LQmDuDHh7xDT$wBnsu|G(QJm9sISv6qI>a9TGs9g@0LU1Q z#$;%5x$-6aXV`TC8}>2dFnlY&j^Xm)DSWRlpJ@?kbou$I_|H$cn2r2`Z*FvX`m{_E zazByVm;Z9P-*hBp6b?4kj7A!6aZpsjVRtDwa=e1mk_yH%_-Y0heypUg%*59v6}q5J z?`Ae^&fv}r9?b0cMKbovh*6q~D;sC(^4ET|- zfUf5I6kT08H*@?)!a^F^gA*j#c#y1NW8qwN{Y3o|y`fUk zovNvHr&>k#i7(JI{5aD!a9k@FKEz(6T*Kq2IEH>N03o*lqIteg&iu?iDIrR0aotnG zlGuCC<@GMQ*5fs7;$`qH8%r-km*bo`j&4`+EM5CY0^2CI{nUOmy}?gadac(2_7OZU z_EU0zl7o~SqU1A54pZ_uB}aIRCS=~V_OG+e`j|9wmL_l=gtQ;)V;_usTob;&Z4uj| zkG1^A6S>{4-@lmE>1APt=3JOzRx5fJZ4nbjb&ij3MZK}{qlzNU{ukMWkAIrJgl*I7 z6eo%g>t^8MUh+{`u{ZgsPI0G7T9kNlv|@jfJg(qo`#yR9&5IQLIBS|5|G0lc1#_<* zfR|CT7A=genj4L=>gONTO}H^@DXwT_J7bfdKiC9BIQZCPcWK=gOK#BYwwtx?fP3A5 z$e*eH)Sw+SOP6A?Q<_K59vL-y71ea6V^{Eq zdF&lj(^m+*!6QS*`Kczz@>lZ6(eb^hCaKC_#UmXiZls!+hP}xnKfN%SYQ|^1zM4lS zPl`~DEqmS?9?5^H4a?r2m9rKRBiq;@)@|yV$}Er8AF?~#aJ-eY#bJxhWA$i3h>kbx zkV6}^;hPr75VS$NGuC{Xk-oR?j%gLN(&Rr`_(-bdb=p8xRtd!$LRr?=t#&6ZLY_K{ zrc7_AT27V&kTlOY?;8g98s$NR8nwdcXfE(_I4w2YO<9I5adU7&6^`B({6H zxmDA=#c#3gdX?<7B^p!)YDCGC-g$G@v0eIDvl)+Qdg({J&35Z!!)El<6y*ihvrqNw zcFicDnvwbS@31}kb*E#)sisZC|JuL~=wrT_r5dSW%XisfeQeUq<^?4Up5Ms6Kr36W zX_cE-EE!5nrDd^qXZ9AknpUjYtV*`FGS+35El*ad>P%D3K8AixZfyK4DWWDSS+gjW zHJe?${(<3{PLETfKbf6huWp&^A2fK-vjYb|J**nqO2boVI);>LT1wM4rJByTkWuCI zdUaYoG!z~h8rIif(D(-p3Js{nSJ0}>r|U@tDNm{5sa$(XoTumoHJ(RUeNMZSdY(9Z z=+lFOceNa=@;_bEZ+JD zEW6QudVn6Jhv;YYF#Vh!iG3Zf)U1@mdG+ zptoOrv(DbW^`x`SO^67{{# zX4`Qpi9P?nvw+Q}B-a#h25iNkA(M?@!8wK3U(PcOeTEQRmNP`dIkKPExRdjB7e6l| zlCAjvz!vr!S(xAkMY_+XJ`ex1zg)bY@3rOrf$^(alJftZ@hjR#eF+RM;Fh*a(+fCL7L3JyXUc+Mi8@wuN-G?&6C7C4_07Dt3{jO~8iVbe!PV$C zqN><~>zhV2LBB#REZqPnjN59|y_!i{EVp70m!QS;pAtJP~EwUrqnud)&h2F{5Fo34+_#?ej z^cD3O&_P`sObLRQ&`Nq-9fs!*m%wXD}r}C53+;>&ybNz8g#tE=OR}=b0gm;+FLYWcDFr zq@>*6Up*B(MbqZBN9GhtA=4YU&TfNC^gA&1H#X7XlgzEfJZWzh#@Y)XLE`9)!DqXj zA;>tm5nrG6fc)up0&{7vWQ(Y4!6`Ixy2Wb~u*P6FCPkS|pO>#q+N;hujdY%DYC-H# zoBAxsf+o(ZMnC%_m4`%rQ~clrc@^ggj<{ z)Ta6z>^(b{2ZyQf^#d$B#`yyDY8+CZ($(DF#-+PWuEx|El{Wh`$wuq4y|3tQG3em> zE-7JfWpSMjkT5}~!}ONP2TSVGMv_gv;_yt}nhg!THY_Fd&Jg63{KGgHi;-_&tz|7I z$k`_obB4 zoBecaLbxa6d%Cxm@=V;fM8W<06+CcV!9xZGKkLy1C-joT&nxlISIv^+M~*A_MUJxl z*d5CD^t^7JIBtm3+y5*zQlfDKeEg03cJd#VL@R(yN73hU$!F`brZO%n>V}Z z+=4@Ubk|d5M8rJqzF|)XgP~!=!~?PXiv`W+a#fb|BX= zj%uDFf5zQC5QQ2^U_fY?uRGZ(dD)SLX8hYDW$Q7#l9C3cBaKf#RpTEXs!3L9+nd`M zhjXHt6m(YIqhj9Us=s`ecuWlU3k|4=K1TN8BgdKVwZ6x4K0CNaH+xYb!IZW^nY7f` zEm0*v8MsY~3`jO&=22xS@;J)1J2*nZ{c+@Beq^+b?=ezq*r`daY#)2|xB-uz9zMU= zZ%|EW#Db<|jMR%wJ6h%ok(Z@x&AVSUBw~ZuiQ@*mGXHwLNo1xpfPp^LH-gNPva_a* zZ$_jBY~(1GB3{&8FP~SsQ#~M5{nXHYf0quDK8bfpT(Yr!KdF5k$s8%0t=Vrgwj@Q# z4Job7u$>g8NH6Ud>^}b>|A1$o8{Ln*Ds^Pb&bIR1N8XgORh)!a%s)l#+GFg|aKAx) zT84&7W9Xpan>Te1l6g`!yLhD`YHg8}oqheZDYoW@t!%IEID05Kz&~tQzwon?_au3R zEQZp;#7|rL=0VUcn?-L_L3AnmtD?x4DdzM4HTnx#EKiXksi*7j7Z-i=M1?qhZWJ6M_C7{;fwL zaE@iMFkMkcP9}QQp7-^FCg1%GntZ-qbn8|rL|8IekYR`8u6nCk=q0-v9AbAq&3M^2|3)JYwo@Mpuq3+fZ?SH(%3#r$;fR`N}nZI!x{BVI3ATdSgT zwwGjyU}+XRouW>1CY`$##d3`Iv-1|;co02j)5!HjWlxgk>3-YD*)$8CWb?>1X$FHb zpl?2z2y>z{@3iQ;FkQ8se4AqaQ>+(xQF?@3Of~oU$xLsy06OR@zV*8_+fHsu_b_M& z`W~h)?ldk?fwEbAiPh6-Qs9eUnCCAv3U%Q%aYnE4GmfiN{W|3e;YA1_46f zVvtN54v^PMCGy(Y%1Pv6TD^^IKrO6UJ8m0E^GXEiwAdzX+eR*>b=$~kSl2C!{4oAH z`6u$T@BPX@ktXRowvivwjkl4gaUO$Wq2EPn(K^s|P61kjKZAG){NUwj1PP7si@eSJNzTlD$F_(sX)c-?({Xsg&LQC@D*~*+Qk{|MO4AK` z5(uC6BxNa8&)bAgoBW9wVu@e6K=<_PU!Z#$Q~lZjMp~VIEzbGdm|b77Uvb8BvOsuY zZ2Yfzk>XTy*#7b#1OF-EKPLWD%74mI&5X1g&(6c6m!4p>Kv|)yf3TI+BPkG0)t-34txU%$j zcA2u|_pN%0oc?Xs-3pGdnw$xFVwJA)f~#3xM^TH0Z_uJOUmCJ@z-P(n|_QGDvO z@EDs2(Q2R;-`3>`XmFBXLPKg0LI~lg zhWg{H=LjY7)iVTb%R~fc_+tnlj!+!1Zir74I#3mHpAwtLk4zV;)GCnqy3Fyc8G
=#QV9 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 delta 34465 zcmbSzcYGAp`uChO+p@_fp(G>($jt2QrY@OYkg^FK16C9PH8Z=jfPf%HMbQO96-02= zLBN8Dpn`~q!3qK@HbhYYQ3*v*vEaR+AbNeD*$wJ#zw77SKlaQs^~{-bp7MRlwC22N z59cjXI8l<~qA16!6XPa~H70cts&BL=OdK`t`YxivRVT(+lVT&S30>l{k&t9D;ooq> zU3rVAW#66u|9>e}aG_Z}))?PK)m3P3?jos*%2kgyMpzTO@TyQfVcfV$T_ldt8e#95VfgJnuCS2F4i1-$Lp5r2rYY=t~ zB3*-Au0e1L(E+u>hjQ%bW?blzP)G7`j(zoJ+_`^G)X8-u2N51(@IY&lVHy*y%izW1 zlgC&SuI6H@#hDx*6BUzJc}-Jzh37a~bHB6s*+&`$_d8t(0^dr0;Xanr^zmjq8FQ^& zS)SuLB!Os5leF{XBA4v_D#t^V5FLn)L?@z@pq$-kn|qG$o1CWGU&Nb{KMs2)c_wE4 zJ;$zn8DFoA@wD@w%5jmfJ4&GE7p7b6-j!)Dab77(;0JOu?Ux@E!LPI1{{CfL+1mTq z#`*qf&lJNk#Ct!^K9$p?y@IQdr*oE;1H^S(a5?hS_(lhSxPL3I03v&6E)Z|N3P=1{ z&AK=5R8D6+s_B<)IEY+R8Uj9B+JW!Ibd&wg4%{2lZ`*BO!=VB22qGF-mVY|Oh0
  • EIJ|gHm6((Zzemn9uE~%P| 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 IOg!tq0D{n0Y5)KL diff --git a/sandbox/models/staging/schema.yml b/sandbox/models/staging/schema.yml index 7ed0a8a..0502f98 100644 --- a/sandbox/models/staging/schema.yml +++ b/sandbox/models/staging/schema.yml @@ -2,6 +2,8 @@ version: 2 models: - name: stg_customers + meta: + metabase.visibility_type: hidden columns: - name: customer_id data_tests: diff --git a/tests/_mocks.py b/tests/_mocks.py index 49c3181..84333d6 100644 --- a/tests/_mocks.py +++ b/tests/_mocks.py @@ -7,7 +7,7 @@ from dotenv import dotenv_values from dbtmetabase.core import DbtMetabase -from dbtmetabase.manifest import Manifest, Model +from dbtmetabase.manifest import Column, Manifest, Model from dbtmetabase.metabase import Metabase FIXTURES_PATH = Path("tests") / "fixtures" @@ -50,28 +50,30 @@ def _api( params: Optional[Dict[str, Any]] = None, **kwargs, ) -> Union[Mapping, Sequence]: + result = {} path_toks = f"{path.lstrip('/')}.json".split("/") json_path = Path.joinpath(FIXTURES_PATH, *path_toks) if self.record: - resp = super()._api(method, path, params, **kwargs) - - if method == "get": - json_path.parent.mkdir(parents=True, exist_ok=True) - with open(json_path, "w", encoding="utf-8") as f: - json.dump(resp, f, indent=4) - - return resp + is_auth = path == "/api/session" + if method == "get" or is_auth: + result = super()._api(method, path, params, **kwargs) + + if not is_auth: + json_path.parent.mkdir(parents=True, exist_ok=True) + with open(json_path, "w", encoding="utf-8") as f: + json.dump(result, f, indent=4) else: if method == "get": if json_path.exists(): with open(json_path, encoding="utf-8") as f: - return json.load(f) + result = json.load(f) else: response = requests.Response() response.status_code = 404 raise requests.exceptions.HTTPError(response=response) - return {} + + return result class MockManifest(Manifest): @@ -82,6 +84,24 @@ def read_models(self) -> Sequence[Model]: self._models = super().read_models() return self._models + def find_model(self, model_name: str) -> Optional[Model]: + filtered = [m for m in self._models if m.name == model_name] + if filtered: + return filtered[0] + return None + + def find_column( + self, + model_name: str, + column_name: str, + ) -> Optional[Column]: + model = self.find_model(model_name=model_name) + if model: + filtered = [c for c in model.columns if c.name == column_name] + if filtered: + return filtered[0] + return None + class MockDbtMetabase(DbtMetabase): def __init__( diff --git a/tests/fixtures/api/card/27.json b/tests/fixtures/api/card/27.json index 1828511..8d739af 100644 --- a/tests/fixtures/api/card/27.json +++ b/tests/fixtures/api/card/27.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": "Orders and customers", "archived": false, - "view_count": 361, + "view_count": 389, "collection_position": null, "table_id": 10, "can_run_adhoc_query": true, @@ -561,7 +561,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/card/28.json b/tests/fixtures/api/card/28.json index d7bfbed..589ee64 100644 --- a/tests/fixtures/api/card/28.json +++ b/tests/fixtures/api/card/28.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": null, "archived": false, - "view_count": 180, + "view_count": 194, "collection_position": null, "table_id": 10, "can_run_adhoc_query": true, @@ -549,7 +549,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/card/29.json b/tests/fixtures/api/card/29.json index 837addf..d1b4c20 100644 --- a/tests/fixtures/api/card/29.json +++ b/tests/fixtures/api/card/29.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": null, "archived": false, - "view_count": 179, + "view_count": 193, "collection_position": null, "table_id": null, "can_run_adhoc_query": true, @@ -41,7 +41,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/card/30.json b/tests/fixtures/api/card/30.json index 20d72db..f5cfbb8 100644 --- a/tests/fixtures/api/card/30.json +++ b/tests/fixtures/api/card/30.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": "Dummy 1", "archived": false, - "view_count": 21, + "view_count": 28, "collection_position": null, "table_id": null, "can_run_adhoc_query": true, @@ -41,7 +41,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/card/31.json b/tests/fixtures/api/card/31.json index 62870a9..870fddb 100644 --- a/tests/fixtures/api/card/31.json +++ b/tests/fixtures/api/card/31.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": "Dummy 2", "archived": false, - "view_count": 21, + "view_count": 28, "collection_position": null, "table_id": null, "can_run_adhoc_query": true, @@ -41,7 +41,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/card/32.json b/tests/fixtures/api/card/32.json index 2a2aabd..333c8d3 100644 --- a/tests/fixtures/api/card/32.json +++ b/tests/fixtures/api/card/32.json @@ -2,7 +2,7 @@ "cache_invalidated_at": null, "description": "CTE SQL", "archived": false, - "view_count": 12, + "view_count": 19, "collection_position": null, "table_id": null, "can_run_adhoc_query": true, @@ -276,7 +276,7 @@ "creator": { "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_qbnewb": false, "is_superuser": true, "id": 1, diff --git a/tests/fixtures/api/dashboard/2.json b/tests/fixtures/api/dashboard/2.json index 3a2f87c..474dc00 100644 --- a/tests/fixtures/api/dashboard/2.json +++ b/tests/fixtures/api/dashboard/2.json @@ -1,7 +1,7 @@ { "description": "Dashboard is a dashboard is a dashboard", "archived": false, - "view_count": 96, + "view_count": 103, "collection_position": null, "dashcards": [ { @@ -14,7 +14,7 @@ "cache_invalidated_at": null, "description": "Orders and customers", "archived": false, - "view_count": 360, + "view_count": 388, "collection_position": null, "table_id": 10, "can_run_adhoc_query": true, @@ -654,7 +654,7 @@ "cache_invalidated_at": null, "description": null, "archived": false, - "view_count": 180, + "view_count": 194, "collection_position": null, "table_id": 10, "can_run_adhoc_query": true, @@ -1268,7 +1268,7 @@ "cache_invalidated_at": null, "description": null, "archived": false, - "view_count": 179, + "view_count": 193, "collection_position": null, "table_id": null, "can_run_adhoc_query": true, diff --git a/tests/fixtures/api/database.json b/tests/fixtures/api/database.json index d66d6b8..da09833 100644 --- a/tests/fixtures/api/database.json +++ b/tests/fixtures/api/database.json @@ -51,7 +51,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "native_permissions": "write", "cache_ttl": null, "details": { diff --git a/tests/fixtures/api/database/2/metadata.json b/tests/fixtures/api/database/2/metadata.json index c22daed..64cbe3f 100644 --- a/tests/fixtures/api/database/2/metadata.json +++ b/tests/fixtures/api/database/2/metadata.json @@ -408,7 +408,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 12, "db_id": 2, @@ -937,7 +937,7 @@ ], "caveats": "Some facts are derived from payments", "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 10, "db_id": 2, @@ -1099,7 +1099,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 13, "db_id": 2, @@ -1309,7 +1309,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 14, "db_id": 2, @@ -1523,7 +1523,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 11, "db_id": 2, @@ -1700,11 +1700,11 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:57.125982Z", "active": true, "id": 16, "db_id": 2, - "visibility_type": null, + "visibility_type": "hidden", "field_order": "custom", "is_upload": false, "initial_sync_status": "complete", @@ -1925,7 +1925,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 15, "db_id": 2, @@ -2154,7 +2154,7 @@ ], "caveats": null, "segments": [], - "updated_at": "2024-06-20T06:03:34.567961Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 9, "db_id": 2, @@ -2171,7 +2171,7 @@ ], "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, diff --git a/tests/fixtures/api/table.json b/tests/fixtures/api/table.json index 430cfd9..274160f 100644 --- a/tests/fixtures/api/table.json +++ b/tests/fixtures/api/table.json @@ -57,7 +57,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -92,7 +92,7 @@ "show_in_getting_started": false, "name": "customers", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 12, "db_id": 2, @@ -163,7 +163,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -198,7 +198,7 @@ "show_in_getting_started": false, "name": "orders", "caveats": "Some facts are derived from payments", - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 10, "db_id": 2, @@ -269,7 +269,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -304,7 +304,7 @@ "show_in_getting_started": false, "name": "raw_customers", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 13, "db_id": 2, @@ -375,7 +375,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -410,7 +410,7 @@ "show_in_getting_started": false, "name": "raw_orders", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 14, "db_id": 2, @@ -481,7 +481,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -516,7 +516,7 @@ "show_in_getting_started": false, "name": "raw_payments", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 11, "db_id": 2, @@ -587,7 +587,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -622,11 +622,11 @@ "show_in_getting_started": false, "name": "stg_customers", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:57.125982Z", "active": true, "id": 16, "db_id": 2, - "visibility_type": null, + "visibility_type": "hidden", "field_order": "custom", "is_upload": false, "initial_sync_status": "complete", @@ -693,7 +693,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -728,7 +728,7 @@ "show_in_getting_started": false, "name": "stg_orders", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 15, "db_id": 2, @@ -799,7 +799,7 @@ "caveats": null, "creator_id": 1, "is_full_sync": true, - "updated_at": "2024-06-20T05:33:42.131951Z", + "updated_at": "2024-07-04T05:54:51.198536Z", "cache_ttl": null, "details": { "ssl": false, @@ -834,7 +834,7 @@ "show_in_getting_started": false, "name": "stg_payments", "caveats": null, - "updated_at": "2024-06-20T06:02:33.283724Z", + "updated_at": "2024-07-04T05:54:52.259601Z", "active": true, "id": 9, "db_id": 2, diff --git a/tests/fixtures/api/user/1.json b/tests/fixtures/api/user/1.json index f49fde9..c98f618 100644 --- a/tests/fixtures/api/user/1.json +++ b/tests/fixtures/api/user/1.json @@ -2,7 +2,7 @@ "email": "dbtmetabase@example.com", "first_name": "dbtmetabase", "locale": null, - "last_login": "2024-06-20T06:03:33.519227Z", + "last_login": "2024-07-04T05:55:25.914119Z", "is_active": true, "user_group_memberships": [ { @@ -13,7 +13,7 @@ } ], "is_qbnewb": false, - "updated_at": "2024-06-20T06:03:33.519227Z", + "updated_at": "2024-07-04T05:55:25.914119Z", "is_superuser": true, "login_attributes": null, "id": 1, diff --git a/tests/test_manifest.py b/tests/test_manifest.py index 160bbaf..a731d71 100644 --- a/tests/test_manifest.py +++ b/tests/test_manifest.py @@ -1,21 +1,22 @@ import unittest from operator import attrgetter -from typing import Optional, Sequence +from typing import Sequence from dbtmetabase.manifest import Column, Group, Manifest, Model -from ._mocks import FIXTURES_PATH +from ._mocks import FIXTURES_PATH, MockManifest class TestManifest(unittest.TestCase): def test_v11_disabled(self): - models = Manifest(FIXTURES_PATH / "manifest-v11-disabled.json").read_models() + manifest = MockManifest(FIXTURES_PATH / "manifest-v11-disabled.json") + manifest.read_models() - orders_mod = self._find_model(models, "orders") + orders_mod = manifest.find_model("orders") self.assertIsNone(orders_mod) - customer_id_col = self._find_column(models, "customers", "customer_id") - assert customer_id_col + customer_id_col = manifest.find_column("customers", "customer_id") + self.assertIsNotNone(customer_id_col) self.assertIsNone(customer_id_col.fk_target_table) self.assertIsNone(customer_id_col.fk_target_field) @@ -387,23 +388,3 @@ def _assertModelsEqual( ) self.assertEqual(first, second) - - @staticmethod - def _find_model(models: Sequence[Model], model_name: str) -> Optional[Model]: - filtered = [m for m in models if m.name == model_name] - if filtered: - return filtered[0] - return None - - @staticmethod - def _find_column( - models: Sequence[Model], - model_name: str, - column_name: str, - ) -> Optional[Column]: - model = TestManifest._find_model(models=models, model_name=model_name) - if model: - filtered = [c for c in model.columns if c.name == column_name] - if filtered: - return filtered[0] - return None diff --git a/tests/test_models.py b/tests/test_models.py index 340d046..e488a07 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -13,7 +13,24 @@ def test_export(self): self.c.export_models( metabase_database="dbtmetabase", skip_sources=True, - sync_timeout=0, + sync_timeout=1, + order_fields=True, + ) + + def test_export_hidden_table(self): + # pylint: disable=protected-access + self.c._manifest.read_models() + model = self.c._manifest.find_model("stg_customers") + model.visibility_type = "hidden" + + column = model.columns[0] + column.name = "new_column_since_stale" + model.columns.append(column) + + self.c.export_models( + metabase_database="dbtmetabase", + skip_sources=True, + sync_timeout=1, order_fields=True, )