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; } }