diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/UnsTreeService.cs b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/UnsTreeService.cs index a6a5e183..7b3bc51f 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/UnsTreeService.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/UnsTreeService.cs @@ -523,6 +523,9 @@ public sealed class UnsTreeService(IDbContextFactory dbF return new UnsMutationResult(false, "TagConfig is not valid JSON."); } + if (!await db.Equipment.AnyAsync(e => e.EquipmentId == equipmentId, ct)) + return new UnsMutationResult(false, $"Equipment '{equipmentId}' not found."); + var equipmentCluster = await ResolveEquipmentClusterAsync(db, equipmentId, ct); var guard = await CheckTagDriverGuardAsync(db, input.DriverInstanceId, equipmentCluster, ct); if (guard is not null) @@ -648,7 +651,7 @@ public sealed class UnsTreeService(IDbContextFactory dbF using var _ = System.Text.Json.JsonDocument.Parse(json); return true; } - catch + catch (System.Text.Json.JsonException) { return false; } diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs index eb8f9d6d..68183c7e 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs @@ -219,6 +219,23 @@ public sealed class UnsTreeServiceTagTests result.Error.ShouldBe("Tag 'TAG-1' already exists."); } + /// Creating a tag for an equipment id that does not exist returns a not-found error. + [Fact] + public async Task CreateTag_unresolvable_equipment_returns_error() + { + var (service, dbName) = Fresh(); + SeedHierarchyAndDrivers(dbName, equipmentCluster: "MAIN", seedEquipmentDriver: true); + + var result = await service.CreateTagAsync("EQ-NOPE", Input("TAG-1", "speed", "DRV-EQ")); + + result.Ok.ShouldBeFalse(); + result.Error.ShouldNotBeNull(); + result.Error.ShouldContain("not found"); + + using var db = UnsTreeTestDb.CreateNamed(dbName); + db.Tags.Any(t => t.TagId == "TAG-1").ShouldBeFalse(); + } + /// Creating a tag whose Name already exists on the same equipment is blocked. [Fact] public async Task CreateTag_duplicate_name_on_equipment_blocked()