§
    ÝV¼j2  ã            
       óV  — d Z ddlZddlZddlZej                             dej                             ej                             ej                             e	¦  «        d¦  «        ¦  «        ¦  «         ddl
mZmZmZmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )zÖ
Unit tests for FreeExile MegaShop Catalog Engine.
Validates product SKUs, categorization (Items, Skins, Chests, Coins, Passes),
transparent loot box drop rates disclosures, account purchase limits, and discounts.
é    Nz../../server)ÚMegaShopCatalogÚProductCategoryÚShopProductÚChestDropProbabilityc                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestShopCatalogc                 ó,   — t          ¦   «         | _        d S ©N)r   Úcatalog)Úselfs    ú5C:\Projects\FreeExile\tests\unit\test_shop_catalog.pyÚsetUpzTestShopCatalog.setUp   s   € Ý&Ñ(Ô(ˆŒˆˆó    c                 ó  — d„ | j                              ¦   «         D ¦   «         }t          j        t          j        t          j        t          j        t          j        h}|                      | 	                    |¦  «        ¦  «         dS )zECatalog must contain items across all 5 mandatory product categories.c                 ó   — h | ]	}|j         ’Œ
S © )Úcategory)Ú.0Úps     r   ú	<setcomp>zGTestShopCatalog.test_catalog_contains_all_categories.<locals>.<setcomp>   s   € ÐJÐJÐJ Q�a”jÐJÐJÐJr   N)
r   Úget_all_productsr   ÚCOINSÚSKINSÚITEMSÚCHESTSÚPASSESÚ
assertTrueÚissubset)r   Ú
categoriesÚexpected_categoriess      r   Ú$test_catalog_contains_all_categoriesz4TestShopCatalog.test_catalog_contains_all_categories   sr   € àJÐJ¨$¬,×*GÒ*GÑ*IÔ*IÐJÑJÔJˆ
åÔ!ÝÔ!ÝÔ!ÝÔ"ÝÔ"ð
Ðð 	�ŠÐ+×4Ò4°ZÑ@Ô@ÑAÔAÐAÐAÐAr   c           
      óæ  — | j                              t          j        ¦  «        }|                      t          |¦  «        dd¦  «         |D ]¥}|                      |j        d|j        › d�¦  «         t          d„ |j        D ¦   «         ¦  «        }|  
                    |ddd|j        › d|› �¬	¦  «         t          d
„ |j        D ¦   «         ¦  «        }|                      |d|j        › d�¦  «         Œ¦dS )zQEvery Mystery Chest must have full drop rate disclosure summing strictly to 100%.r   z,At least one mystery chest must be availablezChest z missing drop ratesc              3   ó$   K  — | ]}|j         V — Œd S r
   )Údrop_chance_percent©r   Údrops     r   ú	<genexpr>zGTestShopCatalog.test_loot_box_transparency_guarantee.<locals>.<genexpr>,   s%   è è € Ð#`Ð#`À DÔ$<Ð#`Ð#`Ð#`Ð#`Ð#`Ð#`r   g      Y@é   z, drop probabilities must sum to 100.0%, got )ÚplacesÚmsgc              3   ó,   K  — | ]}|j         d k    V — ŒdS )r(   N)Úrarityr%   s     r   r'   zGTestShopCatalog.test_loot_box_transparency_guarantee.<locals>.<genexpr>4   s)   è è € Ð$YÐ$Y¸$ T¤[°AÒ%5Ð$YÐ$YÐ$YÐ$YÐ$YÐ$Yr   z must have Rare/Unique itemsN)r   Úget_products_by_categoryr   r   ÚassertGreaterÚlenr   Úchest_drop_ratesÚ
product_idÚsumÚassertAlmostEqualÚany)r   ÚchestsÚchestÚtotal_probabilityÚhas_rare_or_uniques        r   Ú$test_loot_box_transparency_guaranteez4TestShopCatalog.test_loot_box_transparency_guarantee%   s"  € à”×6Ò6µÔ7MÑNÔNˆØ×Ò�3˜v™;œ;¨Ð+YÑZÔZÐZàð 	ið 	iˆEØ�OŠO˜EÔ2Ð4b¸UÔ=MÐ4bÐ4bÐ4bÑcÔcÐcÝ #Ð#`Ð#`ÈÔI_Ð#`Ñ#`Ô#`Ñ `Ô `ÐØ×"Ò"Ø!ØØØn˜UÔ-ÐnÐnÐ[lÐnÐnð	 #ñ ô ð õ "%Ð$YÐ$YÀ%ÔBXÐ$YÑ$YÔ$YÑ!YÔ!YÐØ�OŠOÐ.Ð0g¸Ô9IÐ0gÐ0gÐ0gÑhÔhÐhÐhð	ið 	ir   c                 óJ  — | j                              t          j        ¦  «        }|                      t          |¦  «        d¦  «         |D ]X}|                      |j        dk    p
|j        dk    ¦  «         |                      |j	         
                    d¦  «        ¦  «         ŒYdS )z=Skins must have cosmetic keys and valid coin or fiat pricing.r   z
shop.skin.N)r   r-   r   r   r.   r/   r   Ú
coin_priceÚbase_fiat_usdÚname_i18n_keyÚ
startswith)r   ÚskinsÚskins      r   Útest_skin_products_attributesz-TestShopCatalog.test_skin_products_attributes7   sŸ   € à”×5Ò5µoÔ6KÑLÔLˆØ×Ò�3˜u™:œ: qÑ)Ô)Ð)Øð 	Ið 	IˆDØ�OŠO˜DœO¨aÒ/ÐI°4Ô3EÈÒ3IÑJÔJÐJØ�OŠO˜DÔ.×9Ò9¸,ÑGÔGÑHÔHÐHÐHð	Ið 	Ir   c                 ó`  — | j                              d¦  «        }|                      |¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |                     ¦   «         t          |j	        d|j        z
  z  dz  ¦  «        ¦  «         dS )zPProducts with purchase limit and discounts calculate effective prices correctly.Úcoin_starter_pack_onceé   r   éd   N)
r   Úget_productÚassertIsNotNoneÚassertEqualÚpurchase_limit_per_accountr.   Údiscount_percentÚcalculate_discounted_priceÚintr;   ©r   Úproducts     r   Ú"test_purchase_limits_and_discountsz2TestShopCatalog.test_purchase_limits_and_discounts?   s¯   € à”,×*Ò*Ð+CÑDÔDˆØ×Ò˜WÑ%Ô%Ð%Ø×Ò˜Ô;¸QÑ?Ô?Ð?Ø×Ò˜7Ô3°QÑ7Ô7Ð7Ø×ÒØ×.Ò.Ñ0Ô0Ý�Ô" c¨GÔ,DÑ&DÑEÈÑKÑLÔLñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óP  — | j                              d¦  «        }|                      |¦  «         |                      |j        t
          j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j	        d¦  «         dS )zNPremium merchant stash tab must be registered under ITEMS with coin price 500.Úitem_premium_merchant_stash_tabiô  rD   ÚPREMIUM_TRADEN)
r   rF   rG   rH   r   r   r   r;   rI   Úbadge_labelrM   s     r   Ú#test_premium_merchant_stash_productz3TestShopCatalog.test_premium_merchant_stash_productK   s™   € à”,×*Ò*Ð+LÑMÔMˆØ×Ò˜WÑ%Ô%Ð%Ø×Ò˜Ô)­?Ô+@ÑAÔAÐAØ×Ò˜Ô+¨SÑ1Ô1Ð1Ø×Ò˜Ô;¸QÑ?Ô?Ð?Ø×Ò˜Ô,¨oÑ>Ô>Ð>Ð>Ð>r   N)	Ú__name__Ú
__module__Ú__qualname__r   r!   r9   rA   rO   rT   r   r   r   r   r      sw   € € € € € ð)ð )ð )ð
Bð 
Bð 
Bðið ið ið$Ið Ið Ið	
ð 	
ð 	
ð?ð ?ð ?ð ?ð ?r   r   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úshop.shop_catalogr   r   r   r   ÚTestCaser   rU   Úmainr   r   r   ú<module>rf      sþ   ððð ð €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð=?ð =?ð =?ð =?ð =?�hÔ'ñ =?ô =?ð =?ð@ ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   