using System.Text.Json; using Tau.Acuvim.Console.DTOs; using Tau.Acuvim.Console.Models; using Tau.Acuvim.Console.Services; namespace Tau.Acuvim.Console.Tests; public class DeviceServiceTests { private DeviceService CreateService(Data.AppDbContext db) => new(db, TestHelpers.CreateLogger()); [Fact] public async Task RegisterAsync_CreatesNewDevice() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); var payload = JsonSerializer.Serialize(new { device_id = "DEV-001", mac = "AA:BB:CC:DD:EE:FF", firmware = "1.0.0", hardware = "rev-A", imei = "123456789012345", ts = 1700000000L }); var device = await svc.RegisterAsync(payload); Assert.Equal("DEV-001", device.DeviceId); Assert.Equal("AA:BB:CC:DD:EE:FF", device.MacAddress); Assert.Equal("1.0.0", device.FirmwareVersion); Assert.Equal("rev-A", device.Hardware); Assert.Equal("123456789012345", device.Imei); Assert.Equal("online", device.Status); Assert.Single(db.Devices); } [Fact] public async Task RegisterAsync_UpdatesExistingDevice() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); var payload1 = JsonSerializer.Serialize(new { device_id = "DEV-001", firmware = "1.0.0" }); await svc.RegisterAsync(payload1); var payload2 = JsonSerializer.Serialize(new { device_id = "DEV-001", firmware = "2.0.0" }); var device = await svc.RegisterAsync(payload2); Assert.Equal("2.0.0", device.FirmwareVersion); Assert.Single(db.Devices); } [Fact] public async Task GetAllAsync_FiltersByStatus() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); db.Devices.AddRange( new Device { Id = Guid.NewGuid(), DeviceId = "D1", Status = "online" }, new Device { Id = Guid.NewGuid(), DeviceId = "D2", Status = "offline" }, new Device { Id = Guid.NewGuid(), DeviceId = "D3", Status = "online" } ); await db.SaveChangesAsync(); var result = await svc.GetAllAsync(status: "online", search: null, page: 1, pageSize: 10); Assert.Equal(2, result.Count); Assert.All(result, r => Assert.Equal("online", r.Status)); } [Fact] public async Task GetAllAsync_SearchesByName() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); db.Devices.AddRange( new Device { Id = Guid.NewGuid(), DeviceId = "D1", Name = "Sensor Alpha" }, new Device { Id = Guid.NewGuid(), DeviceId = "D2", Name = "Sensor Beta" }, new Device { Id = Guid.NewGuid(), DeviceId = "D3", Name = "Motor Gamma" } ); await db.SaveChangesAsync(); var result = await svc.GetAllAsync(status: null, search: "Sensor", page: 1, pageSize: 10); Assert.Equal(2, result.Count); } [Fact] public async Task GetByDeviceIdAsync_ReturnsNull_WhenNotFound() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); var result = await svc.GetByDeviceIdAsync("NONEXISTENT"); Assert.Null(result); } [Fact] public async Task DeleteAsync_RemovesDevice() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); db.Devices.Add(new Device { Id = Guid.NewGuid(), DeviceId = "DEV-DEL" }); await db.SaveChangesAsync(); var result = await svc.DeleteAsync("DEV-DEL"); Assert.True(result); Assert.Empty(db.Devices); } [Fact] public async Task DeleteAsync_ReturnsFalse_WhenNotFound() { using var db = TestHelpers.CreateDbContext(); var svc = CreateService(db); var result = await svc.DeleteAsync("NONEXISTENT"); Assert.False(result); } }