using System.Text.Json;
using CampusErrand.Models;
using FsCheck;
using FsCheck.Xunit;
namespace CampusErrand.Tests;
///
/// Property 27: 数据序列化往返一致性
/// 验证:对任意合法的 Banner、服务入口、订单对象,JSON 序列化后再反序列化应产生等价结果。
/// **Feature: login-and-homepage, Property 27: 数据序列化往返一致性**
///
///
public class SerializationRoundtripPropertyTests
{
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false
};
///
/// 属性:Banner 序列化往返一致性
///
[Property(MaxTest = 20)]
public bool Banner序列化往返一致(
PositiveInt id, bool isEnabled, NonNegativeInt sortOrder)
{
var original = new Banner
{
Id = id.Get,
ImageUrl = "https://img.example.com/test.png",
LinkType = LinkType.External,
LinkUrl = "https://example.com",
SortOrder = sortOrder.Get,
IsEnabled = isEnabled,
CreatedAt = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)
};
var json = JsonSerializer.Serialize(original, JsonOptions);
var deserialized = JsonSerializer.Deserialize(json, JsonOptions)!;
return original.Id == deserialized.Id
&& original.ImageUrl == deserialized.ImageUrl
&& original.LinkType == deserialized.LinkType
&& original.LinkUrl == deserialized.LinkUrl
&& original.SortOrder == deserialized.SortOrder
&& original.IsEnabled == deserialized.IsEnabled
&& original.CreatedAt == deserialized.CreatedAt;
}
///
/// 属性:ServiceEntry 序列化往返一致性
///
[Property(MaxTest = 20)]
public bool ServiceEntry序列化往返一致(
PositiveInt id, bool isEnabled, NonNegativeInt sortOrder)
{
var original = new ServiceEntry
{
Id = id.Get,
Name = "代取",
IconUrl = "https://img.example.com/icon.png",
PagePath = "/pages/pickup/pickup",
SortOrder = sortOrder.Get,
IsEnabled = isEnabled
};
var json = JsonSerializer.Serialize(original, JsonOptions);
var deserialized = JsonSerializer.Deserialize(json, JsonOptions)!;
return original.Id == deserialized.Id
&& original.Name == deserialized.Name
&& original.IconUrl == deserialized.IconUrl
&& original.PagePath == deserialized.PagePath
&& original.SortOrder == deserialized.SortOrder
&& original.IsEnabled == deserialized.IsEnabled;
}
///
/// 属性:Order 序列化往返一致性
///
[Property(MaxTest = 20)]
public bool Order序列化往返一致(
PositiveInt id, PositiveInt ownerId, bool isReviewed)
{
var commission = 5.0m;
var goodsAmount = 20.0m;
var original = new Order
{
Id = id.Get,
OrderNo = $"ORD{id.Get:D8}",
OwnerId = ownerId.Get,
RunnerId = null,
OrderType = OrderType.Purchase,
Status = OrderStatus.Pending,
ItemName = "快递",
PickupLocation = "A楼",
DeliveryLocation = "B楼",
Remark = "请尽快",
Phone = "13800138000",
Commission = commission,
GoodsAmount = goodsAmount,
TotalAmount = commission + goodsAmount,
IsReviewed = isReviewed,
CreatedAt = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc)
};
var json = JsonSerializer.Serialize(original, JsonOptions);
var deserialized = JsonSerializer.Deserialize(json, JsonOptions)!;
return original.Id == deserialized.Id
&& original.OrderNo == deserialized.OrderNo
&& original.OwnerId == deserialized.OwnerId
&& original.RunnerId == deserialized.RunnerId
&& original.OrderType == deserialized.OrderType
&& original.Status == deserialized.Status
&& original.ItemName == deserialized.ItemName
&& original.PickupLocation == deserialized.PickupLocation
&& original.DeliveryLocation == deserialized.DeliveryLocation
&& original.Phone == deserialized.Phone
&& original.Commission == deserialized.Commission
&& original.GoodsAmount == deserialized.GoodsAmount
&& original.TotalAmount == deserialized.TotalAmount
&& original.IsReviewed == deserialized.IsReviewed
&& original.CreatedAt == deserialized.CreatedAt;
}
}