diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fe00fddf470dd93223d85e7856790fb30fbd4a47..6352f81b1339cce046a298562942ac52163bab7a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -297,6 +297,26 @@ test-analyse-service:
       junit: ./dbrepo-analyse-service/report.xml
   coverage: '/TOTAL.*?([0-9]{1,3})%/'
 
+test-auth-service-init:
+  image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
+  stage: test
+  variables:
+    PIPENV_PIPFILE: "./dbrepo-auth-service/init/Pipfile"
+  script:
+    - "pip install pipenv"
+    - "pipenv install gunicorn && pipenv install --dev --system --deploy"
+    - cd ./dbrepo-auth-service/init/ && coverage run -m pytest test/test_unit_app.py --junitxml=report.xml && coverage html --omit="test/*" && coverage report --omit="test/*" > ./coverage.txt
+    - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
+  artifacts:
+    when: always
+    paths:
+      - ./dbrepo-auth-service/init/report.xml
+      - ./dbrepo-auth-service/init/coverage.txt
+    expire_in: 1 days
+    reports:
+      junit: ./dbrepo-auth-service/init/report.xml
+  coverage: '/TOTAL.*?([0-9]{1,3})%/'
+
 test-search-service:
   image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
   stage: test
diff --git a/dbrepo-auth-service/init/.gitignore b/dbrepo-auth-service/init/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..83faa6688b2694e31b9e7f1add69479402c46f27
--- /dev/null
+++ b/dbrepo-auth-service/init/.gitignore
@@ -0,0 +1,5 @@
+# IDE
+.idea/
+# artifacts
+.coverage
+report.xml
\ No newline at end of file
diff --git a/dbrepo-auth-service/init/Pipfile b/dbrepo-auth-service/init/Pipfile
index 7e33e9af28c45c4d2a747cbf916f5cde9bb23fde..f7b4b54ee1508ece7d4af92acee907edf990c4c4 100644
--- a/dbrepo-auth-service/init/Pipfile
+++ b/dbrepo-auth-service/init/Pipfile
@@ -7,5 +7,10 @@ name = "pypi"
 requests = "*"
 mariadb = "*"
 
+[dev-packages]
+coverage = "*"
+pytest = "*"
+requests-mock = "*"
+
 [requires]
 python_version = "3.11"
diff --git a/dbrepo-auth-service/init/Pipfile.lock b/dbrepo-auth-service/init/Pipfile.lock
index c7489ba174fdd940edf7eaf714137940446ff8e7..c8224a7844942ed36a6fef30185dc094f516378d 100644
--- a/dbrepo-auth-service/init/Pipfile.lock
+++ b/dbrepo-auth-service/init/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "72f9dd7f9b61aca876f3b369d1444679a25b5f692a8baa979a0fa947a868f935"
+            "sha256": "d87ee7c247235a203e58f7d0133891024afc72a1331d3d4b2edb01a401bb0c1a"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -172,5 +172,244 @@
             "version": "==2.3.0"
         }
     },
