From 255aeb7e1692e42e57e7e93213048fb6cb3d6bcb Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Thu, 24 Jun 2021 16:52:13 +1000 Subject: [PATCH 01/33] ERD of the Bakery domain to begin with --- tests/bakery/bakery_erd.drawio | 1 + tests/bakery/bakery_erd.jpg | Bin 0 -> 20576 bytes 2 files changed, 1 insertion(+) create mode 100644 tests/bakery/bakery_erd.drawio create mode 100644 tests/bakery/bakery_erd.jpg diff --git a/tests/bakery/bakery_erd.drawio b/tests/bakery/bakery_erd.drawio new file mode 100644 index 00000000..417e45e1 --- /dev/null +++ b/tests/bakery/bakery_erd.drawio @@ -0,0 +1 @@ +7ZvRbqs4EIafJpetAANJL0s23dVuK1XtSkfn0gUHvDF2ZJwmOU+/42BCiJM0LclSrZAiFYZhsOcb2z8WHaBxvvpd4nn2JBLCBp6TrAbot4Hnua4Twh9tWZcWzxk5pSWVNDFeteGV/iLGWLktaEKKhqMSgik6bxpjwTmJVcOGpRTLpttUsOZT5zglluE1xsy2/qCJykrrKHBq+x+Eppna9thcyXHlbAxFhhOxbJjISj0IrkwTn4nMMSdcwZUnLGdEDoJJppTu6f3Ae4DfVHvfpkKkjOA5LW5jkYM5LsDlYYpzynSedwJFJhA8Dk0GaCyFUOVRvhoTpmFVGMo2PRy5us2D1HHPuGEWrYqfMz/+M+Kjux/ZzSxb/3NjorxjtjD5je7/mrz8NBlS6yrtClIzQFGmcgYGFw4LJcWMjAUTEixccPCMppSxPRNmNOVwGkM7oeMoeidSUQB6by7kNEn0Y6JlRhV5neNYP3MJ9Qs2KRY8IboLjg4P6TYlibzq3DSy6gpEJ6ujOXK3mYchQkROlFyDi7kBBai8xYyOm7vQVMayrjXXD0pbtlNnVf1hUzvpNnaNBA4Mlc8QCmxEGCpobSEqljRnuMSwkxedtzijLHnEa7HQzS0UjmfVWZQJSX+BP67BYlll2QsbHq/6ThNTkgJ8nqvcunumJ7xqOD7iQlWtEYzheUHfDDcU5VimlEdCKRg+pZNVNjvsXR/OL4Dbc4LboAl8NLSBVzPkLm93GF4LeGgBB/8j4/HcQVjAqKI8fSRT3X6/tryYLmmTgGRO2WZKzGBMEr4Zfwor/LatpLmgZn4MIvhBZsYO5DCANo3h3K3P4afdpRoLDs3EdMOEQBksiS6FBlDvXKAnxoiNuVrjwrOQoqsN4aFFlOOc9ExbMA26ZjqymL7pabnoqbagOuqa6p1FNQaqPdQ2UF23Y6qVut+hWmSEvfdc23H1u+Z64O0Fm5erXhm3UsZB+HVl7F9LGev7e2X8qSF8DPM3UcYe6pXxpZl2rYw9/7Aypv1y24pr19rYszeiem3cFmr32tjebRoD1V5CXUNChX7nEsreiuol1AcjOPzeEsreiOolVEumXUsoZG9Y9JuLral2LqDszUW9DTXtobaA2rmAQvYm1OtBqr2C+qyCQgcUlHumgnKvpaBQvwn12SGMvvcmFDqyYWF/YdFTPZ9q5xqq3664PNSuJRSydyssniRJSbW4QmepWr8QhhUVfFJfsVK282Eb4cm9/lARTicvAP1v8YT5eptWHf/0ggbNEQsZk1OqxmQI1vKUnATiHway+z2ac2gBrIxy0/n3ZpMPgTHPeNZlWa/Bvmutwb6/h7fsrbmxJmzFCkZWrADdNWOVCbFibapl2/0WBWRr8JMFBIMuE6ngmH2lePKL1001q31YN+XLRnd1g2zW4f43kufWDfLsutmvwSvXjW+/kZ+eeNibWLYomY3Iv2YheecWUjmX/08mIDvWuYUELPB6x82s3kebHdiflg7dxgfacFAGvWyh2q8nV14h/6uKrb64+3jq63jJRIFjoR9+sWJ9O9ZoP9aXpz44rf/9oHSv/2kETf4F \ No newline at end of file diff --git a/tests/bakery/bakery_erd.jpg b/tests/bakery/bakery_erd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0170736946ff1de92175a6c378f6c601a18b8f51 GIT binary patch literal 20576 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
( z$h8RU4HqlX#1!lCYErCQ8_dTf*?Az(B}_gBuo#woWphC)D|hf!cMJ}fWx$XZwl#Zt ztw(S%{ME0cV#vJ`?C|9A1+9^5!sk8-Yu0{QON`1~SXfw8PA*1L*b%*yh2UM@Mf&^1 z9vq;D^8#yO6sFA{=z^M zs2#1Ba;+z|$H7Te8y(>Xa((bm1zo%%dL+ws|>tUSX-%`C>!qD6#5_>uPNN zN62LcJ{Z+V*3qhre436GT%L2^U}o)+hbmTI&puk%-zz^|ImKACjyr_ANjoLm4@b!OZ#uJ z7v`W>bnA%OuGhTh^}Ex;1xK`CbyD5cMa(e`vLVCt$n}2?`%@qAFSWscSKF|c|I?i< z$8ZrANcGX+Ieh3mfk?n(^Qv}TLlw_yOhdJ)WC#EtFwrH)`vuV{`sgQg(2j+@d&<`BsX)7l^^Ago53mkuzp8OnG$uXWNj*it8lO92CzV3` zCgNUl=4(y9dZ3VqQcAPOLjg>=IESCgE1wE`PqfMc;qn zTl|v)|Ka<`s*IMIq6%aZG~GgKeWI0oGkQF%0#UDAt_>gr74=mEidt3T#zG+nWYo7P zgOVX}&H@71@ePa5r~gb--KrL4YT1b6D>CBjf;}29P1K?5UJyl|{X6<8$kd$PtKE z&sL6FjA9#@^r&QoikWq!ON_X>oEn$>YI(z(oMLBJ&m_SYQC=eF$y}i@ zGvVK36#ozMuiAfd@TGoP0+{bh3b8!Fu1rpI8w^}No||O|Sv!l$9ktAjh~5Tcw{i>< zv8JK>dr2#CQlCV(!Qxw+$*M!A?R#J1h9mlG?KZd$;P~%NwkLb)1uwnke#@;w)?Jsz zJ1B#SRZzr>UsCHd#ESu6tzM~gXaD~7!E>aCN*hz_I-&2M@#57)7qNN0 z*iM!sDJe0sKIWoKeuIG^D9KY!$p@_3;j^{csrx`LW8#P>N5gJPd+LaqHU$ET7R2*r zxNM6`^Q&Lpz&M#gHhDK_AcO|hDIcnc#-s?T8wZOr)&-px?NOAe`bzC-Vu=r)zYeb& z8(=*H%#y+~Ervr?5MJm#tZ_L#KbrX!H)4#ktm3I5t;{IRNHV%?FI%;Y$CIf4Nc6u` zUa-9W>U|GV&CX7DLCdR+&^T;t23jw1FP{v-a+z)ko-KUGm`vHsQzz(b8`5iBPB0*q zbUrh$t5>d`HPrF`c?VK~Yv5*9R4^sn`~VM{ku1Zx5eu&kg(!-LuW;rew6ci3K)i{=*^UJ0u0u9Z=_=F310$n`b=5VeVy-tMRx z9vXoH8T7XCw(Yjs(!y;im+jer?+W@qc}tUSh@Ldub0cYtKh~+53|3K(8_vSz4G?8r jBcHWOqsE%R;&Rg?$fd2rS8(R#|6u6 Date: Fri, 25 Jun 2021 16:41:02 +1000 Subject: [PATCH 02/33] Bakery chain domain model --- tests/bakery/bakery_erd.drawio | 2 +- tests/bakery/bakery_erd.jpg | Bin 20576 -> 36434 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bakery/bakery_erd.drawio b/tests/bakery/bakery_erd.drawio index 417e45e1..ede667c1 100644 --- a/tests/bakery/bakery_erd.drawio +++ b/tests/bakery/bakery_erd.drawio @@ -1 +1 @@ -7ZvRbqs4EIafJpetAANJL0s23dVuK1XtSkfn0gUHvDF2ZJwmOU+/42BCiJM0LclSrZAiFYZhsOcb2z8WHaBxvvpd4nn2JBLCBp6TrAbot4Hnua4Twh9tWZcWzxk5pSWVNDFeteGV/iLGWLktaEKKhqMSgik6bxpjwTmJVcOGpRTLpttUsOZT5zglluE1xsy2/qCJykrrKHBq+x+Eppna9thcyXHlbAxFhhOxbJjISj0IrkwTn4nMMSdcwZUnLGdEDoJJppTu6f3Ae4DfVHvfpkKkjOA5LW5jkYM5LsDlYYpzynSedwJFJhA8Dk0GaCyFUOVRvhoTpmFVGMo2PRy5us2D1HHPuGEWrYqfMz/+M+Kjux/ZzSxb/3NjorxjtjD5je7/mrz8NBlS6yrtClIzQFGmcgYGFw4LJcWMjAUTEixccPCMppSxPRNmNOVwGkM7oeMoeidSUQB6by7kNEn0Y6JlRhV5neNYP3MJ9Qs2KRY8IboLjg4P6TYlibzq3DSy6gpEJ6ujOXK3mYchQkROlFyDi7kBBai8xYyOm7vQVMayrjXXD0pbtlNnVf1hUzvpNnaNBA4Mlc8QCmxEGCpobSEqljRnuMSwkxedtzijLHnEa7HQzS0UjmfVWZQJSX+BP67BYlll2QsbHq/6ThNTkgJ8nqvcunumJ7xqOD7iQlWtEYzheUHfDDcU5VimlEdCKRg+pZNVNjvsXR/OL4Dbc4LboAl8NLSBVzPkLm93GF4LeGgBB/8j4/HcQVjAqKI8fSRT3X6/tryYLmmTgGRO2WZKzGBMEr4Zfwor/LatpLmgZn4MIvhBZsYO5DCANo3h3K3P4afdpRoLDs3EdMOEQBksiS6FBlDvXKAnxoiNuVrjwrOQoqsN4aFFlOOc9ExbMA26ZjqymL7pabnoqbagOuqa6p1FNQaqPdQ2UF23Y6qVut+hWmSEvfdc23H1u+Z64O0Fm5erXhm3UsZB+HVl7F9LGev7e2X8qSF8DPM3UcYe6pXxpZl2rYw9/7Aypv1y24pr19rYszeiem3cFmr32tjebRoD1V5CXUNChX7nEsreiuol1AcjOPzeEsreiOolVEumXUsoZG9Y9JuLral2LqDszUW9DTXtobaA2rmAQvYm1OtBqr2C+qyCQgcUlHumgnKvpaBQvwn12SGMvvcmFDqyYWF/YdFTPZ9q5xqq3664PNSuJRSydyssniRJSbW4QmepWr8QhhUVfFJfsVK282Eb4cm9/lARTicvAP1v8YT5eptWHf/0ggbNEQsZk1OqxmQI1vKUnATiHway+z2ac2gBrIxy0/n3ZpMPgTHPeNZlWa/Bvmutwb6/h7fsrbmxJmzFCkZWrADdNWOVCbFibapl2/0WBWRr8JMFBIMuE6ngmH2lePKL1001q31YN+XLRnd1g2zW4f43kufWDfLsutmvwSvXjW+/kZ+eeNibWLYomY3Iv2YheecWUjmX/08mIDvWuYUELPB6x82s3kebHdiflg7dxgfacFAGvWyh2q8nV14h/6uKrb64+3jq63jJRIFjoR9+sWJ9O9ZoP9aXpz44rf/9oHSv/2kETf4F \ No newline at end of file +7Vxdc5s4FP01fmzGfJPH2E22u5vudpqHto8KKEYbQF6Qa3t//V4FYWwu2E6wrXRGM54JugghdM4VR1c3jJxptvqtIPPkM49pOrLH8WrkfBzZtmWNffgjLevKYo/DcWWZFSxWtRrDA/uPKmNdbcFiWu5UFJyngs13jRHPcxqJHRspCr7crfbE0927zsmMIsNDRFJs/cZikVTW0Bs39k+UzRKxeWJ1JiN1ZWUoExLz5Y6JrsQdz4Xq4hdaZCSnuYAzn0nxTIuRd5sIIZ/0ZmTfwe9J1r6acT5LKZmz8iriGZijEqrcPZGMpXKctxqaqIbgds7tyJkWnIvqKFtNaSrBqmGo+nTXc3YzDoVs94gLnier8sezG/0xycPrb8mH52T9zwfVyk+SLtT4Tm7+vP36A2zTTze//6VGSqzr4RcwRCNnkogsBYMFh6Uo+DOd8pQXYMl5DjUnTyxNWyaSslkOxQj6CwPgTH7SQjAA9kadyFgcy9tMlgkT9GFOInnPJfAYbAVf5DGVjzKWzcOwK2o6dl1WnawfCVqnq96xsjYIgKtQnlFRrKGKusB2FSGUl3y49pVh2XDOCZQt2eJbzUOiODTbtN1AAwcKndcg5WGoCDBpjSAqlyxLSQXD1rjIcYsSlsb3ZM0XsrulINFzXZokvGD/QX3SAEuKepRtf6fGg7xStVnQEup8qcfWapk+k9VOxXtSiro3PE3JvGSPCjdnkpFixvIJFwLcqKqEaLOFveVC+QRwO04L7rAD7s1Esg23FfjnwttHeEP9Hnc81gdLcCqWz+7pk+y/21i+qkeSJg5j+ZS+zIwJuCTNX9xPEEEeN0Sac6amSW8CPxiZ6fjKG3nQpymUraYMP1m9EFOeQzcJe4GEAguWVDJhB0/7WDz3uAhGuX7V+cdh6pzNhQMEaU4yakAdAKqnHdQQgfoo5+XSwDoA1lA3rKGNYOVFbGAdBqtl6cbVuka4RuCuBtZBsLq6YbU7FjJErbOMOB4kjj0kjh0sjsMubeyeSxvbeHI22ni/B/eB3K+NuyA9n/86RhqfGtMOaXxZTN1uZczM23YQrh3a+LK44kiUkVBDQe1SxpdFFcebpoCqEVCnF1C+e5yAssdnE1A4EmUE1AH/9d+3gMJhKCOgBmKqW0D5OFYxL1hkQB0Cqm71FOCp97F7H8+gejyq2uVT3bDZBjgprB2Bxct6K440pSynTNDMIDsI2UAzsi52WAQojWe0XuDQ9JEvbxsDGqqtlBiaxzcy1QmKt18zkq/r9Q6yVreU99m/uIBu8UUR0X0DrpblcJ8Z3YdMNaQYmYO5DrWxoCkR7Odul7sAUvf4IvnZrIdc27tSfa1XRO64BXP1tOrCBmnUlofb8tptVQOC2gIsyHqrmvKi3m77fmsZ513vJFzBQdVkw8nN4A6gKZ6ALkfTeqKStjsmO/4y35yQtPXu+UHSVsFEfaR1/HGbaEF7bjqWtC5uK2y31UPak9EKx9v/ltvbiFsm3NND7t5wj9WeJ/w6dVZfMlmIX3Ym3rNfv1Qe8n6Tydye3RWzjhwCq/Z0Mrdjc2VRwgzWMTcbYI8HVntCWYD9VXD5fjSovh1V/flkLt42kwECeZmJEQxFV3tamY91032DrhHLg8Uy+s8LN9Quln2cS2jE8n5H9ntCSu9FLAd4lo66khsMqMeDql0q+zg0ZrZHh6KqXSf7ODL174Lkggmzsh0CrH6pHOD3Kq9ijtAzx2oiywbhtyGsXy7jNe60L3hhtPJgrdyVR9itla2zaWUcrjJa+YAX9+xkvRutjCE1mYQDQdWvlfECyPw762BY9YtlnPWLAD1ldgBdMfFdASaPf8hjQKUqfVxtnfq4Hp08W6Bm8cFsAbfn/1Uvli0Qtl7VzvVbcwXaLbntls6cKVB/5ObSFLNeQTEgUrH+vl3YukoWm8teSmegpnssNYMekWeo+Xpq4lDBu5v9NtS0tFGzzmE9TM2elM1fj5pe0G7pwvlVgaYX8y82a9Zf4zhMzUAzNduEct+c/NduybswNUMchjsvNd9IM81as/4A0GGtqTkz1W7PmsFbk6kxNdtfMzxRKrWFIlm73658bSo1FJvvaFbVm6+fOrf/Aw== \ No newline at end of file diff --git a/tests/bakery/bakery_erd.jpg b/tests/bakery/bakery_erd.jpg index 0170736946ff1de92175a6c378f6c601a18b8f51..1bd9d1071286221503382da6af4c2ebd88b1f7cd 100644 GIT binary patch literal 36434 zcmeFZcT|&E*FKDWL{U*drC6vE+R!_wH0doN5SmgYp-AX`bVigQ!2|=+C6tha1PKI4 z5U|mkkOT-tM0!`Mpu)$@)0k(y{^og~@B8Ol>vve|&VBBj`_z5*x%S>y*y-Q-z;VjN z(Abb;-#!kGeY<}gJA)j090&IQo_@a`*i8oyAN)Q2bolV0!$*JOovCr+L^#eItN_~|pJPo3GlKlOVh`+k4(z`>t(Up#f}=&{|W|I4)Vl7suF z{a^M!IIvHcV?X!41Kj&|-f~>{y{r2V?AuKoe@{ma|8(%s(F6PUaqfN(KE<)y^8Wn? zk8&Q`cks|p$9BiH|G>dRhmUaobo$KYFc!}_VR=LO5B+6dW3>~hHvqpL`}rL?=lP2X zdOI9jIu-0jUPo&ou?wyqIT1OJkXOju>Pv8P^TUS=Eb!(fp?-~;9NR|@fYay|)WEbv z&}n@Hfufc}0s)PDCkzIIUFzp?+_de(8zPRG_8?HGzUdRq(jAWK6W=Z#>9aO6oO^_M ztbjt5bY}Mm8=|oOWN-v6bZ(^m4k^MyF{(I3EKP*k*V!nIM5a>IU6Ks+!2o4Y=&-fw z_Vkh4CzM}L_*eAQ(dS&vjm-J6I?x110Rj4aCav{hCINd<3bfS}y2u= zpyctRr-N=()@1QUCw%M6531Bee7%2&fHwJ>9ilCyV{e~7w8f7PlX=p@PL?Lfc+ea^%!JplG&tmTBLt<#IL)BS$jK> zOyj!uwoGh!GoUK?>#ECHo92l1!B`hh^YvlX!Odqvzo_wsedRq=Cq)gJy_XXo3~jKL zF+IMRx5`|;EaId1>nWS-d0D-_^UY*qgTmRT-|M_QJ4q52St9|Uv*skIl4dK#u?!X_tY2it4b;___2Eq~hKzz&p`YMFYf z={%b1zO}I~(?jb!FEx9++lOt_Tc?B0CdWZ)6DtR0hhshV*Ehtq{2D!KWCEZTvB|;d z$5kR*ZxrA{vU^*9b11wqFztjny`oMI0tbjiSa*)JuwxEx%2CsFdh7UnL)`i=`kN|0I_>Te|iTVPU8)^t0u1OyJ!jjR0ptWF|pnXuTm> z6b@3+{2t(vPmWb zPQ)V0L<3A(sZ(HeF_fJ}%uq4ejR2=wC;imd=1jV%>eg>}cVKosXUXatdO^Us9G!FF zHa=tg>%gXvVtqT8u&(Gfc0|cE@mO#CB$ENjernUydRX|Hawz0Jh|L{3 z7MMxeats_3PkGqM4`0gu7_|_#DF)%pP>P>38HYVB$x%_a?zksGv*zXXfCtolh&s^Z z+W*yVhvQR&>kdcHg^1{<(br~1xCFK5#0zI-ny^Lp7JTF55n`4{X`qrbM9B}(&7lPh zD7pix-U-wPsn#G~^mgC{_j^a)MYi=gDwy&1nHT}qR&B4d`4hikxCa3-t%wKl8P0De zpU>&Yr;TrgB(R1_YRX4C!y-gNn;UmHUI~D|kH1KY+7zHKH!jsTIcA4rm_Q#}F8_|81nh9|R_t)B_#Wu$Jh5%YRx9t3 zfD)Apt0^iAwy;l!nxa*|Gu*>;jYs7-w=7lV?B0hA4RBrD6!h%L2EU=I59w2;pJuPe zuYE91DA76dfkAOeF8I_04}$x3v@TSQc&_kgz6Ku>1kEjCbhWxk-qer%Th7occJbI9 z4tRbf)3Bel931?qHWQ$Yulq{g-8!mLzabBX*L6EbHz`YiLV8&!cfR5|M+ZM#GZ|x< z?OBj|WgQWIUV!F-Le7POWoLRH9xjb8H=9u_f8JC#)Nfv^y2GJNEp(|FS0W?P;KA^W zdy!9|C4pTJN~~!kaP=9;8Z<5#y2EkLdbuONFH!2WQN6+_-?np_e?1pTu_R}BdC1CM zYEE`#T+)C`b3|isE^rgT{g4F?_A7$7lLuqyN|PfUy@xL@`#{Abe)+5#^kGi5WOM3d zOI`GHXJ2$Pl}8@LxTZOgDqfmiY7*fd+Wc_688JRwjQ|kU%xdQvp(pSy{shuba-tq*(cVP zpgKJ)b3zVUOfx>l%gvDX1^JqTW{tFmO3b%6E`PMc%ru?K1;ogltZEERo-(*E|j2Gaq?R(S?NNI>U~)ZPXEHsy`+ zeJj?w zI3ffmP@!OVb#^Y>QSyWFg&O4-OF;8JPd1nJrrz4w1I!(clqnmEpGLdPc^TYm8J_n7 zFrufKwv_*>$z)I&NIfN8)pGHdn?EIg1IGRAZxOb?fG=c4unTy|Ff8ODETX;!O z;FB&{%iM=GqQa1IdG>apa&9OUkCz~pB=mIlU&eS0@DW2N(svQ&rquUGrb#+HYmWEZ zawH815R_4x>El;m8NnxO$_igJZw238b;&;C*K4?0k6t`N6O@n1Sk2twIA9;Q`IDv4 zwyn8g?dJoHho+9b@tLCc_ZJX}W?*=;@I~2!6A} zVfZ958vV_><_6VgKq9SA`W!jm?CrDY&Ix4dryP9?^X-{#JmdgS*DZhA{(w#>d^xn8ic}4dlL#dv@G?I|&lE_;cK+fg@i3Il}r!$#BV{@F_t- zHCT=j0RnmxAEW)6;CTO-Xvr(GveFVRBRG;)+|P*FX~$rUV)%+@QKd#@6d({QVxJ5HSzll-+s2YM284u0mq2QlKB!vd z`ZO)l_(~?;X?Rq+GtuBK18YqI^Mio}S0+$C0~_rdRNk5utQ3mddHTwM=94LX<3p8D zQ2Ea-YNVbL0)tCwm8qf`(y7s=wG<|mtM!f8UE9unM44GQAqd?%$*E6O%+|82bGpXr*YfZ*qE8i2)nWA2a-@j85kTOoa-+%k`hqlFVzR>gLYB(NqvqBil3Wa){&-D>#gRF za8?^y239!F#YSKg&sBDTweL*{bT7FX9TP0M?^OJy&mTD4J^zq7$-W>CclP+0I6hH= zuF(t1bis->vQ0x9hm-7@Kw|pJ+!`i`+d>zOMNdHUyE_aF7bgjXGT^GI~TnK@WX9$*CVnBu2(of`$+O+ps5PIJ@=$@TPRQ>e*aCAw#8UAzl2pappRr zh9t_nqH9jX`UZEUlQ6AoUhVpBw1_mk%Fx=wedDUF4S55s;%`>{rCSjN=gHQvMDAxr zXnMy@A_?cwQ9=yL4@MbI=A#5zc7(-;IOnvFP_ZnJ*4IjnX*Y}89s%gu z=o-yfBLZM)q5r^}?*`4=R<2LrOKz_g2VAXv%dD8;rou(#K*;=avxg;+^jUz@TF^if zjr+x7XzQXOfUs2a!tm28=R#d^^Q8wd(i9hkLF#cnsy(UVG_co+kR4uBOh|wH78zMI zCxXJ)i~8w<*fp7r9NoF-ix$))=4w%`CG@0w<7%YW`HIDac=U#EPQ1@$2){}}l1B#& zgP2rTN2v@Ga^dLGRMi_H?zYP^vbpBLZ)DostGb;X?7j-67S&cPMn7qNi@N1b<8AKq zs~cPWqNSM0IFAs+hZW_WMrgsN`_%M?*bZ`1QG&Z)!Ps%R0!%V?gX z$lI?O)}-TGC)lAj-rJs-~f*55^RR22pX;7%K%Z*rV_ykTMUP9k^IzHnz zm()CABnQy-Fv?qU(d2pVzTPa6)ZHQ^C>Qbtb1@CfwJhBMv zo%1ATKn4a{(@(4Ud`LoUibeI|NiYZ*XW2=qlIIo% z*40&wguhQ0*W_A>x$GHRc$-fjF@w063t0R};K1z3j_#=(QM^Ck=Eq|eaA`Cv;niVJ zzv}ms=!~JXcK%K8_@dh%&|&&5b3Vce9@96|zh!-E?SEgKNO^J(RFZ=VmZ;$Dx*yO0 z{Oi^H>k>!7Tslbd_h;U5yw03>z$mVpHBxbW=_4@@!~xs5cue6=b|y*d^EH4Dt3{eL z=`OTVDBB75&&0|>ie|R0`p=ZK1U`Z(Qb6wN@!Gz1?756bgsLID2%#vucpNVB5yeZ^ z4}#$7auDI~FMY&8PsX2~JX2j1LeQYypA513unAP^dNbc*Y%o#+1iB4dlH{y zgK=}yuu~R|6oC*XfSFDq2dwiNf}CtNA5Vm+JnDKdUnP=}E75kThQ%^#Rikq<3-9u2 z!nIRO5{|>w5s2{#gCwV=Yj?h%>t4`?G`tMX=W4VYJ^c#2qK!yRd@bUtDLVc1edrE{ z=kN(K`%TzMyW8kv7WY5!1X7`_^M}<9-|lcg@886mqji;@)7&B>vKl6w2bqVTw2`-l z-Mh2R>OHE6MRIt)@Xt}&Cp5Wy<5cYf>6VG zTS%9{bMJ7WT-#+S#nUy1{0^?sVpQ}ZD9pb1V@26>R=fTcT8>cG<5sezu)e;bu6wjB ze+aG*it8P|;}l83n%b6FW?A(Ml~9WIf6hiKjd`R!B4pZEu6wS70#Km6Eds z#b8=bsbQb;Bf~O*9(9n*ix(BoI5@;0Ei-4YM_n!XV)qSXY)6SSc$f1|N{6?e*Xpn3 z_peJRml~+WymMMP-wZDq)4wB#*l^69oUw)1xC22UwgnN&t!mxNZ2~!q_Wh0GbIe}q z89ev#9gYUg`^jF}fNz=p-&4r%2GY8xJHg-!-`;se-WLgtEDQ5D4{^aMTibR_85rm} zFZ*AjRslvA>GhVW-9A*eFaDxmhy9#eYXcN|or-6mF0&AvamV%(5O)N;BsqO{orr2C zEyT+R_h@xNALznmLOJG_G(Qu86w=q}KHy0kA*NNFQ_ zoq`~HJCb>M6mEPGuCQqC?y=SG(8p|>RD~D}pMGaj?XwyZws1i63t{@e%tfAEE3p=^ zkrudkc{LdkH~k(H)mFX14N~jVm?nh|)MT{>$068>alL_bUZ1z5yz+Zs^}qr%O#LGQONi9K z&rJCG8Odo77`4+$!x5n%{W<+b89EA=meE#Q*OfE2YyTgF4?ioSUz1K<4frgh2br+1 zWQR=+`u*}I7WLWkyFgEAMA(Io7jJyQZ70ouU(_TA@*F!1N}LD;b|sFd*1QDW*^{`jG8o;_eR0DDfFu z+m4^*kAxshcm|TF@sM#_WgWPPqD8ZU~@6XX+XwY4l$9c}~8HOdpF)Y}A5+}s*0Q0&K;J?H;k zD09GYbkgMgS&jr&0tj`YQAYn1tf-uqBZN;`#X z5=FiWNFBS;s#JtwbrvP#q8HeL<;3oYp&brMkVflWz+T+Br_OyKF(;)hjhgkl+226H zdvWK-PsBU8ni*y1_h^l$A4)q`pw;OhQyHZNk96&h1>?&Y5?TVQuAYw~MS(+UBsky_ z_~m~f%l|5}SBHUaR6gudmPL57l$Po0ZtWplpKFN}YDrrM45VM|gDG2Ndve?0iy7G>pqH4^qPcDGg=h+D_H=>1Q z*?*gqeSlue8}u^+hrC}`eI%GrQ+i~7Tfgh@iS&i=%fF^g^qXo2mrjPuEI`b|+920E zIqLm548m;nM-T|LHy-9j*b5JcDOGGqq;(xcw216Z<$Ms>6P6-g0|4x^jdescB^jl+ zpa(LO+f0Rg!#qopUyfJ`3sXEYV-4I<9YDBjD3tQ5|OPwx;&ND0GIuvysdowA_HH&0C3JM7oytyzo=|9eLmdU6t^`QIH&KbA-u!Uap zY24pAXxBV@%+Q~KEf={?1mrTC`@4Btdp$OGPw?4 zO+W3mc0cWA)2T-l+pW|nw`wc*1As}**bPgR0J#r)I z1};h*sbT|cW)bYWms!3`5(OZxYG;22g7C=T>7;=Xn&B13E}P|?6LR8xQU+?!vxTgt z8XA{d3m2fYa=e4o9~M6(jL%Q8%zrLKcFWl1e|$&T;ZU3*$)Z17Fssd);2Ihs;2jRa zco>@GHJiwqQi?6TZw_Y?lN#T+o`^|s3}Ac8%&=wrLgFC7v zY(Z;6iDFgTq)|zn*$&5p;fS`Z^7p~1Yo-^Ba7t=gsaiJW{GN4eYg1)MaSyc9wC%&EGfQC{NLgox z;|*pj?JNtHZIR_HcXn)IY$W3Zlns%Bx*(@gp1BwVVWMY? z583}AkO%i3;&`5qDwzOctCB@7=ZgUn7&m*!@>e@&8MKq6+u*r6sm+O!u8oVWuC9aFw3aP3GHVst@JrGZ7gd{d&mQfhQWdN6)cv4|H3 zm~%<9NCRwe(C~=0PZWLvR$vI!cI0j82x8p|Vp%Wgr-a@4BzsZWWCp)JmlII5dB{bL z{wuW2tGLzcc}d&Ba|?}$IZzn9^6-t;!hANWapCC~=k^KTth?1JGNz12*a@-B^UUM^ zOLq`SX-6fm_&*1lwSuuy5_a;f<4Mhv^WSOUV0L7ug;eHf1WR<|xQHCZL#cwHkrA-~ z{)sS#u-hC9!UmzpmbJuQpZk5kap^ltRl0>+2>CUZq6gN*?~y40L^xfU&b%>u*jUsb ztf7AHF)pQ}o63(!n$S0iGdl)#s zH?T99M;S(RqkNY7x!$Tf?B~0yxc^V^@lTrdf9Iz;NZji|`_qy0%OBG6`{gfA)qRp5 zsY%{k8JN()?@=dI9UoiQEFsDFluK}tabmvA&$M0malOR!OHl!#bTk=Ud_}SlkH^1U z`t;_wG`P-)KBA#af`$+X1YzM20{(AS_}(FbjQ4nrIR1H%pWb5)@Y?K|kgI@a|Lppn z8*cjS{FMDl=C)ko1S>p;JAtXv2d6>U7dyjXxrQyCxO)zeNe1I}iwJBSW@pqqRYp$4 zg2Em4$%UP$mS&=CSf2cO3QZyt4z{)wHIJyAB!fwNVkT=`ykihUAlqSsG~?0|EwUq< z2zBcUt!UMkVwp$k{f#X zkWl}j$!*Nm^kb8(y7Skw9VL7NumcogbegHDTgYT5+bv-&_>nIXP9<9JFM$`pms^|Q zzQv(hY9H;Oq@#5=F@8isMMvsXYQkwU1%jWzIi=2=UQKDAGL>T0MO>KDZY7XGAdtKq zk8j(hCdXS$XP2t?qLhz`@na#uPY3a?riNPxhr*mfB5*Y)Z${6oAxJ|UE8m*5%sQnT zS=Q($d-35g;WJ68eLK4Hoiz(o*x9t*=7lEvBU7dBDR@K&pj0B2vsxQ#6D7pIo~O$3 z(4)YqvTB1WW^K_`kU6dshF_y>7BJ?Jpz6ODhp1ksA`<0CI_W>Hm(K5 z3%2RjdBy1~yF578MCGlVftyGMPLK#O=4TuPL~*&V-F^MgS8gH=>8hLZn*dhm%saQN z6A*cGV|?p0`J82ktCn+V1*Pbi3GJk%GlO0;N|fP%0lkKY?? ztlJm)yg#7VT!Xnw@hM2%%4E^wrId^vwTlijN~#WD-9#;4M-tp2sQki6>TL7SaMr@z zd$(tABC%p1j}jv)h`?go2G6?e(xNzF7IClE`s5f~Iz6+|gXc36k2T~qx>`rQwV~UY z@@iR8rUIe>ZmIF4+S3Gpv4~dDVqyz@{yyQpUuvr+l*I&*M7dv3}c zt3cb(XYgPC*w=r;_vpQ5_p{%>caOw8xK^AIg7Nuo*21H%jHY*qA~Kg%ijKS`?r?}k zbl=V?WX!4va5@PN_>$i~qE4u!kr{*jDC%i1ZDL>Zgh6z`VCs#brmA2#&l%2+3U6~| z&WS@S5{>8P8kAy=t3vtl3mfOgMq&+F3?23EnziNp^^ww>idLqx)j^Ee78@V9kR=SQ z_EA3(xE!8YelE#UEbXBAI@Eum3ck3@IRm-=hYI63PM2kN#O%t*RzUlNv6W@XhR zFe^nqjSc9w>3O@$Y&J)M(JJbpbNyL&me3Yix+BY5jv)r3El;NUuFS}uDuKUVDoArU zt^PEz#wn3Gxx_5S({x*_`SNxh4)mG=Hqt?Rxi0+)b)C2v^Z4pOzx$+JlTc?WUg}cl z;!4M;nI&C?KzuZHKah3?PNKLcugp6Ro@ zhJ{4bt-ty)Y(9l$_l=ghrRP*LhCH9&lKRzct@m5ts$70S^poTqNYNL^-n`{PE+vcU zVa{FNjX7p^e3s-Yv8WD)%sMSr9U(UmmY(!&4Y{=3SLyS2z*h7*(y!QK6oUPBIAHO? zQM7U6n?bY}m8-W*>OaGN8w-BS8oFb)7AbHBo;W1$kg-`dr#B+vPAp9>oJ_j#*lac7 z;U=oA)>$9|bY?8_W4=J9RLPsqj(&4FZBHEJ=P;Al_VR&jnHYmJ4wlC|vJo>L2r3zd z5=3F8-Zx2zcw~-$J2V7`5@TA|iqFNHhHhz^CpwWgy>b~YFfG1RpVSO8$~)cR5L8ds zNIKcKtaVbsAc2rYvW#gH2?^sU0gW~klL8!1TWvC5ilfW&i?-IOA6M3Nz zRV~~;G`{?6(pXBtb0gOfx|PTJP$;KqtzZ3R0(Bwa1*N~KuI$QClZFw|fu}S;%hy;y zAe+CI8~Ds8wzvm+|4@j>ZnuyvdQ#_RqlQHT>9@z-bks-D=f&dfhgh?AyUrH`(vaYL z^=JPBSMEq9IhK8UaIEs0u|a6z^Py>_t-Eq%I#je_Umw_PMoZ?h2iZ-ztf8lhU;y_| zv>hG1I{9u|K`eD5S)vE<6u`%N)IZ`~ZbiSsLWXFI;4<^02`_r2oRUC>^UT4JV?XVJ zl)cfUy)K#kgg>;!zgKiXr{m->0GB*HTKRhPmm9F_I$oCswLMuDat7`9|h0E0st}7 zfmhTF-@!c5e%W&7*v5RuD_8%jK{6i!miXb>z1x7<82~qe zbbKk1WcOx8iY(>(_R6x)os45zeUlFInhUSwK+1tC5e|B`CM`bGPn%s>?gW4@mxSp)(?W=T{#iyHtL3vNc7rSoU`Y>smNB@8TBleQ= zG10y#WQJF2qVl~YsO-BzKbFeieeDo^o^rr72Xn|OMC!Mo>j@%b_wB#%hK8w1RrbTf zl5QVPb5qZvO&~j5g<4o3OvPvO@RA%vJeJfti}$%bj$y7YVLIWp-Hj|4@3^-M)4%*p zItL&;Hg(|?RS@it~Vm#15+{t6M75iY%n%@ z^Fu8cA;!8~-9{>zE_oR$ErRLm;eFH=y82m3x-b^^{uhhE(hPR8&x76*F&8qeiwu0q zhviobV|;Uth=u4|lSG;G4gjffn7CV+&(qEf{ps#UlduGThsL5?H>vKB`*F{mz41*; zY~_1(!vR%JGQhsGudW?@2V(UAMR57Jr1AnvN%PwM5>!ijjqtqlk)H;*d?}#*D}k`A z;I(50?@VaCEo&;1-L2&|3h`kUly0NrNU;244HYb5&5s%Sw2DhZ{sG9?!K(r4D#}t0 zL4S#PUs+4(0-3c!@fQXXa*~6)4Vfq>M5*)8!VqENr}(gjUgE7yOdoHh8&8B%wfUhO z*oyQnDg8qlA)`7|t0WI!=uxq1<{<|yW68mrC)n0W7D1~2mCUxB{muE{R0Z5E?cB`# zD$s7SyXsQ)7a30(0Spsm_qu%9u9DaFGT^iYP(R=k_VUOWWM5%F(pxsdy&T*G4*_}l zY1z6+NnrDeiEugr0#O$W(bk*@$|?;Gq=M5&K5O2={=UrodcOps?oOLUxM<^P7x+>& zoUeB9c2Zg7yQuzD=o0@M?AB!;W^~l$YN&;A zc(Xi}d3^ZF=d;cI()0Q)WWPve!)XyBW^ocu$?Hnsh9vMyMLfBpB{VYk4WhA_- zdjbA8w2MKDh5dIDL5 zHFz=T7=vBhq4bK}*>C9~wmIXaX_OhO;%QaV!rDzCGg^iww>%q_3yveQ~*`Yw7`9ltq7oHV!tPaqIB_{07 zp3v2<0R1SE#cOqtxF@i+H(m$YmB>BeJFS1!9SHhUQ-NEfgdDoi&pCuTMo=Y*A=^e? zUEKg2Eha>tF27t2WN3e~=ruiEcODxjHP9!lt*Y;WE&4;0PL~8Nm>2u(aP%KnT@!pn zK=0-)i(_&}>x;*4{u{#iFJ$hIHvV)uO_q*r<8NVa>um*305O5?>-N1CUCS34xc}LK zbkt6L9mmw^`ZU6XD-cY|x~MvN>v8eh`KY`97L5L1BDFvD>Yo{t>awrWFbVI?A4tYO z3;z8^%zkPh*Xpb8n>g#{Ry?3dhq?8Dy)CeXG(7ZgKEeM0YyMm1`}Q;14&!DE$!lq> zK!KcoZiV?AhNWMHW7*QdqM~QDz1>%PWy~o)m`K2FR_mr9VFJD;j1{+DQ!TFR)gXTH zmm2yvsvh$__N)DD>1cIn&`Er)!Fn0X^-ZA5q`Khs*@nIw&rKY26upY*<20`2!AJIz zfQjJXuIfIZ%DHUK%n4Dm$zbHf9MBC52%x)H5|9!~OP7jhP#uGZ-r*h0M{9e~ma6T40#&4M^78C#Ggn@5S?LbdP z&eSzU)OouW2dR`i^MO(WAf|Y7>7qSP>7Kz}w2e$$a3|Eqf2?hH-wZh0uW}LOYU+G< zij`~R7hDxhUF8b}s`BEB6Fi|#>Yl?F`cWQ1myEM|B@~KU5w)Q~O|r-jsxOd(f#qId z0-+Zw*>W3mAQUUK%}+T-%a#FbQ534l5At^NZKQq8PfNq7KT*8+gZ6{@wtrrIZ5Ab4 zH*P1`bQb@{Zg?~`ssq#QM6mfV;d$iOYXUhGlHS0id`j2CiUi)1s1-*V7-6L?A{U#g{5>WPNNi;?U136?Z>qeD zxAq7}!vWrUP07Xunm|dIqr#9+y6s9#Z}z2?i8x#a^-D1$cH0_~!Oat3 zsWdzg_O5Y6Ks$ zYWViJg+aBV= z8*4cpDuy@JOgvrIs)=C`a9epLG*8KVk z93mJGdvTKSwJx{E)2^z?NMtdD#o}$V-qWl?1) zQ@o7SSaeP}qeviTnT|Np+%JL@Mcu+Br#lGnlZUPGbq$yHsy@!&MPc7wMY+od{FjRV z`QJ`~ABRf*sOaA`<{#NVA5)}A$;du}miJ}ctJS`JHSF`bliOSlp&fI6EE~XhpIAyx zj+D9H`3l5(5kqqq3Z`M4O8n#Yu%=E4c3uj`*4ry>OddP5EG28;v+J}```&mv(jHF^ zRz9AS-J{q!&1#>BlyH^Gu5!40?Uz7JLWB%C-@a6>@oW&(mMO>4=qsR!w{WJ}2i6sc)p=-h0F*FL;`jI#Je9P_+CuXXY@WdE{M z((4Y}uwYV@zw_}=WfjLKppB@jO%V#}&UEUj{;nSq>#iD8vd?_9Fv+$`w90wjI(ozM z0ka=JCthr5?BGc($+3rNsN|;~C*fh-pJ`qGi(zu;hl|MqqXJr~l5&{p&I1Wf07bLw zD=U8F8P_|8j(%qk64J#;#Yq>HdIBVj_zjx}nTRFH*3@0s`;VxFS3%bRdx?KBA|G?N zR0~~}7q#CW*u#;;li7ZK4#YKYePQOKW5>!IGc$YXoQdMj;Lz-~i-vNyQFKXC1qsHR zC`{}z0!Tr!5J<49+tuGi_fKf3fS7oZ(ntx7d%T^k{x_)er}&&XtlPA=)_P2xOXp-! zHP`#*_8kt@Ptdl?07riU3M@{O&RYEpfu8Fq08>@chdN+RF9;LvdY=1!IE=$*!A0Nn zW-Ri&&n_G;e7W>xJL@4{j4WD@_82S zzTchFL{41oB;T+du4;gMXXFZeD1Iye>sadv0g6T4!g z;*aQ`r}(=)Hg#46;uR4+6MZ#@YQ!1s=L5ePeut8Z(T*{*Ig_&lQ-tBPJ=2XUVpJA^ z;qH-FHJEgXje32!%=3IDC>!WD;2v88buQ}TT{KNvp5fAtpR&|%H6F*spG$c&lhZsf z*(9ew9=ZUU0I7)lupc~H&?fUoW2q(n$tkZEl&q{8nmY}b4fy42R72P*(2xLTsQ!;f z@u%qMwLJ=jyJ6JM^a${Q2zdKw1Bq+xJ7RXHv1S?g1lY<@q zWb$Pqd0+E|rm|Kf3_YxY#p2SfExQn5$1ZeefHqZzzl!V?!T*k~e8D(4wFx;acgKcg zmbxW5o6Z?A9vnzS)vpW&Y-XetX~H7Z6__7 zZ(@-i1%6tZ`Fs-k<8b+*uY|=zO?!yjs68C&mO~7r>{{ui%6{2CGw-ubksSqw?XO|0zL3Rsfu)sNr)@NxBokiyYwyPQMXKW zM~rO|GAE}8V{8Orhaw{~1)h>n50i`v9wwP*OdW3eg1b{T&nR?F@f)FN*;d=H`}CBy zRPK71`gq5xtmb5RH%vQHxM=jMgS8XA(vxs?Ee#WJp06xoAxT1fda+-@3Tikr6JwoXC8ue?zQ>H$EUO8N}JDZre1;cmLNT> zm7ObRQDwZLP`{wPR?W+Q#{SWF=4@JJeGztF`U!2r7RQm0u?FI;qd(p(qS|8|&NJf_d>(DnBZnS)<-UDYedf zg5lj##JuY<>any&k2-z^ z{pp7YSAQ??S4!7dEd=k$mo`Eah0>mTN6eFIK|oeOvtPS_3O)pGu;b;ayYUb;|3+dV{^v3N) zyT5a>egK3yvA_Grgt2P?NizD5Il>55eY4WpiJ7UA>FkwiQo?_4%2KEtiy30rGyq;w z@7UfT$0^BoGTDpzcG!8Z9gZK=d!jS#dc{_XNS$l`GmH=AxXpuOgbM$+&pgQ}Xr$Vh zoAU0Da#_ty5hhtAH(~KsqFPh9*ejVTDIr7K;)q^%zlM3tmkxACbV*?huMn1!`KqX3 z01!SREbT;^xv-XUyB{&3&knNuft7by%KgLot84Dn?&nXCXI0E^r}2^Bkbr5XNeYxM zKSE+&O5TkRZl)TBNieTsW2Ypj#LD~8o8>lRl~SR)2BM|7N*g_+V}(F44OMoI1;+{l z=9wcNmY*zQ|7VNlXI`rx89P7ko=V6V{MyO#Z@;^H_SgjS?|gJrBO1b!nNfZlR&tw3 zdY>L$4;_-TdS_tOC=+{~dH-~LMvkn$9j%$jUmqb6S6vumg6AM1YW)^

?hEL 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


( z$h8RU4HqlX#1!lCYErCQ8_dTf*?Az(B}_gBuo#woWphC)D|hf!cMJ}fWx$XZwl#Zt ztw(S%{ME0cV#vJ`?C|9A1+9^5!sk8-Yu0{QON`1~SXfw8PA*1L*b%*yh2UM@Mf&^1 z9vq;D^8#yO6sFA{=z^M zs2#1Ba;+z|$H7Te8y(>Xa((bm1zo%%dL+ws|>tUSX-%`C>!qD6#5_>uPNN zN62LcJ{Z+V*3qhre436GT%L2^U}o)+hbmTI&puk%-zz^|ImKACjyr_ANjoLm4@b!OZ#uJ z7v`W>bnA%OuGhTh^}Ex;1xK`CbyD5cMa(e`vLVCt$n}2?`%@qAFSWscSKF|c|I?i< z$8ZrANcGX+Ieh3mfk?n(^Qv}TLlw_yOhdJ)WC#EtFwrH)`vuV{`sgQg(2j+@d&<`BsX)7l^^Ago53mkuzp8OnG$uXWNj*it8lO92CzV3` zCgNUl=4(y9dZ3VqQcAPOLjg>=IESCgE1wE`PqfMc;qn zTl|v)|Ka<`s*IMIq6%aZG~GgKeWI0oGkQF%0#UDAt_>gr74=mEidt3T#zG+nWYo7P zgOVX}&H@71@ePa5r~gb--KrL4YT1b6D>CBjf;}29P1K?5UJyl|{X6<8$kd$PtKE z&sL6FjA9#@^r&QoikWq!ON_X>oEn$>YI(z(oMLBJ&m_SYQC=eF$y}i@ zGvVK36#ozMuiAfd@TGoP0+{bh3b8!Fu1rpI8w^}No||O|Sv!l$9ktAjh~5Tcw{i>< zv8JK>dr2#CQlCV(!Qxw+$*M!A?R#J1h9mlG?KZd$;P~%NwkLb)1uwnke#@;w)?Jsz zJ1B#SRZzr>UsCHd#ESu6tzM~gXaD~7!E>aCN*hz_I-&2M@#57)7qNN0 z*iM!sDJe0sKIWoKeuIG^D9KY!$p@_3;j^{csrx`LW8#P>N5gJPd+LaqHU$ET7R2*r zxNM6`^Q&Lpz&M#gHhDK_AcO|hDIcnc#-s?T8wZOr)&-px?NOAe`bzC-Vu=r)zYeb& z8(=*H%#y+~Ervr?5MJm#tZ_L#KbrX!H)4#ktm3I5t;{IRNHV%?FI%;Y$CIf4Nc6u` zUa-9W>U|GV&CX7DLCdR+&^T;t23jw1FP{v-a+z)ko-KUGm`vHsQzz(b8`5iBPB0*q zbUrh$t5>d`HPrF`c?VK~Yv5*9R4^sn`~VM{ku1Zx5eu&kg(!-LuW;rew6ci3K)i{=*^UJ0u0u9Z=_=F310$n`b=5VeVy-tMRx z9vXoH8T7XCw(Yjs(!y;im+jer?+W@qc}tUSh@Ldub0cYtKh~+53|3K(8_vSz4G?8r jBcHWOqsE%R;&Rg?$fd2rS8(R#|6u6 Date: Fri, 25 Jun 2021 18:36:38 +1000 Subject: [PATCH 03/33] Use more datatypes in the model --- tests/bakery/bakery_erd.drawio | 2 +- tests/bakery/bakery_erd.jpg | Bin 36434 -> 54167 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bakery/bakery_erd.drawio b/tests/bakery/bakery_erd.drawio index ede667c1..7835e91b 100644 --- a/tests/bakery/bakery_erd.drawio +++ b/tests/bakery/bakery_erd.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/tests/bakery/bakery_erd.jpg b/tests/bakery/bakery_erd.jpg index 1bd9d1071286221503382da6af4c2ebd88b1f7cd..7c9f2f9199fd65849625615addfdd9d9f030dcb7 100644 GIT binary patch literal 54167 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

qRjb#(XIsB0AH-)}mFX$IfQ@3ZKkCvgD;Zov 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

?hEL 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 Hf9?N2 Date: Sat, 26 Jun 2021 16:09:43 +1000 Subject: [PATCH 04/33] Start creating the table for Bakery and Baker objects --- tests/bakery/bakery_erd.drawio | 1 - tests/bakery_chain.rs | 74 ++++++++++++++++++ tests/bakery_chain/bakery_chain_erd.drawio | 1 + .../bakery_chain_erd.jpg} | Bin 4 files changed, 75 insertions(+), 1 deletion(-) delete mode 100644 tests/bakery/bakery_erd.drawio create mode 100644 tests/bakery_chain.rs create mode 100644 tests/bakery_chain/bakery_chain_erd.drawio rename tests/{bakery/bakery_erd.jpg => bakery_chain/bakery_chain_erd.jpg} (100%) diff --git a/tests/bakery/bakery_erd.drawio b/tests/bakery/bakery_erd.drawio deleted file mode 100644 index 7835e91b..00000000 --- a/tests/bakery/bakery_erd.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/tests/bakery_chain.rs b/tests/bakery_chain.rs new file mode 100644 index 00000000..39a0f899 --- /dev/null +++ b/tests/bakery_chain.rs @@ -0,0 +1,74 @@ +use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; +use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Iden, SqliteQueryBuilder}; + +mod setup; + +#[derive(Iden)] +enum Bakery { + Table, + Id, + Name, + ProfitMargin, +} + +#[derive(Iden)] +enum Baker { + Table, + Id, + Name, + BakeryId, +} + +#[async_std::test] +// cargo test --test bakery -- --nocapture +async fn main() { + let db: DbConn = setup::setup().await; + setup_schema(&db).await; +} + +async fn setup_schema(db: &DbConn) { + assert!(create_bakery(db).await.is_ok()); + assert!(create_baker(db).await.is_ok()); +} + +async fn create_bakery(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(Bakery::Table) + .if_not_exists() + .col( + ColumnDef::new(Bakery::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Bakery::Name).string()) + .col(ColumnDef::new(Bakery::ProfitMargin).float()) + .build(SqliteQueryBuilder); + db.execute(stmt.into()).await +} + +async fn create_baker(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(Baker::Table) + .if_not_exists() + .col( + ColumnDef::new(Baker::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Baker::Name).string()) + // .foreign_key( + // ForeignKey::create() + // .name("FK_baker_bakery") + // .from(Baker::Table, Baker::BakeryId) + // .to(Bakery::Table, Bakery::Id) + // .on_delete(ForeignKeyAction::Cascade) + // .on_update(ForeignKeyAction::Cascade), + // ) + .build(SqliteQueryBuilder); + + db.execute(stmt.clone().into()).await +} diff --git a/tests/bakery_chain/bakery_chain_erd.drawio b/tests/bakery_chain/bakery_chain_erd.drawio new file mode 100644 index 00000000..cca54bca --- /dev/null +++ b/tests/bakery_chain/bakery_chain_erd.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/tests/bakery/bakery_erd.jpg b/tests/bakery_chain/bakery_chain_erd.jpg similarity index 100% rename from tests/bakery/bakery_erd.jpg rename to tests/bakery_chain/bakery_chain_erd.jpg From bd2e7a922fdb71b7d3aefc33fe131f311c8195a8 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 26 Jun 2021 17:58:37 +1000 Subject: [PATCH 05/33] Baker belongs to a bakery --- tests/bakery_chain/baker.rs | 71 ++++++++++++++++++ tests/bakery_chain/bakery.rs | 74 +++++++++++++++++++ tests/bakery_chain/mod.rs | 2 + ...{bakery_chain.rs => bakery_chain_tests.rs} | 54 ++++++-------- 4 files changed, 168 insertions(+), 33 deletions(-) create mode 100644 tests/bakery_chain/baker.rs create mode 100644 tests/bakery_chain/bakery.rs create mode 100644 tests/bakery_chain/mod.rs rename tests/{bakery_chain.rs => bakery_chain_tests.rs} (52%) diff --git a/tests/bakery_chain/baker.rs b/tests/bakery_chain/baker.rs new file mode 100644 index 00000000..e5062c8e --- /dev/null +++ b/tests/bakery_chain/baker.rs @@ -0,0 +1,71 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "baker" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub name: String, + pub bakery_id: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Name, + BakeryId, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Bakery, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Name => ColumnType::String(None).def(), + Self::BakeryId => ColumnType::Integer.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Bakery => Entity::belongs_to(super::bakery::Entity) + .from(Column::BakeryId) + .to(super::bakery::Column::Id) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Bakery.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/bakery.rs b/tests/bakery_chain/bakery.rs new file mode 100644 index 00000000..567eaa86 --- /dev/null +++ b/tests/bakery_chain/bakery.rs @@ -0,0 +1,74 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "bakery" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub name: String, + pub profit_margin: f64, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Name, + ProfitMargin, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Baker, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Name => ColumnType::String(None).def(), + Self::ProfitMargin => ColumnType::Float.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Baker => Entity::has_many(super::baker::Entity).into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Baker.def() + } +} + +impl Model { + pub fn find_bakers(&self) -> Select { + Entity::find_related().belongs_to::(self) + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/mod.rs b/tests/bakery_chain/mod.rs new file mode 100644 index 00000000..6c1d8858 --- /dev/null +++ b/tests/bakery_chain/mod.rs @@ -0,0 +1,2 @@ +pub mod baker; +pub mod bakery; diff --git a/tests/bakery_chain.rs b/tests/bakery_chain_tests.rs similarity index 52% rename from tests/bakery_chain.rs rename to tests/bakery_chain_tests.rs index 39a0f899..1a2c92a0 100644 --- a/tests/bakery_chain.rs +++ b/tests/bakery_chain_tests.rs @@ -1,26 +1,12 @@ use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; -use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Iden, SqliteQueryBuilder}; +use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, SqliteQueryBuilder}; +pub mod bakery_chain; mod setup; - -#[derive(Iden)] -enum Bakery { - Table, - Id, - Name, - ProfitMargin, -} - -#[derive(Iden)] -enum Baker { - Table, - Id, - Name, - BakeryId, -} +pub use bakery_chain::*; #[async_std::test] -// cargo test --test bakery -- --nocapture +// cargo test --test bakery_chain_tests -- --nocapture async fn main() { let db: DbConn = setup::setup().await; setup_schema(&db).await; @@ -33,41 +19,43 @@ async fn setup_schema(db: &DbConn) { async fn create_bakery(db: &DbConn) -> Result { let stmt = sea_query::Table::create() - .table(Bakery::Table) + .table(bakery::Entity) .if_not_exists() .col( - ColumnDef::new(Bakery::Id) + ColumnDef::new(bakery::Column::Id) .integer() .not_null() .auto_increment() .primary_key(), ) - .col(ColumnDef::new(Bakery::Name).string()) - .col(ColumnDef::new(Bakery::ProfitMargin).float()) + .col(ColumnDef::new(bakery::Column::Name).string()) + .col(ColumnDef::new(bakery::Column::ProfitMargin).float()) .build(SqliteQueryBuilder); + db.execute(stmt.into()).await } async fn create_baker(db: &DbConn) -> Result { let stmt = sea_query::Table::create() - .table(Baker::Table) + .table(baker::Entity) .if_not_exists() .col( - ColumnDef::new(Baker::Id) + ColumnDef::new(baker::Column::Id) .integer() .not_null() .auto_increment() .primary_key(), ) - .col(ColumnDef::new(Baker::Name).string()) - // .foreign_key( - // ForeignKey::create() - // .name("FK_baker_bakery") - // .from(Baker::Table, Baker::BakeryId) - // .to(Bakery::Table, Bakery::Id) - // .on_delete(ForeignKeyAction::Cascade) - // .on_update(ForeignKeyAction::Cascade), - // ) + .col(ColumnDef::new(baker::Column::Name).string()) + .col(ColumnDef::new(baker::Column::BakeryId).integer().not_null()) + .foreign_key( + ForeignKey::create() + .name("FK_baker_bakery") + .from(baker::Entity, baker::Column::BakeryId) + .to(bakery::Entity, bakery::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) .build(SqliteQueryBuilder); db.execute(stmt.clone().into()).await From 1de4d0cd280bdfa8b71f707a1a8da4519ce13b28 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 26 Jun 2021 22:09:19 +1000 Subject: [PATCH 06/33] Create Customer and Order --- tests/bakery_chain/bakery.rs | 2 + tests/bakery_chain/bakery_chain_erd.jpg | Bin 54167 -> 53447 bytes tests/bakery_chain/customer.rs | 77 +++++++++++++++++++++ tests/bakery_chain/mod.rs | 2 + tests/bakery_chain/order.rs | 88 ++++++++++++++++++++++++ tests/bakery_chain_tests.rs | 74 ++++++++++++++++++-- 6 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 tests/bakery_chain/customer.rs create mode 100644 tests/bakery_chain/order.rs diff --git a/tests/bakery_chain/bakery.rs b/tests/bakery_chain/bakery.rs index 567eaa86..ff4577c8 100644 --- a/tests/bakery_chain/bakery.rs +++ b/tests/bakery_chain/bakery.rs @@ -37,6 +37,7 @@ impl PrimaryKeyTrait for PrimaryKey { #[derive(Copy, Clone, Debug, EnumIter)] pub enum Relation { Baker, + Order, } impl ColumnTrait for Column { @@ -55,6 +56,7 @@ impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { Self::Baker => Entity::has_many(super::baker::Entity).into(), + Self::Order => Entity::has_many(super::order::Entity).into(), } } } diff --git a/tests/bakery_chain/bakery_chain_erd.jpg b/tests/bakery_chain/bakery_chain_erd.jpg index 7c9f2f9199fd65849625615addfdd9d9f030dcb7..578141d5cbc08e1c4763263144ed4c394f7b1f60 100644 GIT binary patch delta 39770 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 WPJE5LWVZW>y0bFmt=o5f8UG7Z{)&?T delta 40632 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 i9QtxM=Kj#CwLB4~4`@M&WCF6^H6X;3cJC#8hN; diff --git a/tests/bakery_chain/customer.rs b/tests/bakery_chain/customer.rs new file mode 100644 index 00000000..edbd9311 --- /dev/null +++ b/tests/bakery_chain/customer.rs @@ -0,0 +1,77 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "customer" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub name: String, + pub notes: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Name, + Notes, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Order, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Name => ColumnType::String(None).def(), + Self::Notes => ColumnType::Text.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Order => Entity::has_many(super::order::Entity) + .from(Column::Id) + .to(super::order::Column::CustomerId) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Order.def() + } +} + +impl Model { + pub fn find_orders(&self) -> Select { + Entity::find_related().belongs_to::(self) + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/mod.rs b/tests/bakery_chain/mod.rs index 6c1d8858..22f46f7f 100644 --- a/tests/bakery_chain/mod.rs +++ b/tests/bakery_chain/mod.rs @@ -1,2 +1,4 @@ pub mod baker; pub mod bakery; +pub mod customer; +pub mod order; diff --git a/tests/bakery_chain/order.rs b/tests/bakery_chain/order.rs new file mode 100644 index 00000000..e3218018 --- /dev/null +++ b/tests/bakery_chain/order.rs @@ -0,0 +1,88 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "order" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub total: f32, + pub bakery_id: Option, + pub customer_id: Option, + pub placed_at: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Total, + BakeryId, + CustomerId, + PlacedAt, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Bakery, + Customer, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Total => ColumnType::Money(Some((19, 4))).def(), + Self::BakeryId => ColumnType::Integer.def(), + Self::CustomerId => ColumnType::Integer.def(), + Self::PlacedAt => ColumnType::DateTime.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Bakery => Entity::belongs_to(super::bakery::Entity) + .from(Column::BakeryId) + .to(super::bakery::Column::Id) + .into(), + Self::Customer => Entity::belongs_to(super::customer::Entity) + .from(Column::CustomerId) + .to(super::customer::Column::Id) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Bakery.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Customer.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index 1a2c92a0..66a7c985 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -13,11 +13,13 @@ async fn main() { } async fn setup_schema(db: &DbConn) { - assert!(create_bakery(db).await.is_ok()); - assert!(create_baker(db).await.is_ok()); + assert!(create_bakery_table(db).await.is_ok()); + assert!(create_baker_table(db).await.is_ok()); + assert!(create_customer_table(db).await.is_ok()); + assert!(create_order_table(db).await.is_ok()); } -async fn create_bakery(db: &DbConn) -> Result { +async fn create_bakery_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(bakery::Entity) .if_not_exists() @@ -35,7 +37,7 @@ async fn create_bakery(db: &DbConn) -> Result { db.execute(stmt.into()).await } -async fn create_baker(db: &DbConn) -> Result { +async fn create_baker_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(baker::Entity) .if_not_exists() @@ -58,5 +60,67 @@ async fn create_baker(db: &DbConn) -> Result { ) .build(SqliteQueryBuilder); - db.execute(stmt.clone().into()).await + db.execute(stmt.into()).await +} + +async fn create_customer_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(customer::Entity) + .if_not_exists() + .col( + ColumnDef::new(customer::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(customer::Column::Name).string()) + .col(ColumnDef::new(customer::Column::Notes).text()) + .build(SqliteQueryBuilder); + + db.execute(stmt.into()).await +} + +async fn create_order_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(order::Entity) + .if_not_exists() + .col( + ColumnDef::new(order::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(order::Column::Total).float()) + .col(ColumnDef::new(order::Column::BakeryId).integer().not_null()) + .col( + ColumnDef::new(order::Column::CustomerId) + .integer() + .not_null(), + ) + .col( + ColumnDef::new(order::Column::PlacedAt) + .date_time() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("FK_order_bakery") + .from(order::Entity, baker::Column::BakeryId) + .to(bakery::Entity, bakery::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .foreign_key( + ForeignKey::create() + .name("FK_order_customer") + .from(order::Entity, baker::Column::BakeryId) + .to(customer::Entity, customer::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .build(SqliteQueryBuilder); + + db.execute(stmt.into()).await } From c76557135ef1dcef13a2a72e75785d2e1f57b926 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sun, 27 Jun 2021 15:28:04 +1000 Subject: [PATCH 07/33] Create Lineitem --- tests/bakery_chain/lineitem.rs | 80 ++++++++++++++++++++++++++++++++++ tests/bakery_chain/mod.rs | 1 + tests/bakery_chain/order.rs | 14 ++++++ tests/bakery_chain_tests.rs | 32 ++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 tests/bakery_chain/lineitem.rs diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs new file mode 100644 index 00000000..261de494 --- /dev/null +++ b/tests/bakery_chain/lineitem.rs @@ -0,0 +1,80 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "lineitem" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub price: f32, + pub quantity: i32, + pub order_id: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Price, + Quantity, + OrderId, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Order, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Price => ColumnType::Money(Some((19, 4))).def(), + Self::Quantity => ColumnType::Integer.def(), + Self::OrderId => ColumnType::Integer.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Order => Entity::belongs_to(super::order::Entity) + .from(Column::Id) + .to(super::order::Column::CustomerId) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Order.def() + } +} + +impl Model { + pub fn find_orders(&self) -> Select { + Entity::find_related().belongs_to::(self) + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/mod.rs b/tests/bakery_chain/mod.rs index 22f46f7f..4c557e26 100644 --- a/tests/bakery_chain/mod.rs +++ b/tests/bakery_chain/mod.rs @@ -1,4 +1,5 @@ pub mod baker; pub mod bakery; pub mod customer; +pub mod lineitem; pub mod order; diff --git a/tests/bakery_chain/order.rs b/tests/bakery_chain/order.rs index e3218018..ff655699 100644 --- a/tests/bakery_chain/order.rs +++ b/tests/bakery_chain/order.rs @@ -42,6 +42,7 @@ impl PrimaryKeyTrait for PrimaryKey { pub enum Relation { Bakery, Customer, + Lineitem, } impl ColumnTrait for Column { @@ -69,6 +70,7 @@ impl RelationTrait for Relation { .from(Column::CustomerId) .to(super::customer::Column::Id) .into(), + Self::Lineitem => Entity::has_many(super::lineitem::Entity).into(), } } } @@ -85,4 +87,16 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::Lineitem.def() + } +} + +impl Model { + pub fn find_lineitems(&self) -> Select { + Entity::find_related().belongs_to::(self) + } +} + impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index 66a7c985..afcaa1fa 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -17,6 +17,7 @@ async fn setup_schema(db: &DbConn) { assert!(create_baker_table(db).await.is_ok()); assert!(create_customer_table(db).await.is_ok()); assert!(create_order_table(db).await.is_ok()); + assert!(create_lineitem_table(db).await.is_ok()); } async fn create_bakery_table(db: &DbConn) -> Result { @@ -124,3 +125,34 @@ async fn create_order_table(db: &DbConn) -> Result { db.execute(stmt.into()).await } + +async fn create_lineitem_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(lineitem::Entity) + .if_not_exists() + .col( + ColumnDef::new(lineitem::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(lineitem::Column::Price).float()) + .col(ColumnDef::new(lineitem::Column::Quantity).integer()) + .col( + ColumnDef::new(lineitem::Column::OrderId) + .integer() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("FK_lineitem_order") + .from(lineitem::Entity, lineitem::Column::OrderId) + .to(order::Entity, order::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .build(SqliteQueryBuilder); + + db.execute(stmt.into()).await +} From 0011f5e7d1d33d339fc7df24418f8d57ef043155 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sun, 27 Jun 2021 16:32:24 +1000 Subject: [PATCH 08/33] Create Cake and CakesBakers --- tests/bakery_chain/cake.rs | 107 +++++++++++++++++++++++++++++ tests/bakery_chain/cakes_bakers.rs | 68 ++++++++++++++++++ tests/bakery_chain/mod.rs | 2 + tests/bakery_chain_tests.rs | 27 +++++++- 4 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 tests/bakery_chain/cake.rs create mode 100644 tests/bakery_chain/cakes_bakers.rs diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs new file mode 100644 index 00000000..976d8acb --- /dev/null +++ b/tests/bakery_chain/cake.rs @@ -0,0 +1,107 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "cake" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub id: i32, + pub name: String, + pub price: f32, + pub bakery_id: Option, + pub lineitem_id: Option, + pub best_before: String, + pub produced_at: String, + pub gluten_free: bool, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + Id, + Name, + Price, + BakeryId, + LineitemId, + BestBefore, + ProducedAt, + GlutenFree, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + Id, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + true + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Bakery, + Lineitem, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::Id => ColumnType::Integer.def(), + Self::Name => ColumnType::String(None).def(), + Self::Price => ColumnType::Money(Some((19, 4))).def(), + Self::BakeryId => ColumnType::Integer.def(), + Self::LineitemId => ColumnType::Integer.def(), + Self::BestBefore => ColumnType::Date.def(), + Self::ProducedAt => ColumnType::Timestamp.def(), + Self::GlutenFree => ColumnType::Boolean.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Bakery => Entity::belongs_to(super::bakery::Entity) + .from(Column::BakeryId) + .to(super::bakery::Column::Id) + .into(), + Self::Lineitem => Entity::belongs_to(super::lineitem::Entity) + .from(Column::LineitemId) + .to(super::lineitem::Column::Id) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Bakery.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + super::cakes_bakers::Relation::Baker.def() + } + + fn via() -> Option { + Some(super::cakes_bakers::Relation::Cake.def().rev()) + } +} + +impl Model { + pub fn find_bakers(&self) -> Select { + Entity::find_related().belongs_to::(self) + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/cakes_bakers.rs b/tests/bakery_chain/cakes_bakers.rs new file mode 100644 index 00000000..8106bbdf --- /dev/null +++ b/tests/bakery_chain/cakes_bakers.rs @@ -0,0 +1,68 @@ +use sea_orm::entity::prelude::*; + +#[derive(Copy, Clone, Default, Debug, DeriveEntity)] +pub struct Entity; + +impl EntityName for Entity { + fn table_name(&self) -> &str { + "cakes_bakers" + } +} + +#[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] +pub struct Model { + pub cake_id: i32, + pub baker_id: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] +pub enum Column { + CakeId, + BakerId, +} + +#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] +pub enum PrimaryKey { + CakeId, + BakerId, +} + +impl PrimaryKeyTrait for PrimaryKey { + fn auto_increment() -> bool { + false + } +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Cake, + Baker, +} + +impl ColumnTrait for Column { + type EntityName = Entity; + + fn def(&self) -> ColumnDef { + match self { + Self::CakeId => ColumnType::Integer.def(), + Self::BakerId => ColumnType::Integer.def(), + } + } +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Cake => Entity::belongs_to(super::cake::Entity) + .from(Column::CakeId) + .to(super::cake::Column::Id) + .into(), + Self::Baker => Entity::belongs_to(super::baker::Entity) + .from(Column::BakerId) + .to(super::baker::Column::Id) + .into(), + } + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/mod.rs b/tests/bakery_chain/mod.rs index 4c557e26..e0a4100e 100644 --- a/tests/bakery_chain/mod.rs +++ b/tests/bakery_chain/mod.rs @@ -1,5 +1,7 @@ pub mod baker; pub mod bakery; +pub mod cake; +pub mod cakes_bakers; pub mod customer; pub mod lineitem; pub mod order; diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index afcaa1fa..c8631e6c 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -1,5 +1,5 @@ use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; -use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, SqliteQueryBuilder}; +use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, SqliteQueryBuilder}; pub mod bakery_chain; mod setup; @@ -18,6 +18,7 @@ async fn setup_schema(db: &DbConn) { assert!(create_customer_table(db).await.is_ok()); assert!(create_order_table(db).await.is_ok()); assert!(create_lineitem_table(db).await.is_ok()); + assert!(create_cakes_bakers_table(db).await.is_ok()); } async fn create_bakery_table(db: &DbConn) -> Result { @@ -156,3 +157,27 @@ async fn create_lineitem_table(db: &DbConn) -> Result { db.execute(stmt.into()).await } + +async fn create_cakes_bakers_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(cakes_bakers::Entity) + .if_not_exists() + .col( + ColumnDef::new(cakes_bakers::Column::CakeId) + .integer() + .not_null(), + ) + .col( + ColumnDef::new(cakes_bakers::Column::BakerId) + .integer() + .not_null(), + ) + .primary_key( + Index::create() + .col(cakes_bakers::Column::CakeId) + .col(cakes_bakers::Column::BakerId), + ) + .build(SqliteQueryBuilder); + + db.execute(stmt.into()).await +} From 8f66968724e87f469e0cb0f04fd8c8d798b49c42 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 12:03:11 +1000 Subject: [PATCH 09/33] Use find_related in place of find_xxx --- tests/bakery_chain/baker.rs | 10 ++++++++++ tests/bakery_chain/bakery.rs | 6 ------ tests/bakery_chain/cake.rs | 6 ------ tests/bakery_chain/customer.rs | 6 ------ tests/bakery_chain/lineitem.rs | 6 ------ tests/bakery_chain/order.rs | 6 ------ 6 files changed, 10 insertions(+), 30 deletions(-) diff --git a/tests/bakery_chain/baker.rs b/tests/bakery_chain/baker.rs index e5062c8e..b359e7ef 100644 --- a/tests/bakery_chain/baker.rs +++ b/tests/bakery_chain/baker.rs @@ -68,4 +68,14 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + super::cakes_bakers::Relation::Cake.def() + } + + fn via() -> Option { + Some(super::cakes_bakers::Relation::Baker.def().rev()) + } +} + impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/bakery.rs b/tests/bakery_chain/bakery.rs index ff4577c8..8348a764 100644 --- a/tests/bakery_chain/bakery.rs +++ b/tests/bakery_chain/bakery.rs @@ -67,10 +67,4 @@ impl Related for Entity { } } -impl Model { - pub fn find_bakers(&self) -> Select { - Entity::find_related().belongs_to::(self) - } -} - impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 976d8acb..6ba431a4 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -98,10 +98,4 @@ impl Related for Entity { } } -impl Model { - pub fn find_bakers(&self) -> Select { - Entity::find_related().belongs_to::(self) - } -} - impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/customer.rs b/tests/bakery_chain/customer.rs index edbd9311..d8566726 100644 --- a/tests/bakery_chain/customer.rs +++ b/tests/bakery_chain/customer.rs @@ -68,10 +68,4 @@ impl Related for Entity { } } -impl Model { - pub fn find_orders(&self) -> Select { - Entity::find_related().belongs_to::(self) - } -} - impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index 261de494..9dc7e096 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -71,10 +71,4 @@ impl Related for Entity { } } -impl Model { - pub fn find_orders(&self) -> Select { - Entity::find_related().belongs_to::(self) - } -} - impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/order.rs b/tests/bakery_chain/order.rs index ff655699..f18c3a3b 100644 --- a/tests/bakery_chain/order.rs +++ b/tests/bakery_chain/order.rs @@ -93,10 +93,4 @@ impl Related for Entity { } } -impl Model { - pub fn find_lineitems(&self) -> Select { - Entity::find_related().belongs_to::(self) - } -} - impl ActiveModelBehavior for ActiveModel {} From ba65d4f2904a64c9685801ed6f57738946e8c95d Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 12:27:48 +1000 Subject: [PATCH 10/33] Update customer has_many relation --- tests/bakery_chain/customer.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/bakery_chain/customer.rs b/tests/bakery_chain/customer.rs index d8566726..a7464082 100644 --- a/tests/bakery_chain/customer.rs +++ b/tests/bakery_chain/customer.rs @@ -54,10 +54,7 @@ impl ColumnTrait for Column { impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { - Self::Order => Entity::has_many(super::order::Entity) - .from(Column::Id) - .to(super::order::Column::CustomerId) - .into(), + Self::Order => Entity::has_many(super::order::Entity).into(), } } } From 2b0424b9d9008cbf6910ff9c22296060f4ba61a9 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 19:38:05 +1000 Subject: [PATCH 11/33] Update ERD jpg --- tests/bakery_chain/bakery_chain_erd.jpg | Bin 53447 -> 53807 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/bakery_chain/bakery_chain_erd.jpg b/tests/bakery_chain/bakery_chain_erd.jpg index 578141d5cbc08e1c4763263144ed4c394f7b1f60..4d95480ad220a4c5d79328e6d5252b726e3ebcaa 100644 GIT binary patch delta 37148 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 From d1036717014fd704781a1944b9df967f8c142a92 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 19:39:17 +1000 Subject: [PATCH 12/33] Agnostic backend for creating table --- tests/bakery_chain_tests.rs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index c8631e6c..56f12f60 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -1,5 +1,5 @@ use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; -use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, SqliteQueryBuilder}; +use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, TableCreateStatement}; pub mod bakery_chain; mod setup; @@ -21,6 +21,11 @@ async fn setup_schema(db: &DbConn) { assert!(create_cakes_bakers_table(db).await.is_ok()); } +async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { + let builder = db.get_schema_builder_backend(); + db.execute(builder.build(stmt)).await +} + async fn create_bakery_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(bakery::Entity) @@ -34,9 +39,9 @@ async fn create_bakery_table(db: &DbConn) -> Result { ) .col(ColumnDef::new(bakery::Column::Name).string()) .col(ColumnDef::new(bakery::Column::ProfitMargin).float()) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } async fn create_baker_table(db: &DbConn) -> Result { @@ -60,9 +65,9 @@ async fn create_baker_table(db: &DbConn) -> Result { .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), ) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } async fn create_customer_table(db: &DbConn) -> Result { @@ -78,9 +83,9 @@ async fn create_customer_table(db: &DbConn) -> Result { ) .col(ColumnDef::new(customer::Column::Name).string()) .col(ColumnDef::new(customer::Column::Notes).text()) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } async fn create_order_table(db: &DbConn) -> Result { @@ -122,9 +127,9 @@ async fn create_order_table(db: &DbConn) -> Result { .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), ) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } async fn create_lineitem_table(db: &DbConn) -> Result { @@ -153,9 +158,9 @@ async fn create_lineitem_table(db: &DbConn) -> Result { .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), ) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } async fn create_cakes_bakers_table(db: &DbConn) -> Result { @@ -177,7 +182,7 @@ async fn create_cakes_bakers_table(db: &DbConn) -> Result { .col(cakes_bakers::Column::CakeId) .col(cakes_bakers::Column::BakerId), ) - .build(SqliteQueryBuilder); + .to_owned(); - db.execute(stmt.into()).await + create_table(db, &stmt).await } From c4fc1b1678dc57662df57319b16f3ff7b403bdb0 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 19:57:05 +1000 Subject: [PATCH 13/33] Add the rest of the relations --- tests/bakery_chain/bakery.rs | 14 ++++++++++++++ tests/bakery_chain/cake.rs | 6 ++++++ tests/bakery_chain/lineitem.rs | 11 +++++++++++ 3 files changed, 31 insertions(+) diff --git a/tests/bakery_chain/bakery.rs b/tests/bakery_chain/bakery.rs index 8348a764..61803329 100644 --- a/tests/bakery_chain/bakery.rs +++ b/tests/bakery_chain/bakery.rs @@ -38,6 +38,7 @@ impl PrimaryKeyTrait for PrimaryKey { pub enum Relation { Baker, Order, + Cake, } impl ColumnTrait for Column { @@ -57,6 +58,7 @@ impl RelationTrait for Relation { match self { Self::Baker => Entity::has_many(super::baker::Entity).into(), Self::Order => Entity::has_many(super::order::Entity).into(), + Self::Cake => Entity::has_many(super::cake::Entity).into(), } } } @@ -67,4 +69,16 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::Order.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Cake.def() + } +} + impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 6ba431a4..6b18c2a0 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -98,4 +98,10 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::Lineitem.def() + } +} + impl ActiveModelBehavior for ActiveModel {} diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index 9dc7e096..8afee4c3 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -39,6 +39,7 @@ impl PrimaryKeyTrait for PrimaryKey { #[derive(Copy, Clone, Debug, EnumIter)] pub enum Relation { Order, + Cake, } impl ColumnTrait for Column { @@ -61,6 +62,10 @@ impl RelationTrait for Relation { .from(Column::Id) .to(super::order::Column::CustomerId) .into(), + Self::Cake => Entity::belongs_to(super::cake::Entity) + .from(Column::Id) + .to(super::cake::Column::LineitemId) + .into(), } } } @@ -71,4 +76,10 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::Cake.def() + } +} + impl ActiveModelBehavior for ActiveModel {} From 6104770b65a204dd1146ff3e90c8210fd966f2cb Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Tue, 29 Jun 2021 20:12:59 +1000 Subject: [PATCH 14/33] Pull table creation into its own module --- tests/bakery_chain_tests.rs | 182 ++---------------------------------- tests/table_creation/mod.rs | 170 +++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 174 deletions(-) create mode 100644 tests/table_creation/mod.rs diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index 56f12f60..02bc6523 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -1,9 +1,9 @@ -use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; -use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, TableCreateStatement}; +use sea_orm::DbConn; pub mod bakery_chain; mod setup; pub use bakery_chain::*; +mod table_creation; #[async_std::test] // cargo test --test bakery_chain_tests -- --nocapture @@ -13,176 +13,10 @@ async fn main() { } async fn setup_schema(db: &DbConn) { - assert!(create_bakery_table(db).await.is_ok()); - assert!(create_baker_table(db).await.is_ok()); - assert!(create_customer_table(db).await.is_ok()); - assert!(create_order_table(db).await.is_ok()); - assert!(create_lineitem_table(db).await.is_ok()); - assert!(create_cakes_bakers_table(db).await.is_ok()); -} - -async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { - let builder = db.get_schema_builder_backend(); - db.execute(builder.build(stmt)).await -} - -async fn create_bakery_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(bakery::Entity) - .if_not_exists() - .col( - ColumnDef::new(bakery::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(bakery::Column::Name).string()) - .col(ColumnDef::new(bakery::Column::ProfitMargin).float()) - .to_owned(); - - create_table(db, &stmt).await -} - -async fn create_baker_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(baker::Entity) - .if_not_exists() - .col( - ColumnDef::new(baker::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(baker::Column::Name).string()) - .col(ColumnDef::new(baker::Column::BakeryId).integer().not_null()) - .foreign_key( - ForeignKey::create() - .name("FK_baker_bakery") - .from(baker::Entity, baker::Column::BakeryId) - .to(bakery::Entity, bakery::Column::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade), - ) - .to_owned(); - - create_table(db, &stmt).await -} - -async fn create_customer_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(customer::Entity) - .if_not_exists() - .col( - ColumnDef::new(customer::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(customer::Column::Name).string()) - .col(ColumnDef::new(customer::Column::Notes).text()) - .to_owned(); - - create_table(db, &stmt).await -} - -async fn create_order_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(order::Entity) - .if_not_exists() - .col( - ColumnDef::new(order::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(order::Column::Total).float()) - .col(ColumnDef::new(order::Column::BakeryId).integer().not_null()) - .col( - ColumnDef::new(order::Column::CustomerId) - .integer() - .not_null(), - ) - .col( - ColumnDef::new(order::Column::PlacedAt) - .date_time() - .not_null(), - ) - .foreign_key( - ForeignKey::create() - .name("FK_order_bakery") - .from(order::Entity, baker::Column::BakeryId) - .to(bakery::Entity, bakery::Column::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade), - ) - .foreign_key( - ForeignKey::create() - .name("FK_order_customer") - .from(order::Entity, baker::Column::BakeryId) - .to(customer::Entity, customer::Column::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade), - ) - .to_owned(); - - create_table(db, &stmt).await -} - -async fn create_lineitem_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(lineitem::Entity) - .if_not_exists() - .col( - ColumnDef::new(lineitem::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(lineitem::Column::Price).float()) - .col(ColumnDef::new(lineitem::Column::Quantity).integer()) - .col( - ColumnDef::new(lineitem::Column::OrderId) - .integer() - .not_null(), - ) - .foreign_key( - ForeignKey::create() - .name("FK_lineitem_order") - .from(lineitem::Entity, lineitem::Column::OrderId) - .to(order::Entity, order::Column::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade), - ) - .to_owned(); - - create_table(db, &stmt).await -} - -async fn create_cakes_bakers_table(db: &DbConn) -> Result { - let stmt = sea_query::Table::create() - .table(cakes_bakers::Entity) - .if_not_exists() - .col( - ColumnDef::new(cakes_bakers::Column::CakeId) - .integer() - .not_null(), - ) - .col( - ColumnDef::new(cakes_bakers::Column::BakerId) - .integer() - .not_null(), - ) - .primary_key( - Index::create() - .col(cakes_bakers::Column::CakeId) - .col(cakes_bakers::Column::BakerId), - ) - .to_owned(); - - create_table(db, &stmt).await + assert!(table_creation::create_bakery_table(db).await.is_ok()); + assert!(table_creation::create_baker_table(db).await.is_ok()); + assert!(table_creation::create_customer_table(db).await.is_ok()); + assert!(table_creation::create_order_table(db).await.is_ok()); + assert!(table_creation::create_lineitem_table(db).await.is_ok()); + assert!(table_creation::create_cakes_bakers_table(db).await.is_ok()); } diff --git a/tests/table_creation/mod.rs b/tests/table_creation/mod.rs new file mode 100644 index 00000000..9a685f41 --- /dev/null +++ b/tests/table_creation/mod.rs @@ -0,0 +1,170 @@ +use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; +use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, TableCreateStatement}; + +pub use super::bakery_chain::*; + +async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { + let builder = db.get_schema_builder_backend(); + db.execute(builder.build(stmt)).await +} + +pub async fn create_bakery_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(bakery::Entity) + .if_not_exists() + .col( + ColumnDef::new(bakery::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(bakery::Column::Name).string()) + .col(ColumnDef::new(bakery::Column::ProfitMargin).float()) + .to_owned(); + + create_table(db, &stmt).await +} + +pub async fn create_baker_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(baker::Entity) + .if_not_exists() + .col( + ColumnDef::new(baker::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(baker::Column::Name).string()) + .col(ColumnDef::new(baker::Column::BakeryId).integer().not_null()) + .foreign_key( + ForeignKey::create() + .name("FK_baker_bakery") + .from(baker::Entity, baker::Column::BakeryId) + .to(bakery::Entity, bakery::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .to_owned(); + + create_table(db, &stmt).await +} + +pub async fn create_customer_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(customer::Entity) + .if_not_exists() + .col( + ColumnDef::new(customer::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(customer::Column::Name).string()) + .col(ColumnDef::new(customer::Column::Notes).text()) + .to_owned(); + + create_table(db, &stmt).await +} + +pub async fn create_order_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(order::Entity) + .if_not_exists() + .col( + ColumnDef::new(order::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(order::Column::Total).float()) + .col(ColumnDef::new(order::Column::BakeryId).integer().not_null()) + .col( + ColumnDef::new(order::Column::CustomerId) + .integer() + .not_null(), + ) + .col( + ColumnDef::new(order::Column::PlacedAt) + .date_time() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("FK_order_bakery") + .from(order::Entity, baker::Column::BakeryId) + .to(bakery::Entity, bakery::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .foreign_key( + ForeignKey::create() + .name("FK_order_customer") + .from(order::Entity, baker::Column::BakeryId) + .to(customer::Entity, customer::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .to_owned(); + + create_table(db, &stmt).await +} + +pub async fn create_lineitem_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(lineitem::Entity) + .if_not_exists() + .col( + ColumnDef::new(lineitem::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(lineitem::Column::Price).float()) + .col(ColumnDef::new(lineitem::Column::Quantity).integer()) + .col( + ColumnDef::new(lineitem::Column::OrderId) + .integer() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("FK_lineitem_order") + .from(lineitem::Entity, lineitem::Column::OrderId) + .to(order::Entity, order::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .to_owned(); + + create_table(db, &stmt).await +} + +pub async fn create_cakes_bakers_table(db: &DbConn) -> Result { + let stmt = sea_query::Table::create() + .table(cakes_bakers::Entity) + .if_not_exists() + .col( + ColumnDef::new(cakes_bakers::Column::CakeId) + .integer() + .not_null(), + ) + .col( + ColumnDef::new(cakes_bakers::Column::BakerId) + .integer() + .not_null(), + ) + .primary_key( + Index::create() + .col(cakes_bakers::Column::CakeId) + .col(cakes_bakers::Column::BakerId), + ) + .to_owned(); + + create_table(db, &stmt).await +} From 391fb082607df8d12d7d8512c72c86031b780c29 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Wed, 30 Jun 2021 21:15:12 +1000 Subject: [PATCH 15/33] Separate schema tests --- tests/bakery_chain/mod.rs | 8 ++++++++ tests/bakery_chain_tests.rs | 20 +++++++++++++------- tests/crud/mod.rs | 14 ++++++++++++++ tests/{table_creation => schema}/mod.rs | 0 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 tests/crud/mod.rs rename tests/{table_creation => schema}/mod.rs (100%) diff --git a/tests/bakery_chain/mod.rs b/tests/bakery_chain/mod.rs index e0a4100e..89028aab 100644 --- a/tests/bakery_chain/mod.rs +++ b/tests/bakery_chain/mod.rs @@ -5,3 +5,11 @@ pub mod cakes_bakers; pub mod customer; pub mod lineitem; pub mod order; + +pub use super::baker::Entity as Baker; +pub use super::bakery::Entity as Bakery; +pub use super::cake::Entity as Cake; +pub use super::cakes_bakers::Entity as CakesBakers; +pub use super::customer::Entity as Customer; +pub use super::lineitem::Entity as Lineitem; +pub use super::order::Entity as Order; diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index 02bc6523..d7cf19ef 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -3,20 +3,26 @@ use sea_orm::DbConn; pub mod bakery_chain; mod setup; pub use bakery_chain::*; -mod table_creation; +mod crud; +mod schema; #[async_std::test] // cargo test --test bakery_chain_tests -- --nocapture async fn main() { let db: DbConn = setup::setup().await; setup_schema(&db).await; + create_entities(&db).await; } async fn setup_schema(db: &DbConn) { - assert!(table_creation::create_bakery_table(db).await.is_ok()); - assert!(table_creation::create_baker_table(db).await.is_ok()); - assert!(table_creation::create_customer_table(db).await.is_ok()); - assert!(table_creation::create_order_table(db).await.is_ok()); - assert!(table_creation::create_lineitem_table(db).await.is_ok()); - assert!(table_creation::create_cakes_bakers_table(db).await.is_ok()); + assert!(schema::create_bakery_table(db).await.is_ok()); + assert!(schema::create_baker_table(db).await.is_ok()); + assert!(schema::create_customer_table(db).await.is_ok()); + assert!(schema::create_order_table(db).await.is_ok()); + assert!(schema::create_lineitem_table(db).await.is_ok()); + assert!(schema::create_cakes_bakers_table(db).await.is_ok()); +} + +async fn create_entities(db: &DbConn) { + assert!(crud::create_bakery(db).await.is_ok()); } diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs new file mode 100644 index 00000000..117d6d22 --- /dev/null +++ b/tests/crud/mod.rs @@ -0,0 +1,14 @@ +use sea_orm::{entity::*, DbConn, ExecErr, InsertResult}; + +pub use super::bakery_chain::*; + +pub async fn create_bakery(db: &DbConn) -> Result<(), ExecErr> { + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; + + Ok(()) +} diff --git a/tests/table_creation/mod.rs b/tests/schema/mod.rs similarity index 100% rename from tests/table_creation/mod.rs rename to tests/schema/mod.rs From c820bb66f75d7b768bd9940a87f662500d8021f3 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Wed, 30 Jun 2021 21:16:44 +1000 Subject: [PATCH 16/33] Fix relationship between Cake and lineitems, add Cake schema creation test --- tests/bakery_chain/bakery_chain_erd.drawio | 2 +- tests/bakery_chain/bakery_chain_erd.jpg | Bin 53807 -> 50804 bytes tests/bakery_chain/cake.rs | 11 +------ tests/bakery_chain_tests.rs | 1 + tests/crud/mod.rs | 2 +- tests/schema/mod.rs | 33 +++++++++++++++++++++ 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/tests/bakery_chain/bakery_chain_erd.drawio b/tests/bakery_chain/bakery_chain_erd.drawio index cca54bca..10084d0a 100644 --- a/tests/bakery_chain/bakery_chain_erd.drawio +++ b/tests/bakery_chain/bakery_chain_erd.drawio @@ -1 +1 @@ -7Z1fc9o4EMA/DY/N4L84j4Em194ld52mM22fMootQBfb4mxRoJ/+VrGMwSsnEIPdzmgmM0WLEEK/XXl3tXYHziRZ/5GRxfyORzQe2MNoPXDeD2zbsoY+/CMlm0JiD4NhIZllLFK9KsE9+0mVsOy2ZBHN9zoKzmPBFvvCkKcpDcWejGQZX+13m/J4/1sXZEaR4D4kMZZ+ZZGYF9LAG1byD5TN5mL7i9U7CSk7K0E+JxFf7YnoWtzwVKgpfqJZQlKaCnjnjmRPNBt413Mh5C+9Gtg38DeVvS9mnM9iShYsvwh5AuIwhy43U5KwWK7zzkBjNRB8nXM9cCYZ56J4lawnNJawSgzFnG4a3t2uQybHPeADT+N1/v3JDf8cp8Hl1/m7p/nm33dqlB8kXqr1HV/9df35O8gmH64+/q1WSmzK5RewRANnPBdJDAILXuYi4090wmOegSTlKfQcT1kc10QkZrMUmiHMFxbAGf+gmWAA9kq9kbAokl8zXs2ZoPcLEsrvXIEegyzjyzSi8qcM5fCw7Eo1Hbtsq0mWPwlGp+vGtbK2BMBUKE+oyDbQRX3AdpVCKCt5d+krwarSOWekZPMdfSv1kCgdmm3HrtDAC0XnGFIeRkVAkzYIUb5iSUwKDDvrItctnLM4uiUbvpTTzQUJn8rWeM4z9hP6kwosycpVtv29Hvfyk2rMjObQ51O5tlZNdEfWex1vSS7K2fA4JoucPSpuzjgh2YylYy4EmFHRCanNDnvLhfYJcDtODXegwW25Gtx2uZ+enrePeMv+sO8MP8JKzIo9RGebhxpkDhbG0tktncof41aSz+r3SRGHhZ3Gz9vkHOyTps+2KIggj1utWnCm9kxvDH+wTJPhhTfwYE4TaFtVG/5k90xMeArTJOyZDwWVWFGpFntw7UPhvmAvGHl53fMPA+yczZ5HiG9KEloQvhcZcDCAWwD2egccIMCPcsPODdYWWIO+sQY2wsqzyGBth9Wy+uZqXSKuIZirwdoKq9s31gBfZhcZnzLxUPiaxfX2JuZEGNJtSI/6Jm1rYlnypHGTTXx0bHzkjQ6JjywN7e0GcHrc+Dps4qMj7LkJ+QvxkQ7w+czZMfHROQHr4qNuAbv6+IgZn6sVWF2E1C1YnKk0nnRbqtoAqVusOCE5AazGvWrvXtXTz16gca88DWz78mzuFY6bjHt1jDn7R7tXOsDns2acnTTu1QkB69yrTgH7OJ+1yFioCN8BInxyaAAfDljnZnUKeIR36Ef9gbDBejhWrZ/VKddyYHNudFKuukx0t/aKE1YxSykTNDFoW6HVpZ47RRtoUhmwCA+PdMozdcV9TwSOlQzmI1zmYe+YcWJjkfFoGdLogYgC8xeWUAhPk4Vh3Ya10ztrnO2YxUtB04dpRpVJjzmPKUkN6VaBcN+kXexvIaI0mtEykUXjR766rgRorXZqY2kaXcmaZ2hef05IuinzWkgKi5htvm0/Bo3vkirgUs33ZR6raG1Uq5iqnF8jFiXK+TIL6Uuk1PYG85vRl5AWKDDSXYRDDcKtMKMxEezH/pR1YNV3fJKKXeXLXNu7UHMtM2busKYexa9VH6w0BI3l4bG8+ljFgqCxgCHZ7HRT5tc47VFZZb79osu9im14UQxZ6fJ2cVuoN3Y7u1PvcoeTshsmJ35qpS2r7F5V2uK4qT+ldfxhXdFG9T3tUKV18VhBfawGpT2ZWuHj2X9kGRzSLXMc0KDcjccBll/bJ/zynGdXV22Nrp6vGj3AF0lzHHCEF1SYy1HHATrA53OCGg7jTTKxDVbdIUC3WDVH8csctjNjr63A6pL/nYIdYXsV/PliaU53TgFYewzQreniBIRMF8uPmYxxW7q6w4BO6Qaa09mY7CYSZb5YJhMN6DagdUcDnYL2seN8W5mxiZZaR0vo3l1HVzyljexH54qWfHwrgomWjrBqvyHB+EK0pAN8Pu8LX5tDXSmkgXo4VF2s1ClUHydKTcHUCQHrYqZuAeOU5X9LkgomNmZvPhVlbeDU7eaML768yEzDzByrOn8whN9GWBc8dWvIOPkxacpqGYe6tUOtPX7QOtRnu9nTx3lM41AfY9INh5+/jEON+Zq7EU4IuH/nGkdM5qkprbH27lIHmpu0uaC5qoWUKA3ft/Pt35n28W1iiOgpq4fomolviph8vVMEB62qBk42zlACV25Tr1YTuQ1PQ+msmiioOWnO5VtrieojufWRzlxJVD5bpGsVs45QsW115rbReXWme6hqjhrce6Oax6smvrz9crvfL1A4XN7Z9LpqNtSC/36qiZ6I5HRcfznq6cL8m+2a5VP9XlfNUc+qWVco983FwfWRvI5VM8AJ2POq5hvVrGdfs3yQ6Ou+Zs+V63Z91xy99WYLrJr1x6Wf6FYLC+Uw9x+Of+ytFtCsHtRfdK/+ewXn+n8= \ No newline at end of file +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 \ No newline at end of file diff --git a/tests/bakery_chain/bakery_chain_erd.jpg b/tests/bakery_chain/bakery_chain_erd.jpg index 4d95480ad220a4c5d79328e6d5252b726e3ebcaa..f44da9aa26859510a2b04cbe530ffe06bb409899 100644 GIT binary patch literal 50804 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 Dc!gCm literal 53807 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 L_dOu=ZR9@y;0?q& diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 6b18c2a0..022ea128 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -16,8 +16,6 @@ pub struct Model { pub price: f32, pub bakery_id: Option, pub lineitem_id: Option, - pub best_before: String, - pub produced_at: String, pub gluten_free: bool, } @@ -28,8 +26,6 @@ pub enum Column { Price, BakeryId, LineitemId, - BestBefore, - ProducedAt, GlutenFree, } @@ -60,8 +56,6 @@ impl ColumnTrait for Column { Self::Price => ColumnType::Money(Some((19, 4))).def(), Self::BakeryId => ColumnType::Integer.def(), Self::LineitemId => ColumnType::Integer.def(), - Self::BestBefore => ColumnType::Date.def(), - Self::ProducedAt => ColumnType::Timestamp.def(), Self::GlutenFree => ColumnType::Boolean.def(), } } @@ -74,10 +68,7 @@ impl RelationTrait for Relation { .from(Column::BakeryId) .to(super::bakery::Column::Id) .into(), - Self::Lineitem => Entity::belongs_to(super::lineitem::Entity) - .from(Column::LineitemId) - .to(super::lineitem::Column::Id) - .into(), + Self::Lineitem => Entity::has_many(super::lineitem::Entity).into(), } } } diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index d7cf19ef..d411c118 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -20,6 +20,7 @@ async fn setup_schema(db: &DbConn) { assert!(schema::create_customer_table(db).await.is_ok()); assert!(schema::create_order_table(db).await.is_ok()); assert!(schema::create_lineitem_table(db).await.is_ok()); + assert!(schema::create_cake_table(db).await.is_ok()); assert!(schema::create_cakes_bakers_table(db).await.is_ok()); } diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 117d6d22..c0f13556 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -8,7 +8,7 @@ pub async fn create_bakery(db: &DbConn) -> Result<(), ExecErr> { profit_margin: Set(10.4), ..Default::default() }; - let res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; + let _res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; Ok(()) } diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index 9a685f41..d9d249e3 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -168,3 +168,36 @@ pub async fn create_cakes_bakers_table(db: &DbConn) -> Result Result { + let stmt = sea_query::Table::create() + .table(cake::Entity) + .if_not_exists() + .col( + ColumnDef::new(cake::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(cake::Column::Name).string()) + .col(ColumnDef::new(cake::Column::Price).float()) + .col(ColumnDef::new(cake::Column::BakeryId).integer().not_null()) + .col( + ColumnDef::new(cake::Column::LineitemId) + .integer() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("FK_cake_bakery") + .from(cake::Entity, cake::Column::BakeryId) + .to(bakery::Entity, bakery::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) + .col(ColumnDef::new(cake::Column::GlutenFree).boolean()) + .to_owned(); + + create_table(db, &stmt).await +} From f60a1c32a31ba56916457989e15160c0268efa96 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 3 Jul 2021 21:18:35 +1000 Subject: [PATCH 17/33] Test bakery create --- tests/crud/mod.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index c0f13556..ebf15499 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -8,7 +8,17 @@ pub async fn create_bakery(db: &DbConn) -> Result<(), ExecErr> { profit_margin: Set(10.4), ..Default::default() }; - let _res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; + let res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; + + let bakery: Option = Bakery::find_by_id(res.last_insert_id) + .one(db) + .await + .map_err(|_| ExecErr)?; + + assert!(bakery.is_some()); + let bakery_model = bakery.unwrap(); + assert_eq!(bakery_model.name, "SeaSide Bakery"); + assert_eq!(bakery_model.profit_margin, 10.4); Ok(()) } From 86bfcba0837952e7d4d161aeb29815e6de6b732c Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 3 Jul 2021 21:20:28 +1000 Subject: [PATCH 18/33] Cake has many lineitems --- tests/bakery_chain/cake.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 022ea128..8843fa9c 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -15,7 +15,6 @@ pub struct Model { pub name: String, pub price: f32, pub bakery_id: Option, - pub lineitem_id: Option, pub gluten_free: bool, } From 76d2cbb955b721979d285cf7150fe3d63074984c Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 3 Jul 2021 21:21:35 +1000 Subject: [PATCH 19/33] Use f64 for money --- tests/bakery_chain/cake.rs | 2 +- tests/bakery_chain/lineitem.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 8843fa9c..21fcf9e1 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -13,7 +13,7 @@ impl EntityName for Entity { pub struct Model { pub id: i32, pub name: String, - pub price: f32, + pub price: f64, pub bakery_id: Option, pub gluten_free: bool, } diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index 8afee4c3..7b7f2b66 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -12,7 +12,7 @@ impl EntityName for Entity { #[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] pub struct Model { pub id: i32, - pub price: f32, + pub price: f64, pub quantity: i32, pub order_id: Option, } From f61ed5a2ccd8268e3b3f9eb460a64beb14ae9f19 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 3 Jul 2021 22:14:13 +1000 Subject: [PATCH 20/33] Use DbErr instead of ExecErr --- tests/crud/mod.rs | 9 +++------ tests/schema/mod.rs | 18 +++++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index ebf15499..653328ab 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -1,8 +1,8 @@ -use sea_orm::{entity::*, DbConn, ExecErr, InsertResult}; +use sea_orm::{entity::*, error::*, DbConn, InsertResult}; pub use super::bakery_chain::*; -pub async fn create_bakery(db: &DbConn) -> Result<(), ExecErr> { +pub async fn create_bakery(db: &DbConn) -> Result<(), DbErr> { let seaside_bakery = bakery::ActiveModel { name: Set("SeaSide Bakery".to_owned()), profit_margin: Set(10.4), @@ -10,10 +10,7 @@ pub async fn create_bakery(db: &DbConn) -> Result<(), ExecErr> { }; let res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; - let bakery: Option = Bakery::find_by_id(res.last_insert_id) - .one(db) - .await - .map_err(|_| ExecErr)?; + let bakery: Option = Bakery::find_by_id(res.last_insert_id).one(db).await?; assert!(bakery.is_some()); let bakery_model = bakery.unwrap(); diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index d9d249e3..2841066c 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -1,14 +1,14 @@ -use sea_orm::{sea_query, DbConn, ExecErr, ExecResult}; +use sea_orm::{error::*, sea_query, DbConn, ExecResult}; use sea_query::{ColumnDef, ForeignKey, ForeignKeyAction, Index, TableCreateStatement}; pub use super::bakery_chain::*; -async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { +async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { let builder = db.get_schema_builder_backend(); db.execute(builder.build(stmt)).await } -pub async fn create_bakery_table(db: &DbConn) -> Result { +pub async fn create_bakery_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(bakery::Entity) .if_not_exists() @@ -26,7 +26,7 @@ pub async fn create_bakery_table(db: &DbConn) -> Result { create_table(db, &stmt).await } -pub async fn create_baker_table(db: &DbConn) -> Result { +pub async fn create_baker_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(baker::Entity) .if_not_exists() @@ -52,7 +52,7 @@ pub async fn create_baker_table(db: &DbConn) -> Result { create_table(db, &stmt).await } -pub async fn create_customer_table(db: &DbConn) -> Result { +pub async fn create_customer_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(customer::Entity) .if_not_exists() @@ -70,7 +70,7 @@ pub async fn create_customer_table(db: &DbConn) -> Result { create_table(db, &stmt).await } -pub async fn create_order_table(db: &DbConn) -> Result { +pub async fn create_order_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(order::Entity) .if_not_exists() @@ -114,7 +114,7 @@ pub async fn create_order_table(db: &DbConn) -> Result { create_table(db, &stmt).await } -pub async fn create_lineitem_table(db: &DbConn) -> Result { +pub async fn create_lineitem_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(lineitem::Entity) .if_not_exists() @@ -145,7 +145,7 @@ pub async fn create_lineitem_table(db: &DbConn) -> Result { create_table(db, &stmt).await } -pub async fn create_cakes_bakers_table(db: &DbConn) -> Result { +pub async fn create_cakes_bakers_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(cakes_bakers::Entity) .if_not_exists() @@ -169,7 +169,7 @@ pub async fn create_cakes_bakers_table(db: &DbConn) -> Result Result { +pub async fn create_cake_table(db: &DbConn) -> Result { let stmt = sea_query::Table::create() .table(cake::Entity) .if_not_exists() From c5dec7e9dc3d2b6743f96e85a9693da4775bf7f7 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sat, 3 Jul 2021 22:49:02 +1000 Subject: [PATCH 21/33] Lineitem belongs to cake --- tests/bakery_chain/lineitem.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index 7b7f2b66..bae11cf2 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -15,6 +15,7 @@ pub struct Model { pub price: f64, pub quantity: i32, pub order_id: Option, + pub cake_id: Option, } #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] @@ -23,6 +24,7 @@ pub enum Column { Price, Quantity, OrderId, + CakeId, } #[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] @@ -51,6 +53,7 @@ impl ColumnTrait for Column { Self::Price => ColumnType::Money(Some((19, 4))).def(), Self::Quantity => ColumnType::Integer.def(), Self::OrderId => ColumnType::Integer.def(), + Self::CakeId => ColumnType::Integer.def(), } } } From 23e0b3c590c1f9be891b229fe03c70e8c91514a3 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sun, 4 Jul 2021 10:40:10 +1000 Subject: [PATCH 22/33] Fix create table for the new relationship between Cake and Lineitem --- tests/bakery_chain/lineitem.rs | 8 ++++---- tests/schema/mod.rs | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index bae11cf2..f4c9e3b6 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -62,12 +62,12 @@ impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { Self::Order => Entity::belongs_to(super::order::Entity) - .from(Column::Id) - .to(super::order::Column::CustomerId) + .from(Column::OrderId) + .to(super::order::Column::Id) .into(), Self::Cake => Entity::belongs_to(super::cake::Entity) - .from(Column::Id) - .to(super::cake::Column::LineitemId) + .from(Column::CakeId) + .to(super::cake::Column::Id) .into(), } } diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index 2841066c..b0536873 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -132,6 +132,11 @@ pub async fn create_lineitem_table(db: &DbConn) -> Result { .integer() .not_null(), ) + .col( + ColumnDef::new(lineitem::Column::CakeId) + .integer() + .not_null(), + ) .foreign_key( ForeignKey::create() .name("FK_lineitem_order") @@ -140,6 +145,14 @@ pub async fn create_lineitem_table(db: &DbConn) -> Result { .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), ) + .foreign_key( + ForeignKey::create() + .name("FK_lineitem_cake") + .from(lineitem::Entity, lineitem::Column::CakeId) + .to(cake::Entity, cake::Column::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade), + ) .to_owned(); create_table(db, &stmt).await @@ -183,11 +196,6 @@ pub async fn create_cake_table(db: &DbConn) -> Result { .col(ColumnDef::new(cake::Column::Name).string()) .col(ColumnDef::new(cake::Column::Price).float()) .col(ColumnDef::new(cake::Column::BakeryId).integer().not_null()) - .col( - ColumnDef::new(cake::Column::LineitemId) - .integer() - .not_null(), - ) .foreign_key( ForeignKey::create() .name("FK_cake_bakery") From 47e7914224cbf1e11e14d9d9c8d23638929550c1 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sun, 4 Jul 2021 11:05:06 +1000 Subject: [PATCH 23/33] Remove LineitemId from cake --- tests/bakery_chain/cake.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 21fcf9e1..81286852 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -24,7 +24,6 @@ pub enum Column { Name, Price, BakeryId, - LineitemId, GlutenFree, } @@ -54,7 +53,6 @@ impl ColumnTrait for Column { Self::Name => ColumnType::String(None).def(), Self::Price => ColumnType::Money(Some((19, 4))).def(), Self::BakeryId => ColumnType::Integer.def(), - Self::LineitemId => ColumnType::Integer.def(), Self::GlutenFree => ColumnType::Boolean.def(), } } From c0177bffc58ce61fcf0c6cbe23e439a1423f07a7 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Sun, 4 Jul 2021 11:19:16 +1000 Subject: [PATCH 24/33] Fix create order table foreign keys --- tests/schema/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index b0536873..250fc7e3 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -96,7 +96,7 @@ pub async fn create_order_table(db: &DbConn) -> Result { .foreign_key( ForeignKey::create() .name("FK_order_bakery") - .from(order::Entity, baker::Column::BakeryId) + .from(order::Entity, order::Column::BakeryId) .to(bakery::Entity, bakery::Column::Id) .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), @@ -104,7 +104,7 @@ pub async fn create_order_table(db: &DbConn) -> Result { .foreign_key( ForeignKey::create() .name("FK_order_customer") - .from(order::Entity, baker::Column::BakeryId) + .from(order::Entity, order::Column::CustomerId) .to(customer::Entity, customer::Column::Id) .on_delete(ForeignKeyAction::Cascade) .on_update(ForeignKeyAction::Cascade), From a40785c5542636497927c2636d47404f6312178f Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Mon, 5 Jul 2021 21:43:32 +1000 Subject: [PATCH 25/33] Test baker and bakery create --- tests/bakery_chain_tests.rs | 3 +- tests/crud/mod.rs | 71 +++++++++++++++++++++++++++++++++---- tests/schema/mod.rs | 2 +- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index d411c118..e97c3c3b 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -25,5 +25,6 @@ async fn setup_schema(db: &DbConn) { } async fn create_entities(db: &DbConn) { - assert!(crud::create_bakery(db).await.is_ok()); + crud::test_create_bakery(db).await; + crud::test_create_baker(db).await; } diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 653328ab..8481577d 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -1,21 +1,80 @@ -use sea_orm::{entity::*, error::*, DbConn, InsertResult}; +use sea_orm::{entity::*, DbConn, InsertResult}; pub use super::bakery_chain::*; -pub async fn create_bakery(db: &DbConn) -> Result<(), DbErr> { +pub async fn test_create_bakery(db: &DbConn) { let seaside_bakery = bakery::ActiveModel { name: Set("SeaSide Bakery".to_owned()), profit_margin: Set(10.4), ..Default::default() }; - let res: InsertResult = Bakery::insert(seaside_bakery).exec(db).await?; + let res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); - let bakery: Option = Bakery::find_by_id(res.last_insert_id).one(db).await?; + let bakery: Option = Bakery::find_by_id(res.last_insert_id) + .one(db) + .await + .expect("could not find bakery"); assert!(bakery.is_some()); let bakery_model = bakery.unwrap(); assert_eq!(bakery_model.name, "SeaSide Bakery"); assert_eq!(bakery_model.profit_margin, 10.4); - - Ok(()) +} + +pub async fn test_create_baker(db: &DbConn) { + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); + + let baker_bob = baker::ActiveModel { + name: Set("Baker Bob".to_owned()), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + let res: InsertResult = Baker::insert(baker_bob) + .exec(db) + .await + .expect("could not insert baker"); + + let baker: Option = Baker::find_by_id(res.last_insert_id) + .one(db) + .await + .expect("could not find baker"); + + assert!(baker.is_some()); + let baker_model = baker.unwrap(); + assert_eq!(baker_model.name, "Baker Bob"); + assert_eq!( + baker_model + .find_related(Bakery) + .one(db) + .await + .expect("Bakery not found") + .unwrap() + .name, + "SeaSide Bakery" + ); + + let bakery: Option = Bakery::find_by_id(bakery_insert_res.last_insert_id) + .one(db) + .await + .unwrap(); + + let related_bakers: Vec = bakery + .unwrap() + .find_related(Baker) + .all(db) + .await + .expect("could not find related bakers"); + assert_eq!(related_bakers.len(), 1); + assert_eq!(related_bakers[0].name, "Baker Bob") } diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index 250fc7e3..29db082c 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -38,7 +38,7 @@ pub async fn create_baker_table(db: &DbConn) -> Result { .primary_key(), ) .col(ColumnDef::new(baker::Column::Name).string()) - .col(ColumnDef::new(baker::Column::BakeryId).integer().not_null()) + .col(ColumnDef::new(baker::Column::BakeryId).integer()) .foreign_key( ForeignKey::create() .name("FK_baker_bakery") From cf356ecfdb9f0a8837a04bd643d35dd000dc651b Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Mon, 5 Jul 2021 21:50:18 +1000 Subject: [PATCH 26/33] Test create customer --- tests/bakery_chain_tests.rs | 1 + tests/crud/mod.rs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index e97c3c3b..c83dc8dc 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -27,4 +27,5 @@ async fn setup_schema(db: &DbConn) { async fn create_entities(db: &DbConn) { crud::test_create_bakery(db).await; crud::test_create_baker(db).await; + crud::test_create_customer(db).await; } diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 8481577d..75fba65b 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -78,3 +78,25 @@ pub async fn test_create_baker(db: &DbConn) { assert_eq!(related_bakers.len(), 1); assert_eq!(related_bakers[0].name, "Baker Bob") } + +pub async fn test_create_customer(db: &DbConn) { + let customer_kate = customer::ActiveModel { + name: Set("Kate".to_owned()), + notes: Set("Loves cheese cake".to_owned()), + ..Default::default() + }; + let res: InsertResult = Customer::insert(customer_kate) + .exec(db) + .await + .expect("could not insert customer"); + + let customer: Option = Customer::find_by_id(res.last_insert_id) + .one(db) + .await + .expect("could not find customer"); + + assert!(customer.is_some()); + let customer_model = customer.unwrap(); + assert_eq!(customer_model.name, "Kate"); + assert_eq!(customer_model.notes, "Loves cheese cake"); +} From 0eeb37b2191c3367cc1a5f4911a2ea7b68881ea4 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Mon, 5 Jul 2021 22:14:16 +1000 Subject: [PATCH 27/33] Test create cake --- tests/bakery_chain_tests.rs | 1 + tests/crud/mod.rs | 88 +++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index c83dc8dc..a51848e5 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -28,4 +28,5 @@ async fn create_entities(db: &DbConn) { crud::test_create_bakery(db).await; crud::test_create_baker(db).await; crud::test_create_customer(db).await; + crud::test_create_cake(db).await; } diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 75fba65b..e058993b 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -100,3 +100,91 @@ pub async fn test_create_customer(db: &DbConn) { assert_eq!(customer_model.name, "Kate"); assert_eq!(customer_model.notes, "Loves cheese cake"); } + +pub async fn test_create_cake(db: &DbConn) { + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); + + let baker_bob = baker::ActiveModel { + name: Set("Baker Bob".to_owned()), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + let baker_insert_res: InsertResult = Baker::insert(baker_bob) + .exec(db) + .await + .expect("could not insert baker"); + + let mud_cake = cake::ActiveModel { + name: Set("Mud Cake".to_owned()), + price: Set(10.25), + gluten_free: Set(false), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + + let cake_insert_res: InsertResult = Cake::insert(mud_cake) + .exec(db) + .await + .expect("could not insert cake"); + + let cake: Option = Cake::find_by_id(cake_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find cake"); + + let cake_baker = cakes_bakers::ActiveModel { + cake_id: Set(cake_insert_res.last_insert_id as i32), + baker_id: Set(baker_insert_res.last_insert_id as i32), + ..Default::default() + }; + let _cake_baker_res: InsertResult = CakesBakers::insert(cake_baker) + .exec(db) + .await + .expect("could not insert cake_baker"); + + assert!(cake.is_some()); + let cake_model = cake.unwrap(); + assert_eq!(cake_model.name, "Mud Cake"); + assert_eq!(cake_model.price, 10.25); + assert_eq!(cake_model.gluten_free, false); + assert_eq!( + cake_model + .find_related(Bakery) + .one(db) + .await + .expect("Bakery not found") + .unwrap() + .name, + "SeaSide Bakery" + ); + + let related_bakers: Vec = cake_model + .find_related(Baker) + .all(db) + .await + .expect("could not find related bakers"); + assert_eq!(related_bakers.len(), 1); + assert_eq!(related_bakers[0].name, "Baker Bob"); + + let baker: Option = Baker::find_by_id(baker_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find baker"); + + let related_cakes: Vec = baker + .unwrap() + .find_related(Cake) + .all(db) + .await + .expect("could not find related cakes"); + assert_eq!(related_cakes.len(), 1); + assert_eq!(related_cakes[0].name, "Mud Cake") +} From f05de487ff1758057ded9edf8bcb5298a3e91342 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Wed, 7 Jul 2021 21:42:42 +1000 Subject: [PATCH 28/33] Use Decimal for lineitem price --- Cargo.toml | 86 ++++++++++++++++++------------ src/executor/query.rs | 29 ++++++++-- tests/bakery_chain/lineitem.rs | 3 +- tests/bakery_chain_tests.rs | 1 + tests/crud/create_lineitem.rs | 96 ++++++++++++++++++++++++++++++++++ tests/crud/mod.rs | 2 + tests/schema/mod.rs | 2 +- 7 files changed, 181 insertions(+), 38 deletions(-) create mode 100644 tests/crud/create_lineitem.rs diff --git a/Cargo.toml b/Cargo.toml index 2773730f..0243a2f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,18 +12,24 @@ members = [ [package] name = "sea-orm" version = "0.1.0" -authors = [ "Chris Tsang " ] +authors = ["Chris Tsang "] edition = "2018" description = "🐚 An async & dynamic ORM for Rust" license = "MIT OR Apache-2.0" documentation = "https://docs.rs/sea-orm" repository = "https://github.com/SeaQL/sea-orm" -categories = [ "database" ] -keywords = [ "orm", "database", "sql", "mysql", "postgres", "sqlite", "async" ] +categories = ["database"] +keywords = ["orm", "database", "sql", "mysql", "postgres", "sqlite", "async"] publish = false [package.metadata.docs.rs] -features = ["default", "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", "runtime-async-std-native-tls"] +features = [ + "default", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "runtime-async-std-native-tls", +] rustdoc-args = ["--cfg", "docsrs"] [lib] @@ -31,38 +37,52 @@ name = "sea_orm" path = "src/lib.rs" [dependencies] -async-stream = { version = "^0.3" } -chrono = { version = "^0", optional = true } -futures = { version = "^0.3" } -futures-util = { version = "^0.3" } -sea-query = { version = "^0.12" } -sea-orm-macros = { path = "sea-orm-macros", optional = true } -serde = { version = "^1.0", features = [ "derive" ] } -sqlx = { version = "^0.5", optional = true } -strum = { git = "https://github.com/SeaQL/strum.git", branch = "sea-orm", version = "^0.21", features = [ "derive", "sea-orm" ] } -serde_json = { version = "^1", optional = true } +async-stream = { version="^0.3" } +chrono = { version="^0", optional=true } +futures = { version="^0.3" } +futures-util = { version="^0.3" } +rust_decimal = "1.14" +rust_decimal_macros = "1.14" + +sea-query = { version="^0.12.5" } +# sea-query = { path="../sea-query", features=[ +# "with-rust_decimal", +# "postgres-rust_decimal", +# "sqlx-mysql", +# ] } + +sea-orm-macros = { path="sea-orm-macros", optional=true } +serde = { version="^1.0", features=["derive"] } +sqlx = { version="^0.5", optional=true } +strum = { git="https://github.com/SeaQL/strum.git", branch="sea-orm", version="^0.21", features=["derive", "sea-orm"] } +serde_json = { version="^1", optional=true } [dev-dependencies] -async-std = { version = "^1.9", features = [ "attributes" ] } -maplit = { version = "^1" } -sea-orm = { path = ".", features = ["sqlx-sqlite", "sqlx-json", "sqlx-chrono", "runtime-async-std-native-tls"] } +async-std = { version="^1.9", features=["attributes"] } +maplit = { version="^1" } +sea-orm = { path=".", features=[ + "sqlx-sqlite", + "sqlx-json", + "sqlx-chrono", + "runtime-async-std-native-tls", +] } [features] debug-print = [] -default = [ "macros", "with-json", "with-chrono", "mock" ] -macros = [ "sea-orm-macros" ] +default = ["macros", "with-json", "with-chrono", "mock"] +macros = ["sea-orm-macros"] mock = [] -with-json = [ "serde_json", "sea-query/with-json" ] -with-chrono = [ "chrono", "sea-query/with-chrono" ] -sqlx-dep = [ "sqlx" ] -sqlx-json = [ "sqlx/json", "with-json" ] -sqlx-chrono = [ "sqlx/chrono", "with-chrono" ] -sqlx-mysql = [ "sqlx-dep", "sea-query/sqlx-mysql", "sqlx/mysql" ] -sqlx-postgres = [ "sqlx-dep", "sea-query/sqlx-postgres", "sqlx/postgres" ] -sqlx-sqlite = [ "sqlx-dep", "sea-query/sqlx-sqlite", "sqlx/sqlite" ] -runtime-actix-native-tls = [ "sqlx/runtime-actix-native-tls" ] -runtime-async-std-native-tls = [ "sqlx/runtime-async-std-native-tls" ] -runtime-tokio-native-tls = [ "sqlx/runtime-tokio-native-tls" ] -runtime-actix-rustls = [ "sqlx/runtime-actix-rustls" ] -runtime-async-std-rustls = [ "sqlx/runtime-async-std-rustls" ] -runtime-tokio-rustls = [ "sqlx/runtime-tokio-rustls" ] \ No newline at end of file +with-json = ["serde_json", "sea-query/with-json"] +with-chrono = ["chrono", "sea-query/with-chrono"] +sqlx-dep = ["sqlx"] +sqlx-json = ["sqlx/json", "with-json"] +sqlx-chrono = ["sqlx/chrono", "with-chrono"] +sqlx-mysql = ["sqlx-dep", "sea-query/sqlx-mysql", "sqlx/mysql"] +sqlx-postgres = ["sqlx-dep", "sea-query/sqlx-postgres", "sqlx/postgres"] +sqlx-sqlite = ["sqlx-dep", "sea-query/sqlx-sqlite", "sqlx/sqlite"] +runtime-actix-native-tls = ["sqlx/runtime-actix-native-tls"] +runtime-async-std-native-tls = ["sqlx/runtime-async-std-native-tls"] +runtime-tokio-native-tls = ["sqlx/runtime-tokio-native-tls"] +runtime-actix-rustls = ["sqlx/runtime-actix-rustls"] +runtime-async-std-rustls = ["sqlx/runtime-async-std-rustls"] +runtime-tokio-rustls = ["sqlx/runtime-tokio-rustls"] diff --git a/src/executor/query.rs b/src/executor/query.rs index 1d23a013..ef43318a 100644 --- a/src/executor/query.rs +++ b/src/executor/query.rs @@ -1,4 +1,5 @@ use crate::DbErr; +use rust_decimal::prelude::*; use std::fmt; #[derive(Debug)] @@ -46,6 +47,25 @@ impl fmt::Debug for QueryResultRow { } // TryGetable // +impl TryGetable for Decimal { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); + match &res.row { + #[cfg(feature = "sqlx-mysql")] + QueryResultRow::SqlxMySql(row) => { + use sqlx::Row; + row.try_get(column.as_str()) + .map_err(crate::sqlx_error_to_query_err) + } + #[cfg(feature = "sqlx-sqlite")] + QueryResultRow::SqlxSqlite(_) => { + panic!("{} unsupported by sqlx-sqlite", stringify!($type)) + } + #[cfg(feature = "mock")] + QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), + } + } +} macro_rules! try_getable_all { ( $type: ty ) => { @@ -56,12 +76,14 @@ macro_rules! try_getable_all { #[cfg(feature = "sqlx-mysql")] QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()) + .map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "sqlx-sqlite")] QueryResultRow::SqlxSqlite(row) => { use sqlx::Row; - row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()) + .map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "mock")] QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), @@ -109,7 +131,8 @@ macro_rules! try_getable_mysql { #[cfg(feature = "sqlx-mysql")] QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()) + .map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "sqlx-sqlite")] QueryResultRow::SqlxSqlite(_) => { diff --git a/tests/bakery_chain/lineitem.rs b/tests/bakery_chain/lineitem.rs index f4c9e3b6..94b15cac 100644 --- a/tests/bakery_chain/lineitem.rs +++ b/tests/bakery_chain/lineitem.rs @@ -1,3 +1,4 @@ +use rust_decimal::prelude::*; use sea_orm::entity::prelude::*; #[derive(Copy, Clone, Default, Debug, DeriveEntity)] @@ -12,7 +13,7 @@ impl EntityName for Entity { #[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] pub struct Model { pub id: i32, - pub price: f64, + pub price: Decimal, pub quantity: i32, pub order_id: Option, pub cake_id: Option, diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index a51848e5..03effc64 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -29,4 +29,5 @@ async fn create_entities(db: &DbConn) { crud::test_create_baker(db).await; crud::test_create_customer(db).await; crud::test_create_cake(db).await; + crud::create_lineitem::test_create_lineitem(db).await; } diff --git a/tests/crud/create_lineitem.rs b/tests/crud/create_lineitem.rs new file mode 100644 index 00000000..d5857ee6 --- /dev/null +++ b/tests/crud/create_lineitem.rs @@ -0,0 +1,96 @@ +pub use super::*; +use rust_decimal_macros::dec; + +pub async fn test_create_lineitem(db: &DbConn) { + // Bakery + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); + + // Baker + let baker_bob = baker::ActiveModel { + name: Set("Baker Bob".to_owned()), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + let baker_insert_res: InsertResult = Baker::insert(baker_bob) + .exec(db) + .await + .expect("could not insert baker"); + + // Cake + let mud_cake = cake::ActiveModel { + name: Set("Mud Cake".to_owned()), + price: Set(10.25), + gluten_free: Set(false), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + + let cake_insert_res: InsertResult = Cake::insert(mud_cake) + .exec(db) + .await + .expect("could not insert cake"); + + // Cake_Baker + let cake_baker = cakes_bakers::ActiveModel { + cake_id: Set(cake_insert_res.last_insert_id as i32), + baker_id: Set(baker_insert_res.last_insert_id as i32), + ..Default::default() + }; + let _cake_baker_res: InsertResult = CakesBakers::insert(cake_baker) + .exec(db) + .await + .expect("could not insert cake_baker"); + + // Customer + let customer_kate = customer::ActiveModel { + name: Set("Kate".to_owned()), + notes: Set("Loves cheese cake".to_owned()), + ..Default::default() + }; + let customer_insert_res: InsertResult = Customer::insert(customer_kate) + .exec(db) + .await + .expect("could not insert customer"); + + // Order + let order_1 = order::ActiveModel { + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + customer_id: Set(Some(customer_insert_res.last_insert_id as i32)), + placed_at: Set("placeholder".to_string()), + ..Default::default() + }; + let order_insert_res: InsertResult = Order::insert(order_1) + .exec(db) + .await + .expect("could not insert order"); + + // Lineitem + let lineitem_1 = lineitem::ActiveModel { + cake_id: Set(Some(cake_insert_res.last_insert_id as i32)), + order_id: Set(Some(order_insert_res.last_insert_id as i32)), + price: Set(dec!(7.55)), + ..Default::default() + }; + let lineitem_insert_res: InsertResult = Lineitem::insert(lineitem_1) + .exec(db) + .await + .expect("could not insert lineitem"); + + let lineitem: Option = + Lineitem::find_by_id(lineitem_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find lineitem"); + + assert!(lineitem.is_some()); + let lineitem_model = lineitem.unwrap(); + // assert_eq!(lineitem_model.price, dec!(7.55)); +} diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index e058993b..01ec4122 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -2,6 +2,8 @@ use sea_orm::{entity::*, DbConn, InsertResult}; pub use super::bakery_chain::*; +pub mod create_lineitem; + pub async fn test_create_bakery(db: &DbConn) { let seaside_bakery = bakery::ActiveModel { name: Set("SeaSide Bakery".to_owned()), diff --git a/tests/schema/mod.rs b/tests/schema/mod.rs index 29db082c..6ebcc381 100644 --- a/tests/schema/mod.rs +++ b/tests/schema/mod.rs @@ -125,7 +125,7 @@ pub async fn create_lineitem_table(db: &DbConn) -> Result { .auto_increment() .primary_key(), ) - .col(ColumnDef::new(lineitem::Column::Price).float()) + .col(ColumnDef::new(lineitem::Column::Price).decimal()) .col(ColumnDef::new(lineitem::Column::Quantity).integer()) .col( ColumnDef::new(lineitem::Column::OrderId) From 40dd5e7da76784168ab6086b7ce8bbdb662df516 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Thu, 8 Jul 2021 01:26:42 +0800 Subject: [PATCH 29/33] Fix build error from rust_decimal --- Cargo.toml | 4 +++- src/executor/query.rs | 31 +++++-------------------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 88bdfccc..f8388030 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ async-stream = { version = "^0.3" } chrono = { version = "^0", optional = true } futures = { version = "^0.3" } futures-util = { version = "^0.3" } +rust_decimal = { version = "^1", optional = true } sea-query = { version = "^0.12" } sea-orm-macros = { path = "sea-orm-macros", optional = true } serde = { version = "^1.0", features = [ "derive" ] } @@ -45,6 +46,7 @@ serde_json = { version = "^1", optional = true } [dev-dependencies] async-std = { version = "^1.9", features = [ "attributes" ] } maplit = { version = "^1" } +rust_decimal_macros = { version = "^1" } sea-orm = { path = ".", features = ["sqlx-sqlite", "sqlx-json", "sqlx-chrono", "sqlx-decimal", "runtime-async-std-native-tls"] } [features] @@ -54,7 +56,7 @@ macros = [ "sea-orm-macros" ] mock = [] with-json = [ "serde_json", "sea-query/with-json" ] with-chrono = [ "chrono", "sea-query/with-chrono" ] -with-rust_decimal = [ "sea-query/with-rust_decimal" ] +with-rust_decimal = [ "rust_decimal", "sea-query/with-rust_decimal" ] sqlx-dep = [ "sqlx" ] sqlx-json = [ "sqlx/json", "with-json" ] sqlx-chrono = [ "sqlx/chrono", "with-chrono" ] diff --git a/src/executor/query.rs b/src/executor/query.rs index ef43318a..e10e7553 100644 --- a/src/executor/query.rs +++ b/src/executor/query.rs @@ -1,5 +1,4 @@ use crate::DbErr; -use rust_decimal::prelude::*; use std::fmt; #[derive(Debug)] @@ -47,25 +46,6 @@ impl fmt::Debug for QueryResultRow { } // TryGetable // -impl TryGetable for Decimal { - fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { - let column = format!("{}{}", pre, col); - match &res.row { - #[cfg(feature = "sqlx-mysql")] - QueryResultRow::SqlxMySql(row) => { - use sqlx::Row; - row.try_get(column.as_str()) - .map_err(crate::sqlx_error_to_query_err) - } - #[cfg(feature = "sqlx-sqlite")] - QueryResultRow::SqlxSqlite(_) => { - panic!("{} unsupported by sqlx-sqlite", stringify!($type)) - } - #[cfg(feature = "mock")] - QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), - } - } -} macro_rules! try_getable_all { ( $type: ty ) => { @@ -76,14 +56,12 @@ macro_rules! try_getable_all { #[cfg(feature = "sqlx-mysql")] QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - row.try_get(column.as_str()) - .map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "sqlx-sqlite")] QueryResultRow::SqlxSqlite(row) => { use sqlx::Row; - row.try_get(column.as_str()) - .map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "mock")] QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), @@ -131,8 +109,7 @@ macro_rules! try_getable_mysql { #[cfg(feature = "sqlx-mysql")] QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - row.try_get(column.as_str()) - .map_err(crate::sqlx_error_to_query_err) + row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) } #[cfg(feature = "sqlx-sqlite")] QueryResultRow::SqlxSqlite(_) => { @@ -183,3 +160,5 @@ try_getable_mysql!(u64); try_getable_all!(f32); try_getable_all!(f64); try_getable_all!(String); +#[cfg(feature = "with-rust_decimal")] +try_getable_mysql!(rust_decimal::Decimal); From 3b67ff8c0cf6ab43d3c41661a8282d2f6346d61e Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Thu, 8 Jul 2021 01:58:01 +0800 Subject: [PATCH 30/33] Support Decimal on sqlite --- src/executor/query.rs | 56 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/executor/query.rs b/src/executor/query.rs index e10e7553..2c10d0b6 100644 --- a/src/executor/query.rs +++ b/src/executor/query.rs @@ -160,5 +160,59 @@ try_getable_mysql!(u64); try_getable_all!(f32); try_getable_all!(f64); try_getable_all!(String); + #[cfg(feature = "with-rust_decimal")] -try_getable_mysql!(rust_decimal::Decimal); +use rust_decimal::Decimal; + +#[cfg(feature = "with-rust_decimal")] +impl TryGetable for Decimal { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); + match &res.row { + #[cfg(feature = "sqlx-mysql")] + QueryResultRow::SqlxMySql(row) => { + use sqlx::Row; + row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) + } + #[cfg(feature = "sqlx-sqlite")] + QueryResultRow::SqlxSqlite(row) => { + use sqlx::Row; + let val: f64 = row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err)?; + use rust_decimal::prelude::FromPrimitive; + Decimal::from_f64(val).ok_or_else(|| DbErr::Query("Failed to convert f64 into Decimal".to_owned())) + } + #[cfg(feature = "mock")] + QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), + } + } +} + +#[cfg(feature = "with-rust_decimal")] +impl TryGetable for Option { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); + match &res.row { + #[cfg(feature = "sqlx-mysql")] + QueryResultRow::SqlxMySql(row) => { + use sqlx::Row; + match row.try_get(column.as_str()) { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + } + } + #[cfg(feature = "sqlx-sqlite")] + QueryResultRow::SqlxSqlite(_) => { + let result: Result = TryGetable::try_get(res, pre, col); + match result { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + } + } + #[cfg(feature = "mock")] + QueryResultRow::Mock(row) => match row.try_get(column.as_str()) { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + }, + } + } +} From 1ecc8480ab10a5c62a2b969311bcd9b71bb96360 Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Thu, 8 Jul 2021 21:43:19 +1000 Subject: [PATCH 31/33] Test create lineitem --- tests/crud/create_lineitem.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/crud/create_lineitem.rs b/tests/crud/create_lineitem.rs index d5857ee6..5af8d0d0 100644 --- a/tests/crud/create_lineitem.rs +++ b/tests/crud/create_lineitem.rs @@ -92,5 +92,24 @@ pub async fn test_create_lineitem(db: &DbConn) { assert!(lineitem.is_some()); let lineitem_model = lineitem.unwrap(); - // assert_eq!(lineitem_model.price, dec!(7.55)); + assert_eq!(lineitem_model.price, dec!(7.55)); + + let cake: Option = Cake::find_by_id(lineitem_model.cake_id) + .one(db) + .await + .expect("could not find cake"); + + let cake_model = cake.unwrap(); + assert_eq!(cake_model.name, "Mud Cake"); + + let order: Option = Order::find_by_id(lineitem_model.order_id) + .one(db) + .await + .expect("could not find order"); + + let order_model = order.unwrap(); + assert_eq!( + order_model.customer_id.unwrap(), + customer_insert_res.last_insert_id as i32 + ); } From ad4c1c813c7c17cc81b2d914d57dc72ceb40199f Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Thu, 8 Jul 2021 21:59:29 +1000 Subject: [PATCH 32/33] Test create order --- tests/bakery_chain/order.rs | 5 +- tests/bakery_chain_tests.rs | 1 + tests/crud/create_order.rs | 122 ++++++++++++++++++++++++++++++++++++ tests/crud/mod.rs | 1 + 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 tests/crud/create_order.rs diff --git a/tests/bakery_chain/order.rs b/tests/bakery_chain/order.rs index f18c3a3b..de38df60 100644 --- a/tests/bakery_chain/order.rs +++ b/tests/bakery_chain/order.rs @@ -1,3 +1,4 @@ +use rust_decimal::prelude::*; use sea_orm::entity::prelude::*; #[derive(Copy, Clone, Default, Debug, DeriveEntity)] @@ -12,7 +13,7 @@ impl EntityName for Entity { #[derive(Clone, Debug, PartialEq, DeriveModel, DeriveActiveModel)] pub struct Model { pub id: i32, - pub total: f32, + pub total: Decimal, pub bakery_id: Option, pub customer_id: Option, pub placed_at: String, @@ -51,7 +52,7 @@ impl ColumnTrait for Column { fn def(&self) -> ColumnDef { match self { Self::Id => ColumnType::Integer.def(), - Self::Total => ColumnType::Money(Some((19, 4))).def(), + Self::Total => ColumnType::Decimal(Some((19, 4))).def(), Self::BakeryId => ColumnType::Integer.def(), Self::CustomerId => ColumnType::Integer.def(), Self::PlacedAt => ColumnType::DateTime.def(), diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index 03effc64..d5338ba1 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -30,4 +30,5 @@ async fn create_entities(db: &DbConn) { crud::test_create_customer(db).await; crud::test_create_cake(db).await; crud::create_lineitem::test_create_lineitem(db).await; + crud::create_order::test_create_order(db).await; } diff --git a/tests/crud/create_order.rs b/tests/crud/create_order.rs new file mode 100644 index 00000000..028ef7bd --- /dev/null +++ b/tests/crud/create_order.rs @@ -0,0 +1,122 @@ +pub use super::*; +use rust_decimal_macros::dec; + +pub async fn test_create_order(db: &DbConn) { + // Bakery + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); + + // Baker + let baker_bob = baker::ActiveModel { + name: Set("Baker Bob".to_owned()), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + let baker_insert_res: InsertResult = Baker::insert(baker_bob) + .exec(db) + .await + .expect("could not insert baker"); + + // Cake + let mud_cake = cake::ActiveModel { + name: Set("Mud Cake".to_owned()), + price: Set(10.25), + gluten_free: Set(false), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + + let cake_insert_res: InsertResult = Cake::insert(mud_cake) + .exec(db) + .await + .expect("could not insert cake"); + + // Cake_Baker + let cake_baker = cakes_bakers::ActiveModel { + cake_id: Set(cake_insert_res.last_insert_id as i32), + baker_id: Set(baker_insert_res.last_insert_id as i32), + ..Default::default() + }; + let _cake_baker_res: InsertResult = CakesBakers::insert(cake_baker) + .exec(db) + .await + .expect("could not insert cake_baker"); + + // Customer + let customer_kate = customer::ActiveModel { + name: Set("Kate".to_owned()), + notes: Set("Loves cheese cake".to_owned()), + ..Default::default() + }; + let customer_insert_res: InsertResult = Customer::insert(customer_kate) + .exec(db) + .await + .expect("could not insert customer"); + + // Order + let order_1 = order::ActiveModel { + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + customer_id: Set(Some(customer_insert_res.last_insert_id as i32)), + total: Set(dec!(15.10)), + placed_at: Set("placeholder".to_string()), + ..Default::default() + }; + let order_insert_res: InsertResult = Order::insert(order_1) + .exec(db) + .await + .expect("could not insert order"); + + // Lineitem + let lineitem_1 = lineitem::ActiveModel { + cake_id: Set(Some(cake_insert_res.last_insert_id as i32)), + order_id: Set(Some(order_insert_res.last_insert_id as i32)), + price: Set(dec!(7.55)), + quantity: Set(2), + ..Default::default() + }; + let _lineitem_insert_res: InsertResult = Lineitem::insert(lineitem_1) + .exec(db) + .await + .expect("could not insert lineitem"); + + let order: Option = Order::find_by_id(order_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find order"); + + assert!(order.is_some()); + let order_model = order.unwrap(); + assert_eq!(order_model.total, dec!(15.10)); + + let customer: Option = Customer::find_by_id(order_model.customer_id) + .one(db) + .await + .expect("could not find customer"); + + let customer_model = customer.unwrap(); + assert_eq!(customer_model.name, "Kate"); + + let bakery: Option = Bakery::find_by_id(order_model.bakery_id) + .one(db) + .await + .expect("could not find bakery"); + + let bakery_model = bakery.unwrap(); + assert_eq!(bakery_model.name, "SeaSide Bakery"); + + let related_lineitems: Vec = order_model + .find_related(Lineitem) + .all(db) + .await + .expect("could not find related lineitems"); + assert_eq!(related_lineitems.len(), 1); + assert_eq!(related_lineitems[0].price, dec!(7.55)); + assert_eq!(related_lineitems[0].quantity, 2); +} diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 01ec4122..495da8ca 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -3,6 +3,7 @@ use sea_orm::{entity::*, DbConn, InsertResult}; pub use super::bakery_chain::*; pub mod create_lineitem; +pub mod create_order; pub async fn test_create_bakery(db: &DbConn) { let seaside_bakery = bakery::ActiveModel { From 550d9a7bcb3b54026c7b530965c62dddc9567f4c Mon Sep 17 00:00:00 2001 From: Sam Samai Date: Thu, 8 Jul 2021 22:07:08 +1000 Subject: [PATCH 33/33] Cake price is decimal now --- tests/bakery_chain/cake.rs | 5 +- tests/bakery_chain_tests.rs | 2 +- tests/crud/create_cake.rs | 90 +++++++++++++++++++++++++++++++++++ tests/crud/create_lineitem.rs | 2 +- tests/crud/create_order.rs | 2 +- tests/crud/mod.rs | 89 +--------------------------------- 6 files changed, 97 insertions(+), 93 deletions(-) create mode 100644 tests/crud/create_cake.rs diff --git a/tests/bakery_chain/cake.rs b/tests/bakery_chain/cake.rs index 81286852..1e134de5 100644 --- a/tests/bakery_chain/cake.rs +++ b/tests/bakery_chain/cake.rs @@ -1,3 +1,4 @@ +use rust_decimal::prelude::*; use sea_orm::entity::prelude::*; #[derive(Copy, Clone, Default, Debug, DeriveEntity)] @@ -13,7 +14,7 @@ impl EntityName for Entity { pub struct Model { pub id: i32, pub name: String, - pub price: f64, + pub price: Decimal, pub bakery_id: Option, pub gluten_free: bool, } @@ -51,7 +52,7 @@ impl ColumnTrait for Column { match self { Self::Id => ColumnType::Integer.def(), Self::Name => ColumnType::String(None).def(), - Self::Price => ColumnType::Money(Some((19, 4))).def(), + Self::Price => ColumnType::Decimal(Some((19, 4))).def(), Self::BakeryId => ColumnType::Integer.def(), Self::GlutenFree => ColumnType::Boolean.def(), } diff --git a/tests/bakery_chain_tests.rs b/tests/bakery_chain_tests.rs index d5338ba1..c58be9eb 100644 --- a/tests/bakery_chain_tests.rs +++ b/tests/bakery_chain_tests.rs @@ -28,7 +28,7 @@ async fn create_entities(db: &DbConn) { crud::test_create_bakery(db).await; crud::test_create_baker(db).await; crud::test_create_customer(db).await; - crud::test_create_cake(db).await; + crud::create_cake::test_create_cake(db).await; crud::create_lineitem::test_create_lineitem(db).await; crud::create_order::test_create_order(db).await; } diff --git a/tests/crud/create_cake.rs b/tests/crud/create_cake.rs new file mode 100644 index 00000000..675b9c14 --- /dev/null +++ b/tests/crud/create_cake.rs @@ -0,0 +1,90 @@ +pub use super::*; +use rust_decimal_macros::dec; + +pub async fn test_create_cake(db: &DbConn) { + let seaside_bakery = bakery::ActiveModel { + name: Set("SeaSide Bakery".to_owned()), + profit_margin: Set(10.4), + ..Default::default() + }; + let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) + .exec(db) + .await + .expect("could not insert bakery"); + + let baker_bob = baker::ActiveModel { + name: Set("Baker Bob".to_owned()), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + let baker_insert_res: InsertResult = Baker::insert(baker_bob) + .exec(db) + .await + .expect("could not insert baker"); + + let mud_cake = cake::ActiveModel { + name: Set("Mud Cake".to_owned()), + price: Set(dec!(10.25)), + gluten_free: Set(false), + bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), + ..Default::default() + }; + + let cake_insert_res: InsertResult = Cake::insert(mud_cake) + .exec(db) + .await + .expect("could not insert cake"); + + let cake: Option = Cake::find_by_id(cake_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find cake"); + + let cake_baker = cakes_bakers::ActiveModel { + cake_id: Set(cake_insert_res.last_insert_id as i32), + baker_id: Set(baker_insert_res.last_insert_id as i32), + ..Default::default() + }; + let _cake_baker_res: InsertResult = CakesBakers::insert(cake_baker) + .exec(db) + .await + .expect("could not insert cake_baker"); + + assert!(cake.is_some()); + let cake_model = cake.unwrap(); + assert_eq!(cake_model.name, "Mud Cake"); + assert_eq!(cake_model.price, dec!(10.25)); + assert_eq!(cake_model.gluten_free, false); + assert_eq!( + cake_model + .find_related(Bakery) + .one(db) + .await + .expect("Bakery not found") + .unwrap() + .name, + "SeaSide Bakery" + ); + + let related_bakers: Vec = cake_model + .find_related(Baker) + .all(db) + .await + .expect("could not find related bakers"); + assert_eq!(related_bakers.len(), 1); + assert_eq!(related_bakers[0].name, "Baker Bob"); + + let baker: Option = Baker::find_by_id(baker_insert_res.last_insert_id) + .one(db) + .await + .expect("could not find baker"); + + let related_cakes: Vec = baker + .unwrap() + .find_related(Cake) + .all(db) + .await + .expect("could not find related cakes"); + assert_eq!(related_cakes.len(), 1); + assert_eq!(related_cakes[0].name, "Mud Cake") +} diff --git a/tests/crud/create_lineitem.rs b/tests/crud/create_lineitem.rs index 5af8d0d0..ac7af1ca 100644 --- a/tests/crud/create_lineitem.rs +++ b/tests/crud/create_lineitem.rs @@ -27,7 +27,7 @@ pub async fn test_create_lineitem(db: &DbConn) { // Cake let mud_cake = cake::ActiveModel { name: Set("Mud Cake".to_owned()), - price: Set(10.25), + price: Set(dec!(10.25)), gluten_free: Set(false), bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), ..Default::default() diff --git a/tests/crud/create_order.rs b/tests/crud/create_order.rs index 028ef7bd..d3769203 100644 --- a/tests/crud/create_order.rs +++ b/tests/crud/create_order.rs @@ -27,7 +27,7 @@ pub async fn test_create_order(db: &DbConn) { // Cake let mud_cake = cake::ActiveModel { name: Set("Mud Cake".to_owned()), - price: Set(10.25), + price: Set(dec!(10.25)), gluten_free: Set(false), bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), ..Default::default() diff --git a/tests/crud/mod.rs b/tests/crud/mod.rs index 495da8ca..9fbf27e6 100644 --- a/tests/crud/mod.rs +++ b/tests/crud/mod.rs @@ -2,6 +2,7 @@ use sea_orm::{entity::*, DbConn, InsertResult}; pub use super::bakery_chain::*; +pub mod create_cake; pub mod create_lineitem; pub mod create_order; @@ -103,91 +104,3 @@ pub async fn test_create_customer(db: &DbConn) { assert_eq!(customer_model.name, "Kate"); assert_eq!(customer_model.notes, "Loves cheese cake"); } - -pub async fn test_create_cake(db: &DbConn) { - let seaside_bakery = bakery::ActiveModel { - name: Set("SeaSide Bakery".to_owned()), - profit_margin: Set(10.4), - ..Default::default() - }; - let bakery_insert_res: InsertResult = Bakery::insert(seaside_bakery) - .exec(db) - .await - .expect("could not insert bakery"); - - let baker_bob = baker::ActiveModel { - name: Set("Baker Bob".to_owned()), - bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), - ..Default::default() - }; - let baker_insert_res: InsertResult = Baker::insert(baker_bob) - .exec(db) - .await - .expect("could not insert baker"); - - let mud_cake = cake::ActiveModel { - name: Set("Mud Cake".to_owned()), - price: Set(10.25), - gluten_free: Set(false), - bakery_id: Set(Some(bakery_insert_res.last_insert_id as i32)), - ..Default::default() - }; - - let cake_insert_res: InsertResult = Cake::insert(mud_cake) - .exec(db) - .await - .expect("could not insert cake"); - - let cake: Option = Cake::find_by_id(cake_insert_res.last_insert_id) - .one(db) - .await - .expect("could not find cake"); - - let cake_baker = cakes_bakers::ActiveModel { - cake_id: Set(cake_insert_res.last_insert_id as i32), - baker_id: Set(baker_insert_res.last_insert_id as i32), - ..Default::default() - }; - let _cake_baker_res: InsertResult = CakesBakers::insert(cake_baker) - .exec(db) - .await - .expect("could not insert cake_baker"); - - assert!(cake.is_some()); - let cake_model = cake.unwrap(); - assert_eq!(cake_model.name, "Mud Cake"); - assert_eq!(cake_model.price, 10.25); - assert_eq!(cake_model.gluten_free, false); - assert_eq!( - cake_model - .find_related(Bakery) - .one(db) - .await - .expect("Bakery not found") - .unwrap() - .name, - "SeaSide Bakery" - ); - - let related_bakers: Vec = cake_model - .find_related(Baker) - .all(db) - .await - .expect("could not find related bakers"); - assert_eq!(related_bakers.len(), 1); - assert_eq!(related_bakers[0].name, "Baker Bob"); - - let baker: Option = Baker::find_by_id(baker_insert_res.last_insert_id) - .one(db) - .await - .expect("could not find baker"); - - let related_cakes: Vec = baker - .unwrap() - .find_related(Cake) - .all(db) - .await - .expect("could not find related cakes"); - assert_eq!(related_cakes.len(), 1); - assert_eq!(related_cakes[0].name, "Mud Cake") -}