diff --git a/AssignmentChecker/.env.vault b/AssignmentChecker/.env.vault
index 4c196a4f439b46f3208cb3528f4bd50ba51c900d..dc6c6967287fbd8461b0a991a0b422966dd23b24 100644
--- a/AssignmentChecker/.env.vault
+++ b/AssignmentChecker/.env.vault
@@ -4,8 +4,11 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="zq6Lpb+yqSDl8yojD34S1KcXFKHeI6tTPRbmSsPUcurGrpWVSoeddVeROGVcA87SAHGpihyK8/EMCyQGFl56FdqIrs2vbTl5dqkLYc88Mr0MsS0UGIkTMtuBAWTzyamftaqLkZTqGjv37FHpRuAECk2poL7l1XOJP8Dfp0lfAi6ARUYbyWPEMuB+jeSooY6UPmd9ur0dzR4Ji4MYMQTczu2vu/Cd3NewlbeRXxvCSWVT+kT/YlmfBB1ZnLbufwPagPYvVpk2EF9IZn6YWhSCG8PC/ZmZha3pyK78WlPzOTCyxfsB0xpGpa83UsRM5coyAa4X4pk1AKuwOc9EpglLE1ixZuOt65V3u23xNBjPnB/qyVYhAnQeWUkWFzJpucanPyzeWK6AiPUlyPzTWcNa52tmU6JLQX1YWKwc6bcYF1+NdL4TSxW/3BGB3+PR6wwQC9zj/KTzN0DbLSEMdxCsVObrFUNtpzk4s1zs+hOh0rqbYuye+NH8Bd7xTD5xIYvORdfaLEbIg322HSR9LoEV111ZcYRC+jSe22eSlE5aiZI07ycB1SbV3GhhW71MRRqVwgoDurUw7kq73sPdPGW8u5PFmkkeOyEqdKO+4xbCjkrFB7pxFTK77yBI7ri3UQlBPsoXfp1+gOjGby3ZGpG2YXk7AUSbDt8opoi9Hbf7vh6MMcsVR7o5DXuVb9csi8Vco8I8N+U0VQjDktXE0RUCVK/fThgCsOVU9hVkSVbM1pwhkiEPSjY0okKj3gDyEbJo06f654O3D9Z8vForaKOfGP7XrIRl5Fa8eg1pkFQrp491lN5wPX97nELaUwRWjOP0AF33c+nlFLUJb467Z+z51KE5A83mdyvms0ASK5fqOVDUzQlxo3u3/gjtQ3pjugwATCjgtwrtN9Z3f9M6AePuZBCVHshy5upiibjjUCFYs410X3a1mqmqduWZNDdocCQFZSiptgHujMvH/wG5GyS2p59aBlmebF8dmUa2AFUA9ALg4TQYLSK23LmSO9r9/GDM+SktZ9+6wSA="
+DOTENV_VAULT_DEVELOPMENT="PcQQf+s59N83R6HyBr5za9PsgvWUUbqHdHzUJcJ+UQviV+ob21vJITdu5lBUO9RCEtxAHb6WwxGX091wWmIOK8hYzHpTaZfQN+3yo1R+AIKZtZgNNaHUVArUDbuYEX+Rh3lT/PKad/q2RjnlmfgneNS21tMXuhTx3PkAs6lI/1thQzJSN8L9mqEGjO6yMLbIXGur6OFerraVxbttxvpG6ZCjN6GoJHy7JTt+pIXwCddwviye87J/kAdbTL2RobV2yZ/+DGWPAG2BtaaVxMX5cQla5ltHSxzGR6YWQJFEVQ7Kdi6I2iydJXcTyNBy1MyIdwXxYftgB4FVc2t4PhPnzCFU0Ey/TG+MHgTCbHJi6Q+ZqxCQo6HqepsWXumGAs5mXLNOsDOQGo78X251ziyfg+XSEarn+Zo4SgG3I7iFBKlmkYZO57/f4gpZjUnr0zB7HIBOYKJV4InzfgynBwxW8LSLffdw/uL16wn1vSnRQ3NsPwgaxOQUQ39aC2FhegIinzgdXYwEwq5fzd+Rf0DI3yaCmWt/WRRXRNRrH/1R2pI/zBZNuPbAnWSz6RIIU+upycloAKgstHvwm0NUWNg1y5SIdqGn2JqtXZDJAmbau1XQTScoDIzal5z3T6h2JbbOwa1Wbl/n0Dcj6VFIp4vdOmdxbb4Fc0+/NLSM4HI0S1p4IIe40nttg8IyGgZGcocOak6OwBT7EWIbu3K5UQuboo18p94J2mwdHxLMvC7yAfozaKnQ23IBEePYemqhKXY1I+OXg1aB+OzaGQ83O+Uza6HDVbpw52+hJvoWIL2Bpa9hXHPenSF7m9ssxe0Cap3C/AnOqlSe08Fr7fJ00X3sKcDaUqJo+1NRN/U/v45TNquXZh7CW7LRBexxD2owWmY4uh/XmL1f5ihgQa0KnPMfpF0Q7PHB55vkgvsQiivVZJ/UK1LefxGPdWKaO2IhibnLhVSzKMkkgUbh8BZlAXM+acXYecAM+RJh+X9T03CdfLsKRR2mclTMYvZADGX5jdt8WbHJmriDEA0="
 
 # production
-DOTENV_VAULT_PRODUCTION="fQ4yyq471YEpB6XvKuQ5OTM4D3EyLuyKrdZz+QpeN0DD90l9zMCZY1xbRQc9UZyEdwkEe/W09oc85HuyCa7Gnjvm9AGNfyy6IUTTz51DdYsb9h4qorGaSLzbs/UxOeeOH4xMjATpZKI8r7QOmEF3wnr6fqSgDTVwdnkdqVWdSroHnROA1b0GuvXafyL0K7QTer9w24zCX7ku4gHNVgRADCi03weOIFfDYEbhJfsNxnFdaqyAjMmwrdwmI8diOlaqfbRjmWMMNnGA5LcK8OvUY62+zrNBfjF60etTfjt5OWCpY/u3iQagvDgDF7GcxxtJmnTavBMBZ/P+2g4LJeefLLGemXffCeLtG29N79sPE2FjPL24e1aaF/swdCMHwH4ACYNdvLz9grPrLZNG44jn02fSkKC/irdBiq7fGs7J3hHy/9HYVWsuAyEj3H9jVQ2d5zzXGI4KeMq+blHtLXSD+dMxxbighh0sD4Ji2isWnj432rCRK6RWJ9WsXm6vyPXGcIOSKMVW4xHN1kgVqQwJA0m7yZjoCvreDpqCGouK0hxnJimP6QKcu02C1K5D8RkZu53pRN7Fz3AlGcYy8iJLoEUKETMTnnkyOkByguhzpbg2KMkW7sZbJgt0t98nlrAi5fClTcjXbG02IHNAa2UTQWW0DhJH6p4DnJCjk6YkQzF/u+FlqY+5//Ruzb0eHRzWwLxn6s4Vi5DsbnQQJ1OeQVgRBT/5yKbQkYPQgiHX6NmvCzoO85lwjEfeE7I44c1sYn46urLHaXcXtExXwjGZYF2ScIXNo4SOpnoFmxPtO4AWJbW2OlGVI4/7e5zlZAmj50+qZcvizTCJy27ohQctWTmLx2I="
+DOTENV_VAULT_PRODUCTION="ljfC3JXVhAkhObK89aNa0jPYh+R1KvT9SW9px4VYdxyUYqm3fOEcIPIk6YBM1VPLDMXOqdMIpNKG4jcBrKCN8GTyAYvnBpDlww65JuH4VJipTokLxs408TQ/nKMOXTbAw6e1wcXevjczxgAV7pffJDoVGqn6Y9/08QRaK2W3trLgW7GJnJeFMfmTp8CSUtT4SPKNDmQztbCtkN7RTUfvcdgdawykIW+Dp3ZgOpr8VT31Z0O4HRarZr7TLEHVjPEThWPOKnZM76F91xIGsjFr4gjRXkQggZEF6O5ZorzfyFVzvXKiDpNXBe1pJj7ryclqps41Uad+n4TQMkUxhWOVKSRLE4YYlp0h21G4dW5YWSJOatqUkUxHZW0YrCrpmHq3oqXoIyo4S0uQ53i3aUlq+d7kpownpYXpgfSRuuUhcPiqMuKy5xVBnHwaQ5D9QruJaxteUZsCd9G6HBMZDvUSZEUiPXRrzVudkvVgUkInIQsJL4FOSPy4SKWdIl0iorBPavZvk42/ovBKvdvFlzdiDrhHb/FoWusUf88HlcmwM6axW43Zh4GT+iLsB8NZ+L8dcz0IPhixITjGNOgmRcxB9YAitWGPaFlBI30XnoOo9g0WfanAYAcxFDFRhTfhe/KcBmaRdEcLIBnbrIcBXmt+2i/E1gc2SJCyrKEAiCds4nqiE3FF7bjBDhkIJE7ixuZTx9Cd0V2iKT4CVbV2+u86U830TAbwt1T30IKExHy54WZjSk/Blm3R7xPggSb1bYziXheTY2w4pQxI3c3baakgi8vqKwLJN3YrdacTa/7kCnOjOmHIJeA3RF0HQHGAx5XUd0xYr6ku2MFoki2lPnZmXoYMgxo="
+
+# test
+DOTENV_VAULT_TEST="qpaBgbgE2PBJ9ybA5gLOG2300r5+CMt78pVUtc4yagUUfVwU0+fuLVOdVEa2NJOxI6hhXu75v0ZFgtJ+VbYG4DK0q81+iYxInSIlw1uVbIap8F3qHqj9dpO4By/MJYLErcCpg+OhKMRzxBSeGuQxuMcFzpc8l2Zf73ahAHyDyY9eg6K7xvuowwpiuYojiXY8TUcxYEkZ81sWrD/aHCHDTAq++thotWN2m1HsXq+bav48fsfWJazZB9drmS+zMX99YLNeOn2CyyJoE6K5mBBvnJdKw/iBZebMOB5fQVbu8mfBBy/exBoOUc3crhH8bJsSez8lT1IogjnVJgUlqVUAQpX3TPt+5XtDH1DpED/xyk7E00XJmKlvqBMkpJVFMBJeIZwXxiEl2iJFBOzlDEZDJFVihDp3zDgSlj01A+RR7HUiRGqcnYHX9bXHhzOpUXMBgL6R/6yIYNnn6T/RgdCwMKnUTLMhqll6E6vFSWf+xK4OvTTMoefOU3GTo+SL7Twl1af2UJJD9XKyvw6ProPRnYZqdMdbIM2e9g4TX5kz64//SNazxF5qCbcxLstk25EkHDtyjhOekguiubHiZlqUty5+pyhtA3q7EjvNB7TCX5KPirm3JnXnWh45d3cMg+cFgXTb+YtRb5wTAbKcSyC5RynlXPOB4rfnydYz2JqXPfIzq0HSxVeQS09xCR4dziuF1xLhoTSEnCVE+HphYns9xIjAPHHPV+FAH6ZhaeqyVHFpJXf8birDeHJ5Wh0/kMpgQx0Po7PpaeeenDx0LT6IgyF9RnXnpJS8wMDWuVAeGtTHMtStWipUFbRa0daqlsXPucRwt5nyJDWRxkzrlaSBZrv9PgYS3/eBToz4KA=="
 
diff --git a/AssignmentChecker/.gitlab-ci/00_vars.yml b/AssignmentChecker/.gitlab-ci/00_vars.yml
index 0af94a753b6ffab5f8892ded39d9b10a92f8e05c..e54032a7ae7d354f3da1d4b7fd6d93058b42cb64 100644
--- a/AssignmentChecker/.gitlab-ci/00_vars.yml
+++ b/AssignmentChecker/.gitlab-ci/00_vars.yml
@@ -6,9 +6,14 @@ variables:
     DOCKER_TLS_CERTDIR:
     DOCKER_DRIVER: overlay2
 
+    DOCKER_REGISTRY: docker.io
+    DOCKER_REGISTRY_USER: dojohesso
+    DOCKER_REGISTRY_IMAGE: dojohesso/dojo_assignment_checker
+
     PROJECT_NAME: DojoAssignmentChecker
 
     VERSION_DEV_SUFFIX: '-dev'
+    VERSION_TEST_SUFFIX: '-test'
 
     GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
 
diff --git a/AssignmentChecker/.gitlab-ci/01_functions.yml b/AssignmentChecker/.gitlab-ci/01_functions.yml
index f0675a514e20658a7d87932f65073487c89cc028..41e95d25e346935bdf5b94d556c9ba15fee3b5cc 100644
--- a/AssignmentChecker/.gitlab-ci/01_functions.yml
+++ b/AssignmentChecker/.gitlab-ci/01_functions.yml
@@ -1,7 +1,19 @@
+.get_vars:
+    script:
+        - IS_DEV=$([[ $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH != "test" ]] && echo true || echo false)
+        - IS_TEST=$([[ $CI_COMMIT_BRANCH == "test" ]] && echo true || echo false)
+        - |
+            if [[ $IS_TEST == true ]]; then
+                DOCKER_REGISTRY_USER="dojohessotest"
+                DOCKER_REGISTRY_IMAGE="dojohesso/dojo-test_assignment_checker"
+                DOCKER_REGISTRY_PASSWORD=$DOCKER_TEST_REGISTRY_PASSWORD
+                DOTENV_PROD_KEY=$DOTENV_TEST_KEY
+            fi
+
+
 .get_version:
     script:
-        - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true)
-        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
+        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_TEST == true ]] && echo $VERSION_TEST_SUFFIX || echo '' )$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
 
 
 .get_packages_url:
@@ -21,7 +33,7 @@
 
         # Init docker buildx
         - |
-            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
+            if [[ $CI_COMMIT_REF_PROTECTED == "true" || $IS_TEST == true ]]; then
                 docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY
             fi
         - docker buildx create --use
