feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
using System.Collections.Generic ;
using System.Linq ;
using System.Threading ;
using Content.Server.Store.Systems ;
using Content.Server.Traitor.Uplink ;
using Content.Shared.FixedPoint ;
using Content.Shared.Inventory ;
2025-02-03 17:11:06 -05:00
using Content.Shared.Mind ;
feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
using Content.Shared.Store ;
using Content.Shared.Store.Components ;
using Content.Shared.StoreDiscount.Components ;
using Robust.Shared.GameObjects ;
using Robust.Shared.Prototypes ;
using Robust.Shared.Random ;
namespace Content.IntegrationTests.Tests ;
[TestFixture]
public sealed class StoreTests
{
[TestPrototypes]
private const string Prototypes = @ "
- type : entity
name : InventoryPdaDummy
id : InventoryPdaDummy
parent : BasePDA
components :
- type : Clothing
QuickEquip : false
slots :
- idcard
- type : Pda
";
[Test]
public async Task StoreDiscountAndRefund ( )
{
await using var pair = await PoolManager . GetServerClient ( ) ;
var server = pair . Server ;
var testMap = await pair . CreateTestMap ( ) ;
await server . WaitIdleAsync ( ) ;
var serverRandom = server . ResolveDependency < IRobustRandom > ( ) ;
serverRandom . SetSeed ( 534 ) ;
var entManager = server . ResolveDependency < IEntityManager > ( ) ;
var mapSystem = server . System < SharedMapSystem > ( ) ;
var prototypeManager = server . ProtoMan ;
Assert . That ( mapSystem . IsInitialized ( testMap . MapId ) ) ;
EntityUid human = default ;
EntityUid uniform = default ;
EntityUid pda = default ;
var uplinkSystem = entManager . System < UplinkSystem > ( ) ;
var listingPrototypes = prototypeManager . EnumeratePrototypes < ListingPrototype > ( )
. ToArray ( ) ;
var coordinates = testMap . GridCoords ;
await server . WaitAssertion ( ( ) = >
{
var invSystem = entManager . System < InventorySystem > ( ) ;
2025-02-03 17:11:06 -05:00
var mindSystem = entManager . System < SharedMindSystem > ( ) ;
feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
human = entManager . SpawnEntity ( "HumanUniformDummy" , coordinates ) ;
uniform = entManager . SpawnEntity ( "UniformDummy" , coordinates ) ;
pda = entManager . SpawnEntity ( "InventoryPdaDummy" , coordinates ) ;
Assert . That ( invSystem . TryEquip ( human , uniform , "jumpsuit" ) ) ;
Assert . That ( invSystem . TryEquip ( human , pda , "id" ) ) ;
2025-02-03 17:11:06 -05:00
var mind = mindSystem . CreateMind ( null ) ;
mindSystem . TransferTo ( mind , human , mind : mind ) ;
feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
FixedPoint2 originalBalance = 20 ;
uplinkSystem . AddUplink ( human , originalBalance , null , true ) ;
var storeComponent = entManager . GetComponent < StoreComponent > ( pda ) ;
var discountComponent = entManager . GetComponent < StoreDiscountComponent > ( pda ) ;
Assert . That (
discountComponent . Discounts ,
2024-12-21 03:14:08 +01:00
Has . Exactly ( 6 ) . Items ,
$"After applying discount total discounted items count was expected to be '6' "
feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
+ $"but was actually {discountComponent.Discounts.Count}- this can be due to discount "
+ $"categories settings (maxItems, weight) not being realistically set, or default "
2024-12-21 03:14:08 +01:00
+ $"discounted count being changed from '6' in StoreDiscountSystem.InitializeDiscounts."
feat: #26107 uplink discounts for traitors (no nukies for now) (#26297)
* feat: #26107 uplink discounts for traitors and nukies
* refactor: #26107 extracted discount label from price of StoreListingControl
* refactor: minor renaming
* refactor: parametrized adding discounts to uplink store
* fix: #26107 prevent exception on empty discountOptions
* feat: uplink now have 'Discounted' category which contains all discounted items on this session.
* after merge fixups
* rename discount categories according to common sense
* refactor: DiscountOptions is now optional (nullable) on ListingData
* add nullability check ignore for already checked listingData.DiscountOptions
* fix after merge store menu ui
* remove unused using
* final fix after merge conflicts
* [refactor]: #26107 fix variables naming in UplinkSystem
* fix: #26107 fix after merge
* refactor: #26107 now supports discountDownUntil on ListingItem, instead of % of discount
* feat: #26107 support multiple currency discount in store on side of discount message label
* refactor: #26107 extracted discounts initialization to separate system. StoreDiscountData are spread as array and not list now
* refactor: #26107 move more code from storesystem to StoreDiscountComponent
* refactor: #26107 separated StoreSystem and StoreDiscountSystem using events
* fix: #26107 placed not-nullable variable initialization in ListingData for tests
* refactor: #26107 minor renaming, xml-docs
* fix: #26107 changed most of discounts to be down to half price for balance purposes
* ids used in with discounts are now ProtoIds, dicountCategories are now prototypes, code with weights simplified
* decoupled storesystem and store discount system
* xml-docs
* refactor: #26107 xml-doc for StoreDiscountSystem
* is now a thing (tmp)
* fix: compilation errors + StoreDiscountData.DiscountCategoryId
* refactor: rename ListingDataWithCostModifiers, fix all cost related code, enpittyfy performance, uglify uplink_catalog
* refactor: removed unused code, more StoreDiscountSystem docs, simplify code
* refactor: moved discount category logic to respective system, now creating ListingData c-tor clones all mutable fields as expected
* refactor: rename back (its not prototype)
* refactor: move ListingItemsInitializingEvent to file with handling logic
* refactor: comments for StoreBuyFinishedEvent handling, more logging
* refactor: moved StoreInitializedEvent, xml-doc
* refactor: simplify StoreDiscountSystem code (reduce nesting) + xml-doc
* refactor: restore old listing data cost field name
* refactor: fix linter in uplink_catalog.yml
* refactor: xml-doc for ListingDataWithCostModifiers
* refactor: limit usage of ListingData in favour of ListingDataWithCostModifiers
* refactor: purged linq, removed custom datafield names, minor cleanup
* refactor: removed double-allocation on getting available listings
* refactor: StoreSystem.OnBuyRequest now uses component.FullListingsCatalog as reference point (as it was in original code)
* fix: minor discount categories on uplink items changes following design overview
* refactor: StoreBuyListingMessage now uses protoId and not whole object
* refactor: store refund and discount integration test, RefreshAllListings now translates previous cost modifiers to refreshed list, if state previous to refresh had any listing items
---------
Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2024-09-05 15:12:39 +03:00
) ;
var discountedListingItems = storeComponent . FullListingsCatalog
. Where ( x = > x . IsCostModified )
. OrderBy ( x = > x . ID )
. ToArray ( ) ;
Assert . That ( discountComponent . Discounts
. Select ( x = > x . ListingId . Id ) ,
Is . EquivalentTo ( discountedListingItems . Select ( x = > x . ID ) ) ,
$"{nameof(StoreComponent)}.{nameof(StoreComponent.FullListingsCatalog)} does not contain all "
+ $"items that are marked as discounted, or they don't have flag '{nameof(ListingDataWithCostModifiers.IsCostModified)}'"
+ $"flag as 'true'. This marks the fact that cost modifier of discount is not applied properly!"
) ;
// Refund action requests re-generation of listing items so we will be re-acquiring items from component a lot of times.
var itemIds = discountedListingItems . Select ( x = > x . ID ) ;
foreach ( var itemId in itemIds )
{
Assert . Multiple ( ( ) = >
{
storeComponent . RefundAllowed = true ;
var discountedListingItem = storeComponent . FullListingsCatalog . First ( x = > x . ID = = itemId ) ;
var plainDiscountedCost = discountedListingItem . Cost [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
var prototype = listingPrototypes . First ( x = > x . ID = = discountedListingItem . ID ) ;
var prototypeCost = prototype . Cost [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
var discountDownTo = prototype . DiscountDownTo [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
Assert . That ( plainDiscountedCost . Value , Is . GreaterThanOrEqualTo ( discountDownTo . Value ) , "Expected discounted cost to be greater then DiscountDownTo value." ) ;
Assert . That ( plainDiscountedCost . Value , Is . LessThan ( prototypeCost . Value ) , "Expected discounted cost to be lower then prototype cost." ) ;
var buyMsg = new StoreBuyListingMessage ( discountedListingItem . ID ) { Actor = human } ;
server . EntMan . EventBus . RaiseComponentEvent ( pda , storeComponent , buyMsg ) ;
var newBalance = storeComponent . Balance [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
Assert . That ( newBalance . Value , Is . EqualTo ( ( originalBalance - plainDiscountedCost ) . Value ) , "Expected to have balance reduced by discounted cost" ) ;
Assert . That (
discountedListingItem . IsCostModified ,
Is . False ,
$"Expected item cost to not be modified after Buying discounted item."
) ;
var costAfterBuy = discountedListingItem . Cost [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
Assert . That ( costAfterBuy . Value , Is . EqualTo ( prototypeCost . Value ) , "Expected cost after discount refund to be equal to prototype cost." ) ;
var refundMsg = new StoreRequestRefundMessage { Actor = human } ;
server . EntMan . EventBus . RaiseComponentEvent ( pda , storeComponent , refundMsg ) ;
// get refreshed item after refund re-generated items
discountedListingItem = storeComponent . FullListingsCatalog . First ( x = > x . ID = = itemId ) ;
var afterRefundBalance = storeComponent . Balance [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
Assert . That ( afterRefundBalance . Value , Is . EqualTo ( originalBalance . Value ) , "Expected refund to return all discounted cost value." ) ;
Assert . That (
discountComponent . Discounts . First ( x = > x . ListingId = = discountedListingItem . ID ) . Count ,
Is . EqualTo ( 0 ) ,
"Discounted count should still be zero even after refund."
) ;
Assert . That (
discountedListingItem . IsCostModified ,
Is . False ,
$"Expected item cost to not be modified after Buying discounted item (even after refund was done)."
) ;
var costAfterRefund = discountedListingItem . Cost [ UplinkSystem . TelecrystalCurrencyPrototype ] ;
Assert . That ( costAfterRefund . Value , Is . EqualTo ( prototypeCost . Value ) , "Expected cost after discount refund to be equal to prototype cost." ) ;
} ) ;
}
} ) ;
await pair . CleanReturnAsync ( ) ;
}
}