using QuestionsApi.Models; using Xunit; namespace QuestionsApi.Tests; public sealed class CreditEconomyTests { [Fact] public void EarningPolicy_UsesTheAgreedRollingLimit() { Assert.Equal(30, CreditEconomy.RollingEarningLimit); Assert.Equal(TimeSpan.FromHours(24), CreditEconomy.EarningWindow); } [Theory] [InlineData(1, 1)] [InlineData(3, 1)] [InlineData(4, 2)] [InlineData(5, 3)] public void FirstCorrectAwardsScaleWithStoredDifficulty(int difficulty, int expected) => Assert.Equal(expected, CreditEconomy.FirstCorrectAmount(difficulty)); [Fact] public void DelayedRecoveryReplacesTheNormalReviewAward() { Assert.Equal(1, CreditEconomy.ReviewAmount(false)); Assert.Equal(3, CreditEconomy.ReviewAmount(true)); } [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 PublicLedgerEntry_DoesNotExposeUserOrOperationIdentifiers() { Assert.Null(typeof(CreditLedgerEntryResponse).GetProperty(nameof(CreditLedgerEntry.UserId))); Assert.Null(typeof(CreditLedgerEntryResponse).GetProperty(nameof(CreditLedgerEntry.OperationId))); Assert.Null(typeof(CreditLedgerEntryResponse).GetProperty(nameof(CreditLedgerEntry.SourceId))); } [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")); } }