80 lines
2.5 KiB
C#
80 lines
2.5 KiB
C#
using FsCheck;
|
|
using FsCheck.Xunit;
|
|
using HuangyanParking.Domain.Utils;
|
|
|
|
namespace HuangyanParking.Tests;
|
|
|
|
/// <summary>
|
|
/// 核销验证的属性测试
|
|
/// </summary>
|
|
public class VerifyPropertyTests
|
|
{
|
|
// 自定义生成器:生成有效的优惠券状态
|
|
private static readonly string[] ValidStatuses = ["unused", "used", "expired"];
|
|
|
|
/// <summary>
|
|
/// Feature: huangyan-parking-points, Property 10: 券码验证正确性
|
|
/// 券码存在且未使用且属于当前门店则通过,否则失败并返回错误原因
|
|
/// Validates: Requirements 11.3, 11.5, 12.2
|
|
/// </summary>
|
|
[Property(MaxTest = 100)]
|
|
public bool CouponVerify_ShouldValidateCorrectly(
|
|
bool couponExists,
|
|
byte statusIndex,
|
|
PositiveInt couponStoreIdWrapper,
|
|
PositiveInt verifyStoreIdWrapper)
|
|
{
|
|
// 从有效状态中选取
|
|
var status = couponExists ? ValidStatuses[statusIndex % ValidStatuses.Length] : null;
|
|
var couponStoreId = couponStoreIdWrapper.Get;
|
|
var verifyStoreId = verifyStoreIdWrapper.Get;
|
|
|
|
var result = CouponVerifier.Validate(couponExists, status, couponStoreId, verifyStoreId);
|
|
|
|
if (!couponExists)
|
|
{
|
|
// 券码不存在 → 失败
|
|
return !result.IsValid && result.ErrorMessage == "券码无效";
|
|
}
|
|
|
|
if (status == "used")
|
|
{
|
|
return !result.IsValid && result.ErrorMessage == "优惠券已使用";
|
|
}
|
|
|
|
if (status == "expired")
|
|
{
|
|
return !result.IsValid && result.ErrorMessage == "优惠券已过期";
|
|
}
|
|
|
|
if (status == "unused" && couponStoreId != verifyStoreId)
|
|
{
|
|
return !result.IsValid && result.ErrorMessage == "该优惠券不适用于本门店";
|
|
}
|
|
|
|
if (status == "unused" && couponStoreId == verifyStoreId)
|
|
{
|
|
// 全部条件满足 → 通过
|
|
return result.IsValid;
|
|
}
|
|
|
|
// 其他异常状态 → 失败
|
|
return !result.IsValid;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Feature: huangyan-parking-points, Property 11: 核销操作正确性
|
|
/// 核销后券状态变为已使用,用户端查询反映已使用状态
|
|
/// Validates: Requirements 11.4, 11.6
|
|
/// </summary>
|
|
[Property(MaxTest = 100)]
|
|
public bool CouponVerify_AfterVerification_StatusShouldBeUsed()
|
|
{
|
|
// 对于未使用的优惠券执行核销
|
|
var newStatus = CouponVerifier.ApplyVerification("unused");
|
|
|
|
// 核销后状态应为已使用
|
|
return newStatus == "used";
|
|
}
|
|
}
|