diff --git a/CodeToXMI.sln.DotSettings.user b/CodeToXMI.sln.DotSettings.user
index 1dd7c1da3d3a54c42c9c53b4a5e066bffccdf3d8..822c584913ed2180a0d6398ebabf842cdeb2a54b 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">&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>
 	
diff --git a/UnitTest/WebApiTests.cs b/UnitTest/WebApiTests.cs
index 9c8e820c3e1f2fd8a58bb8dc844f35ab7d4e1d29..58ad007feb4acccf0eb628f9e34d07fe7ce89b6d 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 6c6cb43ead4f55ac3f297bc8996b6f4e0574b7ce..5fd2a6dc3b8106437d7e29cd5a7df77a72e1858d 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