Skip to content
Snippets Groups Projects
Commit 2a6f1cd0 authored by Jakub Konvička's avatar Jakub Konvička
Browse files

feat: Add tests

parent 546012c8
Branches
1 merge request!15merge: develop into main
Pipeline #909 passed with stages
in 5 minutes and 55 seconds
<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">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=2d2ab9f7_002Dd90c_002D41dc_002D8955_002D125aee8ae064/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="ListAllEmpty" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=33cb20c1_002D7095_002D4c53_002Daff8_002Dbc67f6869c16/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=3e8231df_002D04bd_002D49f0_002D8d73_002Df9481dc4cc9e/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="WebApiTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;Project Location="/Users/jakubkonvicka/RiderProjects/diplomathesis/UnitTest" Presentation="&amp;lt;UnitTest&amp;gt;" /&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=447f0ad2_002D3982_002D4c13_002D8562_002D18748dcc27d7/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #4" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
......@@ -32,6 +41,11 @@
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=c6398b25_002D34a8_002D43e8_002Da6b7_002D390f376e861e/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="RegisterTestWrongToken" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d5334459_002D70ab_002D4733_002D874a_002D3629f29a0297/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #5" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
......@@ -40,12 +54,18 @@
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildEmptyActivityDiagram&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithNActivity&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests.AuthenticationTestWrongPassword&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=fda6a1bd_002Dc689_002D49fc_002Db8c6_002D2b90c31a8b5e/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="RegisterTest" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.WebApiTests.RegisterTest&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
......
......@@ -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
......@@ -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
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment