using QuestionsApi.Models; using Xunit; namespace QuestionsApi.Tests; public sealed class CreditEconomyTests { [Fact] public void EarningPolicy_UsesTheAgreedRollingLimit() { Assert.Equal(20, CreditEconomy.RollingEarningLimit); Assert.Equal(TimeSpan.FromHours(24), CreditEconomy.EarningWindow); } [Fact] public void CreditStatus_DoesNotExposeUserOrOperationIdentifiers() { Assert.Null(typeof(CreditStatusResponse).GetProperty(nameof(UserCreditAccount.UserId))); Assert.Null(typeof(CreditStatusResponse).GetProperty(nameof(UserCreditAccount.RecentEarnings))); Assert.Null(typeof(CreditStatusResponse).GetProperty(nameof(UserCreditAccount.Purchases))); Assert.Null(typeof(CreditStatusResponse).GetProperty(nameof(UserCreditAccount.AppliedOperations))); } [Fact] public void CatalogHasStableCoinOnlyUtilityPrices() { var exam = CreditEconomy.FindProduct(CreditEconomy.ExamTokenSku); var reset = CreditEconomy.FindProduct(CreditEconomy.QBankResetTokenSku); Assert.NotNull(exam); Assert.Equal(100, exam.CoinPrice); Assert.Equal(RzStoreGrant.ExamToken, exam.Grant); Assert.NotNull(reset); Assert.Equal(300, reset.CoinPrice); Assert.Equal(RzStoreGrant.QBankResetToken, reset.Grant); Assert.Equal(2, CreditEconomy.Products.Count); } [Fact] public void UnknownSkuIsRejectedByCatalog() { Assert.Null(CreditEconomy.FindProduct("cash_purchase")); } }