You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
8.1 KiB
C#
245 lines
8.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Xunit;
|
|
using Haoliang.Models.Device;
|
|
using Haoliang.Data.Repositories;
|
|
using Haoliang.Data.Entities;
|
|
|
|
namespace Haoliang.Tests
|
|
{
|
|
public class DeviceRepositoryTests
|
|
{
|
|
[Fact]
|
|
public void GetAllDevices_WhenNoDevices_ReturnsEmptyList()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
// Act
|
|
var devices = repository.GetAllDevices();
|
|
|
|
// Assert
|
|
Assert.Empty(devices);
|
|
}
|
|
|
|
[Fact]
|
|
public void CreateDevice_WithValidDevice_ReturnsCreatedDevice()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
var device = new CNCDevice
|
|
{
|
|
DeviceCode = "TEST001",
|
|
DeviceName = "测试设备",
|
|
IPAddress = "192.168.1.100",
|
|
HttpUrl = "http://192.168.1.100/api/status",
|
|
CollectionInterval = 30,
|
|
TemplateId = 1,
|
|
IsAvailable = true,
|
|
IsOnline = true
|
|
};
|
|
|
|
// Act
|
|
var createdDevice = repository.CreateDevice(device);
|
|
|
|
// Assert
|
|
Assert.NotNull(createdDevice);
|
|
Assert.True(createdDevice.Id > 0);
|
|
Assert.Equal("TEST001", createdDevice.DeviceCode);
|
|
Assert.Equal("测试设备", createdDevice.DeviceName);
|
|
Assert.True(createdDevice.CreatedAt > DateTime.MinValue);
|
|
Assert.True(createdDevice.UpdatedAt > DateTime.MinValue);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetDeviceById_WithExistingDevice_ReturnsDevice()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
var device = new CNCDevice
|
|
{
|
|
DeviceCode = "TEST002",
|
|
DeviceName = "测试设备2",
|
|
IPAddress = "192.168.1.101",
|
|
HttpUrl = "http://192.168.1.101/api/status",
|
|
CollectionInterval = 60,
|
|
TemplateId = 1,
|
|
IsAvailable = true,
|
|
IsOnline = true
|
|
};
|
|
|
|
var createdDevice = repository.CreateDevice(device);
|
|
|
|
// Act
|
|
var retrievedDevice = repository.GetDeviceById(createdDevice.Id);
|
|
|
|
// Assert
|
|
Assert.NotNull(retrievedDevice);
|
|
Assert.Equal(createdDevice.Id, retrievedDevice.Id);
|
|
Assert.Equal("TEST002", retrievedDevice.DeviceCode);
|
|
Assert.Equal("测试设备2", retrievedDevice.DeviceName);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetDeviceById_WithNonExistingId_ReturnsNull()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
// Act
|
|
var device = repository.GetDeviceById(999);
|
|
|
|
// Assert
|
|
Assert.Null(device);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetDeviceByCode_WithExistingCode_ReturnsDevice()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
var device = new CNCDevice
|
|
{
|
|
DeviceCode = "TEST003",
|
|
DeviceName = "测试设备3",
|
|
IPAddress = "192.168.1.102",
|
|
HttpUrl = "http://192.168.1.102/api/status",
|
|
CollectionInterval = 45,
|
|
TemplateId = 1,
|
|
IsAvailable = false,
|
|
IsOnline = false
|
|
};
|
|
|
|
repository.CreateDevice(device);
|
|
|
|
// Act
|
|
var retrievedDevice = repository.GetDeviceByCode("TEST003");
|
|
|
|
// Assert
|
|
Assert.NotNull(retrievedDevice);
|
|
Assert.Equal("TEST003", retrievedDevice.DeviceCode);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetOnlineDevices_WithMixedDevices_ReturnsOnlyOnlineDevices()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
// Create online device
|
|
var onlineDevice = new CNCDevice
|
|
{
|
|
DeviceCode = "ONLINE001",
|
|
DeviceName = "在线设备",
|
|
IsOnline = true,
|
|
IsAvailable = true
|
|
};
|
|
repository.CreateDevice(onlineDevice);
|
|
|
|
// Create offline device
|
|
var offlineDevice = new CNCDevice
|
|
{
|
|
DeviceCode = "OFFLINE001",
|
|
DeviceName = "离线设备",
|
|
IsOnline = false,
|
|
IsAvailable = true
|
|
};
|
|
repository.CreateDevice(offlineDevice);
|
|
|
|
// Act
|
|
var onlineDevices = repository.GetOnlineDevices();
|
|
|
|
// Assert
|
|
Assert.Single(onlineDevices);
|
|
Assert.Equal("ONLINE001", onlineDevices.First().DeviceCode);
|
|
}
|
|
|
|
[Fact]
|
|
public void UpdateDevice_WithValidDevice_UpdatesDevice()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
var device = new CNCDevice
|
|
{
|
|
DeviceCode = "TEST004",
|
|
DeviceName = "原始名称",
|
|
IPAddress = "192.168.1.103",
|
|
HttpUrl = "http://192.168.1.103/api/status",
|
|
CollectionInterval = 30,
|
|
TemplateId = 1,
|
|
IsAvailable = true,
|
|
IsOnline = true
|
|
};
|
|
|
|
var createdDevice = repository.CreateDevice(device);
|
|
|
|
// Act
|
|
createdDevice.DeviceName = "更新后的名称";
|
|
createdDevice.IsAvailable = false;
|
|
var updatedDevice = repository.UpdateDevice(createdDevice);
|
|
|
|
// Assert
|
|
Assert.NotNull(updatedDevice);
|
|
Assert.Equal("更新后的名称", updatedDevice.DeviceName);
|
|
Assert.False(updatedDevice.IsAvailable);
|
|
Assert.True(updatedDevice.UpdatedAt > createdDevice.CreatedAt);
|
|
}
|
|
|
|
[Fact]
|
|
public void DeleteDevice_WithExistingId_DeletesDevice()
|
|
{
|
|
// Arrange
|
|
var options = CreateNewDbContextOptions();
|
|
using var context = new CNCBusinessDbContext(options);
|
|
var repository = new DeviceRepository(context);
|
|
|
|
var device = new CNCDevice
|
|
{
|
|
DeviceCode = "DELETE001",
|
|
DeviceName = "待删除设备",
|
|
IPAddress = "192.168.1.104",
|
|
HttpUrl = "http://192.168.1.104/api/status",
|
|
CollectionInterval = 30,
|
|
TemplateId = 1,
|
|
IsAvailable = true,
|
|
IsOnline = true
|
|
};
|
|
|
|
var createdDevice = repository.CreateDevice(device);
|
|
|
|
// Act
|
|
repository.DeleteDevice(createdDevice.Id);
|
|
|
|
// Assert
|
|
var deletedDevice = repository.GetDeviceById(createdDevice.Id);
|
|
Assert.Null(deletedDevice);
|
|
}
|
|
|
|
private static Microsoft.EntityFrameworkCore.DbContextOptions<CNCBusinessDbContext> CreateNewDbContextOptions()
|
|
{
|
|
var optionsBuilder = new Microsoft.EntityFrameworkCore.DbContextOptionsBuilder<CNCBusinessDbContext>();
|
|
optionsBuilder.UseInMemoryDatabase("TestDatabase_" + Guid.NewGuid().ToString());
|
|
return optionsBuilder.Options;
|
|
}
|
|
}
|
|
} |