129 lines
4.8 KiB
C#
129 lines
4.8 KiB
C#
using System.Text.Json;
|
||
using CampusErrand.Models;
|
||
using FsCheck;
|
||
using FsCheck.Xunit;
|
||
|
||
namespace CampusErrand.Tests;
|
||
|
||
/// <summary>
|
||
/// Property 27: 数据序列化往返一致性
|
||
/// 验证:对任意合法的 Banner、服务入口、订单对象,JSON 序列化后再反序列化应产生等价结果。
|
||
/// **Feature: login-and-homepage, Property 27: 数据序列化往返一致性**
|
||
/// **Validates: Requirements 33.2, 33.3, 33.4**
|
||
/// </summary>
|
||
public class SerializationRoundtripPropertyTests
|
||
{
|
||
private static readonly JsonSerializerOptions JsonOptions = new()
|
||
{
|
||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||
WriteIndented = false
|
||
};
|
||
|
||
/// <summary>
|
||
/// 属性:Banner 序列化往返一致性
|
||
/// </summary>
|
||
[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<Banner>(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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 属性:ServiceEntry 序列化往返一致性
|
||
/// </summary>
|
||
[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<ServiceEntry>(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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 属性:Order 序列化往返一致性
|
||
/// </summary>
|
||
[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<Order>(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;
|
||
}
|
||
}
|