From 2a6f1cd0e0e61a1d266d6d7b34c3f37b2c6525fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Konvi=C4=8Dka?= <konvicka.g630@gmail.com> Date: Mon, 22 Jan 2024 20:04:11 +0100 Subject: [PATCH] feat: Add tests --- CodeToXMI.sln.DotSettings.user | 22 +- UnitTest/WebApiTests.cs | 313 +++++++++++++++++++++++++++- WebAPI/Controllers/ApiController.cs | 30 ++- 3 files changed, 342 insertions(+), 23 deletions(-) diff --git a/CodeToXMI.sln.DotSettings.user b/CodeToXMI.sln.DotSettings.user index 1dd7c1d..822c584 100644 --- a/CodeToXMI.sln.DotSettings.user +++ b/CodeToXMI.sln.DotSettings.user @@ -1,16 +1,25 @@ <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <s:String x:Key="/Default/Environment/Hierarchy/Build/BuildTool/CustomBuildToolPath/@EntryValue">/usr/local/share/dotnet/sdk/7.0.404/MSBuild.dll</s:String> <s:Int64 x:Key="/Default/Environment/Hierarchy/Build/BuildTool/MsbuildVersion/@EntryValue">1114112</s:Int64> + <s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">/Users/jakubkonvicka/Library/Caches/JetBrains/Rider2023.3/resharper-host/temp/Rider/vAny/CoverageData/_CodeToXMI.401400098/Snapshot/snapshot.utdcvr</s:String> <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=1172169d_002D8cd5_002D4c97_002D94b5_002D78b35c14dd26/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=2d2ab9f7_002Dd90c_002D41dc_002D8955_002D125aee8ae064/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="ListAllEmpty" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests</TestId> + </TestAncestor> </SessionState></s:String> <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=33cb20c1_002D7095_002D4c53_002Daff8_002Dbc67f6869c16/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=3e8231df_002D04bd_002D49f0_002D8d73_002Df9481dc4cc9e/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="WebApiTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Project Location="/Users/jakubkonvicka/RiderProjects/diplomathesis/UnitTest" Presentation="&lt;UnitTest&gt;" /> </SessionState></s:String> <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=447f0ad2_002D3982_002D4c13_002D8562_002D18748dcc27d7/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #4" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> @@ -32,6 +41,11 @@ <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions</TestId> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=c6398b25_002D34a8_002D43e8_002Da6b7_002D390f376e861e/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="RegisterTestWrongToken" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests</TestId> + </TestAncestor> </SessionState></s:String> <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d5334459_002D70ab_002D4733_002D874a_002D3629f29a0297/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #5" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> @@ -40,12 +54,18 @@ <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests</TestId> </TestAncestor> </SessionState></s:String> - <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests</TestId> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildEmptyActivityDiagram</TestId> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithNActivity</TestId> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests.AuthenticationTestWrongPassword</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=fda6a1bd_002Dc689_002D49fc_002Db8c6_002D2b90c31a8b5e/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="RegisterTest" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests.RegisterTest</TestId> </TestAncestor> </SessionState></s:String> diff --git a/UnitTest/WebApiTests.cs b/UnitTest/WebApiTests.cs index 9c8e820..58ad007 100644 --- a/UnitTest/WebApiTests.cs +++ b/UnitTest/WebApiTests.cs @@ -2,14 +2,16 @@ using Database; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; +using NUnit.Framework.Constraints; using WebAPI.Controllers; using WebAPI.DTO; +using WebAPI.DTO.External; namespace UnitTest; public class WebApiTests { - [SetUp] + [OneTimeSetUp] public void Setup() { //create db json seed file @@ -24,12 +26,37 @@ public class WebApiTests string json = JsonConvert.SerializeObject(new List<SeedUser>{seedUser}); File.WriteAllText("users.json", json); - + //remove DB file + var folder = Environment.SpecialFolder.LocalApplicationData; + var path = Environment.GetFolderPath(folder); + var dbPath = System.IO.Path.Join(path, "database.db"); + if (File.Exists(dbPath)) + { + File.Delete(dbPath); + } } - [Test] - public void AuthenticationTest() + #region AuthenticationTests + [TestCase("TestUser", "TestPassword")] + public void AuthenticationTest(string username = "TestUser", string password = "TestPassword") + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "TestUser", + Password = "TestPassword" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is OkObjectResult); + var okResult = result as OkObjectResult; + var token = okResult.Value as string; + Assert.IsTrue(!string.IsNullOrEmpty(token)); + } + + public string TestUserAuthenticationProcedure(string username = "TestUser", string password = "TestPassword") { var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); ApiController apiController = new ApiController(null, null, path); @@ -44,7 +71,285 @@ public class WebApiTests var okResult = result as OkObjectResult; var token = okResult.Value as string; Assert.IsTrue(!string.IsNullOrEmpty(token)); + return okResult.Value as string; + } + + [Test] + public void AuthenticationTestWrongPassword() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "TestUser", + Password = "WrongPassword" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is BadRequestObjectResult); + } + + [Test] + public void AuthenticationTestWrongUsername() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "WrongUser", + Password = "TestPassword" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is NotFoundObjectResult); + } + + [Test] + public void AuthenticationTestEmptyUsername() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "", + Password = "TestPassword" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is NotFoundObjectResult); + } + + [Test] + public void AuthenticationTestEmptyPassword() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "TestUser", + Password = "" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is BadRequestObjectResult); + } + + [Test] + public void AuthenticationTestEmptyUsernameAndPassword() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new AuthenticateUserModel() + { + Username = "", + Password = "" + }; + var result = apiController.AuthenticateUserPassword(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is NotFoundObjectResult); + } + #endregion + + #region Register Tests + + [Test] + public void RegisterTest() + { + string token = GetToken(TestUserAuthenticationProcedure()); + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new RegisterUserModel() + { + Username = "TestUser2", + Password = "TestPassword2", + Token = token + }; + var result = apiController.RegisterUser(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is OkObjectResult); + var okResult = result as OkObjectResult; + Assert.IsTrue(!string.IsNullOrEmpty(okResult.Value as string)); + Assert.IsTrue((okResult.Value as string) == "User created"); + } + + [Test] + public void RegisterAlreadyExistingUserTest() + { + string token = GetToken(TestUserAuthenticationProcedure()); + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new RegisterUserModel() + { + Username = "TestUser", + Password = "TestPassword2", + Token = token + }; + var result = apiController.RegisterUser(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is BadRequestObjectResult); + var okResult = result as BadRequestObjectResult; + Assert.IsTrue(!string.IsNullOrEmpty(okResult.Value as string)); + Assert.IsTrue((okResult.Value as string) == "User already exists"); + } + + [Test] + public void RegisterTestWrongToken() + { + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new RegisterUserModel() + { + Username = "TestUser2", + Password = "TestPassword2", + Token = "WrongToken" + }; + var result = apiController.RegisterUser(model); + //assert that returns Ok and parse token + Assert.IsTrue(result is BadRequestObjectResult); + var okResult = result as BadRequestObjectResult; + Assert.IsTrue(!string.IsNullOrEmpty(okResult.Value as string)); + Assert.IsTrue((okResult.Value as string) == "Invalid token"); + } + + [Test] + public void AuthenticateNewRegisteredUser() + { + AuthenticationTest("TestUser2", "TestPassword2"); + } + #endregion + + #region Code Upload and List Tests + [TestCase(true, 0)] + [TestCase(false, 0)] + public void ListAll(bool getValidToken, int count) + { + string token = string.Empty; + if (getValidToken) + { + token = GetToken(TestUserAuthenticationProcedure()); + } + else + { + token = "WrongToken"; + } + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var result = apiController.ListAllCode(token); + + if (getValidToken) + { + Assert.IsTrue(result is OkObjectResult); + var okResult = result as OkObjectResult; + Assert.IsTrue(okResult.Value is List<SourceCodeExt>); + var list = okResult.Value as List<SourceCodeExt>; + Assert.IsTrue(list.Count == count); + } + else + { + Assert.IsTrue(result is BadRequestObjectResult); + var okResult = result as BadRequestObjectResult; + Assert.IsTrue(okResult.Value is string); + Assert.IsTrue(okResult.Value as string == "Invalid token"); + } + } + [TestCase(true)] + [TestCase(false)] + public void UploadCode(bool getValidToken) + { + string token = string.Empty; + if (getValidToken) + { + token = GetToken(TestUserAuthenticationProcedure()); + } + else + { + token = "WrongToken"; + } + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var model = new UploadCodeModel() + { + Token = token, + Code = "TestCode", + }; + var result = apiController.UploadCode(model); + if (getValidToken) + { + Assert.IsTrue(result is OkObjectResult); + var okResult = result as OkObjectResult; + Assert.IsTrue(okResult.Value is string); + //parse Code uploaded, id: 1 + var value = okResult.Value as string; + var id = value.Split("Code uploaded, id:")[1].Trim(); + Assert.IsTrue(!string.IsNullOrEmpty(id)); + Assert.IsTrue(int.TryParse(id, out int idInt)); + Assert.IsTrue(idInt == 1); + ListAll(true, 1); + ListOne(true, 1, true); + } + else + { + Assert.IsTrue(result is BadRequestObjectResult); + var okResult = result as BadRequestObjectResult; + Assert.IsTrue(okResult.Value is string); + Assert.IsTrue(okResult.Value as string == "Invalid token"); + } + } + + [TestCase(true, -1, false)] + [TestCase(false, -1, false)] + public void ListOne(bool getValidToken, int id, bool codeExists) + { + string token = string.Empty; + if (getValidToken) + { + token = GetToken(TestUserAuthenticationProcedure()); + } + else + { + token = "WrongToken"; + } + var path = Path.Join(Directory.GetCurrentDirectory(), "users.json"); + ApiController apiController = new ApiController(null, null, path); + var result = apiController.ListCode(token, id); + if (getValidToken) + { + if (codeExists) + { + Assert.IsTrue(result is OkObjectResult); + var okResult = result as OkObjectResult; + Assert.IsTrue(okResult.Value is SourceCodeExt); + var code = okResult.Value as SourceCodeExt; + Assert.IsTrue(code.Id == id); + } + else + { + Assert.IsTrue(result is NotFoundObjectResult); + var okResult = result as NotFoundObjectResult; + Assert.IsTrue(okResult.Value is string); + Assert.IsTrue(okResult.Value as string == "Code does not exist"); + } + + } + else + { + Assert.IsTrue(result is BadRequestObjectResult); + var okResult = result as BadRequestObjectResult; + Assert.IsTrue(okResult.Value is string); + Assert.IsTrue(okResult.Value as string == "Invalid token"); + } + } + + + #endregion + + private string GetToken(string authResult) + { + //parse guid from authResult + //User authenticated, token: 4a0a63ef-ff08-4259-a53a-19b9373fd666 + return authResult.Split("token:")[1].Trim(); + } } \ No newline at end of file diff --git a/WebAPI/Controllers/ApiController.cs b/WebAPI/Controllers/ApiController.cs index 6c6cb43..5fd2a6d 100644 --- a/WebAPI/Controllers/ApiController.cs +++ b/WebAPI/Controllers/ApiController.cs @@ -21,7 +21,7 @@ namespace WebAPI.Controllers { private readonly ILogger<ApiController> _logger; private readonly IConfiguration _configuration; - private int tokenValidityMinutes => _configuration.GetValue<int>("UserManagement:TokenValidityMinutes"); + private int tokenValidityMinutes => _configuration?.GetValue<int>("UserManagement:TokenValidityMinutes") ?? 30; public ApiController(ILogger<ApiController> logger, IConfiguration configuration, string dbPath) { @@ -235,26 +235,20 @@ namespace WebAPI.Controllers var user = TokenManager.GetUser(token, tokenValidityMinutes); using var db = new DatabaseContext(); - var sourceCodes = db.SourceCodes.Where(s => - s.UserId == user.Id && - s.Id == id) - .ToList(); + var sourceCodeInternal = db.SourceCodes + .FirstOrDefault(s => s.UserId == user.Id && + s.Id == id); - if (sourceCodes.Count == 0) + if (sourceCodeInternal == null) { - return Ok(new List<SourceCodeExt>()); + return NotFound("Code does not exist"); } - - List<SourceCodeExt> sourceCodeExts = new List<SourceCodeExt>(); - foreach (var sourceCode in sourceCodes) + var sourceCode = new SourceCodeExt { - sourceCodeExts.Add(new SourceCodeExt - { - Id = sourceCode.Id, - Code = sourceCode.Code - }); - } - return Ok(sourceCodeExts); + Id = sourceCodeInternal.Id, + Code = sourceCodeInternal.Code + }; + return Ok(sourceCode); } else { @@ -329,7 +323,7 @@ namespace WebAPI.Controllers var passwordHash = PasswordHasher.Hash(model.Password); using var db = new DatabaseContext(); - var user = db.Users.FirstOrDefault(u => u.Name == passwordHash); + var user = db.Users.FirstOrDefault(u => u.Name == model.Username); if (user != null) { //user exists -- GitLab