-    "develop": {}
+    "develop": {
+        "certifi": {
+            "hashes": [
+                "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56",
+                "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==2024.12.14"
+        },
+        "charset-normalizer": {
+            "hashes": [
+                "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
+                "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
+                "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
+                "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
+                "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
+                "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
+                "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
+                "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
+                "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
+                "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
+                "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
+                "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
+                "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
+                "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
+                "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
+                "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
+                "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
+                "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
+                "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
+                "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
+                "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
+                "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
+                "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
+                "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
+                "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
+                "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
+                "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
+                "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
+                "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
+                "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
+                "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
+                "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
+                "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
+                "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
+                "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
+                "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
+                "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
+                "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
+                "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
+                "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
+                "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
+                "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
+                "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
+                "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
+                "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
+                "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
+                "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
+                "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
+                "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
+                "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
+                "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
+                "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
+                "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
+                "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
+                "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
+                "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
+                "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
+                "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
+                "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
+                "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
+                "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
+                "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
+                "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
+                "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
+                "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
+                "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
+                "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
+                "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
+                "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
+                "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
+                "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
+                "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
+                "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
+                "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
+                "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
+                "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
+                "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
+                "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
+                "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
+                "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
+                "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
+                "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
+                "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
+                "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
+                "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
+                "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
+                "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
+                "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
+                "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
+                "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
+                "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
+                "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==3.4.1"
+        },
+        "coverage": {
+            "hashes": [
+                "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9",
+                "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f",
+                "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273",
+                "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994",
+                "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e",
+                "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50",
+                "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e",
+                "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e",
+                "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c",
+                "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853",
+                "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8",
+                "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8",
+                "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe",
+                "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165",
+                "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb",
+                "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59",
+                "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609",
+                "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18",
+                "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098",
+                "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd",
+                "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3",
+                "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43",
+                "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d",
+                "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359",
+                "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90",
+                "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78",
+                "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a",
+                "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99",
+                "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988",
+                "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2",
+                "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0",
+                "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694",
+                "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377",
+                "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d",
+                "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23",
+                "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312",
+                "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf",
+                "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6",
+                "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b",
+                "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c",
+                "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690",
+                "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a",
+                "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f",
+                "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4",
+                "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25",
+                "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd",
+                "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852",
+                "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0",
+                "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244",
+                "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315",
+                "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078",
+                "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0",
+                "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27",
+                "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132",
+                "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5",
+                "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247",
+                "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022",
+                "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b",
+                "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3",
+                "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18",
+                "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5",
+                "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"
+            ],
+            "index": "pypi",
+            "version": "==7.6.10"
+        },
+        "idna": {
+            "hashes": [
+                "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+                "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==3.10"
+        },
+        "iniconfig": {
+            "hashes": [
+                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==2.0.0"
+        },
+        "packaging": {
+            "hashes": [
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==24.2"
+        },
+        "pluggy": {
+            "hashes": [
+                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.0"
+        },
+        "pytest": {
+            "hashes": [
+                "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6",
+                "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"
+            ],
+            "index": "pypi",
+            "version": "==8.3.4"
+        },
+        "requests": {
+            "hashes": [
+                "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+                "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
+            ],
+            "index": "pypi",
+            "version": "==2.32.3"
+        },
+        "requests-mock": {
+            "hashes": [
+                "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563",
+                "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
+            ],
+            "index": "pypi",
+            "version": "==1.12.1"
+        },
+        "urllib3": {
+            "hashes": [
+                "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
+                "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==2.3.0"
+        }
+    }
 }
diff --git a/dbrepo-auth-service/init/app.py b/dbrepo-auth-service/init/app.py
index 5c974d8f97b45d038836828d104798f1cf9cebca..270e959fecb30c9f200ba96c8186357cb94599b9 100644
--- a/dbrepo-auth-service/init/app.py
+++ b/dbrepo-auth-service/init/app.py
@@ -1,46 +1,44 @@
 import os
-import sys
 
 import mariadb
-
 from requests import post, get
 
 endpoint = os.getenv('AUTH_SERVICE_ENDPOINT', 'http://localhost:8080')
 system_username = os.getenv('SYSTEM_USERNAME', 'admin')
 
-print(f'Fetching user id of internal user with username: {system_username}')
-response = post(url=f'{endpoint}/realms/master/protocol/openid-connect/token', data=dict({
-    'username': os.getenv('AUTH_SERVICE_ADMIN', 'admin'),
-    'password': os.getenv('AUTH_SERVICE_ADMIN_PASSWORD', 'admin'),
-    'grant_type': 'password',
-    'client_id': 'admin-cli'
-}))
-
-if response.status_code != 200:
-    print(f'Failed to obtain admin token: {response.status_code}')
-
-response = get(url=f'{endpoint}/admin/realms/dbrepo/users/?username={system_username}', headers=dict({
-    'Authorization': f'Bearer {response.json()["access_token"]}'
-}))
-if len(response.json()) != 1:
-    print(f'Failed to obtain user')
-    sys.exit(1)
-ldap_user = response.json()[0]
-print(f'Successfully fetched user id: {ldap_user["id"]}')
-ldap_user_attrs = ldap_user['attributes']
-if ldap_user_attrs is None:
-    print(f'Failed to obtain user attributes: {ldap_user}')
-    sys.exit(1)
-if 'LDAP_ID' not in ldap_user_attrs:
-    print(f'Failed to obtain ldap id: LDAP_ID not in attributes {ldap_user_attrs}')
-    sys.exit(1)
-if len(ldap_user_attrs['LDAP_ID']) != 1:
-    print(f'Failed to obtain ldap id: wrong length {len(ldap_user_attrs["LDAP_ID"])} != 1')
-    sys.exit(1)
-ldap_user_id = ldap_user_attrs['LDAP_ID'][0]
-print(f'Successfully fetched ldap user id: {ldap_user_id}')
-
-try:
+
+def fetch() -> str:
+    print(f'Fetching user id of internal user with username: {system_username}')
+    response = post(url=f'{endpoint}/realms/master/protocol/openid-connect/token', data=dict({
+        'username': os.getenv('AUTH_SERVICE_ADMIN', 'admin'),
+        'password': os.getenv('AUTH_SERVICE_ADMIN_PASSWORD', 'admin'),
+        'grant_type': 'password',
+        'client_id': 'admin-cli'
+    }))
+
+    if response.status_code != 200:
+        raise IOError(f'Failed to obtain admin token: {response.status_code}')
+
+    response = get(url=f'{endpoint}/admin/realms/dbrepo/users/?username={system_username}', headers=dict({
+        'Authorization': f'Bearer {response.json()["access_token"]}'
+    }))
+    if response.status_code != 200 or len(response.json()) != 1:
+        raise FileNotFoundError(f'Failed to obtain user')
+    ldap_user = response.json()[0]
+    print(f'Successfully fetched user id: {ldap_user["id"]}')
+    if 'attributes' not in ldap_user or ldap_user['attributes'] is None:
+        raise ModuleNotFoundError(f'Failed to obtain user attributes: {ldap_user}')
+    ldap_user_attrs = ldap_user['attributes']
+    if 'LDAP_ID' not in ldap_user_attrs:
+        raise ImportError(f'Failed to obtain ldap id: LDAP_ID not in attributes {ldap_user_attrs}')
+    if len(ldap_user_attrs['LDAP_ID']) != 1:
+        raise EnvironmentError(f'Failed to obtain ldap id: wrong length {len(ldap_user_attrs["LDAP_ID"])} != 1')
+    ldap_user_id = ldap_user_attrs['LDAP_ID'][0]
+    print(f'Successfully fetched ldap user id: {ldap_user_id}')
+    return ldap_user_id
+
+
+def save(user_id: str) -> None:
     conn = mariadb.connect(user=os.getenv('METADATA_USERNAME', 'root'),
                            password=os.getenv('METADATA_DB_PASSWORD', 'dbrepo'),
                            host="metadata-db",
@@ -49,12 +47,11 @@ try:
     cursor = conn.cursor()
     cursor.execute(
         "INSERT IGNORE INTO `mdb_users` (`id`, `username`, `email`, `mariadb_password`, `is_internal`) VALUES (?, ?, LEFT(UUID(), 20), PASSWORD(LEFT(UUID(), 20)), true)",
-        (ldap_user_id, system_username))
+        (user_id, system_username))
     conn.commit()
     conn.close()
-except mariadb.Error as e:
-    print(f"Error connecting to MariaDB Platform: {e}")
-    exit(1)
 
-print(f'Successfully inserted user')
-exit(0)
+
+if __name__ == '__main__':
+    save(fetch())
+    print(f'Successfully inserted user')
diff --git a/dbrepo-auth-service/init/test/test_unit_app.py b/dbrepo-auth-service/init/test/test_unit_app.py
new file mode 100644
index 0000000000000000000000000000000000000000..624b7d8d53e7393d2077c214278bdb98f32297ba
--- /dev/null
+++ b/dbrepo-auth-service/init/test/test_unit_app.py
@@ -0,0 +1,135 @@
+import unittest
+
+import requests_mock
+
+from app import endpoint, fetch
+
+
+class AppUnitTest(unittest.TestCase):
+    token_res = {
+        "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJETU9zNU5UamEyTjZOQW4tX080QjdqeGdHNTBhbGY0bDRkWWRVWm14SUprIn0.eyJleHAiOjE3MzczODI1MjQsImlhdCI6MTczNzM4MjQ2NCwianRpIjoiNzUxZGY2ZDAtZWYzMy00MDkzLTgyYzgtNGU2MTRiMjc5NmMzIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9tYXN0ZXIiLCJzdWIiOiJkMzFjN2VlMS1iODI3LTQ5ZGMtYmZhYS04ZjljZmU4ZDY4NWQiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJhZG1pbi1jbGkiLCJzZXNzaW9uX3N0YXRlIjoiYWU2NGQyYmQtMzIyNS00ZTA1LTk5NDMtMmJiOTFmYjhmZTUyIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIiwic2lkIjoiYWU2NGQyYmQtMzIyNS00ZTA1LTk5NDMtMmJiOTFmYjhmZTUyIn0.hBFe36TbbHLbvYckWYwVfs1AHrenRu2sC-GPjoJFb_5vKrmJBibnHQ8B3ZS2Y2NdsmWgZUwCgu-t6rZ7boAq1K3AuLQgAUQjr0W63aVwTgg-RAnUX5QV2PZO39U9QPuB_EgfKyeqTlw-9wKLC1zWaqHc1JwaudlaoreKnRVhoy-Y6lhglyqgVWmvoEPRDjBx7Q4JQQEIuRwLuYT-c6TTtginMdwSMWZ3cTv9tXf23pUUUkugtAA0Z9cCQxuD9zeKG2YunWjDic1ZIIEwO0IxD-lP_yvtB2expolcyzgPe80Z8Psigtnoaoiti_ERqqP8DRcPVdsXEpBrQhlC8Wj86A",
+        "expires_in": 60,
+        "refresh_expires_in": 1800,
+        "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJkZmY2Y2NjNS1iZDliLTQ2N2MtOGU5My0wZmU1MWQzNTNlYWYifQ.eyJleHAiOjE3MzczODQyNjQsImlhdCI6MTczNzM4MjQ2NCwianRpIjoiMGU3NGQ1YzctNTg3ZC00ZTc0LTljN2UtNjIzNDhjNjEzZmYyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9tYXN0ZXIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL21hc3RlciIsInN1YiI6ImQzMWM3ZWUxLWI4MjctNDlkYy1iZmFhLThmOWNmZThkNjg1ZCIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJhZG1pbi1jbGkiLCJzZXNzaW9uX3N0YXRlIjoiYWU2NGQyYmQtMzIyNS00ZTA1LTk5NDMtMmJiOTFmYjhmZTUyIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIiwic2lkIjoiYWU2NGQyYmQtMzIyNS00ZTA1LTk5NDMtMmJiOTFmYjhmZTUyIn0.iwmBDa5K5PKxxB8YT5VhA4gS_EVgaGa5gmZ-1ySAPX36jxPpaVGb905ApFZxIQMYMYjo3D1w0H2Uoij8eOWiPw",
+        "token_type": "Bearer",
+        "not-before-policy": 0,
+        "session_state": "ae64d2bd-3225-4e05-9943-2bb91fb8fe52",
+        "scope": "profile email"
+    }
+    user_res = [
+        {"id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20",
+         "username": "admin",
+         "firstName": "User1",
+         "lastName": "Bar1",
+         "emailVerified": False,
+         "attributes": {"LDAP_ENTRY_DN": ["cn=admin,ou=users,dc=dbrepo,dc=at"],
+                        "createTimestamp": ["20250120141013Z"],
+                        "modifyTimestamp": ["20250120141013Z"],
+                        "LDAP_ID": ["02b6e096-6b84-103f-81f6-1f6da137f2bb"]},
+         "createdTimestamp": 1737382606939,
+         "enabled": True,
+         "totp": False,
+         "federationLink": "c109d473-5ce1-4032-af7b-02e5442f5c07",
+         "disableableCredentialTypes": [],
+         "requiredActions": [],
+         "notBefore": 0,
+         "access": {"manageGroupMembership": True,
+                    "view": True,
+                    "mapRoles": True,
+                    "impersonate": True,
+                    "manage": True}}]
+
+    def test_fetch_succeeds(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=self.user_res, status_code=200)
+
+            # test
+            user_id = fetch()
+            self.assertEqual("02b6e096-6b84-103f-81f6-1f6da137f2bb", user_id)
+
+    def test_fetch_token_bad_request_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=400)
+            # test
+            try:
+                fetch()
+            except IOError:
+                pass
+
+    def test_fetch_token_unauthorized_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=401)
+            # test
+            try:
+                fetch()
+            except IOError:
+                pass
+
+    def test_fetch_user_not_found_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[], status_code=200)
+
+            # test
+            try:
+                fetch()
+            except FileNotFoundError:
+                pass
+
+    def test_fetch_user_too_much_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{}, {}], status_code=200)
+
+            # test
+            try:
+                fetch()
+            except FileNotFoundError:
+                pass
+
+    def test_fetch_user_not_ok_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{}], status_code=202)
+
+            # test
+            try:
+                fetch()
+            except FileNotFoundError:
+                pass
+
+    def test_fetch_user_no_attrs_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{
+                "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20"
+            }], status_code=200)
+
+            # test
+            try:
+                fetch()
+            except ModuleNotFoundError:
+                pass
+
+    def test_fetch_user_empty_attrs_fails(self):
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post(f'{endpoint}/realms/master/protocol/openid-connect/token', json=self.token_res, status_code=200)
+            mock.get(f'{endpoint}/admin/realms/dbrepo/users/?username=admin', json=[{
+                "id": "5b516520-67cb-4aa0-86a6-d12f8b8f1a20",
+                "attributes": {}
+            }], status_code=200)
+
+            # test
+            try:
+                fetch()
+            except ImportError:
+                pass