@@ -41,15 +53,20 @@
         - cd $PROJECT_FOLDER
         - sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/app.ts
         - |
-            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
+            if [[ $CI_COMMIT_REF_PROTECTED == "true" || $IS_TEST == true ]]; then
                 echo "Decrypt production env vars"
                 sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts
                 sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts
                 npx dotenv-vault local decrypt "${DOTENV_PROD_KEY}" > .env
-            
             fi
         - cd ..
 
+        # Rename executable for test
+        - |
+            if [[ $IS_TEST == true ]]; then
+                sed -i -r "s%dojo_assignment_checker%dojo-test_assignment_checker%g" $DOCKERFILE
+            fi
+
         # Need to build for each platform separately because of multi-stage builds (docker buildx don't use cache same way as docker build)
         - >
             platform_array=$(echo $DOCKER_PLATFORMS | tr "," "\n");
diff --git a/AssignmentChecker/.gitlab-ci/03_stages.yml b/AssignmentChecker/.gitlab-ci/03_stages.yml
index 198b85a3eeb84675229f3459f1457de2b9c2f2f9..a996ecac4ea23db0640d1c6767b1780748aeccbe 100644
--- a/AssignmentChecker/.gitlab-ci/03_stages.yml
+++ b/AssignmentChecker/.gitlab-ci/03_stages.yml
@@ -4,4 +4,7 @@ stages:
     - build
     - clean
     - upload
-    - release
\ No newline at end of file
+    - release
+
+before_script:
+    - !reference [ .get_vars, script ]
\ No newline at end of file
diff --git a/AssignmentChecker/.gitlab-ci/04_stageCodeQuality.yml b/AssignmentChecker/.gitlab-ci/04_stageCodeQuality.yml
index 9fda59d835ec0c91e23548db55a43a1df8d6ab1b..705f2c13f1e88c358038f702856200f44488fa0f 100644
--- a/AssignmentChecker/.gitlab-ci/04_stageCodeQuality.yml
+++ b/AssignmentChecker/.gitlab-ci/04_stageCodeQuality.yml
@@ -5,6 +5,8 @@ code_quality:lint:
     image: node:latest
     script:
         - cd "${PROJECT_FOLDER}"
-        
+
         - npm install
         - npm run lint
+    rules:
+        -   if: '$CI_COMMIT_TAG =~ "/^$/"'
diff --git a/AssignmentChecker/.gitlab-ci/05_stageTest.yml b/AssignmentChecker/.gitlab-ci/05_stageTest.yml
index a1b564295624124e216ae7bba18ac6950590eccb..ccb013bcc6113315e83da6b2190787d73ee11903 100644
--- a/AssignmentChecker/.gitlab-ci/05_stageTest.yml
+++ b/AssignmentChecker/.gitlab-ci/05_stageTest.yml
@@ -9,4 +9,4 @@ test:build:
     script:
         - !reference [ .build_script, script ]
     rules:
-        -   if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true"'
\ No newline at end of file
+        -   if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true" && $CI_COMMIT_BRANCH != "test"'
\ No newline at end of file
diff --git a/AssignmentChecker/.gitlab-ci/06_stageBuild.yml b/AssignmentChecker/.gitlab-ci/06_stageBuild.yml
index e2acdd1042c77d84b45e63e3b8b2cdaf217d92bc..a0c6ca411fd86c59aa49fd601563bd262e3ef89f 100644
--- a/AssignmentChecker/.gitlab-ci/06_stageBuild.yml
+++ b/AssignmentChecker/.gitlab-ci/06_stageBuild.yml
@@ -12,4 +12,4 @@ build:version:
         # Here docker buildx can use cached images created in previous step
         - docker buildx build --platform $DOCKER_PLATFORMS --file $DOCKERFILE --push --tag $CONTAINER_IMAGE .
     rules:
-        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true" || $CI_COMMIT_BRANCH == "test"'
\ No newline at end of file
diff --git a/AssignmentChecker/.gitlab-ci/09_stageRelease.yml b/AssignmentChecker/.gitlab-ci/09_stageRelease.yml
index 325d173cd88c4336e573d1dd33f6ffbe7745c653..ad039e9aa41609db7d147f941fdf6bd73aa3a41b 100644
--- a/AssignmentChecker/.gitlab-ci/09_stageRelease.yml
+++ b/AssignmentChecker/.gitlab-ci/09_stageRelease.yml
@@ -12,7 +12,7 @@ release:dockerhub:latest:
         # Push latest tag
         - docker buildx imagetools create $CONTAINER_IMAGE --tag $DOCKER_REGISTRY_IMAGE:latest
     rules:
-        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "test"'
 
 
 release:wiki: