diff --git a/AsbCloud.sln b/AsbCloud.sln
index f19612c2..c7974f1a 100644
--- a/AsbCloud.sln
+++ b/AsbCloud.sln
@@ -13,7 +13,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp1", "ConsoleApp1\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudDb", "AsbCloudDb\AsbCloudDb.csproj", "{40FBD29B-724B-4496-B5D9-1A5D14102456}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTable", "DataTable\DataTable.csproj", "{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataTable", "DataTable\DataTable.csproj", "{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsbCloudWebApi.Tests", "AsbCloudWebApi.Tests\AsbCloudWebApi.Tests.csproj", "{9CF6FBB1-9AF5-45AB-A521-24F11A79B540}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -45,6 +47,10 @@ Global
{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj
new file mode 100644
index 00000000..2147f08c
--- /dev/null
+++ b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj
@@ -0,0 +1,27 @@
+
+
+
+ net5.0
+
+ false
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
diff --git a/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs b/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs
new file mode 100644
index 00000000..398fa8ce
--- /dev/null
+++ b/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs
@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Claims;
+using Xunit;
+using Moq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Http;
+using AsbCloudWebApi.Controllers;
+using AsbCloudApp.Services;
+using AsbCloudApp.Data;
+
+namespace AsbCloudWebApi.Tests.ControllersTests
+{
+ public class AnalyticsControllerTests
+ {
+ private readonly Mock analyticsService;
+ private readonly Mock wellService;
+ private readonly AnalyticsController controller;
+ private readonly List depthToDayDtos;
+
+ // fills class fields with data. Each test inside can change this data themselves for their needs
+ public AnalyticsControllerTests()
+ {
+ analyticsService = new Mock();
+ wellService = new Mock();
+
+ depthToDayDtos = new List()
+ {
+ new WellDepthToDayDto { WellDepth = 1000.0, BitDepth = 1000.0, Date = DateTime.Now },
+ new WellDepthToDayDto { WellDepth = 2000.0, BitDepth = 2000.0, Date = DateTime.Now },
+ new WellDepthToDayDto { WellDepth = 3000.0, BitDepth = 3000.0, Date = DateTime.Now }
+ };
+
+ analyticsService.Setup(s => s.GetWellDepthToDay(It.IsAny()))
+ .Returns(depthToDayDtos);
+
+ wellService.Setup(s => s.CheckWellOwnership(It.IsAny(), It.IsAny()))
+ .Returns(true);
+
+ controller = new AnalyticsController(analyticsService.Object,
+ wellService.Object);
+
+ var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
+ {
+ new Claim("idCustomer", "1"),
+ }, "mock"));
+
+ controller.ControllerContext = new ControllerContext()
+ {
+ HttpContext = new DefaultHttpContext() { User = user }
+ };
+ }
+
+ [Fact]
+ public void It_should_return_depth_to_day_analytics()
+ {
+ var result = controller.GetWellDepthToDay(1);
+ var okResult = result as OkObjectResult;
+
+ Assert.NotNull(okResult);
+ }
+
+ [Fact]
+ public void It_should_return_correct_count_depth_to_day_analytics()
+ {
+ var result = controller.GetWellDepthToDay(1);
+ var okResult = result as OkObjectResult;
+ var resultCount = ((List)okResult.Value).Count;
+
+ Assert.Equal(3, resultCount);
+ }
+
+ [Fact]
+ public void It_should_return_403_if_no_idCustomer()
+ {
+ var emptyUserController = new AnalyticsController(analyticsService.Object,
+ wellService.Object);
+
+ var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { }, "mock"));
+
+ emptyUserController.ControllerContext = new ControllerContext()
+ {
+ HttpContext = new DefaultHttpContext() { User = user }
+ };
+
+ var result = emptyUserController.GetWellDepthToDay(1);
+ var forbidResult = result as ForbidResult;
+
+ Assert.NotNull(forbidResult);
+ }
+
+ [Fact]
+ public void It_should_return_403_if_user_doesnt_own_well()
+ {
+ var wellServiceReturnsFalse = new Mock();
+
+ wellServiceReturnsFalse.Setup(s => s.CheckWellOwnership(It.IsAny(), It.IsAny()))
+ .Returns(false);
+
+ var newControllerInstance = new AnalyticsController(analyticsService.Object,
+ wellServiceReturnsFalse.Object);
+
+ var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
+ {
+ new Claim("idCustomer", "1"),
+ }, "mock"));
+
+ newControllerInstance.ControllerContext = new ControllerContext()
+ {
+ HttpContext = new DefaultHttpContext() { User = user }
+ };
+
+ var result = newControllerInstance.GetWellDepthToDay(1);
+ var forbidResult = result as ForbidResult;
+
+ Assert.NotNull(forbidResult);
+ }
+
+ [Fact]
+ public void It_should_return_204_if_dtos_is_empty()
+ {
+ var emptyAnalyticsService = new Mock();
+
+ emptyAnalyticsService.Setup(s => s.GetWellDepthToDay(It.IsAny()))
+ .Returns(new List());
+
+ var newControllerInstance = new AnalyticsController(emptyAnalyticsService.Object,
+ wellService.Object);
+
+ var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
+ {
+ new Claim("idCustomer", "1"),
+ }, "mock"));
+
+ newControllerInstance.ControllerContext = new ControllerContext()
+ {
+ HttpContext = new DefaultHttpContext() { User = user }
+ };
+
+ var result = newControllerInstance.GetWellDepthToDay(1);
+ var notFoundResult = result as NoContentResult;
+
+ Assert.NotNull(notFoundResult);
+ }
+
+ [Fact]
+ public void It_should_return_204_if_dtos_is_null()
+ {
+ var emptyAnalyticsService = new Mock();
+
+ emptyAnalyticsService.Setup(s => s.GetWellDepthToDay(It.IsAny()))
+ .Returns(value: null);
+
+ var newControllerInstance = new AnalyticsController(emptyAnalyticsService.Object,
+ wellService.Object);
+
+ var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
+ {
+ new Claim("idCustomer", "1"),
+ }, "mock"));
+
+ newControllerInstance.ControllerContext = new ControllerContext()
+ {
+ HttpContext = new DefaultHttpContext() { User = user }
+ };
+
+ var result = newControllerInstance.GetWellDepthToDay(1);
+ var notFoundResult = result as NoContentResult;
+
+ Assert.NotNull(notFoundResult);
+ }
+ }
+}
\ No newline at end of file