§
    Èd»je  ã            
       ó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 ddlmZ ddlmZmZ ddl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 Orchestrator Service.
Validates end-to-end purchasing workflow, coin credit via 2PC,
cosmetic skin delivery, and mystery chest gacha drops with transparent probabilities.
é    Nz../../server)ÚMegaShopService)ÚProductCategory)ÚPlatformTypeÚPaymentGateway)ÚCryptoChainÚCryptoTokenc                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestShopServicec                 óx   — t          ¦   «         | _        d| _        | j                             | j        ¦  «         d S )NÚplayer_exile_007)r   Úshop_serviceÚtest_accountÚregister_player)Úselfs    ú5C:\Projects\FreeExile\tests\unit\test_shop_service.pyÚsetUpzTestShopService.setUp   s8   € Ý+Ñ-Ô-ˆÔØ.ˆÔØÔ×)Ò)¨$Ô*;Ñ<Ô<Ð<Ð<Ð<ó    c                 óÔ  — | j                              | j        dt          j        t
          j        d¬¦  «        }|                      |j        ¦  «         d|j	        › �}| j          
                    |j	        |¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         | j                              | j        ¦  «        }|                      |d¦  «         dS )zPBuying 1000 Gold Cores on iOS via Apple IAP successfully credits player balance.Úcoin_pack_1000ÚUS)Ú
account_idÚ
product_idÚplatformÚgatewayÚcountry_codeÚvalid_mock_storekit_jws_)Úorder_idÚreceipt_payloadéè  N)r   Úcreate_purchase_orderr   r   ÚPLATFORM_IOSr   ÚGATEWAY_APPLE_IAPÚ
assertTrueÚsuccessr   Úsettle_fiat_orderÚassertEqualÚcoins_creditedÚget_player_coin_balance)r   ÚorderÚreceipt_jwtÚsettle_resultÚbalances        r   Ú#test_buy_coins_via_apple_iap_on_iosz3TestShopService.test_buy_coins_via_apple_iap_on_ios   sí   € ð Ô!×7Ò7ØÔ(Ø'Ý!Ô.Ý"Ô4Øð 8ñ 
ô 
ˆð 	�Š˜œÑ&Ô&Ð&ð B°´ÐAÐAˆØÔ)×;Ò;Ø”^Ø'ð <ñ 
ô 
ˆð 	�Š˜Ô-Ñ.Ô.Ð.Ø×Ò˜Ô5°tÑ<Ô<Ð<ð Ô#×;Ò;¸DÔ<MÑNÔNˆØ×Ò˜ $Ñ'Ô'Ð'Ð'Ð'r   c                 ó”  — | j                              | j        dd¬¦  «         d}| j                              | j        |¬¦  «        }|                      |j        ¦  «         |                      || j                              | j        ¦  «        ¦  «         | j                              | j        ¦  «        }|  	                    |d¦  «         dS )z_Purchasing Azure Dragon Blade Skin with in-game Gold Cores deducts coins and delivers cosmetic.iÄ	  Ú
test_grant©ÚreasonÚskin_azure_dragon_blade)r   r   i¼  N)
r   Úcredit_player_coinsr   Úpurchase_product_with_coinsr#   r$   ÚassertInÚget_player_owned_skinsr(   r&   )r   Úskin_product_idÚresultÚ	remainings       r   Ú test_buy_skin_with_in_game_coinsz0TestShopService.test_buy_skin_with_in_game_coins2   sÆ   € ð 	Ô×-Ò-¨dÔ.?ÀÈlÐ-Ñ[Ô[Ð[à3ˆØÔ"×>Ò>ØÔ(Ø&ð ?ñ 
ô 
ˆð 	�Š˜œÑ'Ô'Ð'Ø�Š�o tÔ'8×'OÒ'OÐPTÔPaÑ'bÔ'bÑcÔcÐcð Ô%×=Ò=¸dÔ>OÑPÔPˆ	Ø×Ò˜ CÑ(Ô(Ð(Ð(Ð(r   c                 ó8  ‡— | j                              | j        dd¬¦  «         d}| j                              | j        |¬¦  «        Š|                      ‰j        ¦  «         |                      ‰j        ¦  «         |                      t          ‰j        j	        ¦  «        dk    ¦  «         |  
                    ‰j        j        g d¢¦  «         | j                              | j        ¦  «        }|                      t          ˆfd„|D ¦   «         ¦  «        ¦  «         d	S )
zmOpening a Mystery Chest deducts coins and delivers weighted random loot according to published probabilities.r   r/   r0   Úchest_celestial_fortune)r   Úchest_product_idr   )r   é   é   é   c              3   óD   •K  — | ]}|d          ‰j         j        k    V — ŒdS )Úitem_idN)Údropped_itemrB   )Ú.0Úitemr8   s     €r   ú	<genexpr>zHTestShopService.test_open_mystery_chest_delivers_loot.<locals>.<genexpr>S   s2   øè è € ÐaÐaÈt˜D œO¨vÔ/BÔ/JÒJÐaÐaÐaÐaÐaÐar   N)r   r3   r   Úpurchase_and_open_chestr#   r$   ÚassertIsNotNonerC   ÚlenrB   r5   ÚrarityÚget_player_inventoryÚany)r   r=   Ú	inventoryr8   s      @r   Ú%test_open_mystery_chest_delivers_lootz5TestShopService.test_open_mystery_chest_delivers_lootC   s  ø€ àÔ×-Ò-¨dÔ.?ÀÈlÐ-Ñ[Ô[Ð[à4ÐØÔ"×:Ò:ØÔ(Ø-ð ;ñ 
ô 
ˆð 	�Š˜œÑ'Ô'Ð'Ø×Ò˜VÔ0Ñ1Ô1Ð1Ø�Š�˜FÔ/Ô7Ñ8Ô8¸1Ò<Ñ=Ô=Ð=Ø�Š�fÔ)Ô0°,°,°,Ñ?Ô?Ð?ð Ô%×:Ò:¸4Ô;LÑMÔMˆ	Ø�Š�ÐaÐaÐaÐaÐW`ÐaÑaÔaÑaÔaÑbÔbÐbÐbÐbr   c           
      óÖ  — | j                              | j        dt          j        t
          j        dt          j        t          j
        d¬¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         d}| j         j                             |t          j        d|j        j        t          j
        |j        j        dd¬¦  «         | j                              |j        |t          j        ¬	¦  «        }|                      |j        ¦  «         |                      |j        d
