diff --git a/SmartCharger.Business/Interfaces/IChargerService.cs b/SmartCharger.Business/Interfaces/IChargerService.cs index ad4a218..da6606b 100644 --- a/SmartCharger.Business/Interfaces/IChargerService.cs +++ b/SmartCharger.Business/Interfaces/IChargerService.cs @@ -6,6 +6,7 @@ public interface IChargerService { Task CreateNewCharger(ChargerDTO charger); Task GetAllChargers(int page, int pageSize, string search); + Task GetChargerById(int chargerId); Task UpdateCharger(int chargerId, ChargerDTO charger); Task DeleteCharger(int chargerId); diff --git a/SmartCharger.Business/Services/ChargerService.cs b/SmartCharger.Business/Services/ChargerService.cs index 8d4b33f..13eb24a 100644 --- a/SmartCharger.Business/Services/ChargerService.cs +++ b/SmartCharger.Business/Services/ChargerService.cs @@ -295,5 +295,38 @@ private void UpdateCharger(Charger chargerEntity, ChargerDTO charger) chargerEntity.Latitude = charger.Latitude; chargerEntity.Longitude = charger.Longitude; } + + public async Task GetChargerById(int chargerId) + { + try + { + + var charger = await _context.Chargers.SingleOrDefaultAsync(c => c.Id == chargerId); + if (charger == null) + { + return new ChargerResponseDTO + { + Success = false, + Message = "Charger with that ID doesn't exist.", + Charger = null + }; + } + return new ChargerResponseDTO + { + Success = true, + Message = $"Charger exists.", + Charger = MapChargerToDTO(charger) + }; + } + catch (Exception ex) + { + return new ChargerResponseDTO + { + Success = false, + Message = "An error occurred: " + ex.Message, + Charger = null + }; + } + } } } diff --git a/SmartCharger.Test/ControllerTests/ChargerControllerTests.cs b/SmartCharger.Test/ControllerTests/ChargerControllerTests.cs index c86b1b6..620780e 100644 --- a/SmartCharger.Test/ControllerTests/ChargerControllerTests.cs +++ b/SmartCharger.Test/ControllerTests/ChargerControllerTests.cs @@ -497,5 +497,71 @@ public async Task UpdateCharger_WhenChargersNameInvalid_ShouldReturnBadRequest() Assert.Equal("Name of the charger cannot be empty.", response.Error); } + + [Fact] + public async Task GetChargerById_WhenChargerServiceReturnsCharger_ShouldReturnOk() + { + // Arrange + var chargerServiceMock = new Mock(); + chargerServiceMock.Setup(service => service.GetChargerById(It.IsAny())).ReturnsAsync(new ChargerResponseDTO + { + Success = true, + Message = "Charger exists.", + Charger = new ChargerDTO + { + Id = 1, + Name = "Charger 1", + Latitude = 55, + Longitude = 50, + } + }); + + var controller = new ChargerController(chargerServiceMock.Object); + + // Act + var actionResult = await controller.GetChargerById(1); + + // Assert + Assert.NotNull(actionResult); + var result = actionResult.Result as ObjectResult; + Assert.Equal(200, result.StatusCode); + var response = result.Value as ChargerResponseDTO; + Assert.NotNull(response); + Assert.True(response.Success); + Assert.Equal("Charger exists.", response.Message); + Assert.Equal(1, response.Charger.Id); + Assert.Equal(55, response.Charger.Latitude); + Assert.Equal(50, response.Charger.Longitude); + Assert.Equal("Charger 1", response.Charger.Name); + } + + [Fact] + public async Task GetChargerById_WhenChargerServiceReturnsNoCharger_ShouldReturnBadRequest() + { + // Arrange + var chargerServiceMock = new Mock(); + chargerServiceMock.Setup(service => service.GetChargerById(It.IsAny())).ReturnsAsync(new ChargerResponseDTO + { + Success = false, + Message = "Charger with that ID doesn't exist.", + Charger = null + }); + + var controller = new ChargerController(chargerServiceMock.Object); + + // Act + var actionResult = await controller.GetChargerById(2); + + // Assert + Assert.NotNull(actionResult); + var result = actionResult.Result as ObjectResult; + Assert.Equal(400, result.StatusCode); + var response = result.Value as ChargerResponseDTO; + Assert.NotNull(response); + Assert.False(response.Success); + Assert.Equal("Charger with that ID doesn't exist.", response.Message); + Assert.Null(response.Charger); + } + } } diff --git a/SmartCharger.Test/ServicesTests/ChargerServiceTests.cs b/SmartCharger.Test/ServicesTests/ChargerServiceTests.cs index fc8534c..8bcd264 100644 --- a/SmartCharger.Test/ServicesTests/ChargerServiceTests.cs +++ b/SmartCharger.Test/ServicesTests/ChargerServiceTests.cs @@ -12,6 +12,7 @@ using System.Text; using System.Threading.Channels; using System.Threading.Tasks; +using System.Xml.Linq; using static System.Runtime.InteropServices.JavaScript.JSType; namespace SmartCharger.Test.ServicesTests @@ -427,6 +428,66 @@ public async Task DeleteCharger_WhenChargerDoesntExist_ShouldReturnFailure() } + [Fact] + public async Task GetChargerById_WhenChargerExists_ShouldReturnCharger() + { + // Arrange + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "ChargerServiceDatabaseGetById1") + .Options; + + using (var context = new SmartChargerContext(options)) + { + SetupChargerDatabase(context); + } + + using (var context = new SmartChargerContext(options)) + { + var chargerService = new ChargerService(context); + + // Act + ChargerResponseDTO result = await chargerService.GetChargerById(1); + + // Assert + Assert.True(result.Success); + Assert.Equal("Charger exists.", result.Message); + Assert.NotNull(result.Charger); + Assert.Equal("Charger 1", result.Charger.Name); + Assert.Equal(1, result.Charger.Id); + Assert.Equal("Charger 1", result.Charger.Name); + Assert.Equal(40.7128, result.Charger.Latitude); + Assert.Equal(-74.0060, result.Charger.Longitude); + } + } + + [Fact] + public async Task GetChargerById_WhenChargerDoesNotExist_ShouldReturnFailure() + { + // Arrange + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "ChargerServiceDatabaseGetById") + .Options; + + using (var context = new SmartChargerContext(options)) + { + SetupChargerDatabase(context); + } + + using (var context = new SmartChargerContext(options)) + { + var chargerService = new ChargerService(context); + + // Act + ChargerResponseDTO result = await chargerService.GetChargerById(3); + + // Assert + Assert.False(result.Success); + Assert.Equal("Charger with that ID doesn't exist.", result.Message); + Assert.Null(result.Charger); + } + } + + private void SetupChargerDatabase(SmartChargerContext context) { var chargers = new List diff --git a/SmartCharger/Controllers/ChargerController.cs b/SmartCharger/Controllers/ChargerController.cs index 4599d17..93a45af 100644 --- a/SmartCharger/Controllers/ChargerController.cs +++ b/SmartCharger/Controllers/ChargerController.cs @@ -70,5 +70,18 @@ public async Task UpdateCharger(int chargerId, [FromBody]ChargerD return Ok(response); } + + [Authorize(Policy = "Admin")] + [HttpGet("admin/chargers/{chargerId}")] + public async Task>> GetChargerById(int chargerId) + { + ChargerResponseDTO response = await _chargerService.GetChargerById(chargerId); + if (response.Success == false) + { + return BadRequest(response); + } + + return Ok(response); + } } } diff --git a/SmartCharger/appsettings.Development.json b/SmartCharger/appsettings.Development.json index 771501e..f686e69 100644 --- a/SmartCharger/appsettings.Development.json +++ b/SmartCharger/appsettings.Development.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "Connection": "Server=dumbo.db.elephantsql.com;Username=oupptaev;Password=y8ezc0d592OdRc-vFXnyFfsiLk3rebQa;Database=oupptaev;" + "connection": "Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=1234;" }, "AllowedHosts": "*", "JWT": { diff --git a/SmartCharger/appsettings.json b/SmartCharger/appsettings.json index 62aae0d..87ebf27 100644 --- a/SmartCharger/appsettings.json +++ b/SmartCharger/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "Connection": "Server=dumbo.db.elephantsql.com;Username=oupptaev;Password=y8ezc0d592OdRc-vFXnyFfsiLk3rebQa;Database=oupptaev;", + "connection": "Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=1234;" }, "AllowedHosts": "*", "JWT": {