using FluentAssertions; using Workflow.Application.Form.Derivation; using Workflow.Application.Form.Relation.Handlers; using Workflow.Application.Form.Relation.Queries; using Workflow.Domain.Entities; using Workflow.Domain.Enums; using Xunit; namespace BuildFlow.Workflow.Tests.Form; public class FormRelationOptionsTests { [Fact] public async Task GetFormRelationOptionsQuery_ShouldReturnOptionsFromPublishedCustomFormData() { await using var db = TestDbFactory.Create(); var supplierFormId = Guid.NewGuid(); db.FormDefinitions.Add(new FormDefinition { Id = supplierFormId, Name = "供应商", Code = "supplier", Status = FormStatus.Published, Version = 1, SchemaJson = "{}", }); db.FormData.AddRange( new FormData { FormDefinitionId = supplierFormId, InstanceId = Guid.NewGuid(), DataJson = """{"id":"supplier-1","name":"上海供应商","code":"SH001"}""", }, new FormData { FormDefinitionId = supplierFormId, InstanceId = Guid.NewGuid(), DataJson = """{"id":"supplier-2","name":"北京供应商","code":"BJ001"}""", }); await db.SaveChangesAsync(); var handler = new GetFormRelationOptionsQueryHandler(db); var result = await handler.Handle( new GetFormRelationOptionsQuery( "supplier", "id", "name", "上海", 1, 20, ["code"]), CancellationToken.None); result.Total.Should().Be(1); result.Items.Should().ContainSingle().Which.Should().BeEquivalentTo(new { Value = "supplier-1", Label = "上海供应商", Snapshot = new Dictionary { ["code"] = "SH001" }, }); } [Fact] public async Task FormValueDerivationService_ShouldResolveRelationSnapshotFromCustomFormData() { await using var db = TestDbFactory.Create(); var supplierFormId = Guid.NewGuid(); db.FormDefinitions.Add(new FormDefinition { Id = supplierFormId, Name = "供应商", Code = "supplier", Status = FormStatus.Published, Version = 1, SchemaJson = "{}", }); db.FormData.Add(new FormData { FormDefinitionId = supplierFormId, InstanceId = Guid.NewGuid(), DataJson = """{"id":"supplier-1","name":"上海供应商","code":"SH001"}""", }); await db.SaveChangesAsync(); var service = new FormValueDerivationService([], [], db); var result = await service.DeriveAsync( """ { "type": "object", "properties": { "supplier": { "type": "object", "title": "供应商", "x-component": "RelationPicker", "x-field-kind": "relation", "x-relation": { "sourceCode": "supplier", "idField": "id", "labelField": "name", "snapshotFields": ["code", "name"], "updatePolicy": "snapshotOnly" } } } } """, """{"supplier":"supplier-1"}""", new FormDerivationContext(null, Guid.NewGuid(), null), CancellationToken.None); result.DataJson.Should().Contain("\"label\":\"上海供应商\""); result.DataJson.Should().Contain("\"code\":\"SH001\""); } }