¦  «         |                      | j                              | j        ¦  «        d
¦  «         dS )z9Web3 Crypto payment on Web portal gives +10% bonus coins.r   ÚVNz0xAbc987...123)r   r   r   r   r   Úcrypto_chainÚcrypto_tokenÚbuyer_walletÚ#0xArbitrumTxHash_USDT_Settled_12345é   T)Útx_hashÚchainÚfrom_addressÚ
to_addressÚtokenÚamount_transferredÚconfirmationsÚis_confirmed)r   rV   rW   iL  N)r   r    r   r   ÚPLATFORM_WEB_PCr   ÚGATEWAY_CRYPTO_WEB3r   ÚCHAIN_ARBITRUMr   Ú
TOKEN_USDTr#   r$   rH   Úweb3_detailsÚcrypto_verifierÚmock_register_on_chain_txÚmerchant_vault_addressÚrequired_token_amountÚsettle_crypto_orderr   r&   r'   r(   )r   r)   rV   Úsettles       r   Ú$test_web3_crypto_purchase_with_bonusz4TestShopService.test_web3_crypto_purchase_with_bonusU   sW  € ð Ô!×7Ò7ØÔ(Ø'Ý!Ô1Ý"Ô6ØÝ$Ô3Ý$Ô/Ø)ð 8ñ 	
ô 	
ˆð 	�Š˜œÑ&Ô&Ð&Ø×Ò˜UÔ/Ñ0Ô0Ð0ð 8ˆØÔÔ)×CÒCØÝÔ,Ø)ØÔ)Ô@ÝÔ(Ø$Ô1ÔGØØð 	Dñ 		
ô 		
ð 		
ð Ô"×6Ò6Ø”^ØÝÔ,ð 7ñ 
ô 
ˆð
 	�Š˜œÑ'Ô'Ð'à×Ò˜Ô.°Ñ5Ô5Ð5Ø×Ò˜Ô*×BÒBÀ4ÔCTÑUÔUÐW[Ñ\Ô\Ð\Ð\Ð\r   N)Ú__name__Ú
__module__Ú__qualname__r   r-   r:   rN   ri   © r   r   r
   r
      sg   € € € € € ð=ð =ð =ð
(ð (ð (ð2)ð )ð )ð"cð cð cð$%]ð %]ð %]ð %]ð %]r   r
   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úshop.shop_servicer   Úshop.shop_catalogr   Úshop.payment_gateway_routerr   r   Úshop.receipt_verifierr   r   ÚTestCaser
   rj   Úmainrm   r   r   ú<module>r      s&  ððð ð €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à -Ð -Ð -Ð -Ð -Ð -Ø -Ð -Ð -Ð -Ð -Ð -Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ðg]ð g]ð g]ð g]ð g]�hÔ'ñ g]ô g]ð g]ðT ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   