fix(m9/T24a): scope move-guard native-alarm scan to source-site templates (Ordinal); purpose-built include; add guard-4 + repo tests

This commit is contained in:
Joseph Doherty
2026-06-18 11:38:31 -04:00
parent fbe4ddaf58
commit dbe51e5f25
5 changed files with 290 additions and 15 deletions
@@ -776,6 +776,76 @@ public class SiteRepositoryTests : IDisposable
Assert.Single(instances);
}
[Fact]
public async Task GetInstancesReferencingDataConnection_NoBindings_ReturnsEmpty()
{
var site = new Site("Site1", "S-001");
var template = new Template("T1");
_context.Sites.Add(site);
_context.Templates.Add(template);
await _context.SaveChangesAsync();
var conn = new DataConnection("Conn1", "OpcUa", site.Id);
_context.DataConnections.Add(conn);
_context.Instances.Add(new Instance("I1") { SiteId = site.Id, TemplateId = template.Id });
await _context.SaveChangesAsync();
var result = await _repository.GetInstancesReferencingDataConnectionAsync(conn.Id);
Assert.Empty(result);
}
[Fact]
public async Task GetInstancesReferencingDataConnection_OneBinding_ReturnsThatInstance()
{
var site = new Site("Site1", "S-001");
var template = new Template("T1");
_context.Sites.Add(site);
_context.Templates.Add(template);
await _context.SaveChangesAsync();
var conn = new DataConnection("Conn1", "OpcUa", site.Id);
_context.DataConnections.Add(conn);
var instance = new Instance("I1") { SiteId = site.Id, TemplateId = template.Id };
_context.Instances.Add(instance);
await _context.SaveChangesAsync();
_context.InstanceConnectionBindings.Add(
new InstanceConnectionBinding("Attr1") { InstanceId = instance.Id, DataConnectionId = conn.Id });
await _context.SaveChangesAsync();
var result = await _repository.GetInstancesReferencingDataConnectionAsync(conn.Id);
Assert.Single(result);
Assert.Equal(instance.Id, result[0].Id);
}
[Fact]
public async Task GetInstancesReferencingDataConnection_TwoBindingsSameInstance_ReturnsOne()
{
var site = new Site("Site1", "S-001");
var template = new Template("T1");
_context.Sites.Add(site);
_context.Templates.Add(template);
await _context.SaveChangesAsync();
var conn = new DataConnection("Conn1", "OpcUa", site.Id);
_context.DataConnections.Add(conn);
var instance = new Instance("I1") { SiteId = site.Id, TemplateId = template.Id };
_context.Instances.Add(instance);
await _context.SaveChangesAsync();
// Two distinct bindings (different attributes) on the SAME instance both
// reference the connection -> the result must be deduped to one instance.
_context.InstanceConnectionBindings.Add(
new InstanceConnectionBinding("Attr1") { InstanceId = instance.Id, DataConnectionId = conn.Id });
_context.InstanceConnectionBindings.Add(
new InstanceConnectionBinding("Attr2") { InstanceId = instance.Id, DataConnectionId = conn.Id });
await _context.SaveChangesAsync();
var result = await _repository.GetInstancesReferencingDataConnectionAsync(conn.Id);
Assert.Single(result);
Assert.Equal(instance.Id, result[0].Id);
}
[Fact]
public void Constructor_NullContext_Throws()
{