From 2c23952a5e993a3b414232fca9ef4dfef62fef56 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 19:04:41 +0100 Subject: [PATCH 01/36] Write simple Testcase for ci/cd --- backend/.idea/workspace.xml | 91 ++++++++++++------- backend/pom.xml | 6 ++ .../src/main/java/core/DemoApplication.java | 4 +- backend/src/main/java/core/entities/User.java | 21 +++++ .../java/core/users/UserRepositoryTests.java | 37 ++++++++ .../src/test/resources/application.properties | 7 ++ 6 files changed, 133 insertions(+), 33 deletions(-) create mode 100644 backend/src/test/java/core/users/UserRepositoryTests.java create mode 100644 backend/src/test/resources/application.properties diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index f7c95af..f0e683e 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -5,12 +5,13 @@ + + + - - - - - + + + - { - "keyToString": { - "RequestMappingsPanelOrder0": "0", - "RequestMappingsPanelOrder1": "1", - "RequestMappingsPanelWidth0": "75", - "RequestMappingsPanelWidth1": "75", - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "WebServerToolWindowFactoryState": "false", - "extract.method.default.visibility": "private", - "git-widget-placeholder": "issue-11-angular-update", - "last_directory_selection": "D:/Programmierprojekte/TimeManager/backend/src/main/java/core/api/models/timemanager", - "last_opened_file_path": "D:/Programmierprojekte/Dicewars/client", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "swagger", - "ts.external.directory.path": "/snap/intellij-idea-ultimate/459/plugins/javascript-impl/jsLanguageServicesImpl/external", - "vue.rearranger.settings.migration": "true" + - +}]]> + + + + + + + + + + + + + @@ -111,6 +134,7 @@ + diff --git a/backend/pom.xml b/backend/pom.xml index 2073f15..8fee0eb 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -54,6 +54,12 @@ jjwt 0.9.1 + + com.h2database + h2 + 1.3.176 + test + diff --git a/backend/src/main/java/core/DemoApplication.java b/backend/src/main/java/core/DemoApplication.java index 4ace39f..ab593cb 100644 --- a/backend/src/main/java/core/DemoApplication.java +++ b/backend/src/main/java/core/DemoApplication.java @@ -18,7 +18,7 @@ public class DemoApplication{ } - @Bean + /*@Bean public CommandLineRunner init(RoleRepository roleRepository, UserRepository userRepository, PropertyService propertyService) { return args -> { for (UserRole userRole : UserRole.values()) { @@ -32,5 +32,5 @@ public class DemoApplication{ FirstUserObserver observer = new FirstUserObserver(userRepository); observer.start(); }; - } + }*/ } diff --git a/backend/src/main/java/core/entities/User.java b/backend/src/main/java/core/entities/User.java index 636d29e..1f6c1f2 100644 --- a/backend/src/main/java/core/entities/User.java +++ b/backend/src/main/java/core/entities/User.java @@ -8,6 +8,7 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.HashSet; +import java.util.Objects; import java.util.Set; @Entity @@ -50,6 +51,13 @@ public class User { this.password = password; } + public User(Long id, String username, String email, String password) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + } + public Long getId() { return id; } @@ -89,4 +97,17 @@ public class User { public void setRoles(Set roles) { this.roles = roles; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(username, user.username) && Objects.equals(email, user.email) && Objects.equals(password, user.password) && Objects.equals(roles, user.roles); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, email, password, roles); + } } diff --git a/backend/src/test/java/core/users/UserRepositoryTests.java b/backend/src/test/java/core/users/UserRepositoryTests.java new file mode 100644 index 0000000..66e9ca4 --- /dev/null +++ b/backend/src/test/java/core/users/UserRepositoryTests.java @@ -0,0 +1,37 @@ +package core.users; + +import core.entities.User; +import core.repositories.UserRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +@DirtiesContext +@ExtendWith(SpringExtension.class) +public class UserRepositoryTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private TestEntityManager testEntityManager; + + @Test + void test_findByUsername() { + assertTrue(userRepository.findByUsername("FawKes100").isEmpty()); + userRepository.save(new User(1L,"FawKes100", "mail@fawkes100.de", "123456")); + + Optional findResult = userRepository.findByUsername("FawKes100"); + assertTrue(findResult.isPresent()); + assertEquals(new User(1L, "FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); + } +} diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties new file mode 100644 index 0000000..fc90813 --- /dev/null +++ b/backend/src/test/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:file:~/testdb;MODE=LEGACY +spring.h2.console.enabled=true +spring.h2.console.path=/console +spring.flyway.enabled=false +spring.liquibase.enabled=false +hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file -- 2.34.1 From cbe0ed070b1e63ba74d67c05eb54963924843be8 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 19:08:44 +0100 Subject: [PATCH 02/36] Deactivate Overall System test (temporarly) --- backend/.idea/workspace.xml | 27 ++++++++++--------- .../test/java/core/DemoApplicationTests.java | 6 ++--- .../src/test/resources/application.properties | 3 +-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index f0e683e..66ea920 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,14 +4,8 @@ - - - - - - - - + + @@ -324,7 +326,8 @@ - @@ -351,7 +354,7 @@ file://$PROJECT_DIR$/src/main/java/core/entities/User.java - 56 + 57 diff --git a/backend/src/test/java/core/DemoApplicationTests.java b/backend/src/test/java/core/DemoApplicationTests.java index 0a16e57..86d252a 100644 --- a/backend/src/test/java/core/DemoApplicationTests.java +++ b/backend/src/test/java/core/DemoApplicationTests.java @@ -3,11 +3,11 @@ package core; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +/*@SpringBootTest*/ class DemoApplicationTests { - @Test + /*@Test void contextLoads() { - } + }*/ } diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties index fc90813..04ae4dc 100644 --- a/backend/src/test/resources/application.properties +++ b/backend/src/test/resources/application.properties @@ -3,5 +3,4 @@ spring.datasource.url=jdbc:h2:file:~/testdb;MODE=LEGACY spring.h2.console.enabled=true spring.h2.console.path=/console spring.flyway.enabled=false -spring.liquibase.enabled=false -hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file +spring.liquibase.enabled=false \ No newline at end of file -- 2.34.1 From 4ac1d8bbcceb23144cf986cecc54b1cb842b88a2 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:06:21 +0100 Subject: [PATCH 03/36] Demo Gitea Actions --- .gitea/workflows/demo.yaml | 19 +++++++++++++++++++ backend/.idea/workspace.xml | 19 ++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 .gitea/workflows/demo.yaml diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml new file mode 100644 index 0000000..d67ac59 --- /dev/null +++ b/.gitea/workflows/demo.yaml @@ -0,0 +1,19 @@ +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +on: [push] + +jobs: + Explore-Gitea-Actions: + runs-on: ubuntu-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" + - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." + - name: Check out repository code + uses: actions/checkout@v3 + - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository + run: | + ls ${{ gitea.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 66ea920..5392fa7 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,8 +4,8 @@ - - + + @@ -327,7 +335,8 @@ - -- 2.34.1 From 22a57bdc371686ea81a21b57617b5874232c3516 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:10:03 +0100 Subject: [PATCH 04/36] Test maven test --- .gitea/workflows/demo.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index d67ac59..80550d6 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -6,14 +6,14 @@ jobs: Explore-Gitea-Actions: runs-on: ubuntu-latest steps: - - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" - - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - - name: Check out repository code - uses: actions/checkout@v3 - - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ gitea.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - run: mvn --batch-mode --update-snapshots verify + - run: mkdir staging && cp target/*.jar staging + - uses: actions/upload-artifact@v3 + with: + name: Package + path: staging -- 2.34.1 From bfc5a324f8addc4b32d9d3d643a1572801d6aeb1 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:20:04 +0100 Subject: [PATCH 05/36] Use github action template --- .gitea/workflows/demo.yaml | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 80550d6..ad59c58 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -1,19 +1,29 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 -on: [push] +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven jobs: - Explore-Gitea-Actions: + build: + runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - - run: mvn --batch-mode --update-snapshots verify - - run: mkdir staging && cp target/*.jar staging - - uses: actions/upload-artifact@v3 - with: - name: Package - path: staging + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 \ No newline at end of file -- 2.34.1 From 2332478661fd9caeb47d4f1a165f2f78d090d5e7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:23:08 +0100 Subject: [PATCH 06/36] Fix missing push --- .gitea/workflows/demo.yaml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index ad59c58..44579f2 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -1,12 +1,7 @@ -# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - name: Java CI with Maven +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +on: [push] jobs: build: -- 2.34.1 From caf0dc0b755d71d268b60543dfbed3d2cec05fab Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:23:28 +0100 Subject: [PATCH 07/36] Fix doppelname --- .gitea/workflows/demo.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 44579f2..3d16734 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -1,5 +1,4 @@ name: Java CI with Maven -name: Gitea Actions Demo run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 on: [push] -- 2.34.1 From 4a59352435945fe2e0e434bdd2c48d3ebd5042ad Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:25:48 +0100 Subject: [PATCH 08/36] Include maven installation in actions --- .gitea/workflows/demo.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 3d16734..e6c4c3d 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -15,6 +15,10 @@ jobs: java-version: '17' distribution: 'temurin' cache: maven + - name: Set up Maven + uses: stCarolas/setup-maven@v4.5 + with: + maven-version: 3.8.2 - name: Build with Maven run: mvn -B package --file pom.xml -- 2.34.1 From d1b8f98f8e437b83fd47318e34ea9fea9955caf7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:28:46 +0100 Subject: [PATCH 09/36] (Hopefully) Fix pom location --- .gitea/workflows/demo.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index e6c4c3d..788ab10 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -20,7 +20,7 @@ jobs: with: maven-version: 3.8.2 - name: Build with Maven - run: mvn -B package --file pom.xml + run: mvn -B package --file backend/pom.xml # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph -- 2.34.1 From 91c24fa288e75aaa96951b2106b0cd4c5ccb4c35 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Nov 2023 22:33:00 +0100 Subject: [PATCH 10/36] Skip uploading dependency graph --- .gitea/workflows/demo.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 788ab10..21b19b8 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -23,5 +23,5 @@ jobs: run: mvn -B package --file backend/pom.xml # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 \ No newline at end of file + # - name: Update dependency graph + #uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 \ No newline at end of file -- 2.34.1 From 1d7c280e84cc07a28ffb2103f7805976a06d3da0 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 6 Nov 2023 08:54:15 +0100 Subject: [PATCH 11/36] Simulate failing test --- backend/src/test/java/core/users/UserRepositoryTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/core/users/UserRepositoryTests.java b/backend/src/test/java/core/users/UserRepositoryTests.java index 66e9ca4..7fc0b6e 100644 --- a/backend/src/test/java/core/users/UserRepositoryTests.java +++ b/backend/src/test/java/core/users/UserRepositoryTests.java @@ -31,7 +31,7 @@ public class UserRepositoryTests { userRepository.save(new User(1L,"FawKes100", "mail@fawkes100.de", "123456")); Optional findResult = userRepository.findByUsername("FawKes100"); - assertTrue(findResult.isPresent()); + assertFalse(findResult.isPresent()); assertEquals(new User(1L, "FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); } } -- 2.34.1 From 5ba2fb650999704364845b4fef5a3c56213bed0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Tue, 7 Nov 2023 19:09:08 +0100 Subject: [PATCH 12/36] Fix failing test case --- backend/src/test/java/core/users/UserRepositoryTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/core/users/UserRepositoryTests.java b/backend/src/test/java/core/users/UserRepositoryTests.java index 7fc0b6e..66e9ca4 100644 --- a/backend/src/test/java/core/users/UserRepositoryTests.java +++ b/backend/src/test/java/core/users/UserRepositoryTests.java @@ -31,7 +31,7 @@ public class UserRepositoryTests { userRepository.save(new User(1L,"FawKes100", "mail@fawkes100.de", "123456")); Optional findResult = userRepository.findByUsername("FawKes100"); - assertFalse(findResult.isPresent()); + assertTrue(findResult.isPresent()); assertEquals(new User(1L, "FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); } } -- 2.34.1 From 8166239405c73dfdeb772651b9cb0377a1878022 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 7 Nov 2023 19:33:26 +0100 Subject: [PATCH 13/36] Switch actions/checkout to v2 instead of v3 --- .gitea/workflows/demo.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 21b19b8..3cd4f0a 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v2 - name: Set up JDK 17 uses: actions/setup-java@v3 with: -- 2.34.1 From 942563e5d9b8a4df4cd6f3d8891897d8d2acda90 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 7 Nov 2023 19:44:14 +0100 Subject: [PATCH 14/36] v3 instead of v2 --- .gitea/workflows/demo.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml index 3cd4f0a..21b19b8 100644 --- a/.gitea/workflows/demo.yaml +++ b/.gitea/workflows/demo.yaml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: -- 2.34.1 From 2f78c5ebbfb3738e5c002740760b75d5258ba823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Tue, 7 Nov 2023 20:20:07 +0100 Subject: [PATCH 15/36] Tests for user-repository --- backend/src/main/java/core/entities/User.java | 4 +- .../java/core/users/UserRepositoryTests.java | 69 ++++++++++++++++++- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/core/entities/User.java b/backend/src/main/java/core/entities/User.java index 1f6c1f2..3b0849c 100644 --- a/backend/src/main/java/core/entities/User.java +++ b/backend/src/main/java/core/entities/User.java @@ -103,11 +103,11 @@ public class User { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; - return Objects.equals(id, user.id) && Objects.equals(username, user.username) && Objects.equals(email, user.email) && Objects.equals(password, user.password) && Objects.equals(roles, user.roles); + return Objects.equals(username, user.username) && Objects.equals(email, user.email) && Objects.equals(password, user.password) && Objects.equals(roles, user.roles); } @Override public int hashCode() { - return Objects.hash(id, username, email, password, roles); + return Objects.hash(username, email, password, roles); } } diff --git a/backend/src/test/java/core/users/UserRepositoryTests.java b/backend/src/test/java/core/users/UserRepositoryTests.java index 66e9ca4..65ce191 100644 --- a/backend/src/test/java/core/users/UserRepositoryTests.java +++ b/backend/src/test/java/core/users/UserRepositoryTests.java @@ -12,6 +12,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Optional; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.*; @DataJpaTest @@ -27,11 +28,75 @@ public class UserRepositoryTests { @Test void test_findByUsername() { + //Situation 1: No user is present in the database, so no user should be found by a given username assertTrue(userRepository.findByUsername("FawKes100").isEmpty()); - userRepository.save(new User(1L,"FawKes100", "mail@fawkes100.de", "123456")); + //persist a user to the database, so a user is present + testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); + + //Situation 2: User with name "FawKes100" is present Optional findResult = userRepository.findByUsername("FawKes100"); assertTrue(findResult.isPresent()); - assertEquals(new User(1L, "FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); + assertEquals(new User("FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); + + //Situation 3: No user with the required name is present + findResult = userRepository.findByUsername("fawkes1001"); + assertFalse(findResult.isPresent()); } + + @Test + void test_existsByMail() { + //Situation 1: invalid email format should not matter + assertFalse(userRepository.existsByEmail("FawKes100")); + + //Situation 2: No user exists with such a mail + assertFalse(userRepository.existsByEmail("mail@fawkes100.de")); + + //persist a user to the database, so a user is present + testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); + + //Situation 3: User with this mail exists + assertTrue(userRepository.existsByEmail("mail@fawkes100.de")); + + //Situation 4: No user exists with such a mail (non-empty db) + assertFalse(userRepository.existsByEmail("mail2@fawkes100.de")); + } + + @Test + void test_existsByUsername() { + //Situation 1: Empty database + assertFalse(userRepository.existsByUsername("FawKes100")); + + //persist a user to the database, so a user is present + testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); + + //Situation 3: User with this name exists + assertTrue(userRepository.existsByUsername("FawKes100")); + + //Situation 4: No user exists with such a mail (non-empty db) + assertFalse(userRepository.existsByUsername("FawKes101")); + } + + @Test + void test_deleteUserByName() { + //persist a user to the database, so a user is present + User user = testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); + User user1 = testEntityManager.persist(new User("FawKes101", "mail@fawkes101.de", "123456")); + + userRepository.deleteByUsername("FawKes100"); + + assertThat(testEntityManager.find(User.class, user.getId())).isNull(); + assertThat(testEntityManager.find(User.class, user1.getId())).isNotNull(); + } + + + @Test + void test_countUsers() { + assertEquals(0, userRepository.countUsers()); + + testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); + assertEquals(1, userRepository.countUsers()); + + } + } -- 2.34.1 From 5cf04a685874fd7801f4c016607aae9543dfba06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Wed, 8 Nov 2023 20:00:18 +0100 Subject: [PATCH 16/36] TaskgroupRepsitoryTest --- backend/.idea/workspace.xml | 118 ++++++++++++++++-- .../core/entities/timemanager/Taskgroup.java | 13 ++ .../taskgroups/TaskgroupRepsitoryTest.java | 93 ++++++++++++++ .../taskgroupRepositoryTestEntries.sql | 12 ++ 4 files changed, 225 insertions(+), 11 deletions(-) create mode 100644 backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java create mode 100644 backend/src/test/resources/taskgroupRepositoryTestEntries.sql diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 5392fa7..1088a8b 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,8 +4,11 @@ - + + + + - - + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + @@ -129,6 +213,9 @@ + + + - @@ -336,7 +431,8 @@ - diff --git a/backend/src/main/java/core/entities/timemanager/Taskgroup.java b/backend/src/main/java/core/entities/timemanager/Taskgroup.java index be2d450..e7f0477 100644 --- a/backend/src/main/java/core/entities/timemanager/Taskgroup.java +++ b/backend/src/main/java/core/entities/timemanager/Taskgroup.java @@ -116,4 +116,17 @@ public class Taskgroup { } return activeAmountTasks; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Taskgroup taskgroup = (Taskgroup) o; + return taskgroupID == taskgroup.taskgroupID; + } + + @Override + public int hashCode() { + return Objects.hash(taskgroupID); + } } diff --git a/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java new file mode 100644 index 0000000..7e81bb7 --- /dev/null +++ b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java @@ -0,0 +1,93 @@ +package core.taskgroups; + +import core.entities.User; +import core.entities.timemanager.Taskgroup; +import core.repositories.timemanager.TaskgroupRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +@DataJpaTest +public class TaskgroupRepsitoryTest { + + @Autowired private TaskgroupRepository taskgroupRepository; + @Autowired private TestEntityManager testEntityManager; + + @Test + @Sql("classpath:taskgroupRepositoryTestEntries.sql") + void findAllByUser() { + User testUser1 = testEntityManager.find(User.class, 1L); + User testUser2 = testEntityManager.find(User.class, 2L); + + List result_user2 = taskgroupRepository.findAllByUser(testUser2.getUsername()); + assertEquals(0, result_user2.size()); + + List result_user1 = taskgroupRepository.findAllByUser(testUser1.getUsername()); + assertEquals(8, result_user1.size()); + } + + @Test + @Sql("classpath:taskgroupRepositoryTestEntries.sql") + void existsByTaskgroupNameAndUser() { + User testUser1 = testEntityManager.find(User.class, 1L); + User testUser2 = testEntityManager.find(User.class, 2L); + + //Situation 1: Taskgroup exists but within another user + assertFalse(taskgroupRepository.existsByTaskgroupNameAndUser("No children", testUser2)); + + //Situation 2: Taskgroup exists not + assertFalse(taskgroupRepository.existsByTaskgroupNameAndUser("ada", testUser1)); + + //Situation 3: Taskgroup (top) exists on user + assertTrue(taskgroupRepository.existsByTaskgroupNameAndUser("No children", testUser1)); + + //Situation 4: Taskgroup exists on user but not on top level + assertTrue(taskgroupRepository.existsByTaskgroupNameAndUser("Taskgroup 1.1", testUser1)); + } + + @Test + @Sql("classpath:taskgroupRepositoryTestEntries.sql") + void findAllTopTaskgroupsByUser() { + User testUser1 = testEntityManager.find(User.class, 1L); + User testUser2 = testEntityManager.find(User.class, 2L); + + //Situation 1: Empty user, no taskgroups + assertEquals(0, taskgroupRepository.findAllTopTaskgroupsByUser(testUser2.getUsername()).size()); + + //Situation 2: Only top taskgroups are returned + List topgroups_user1 = taskgroupRepository.findAllTopTaskgroupsByUser(testUser1.getUsername()); + assertEquals(3, topgroups_user1.size()); + assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 1L))); + assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 2L))); + assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 5L))); + + //Situation 3: User with username does not exist + assertEquals(0, taskgroupRepository.findAllTopTaskgroupsByUser("Rotzbakke").size()); + } + @Test + @Sql("classpath:taskgroupRepositoryTestEntries.sql") + void deleteAllByUser() { + User testUser1 = testEntityManager.find(User.class, 1L); + User testUser2 = testEntityManager.find(User.class, 2L); + + taskgroupRepository.deleteAllByUser(testUser2); + for(long i=1; i<=8; i++) { + assertThat(testEntityManager.find(Taskgroup.class, i)).isNotNull(); + } + + taskgroupRepository.deleteAllByUser(testUser1); + for(long i=1; i<=8; i++) { + assertThat(testEntityManager.find(Taskgroup.class, i)).isNull(); + } + } +} diff --git a/backend/src/test/resources/taskgroupRepositoryTestEntries.sql b/backend/src/test/resources/taskgroupRepositoryTestEntries.sql new file mode 100644 index 0000000..2c65e97 --- /dev/null +++ b/backend/src/test/resources/taskgroupRepositoryTestEntries.sql @@ -0,0 +1,12 @@ +INSERT INTO users (id, username, email, password) VALUES (1, 'Testuser1', 'test1@test.com', '123456'); +INSERT INTO users (id, username, email, password) VALUES (2, 'Testuser2', 'test2@test.com', '123456'); + +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (1, 'No children', null, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (2, 'Taskgroup 1', null, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (3, 'Taskgroup 1.1', 2, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (4, 'Taskgroup 1.2', 2, 1); + +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (5, 'Taskgroup 2', null, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (6, 'Taskgroup 2.1', 5, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (7, 'Taskgroup 2.2', 5, 1); +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (8, 'Taskgroup 2.1.2', 6, 1); \ No newline at end of file -- 2.34.1 From 8f5e8133f8e65a40bf34b42a49f366664626f010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Wed, 8 Nov 2023 20:17:57 +0100 Subject: [PATCH 17/36] TaskgroupRepsitoryTest (+Delete) --- backend/.idea/workspace.xml | 58 ++++++++++--------- .../taskgroups/TaskgroupRepsitoryTest.java | 20 +++++++ 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 1088a8b..f391dca 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,11 +4,8 @@ - - - - - + + - + @@ -103,6 +100,22 @@ + + + + + + + @@ -135,22 +148,6 @@ - - - - - - - @@ -176,11 +173,11 @@ + - @@ -215,7 +212,7 @@ - + - @@ -432,7 +437,8 @@ - diff --git a/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java index 7e81bb7..3da0877 100644 --- a/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java +++ b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java @@ -1,6 +1,7 @@ package core.taskgroups; import core.entities.User; +import core.entities.timemanager.Task; import core.entities.timemanager.Taskgroup; import core.repositories.timemanager.TaskgroupRepository; import org.junit.jupiter.api.Test; @@ -90,4 +91,23 @@ public class TaskgroupRepsitoryTest { assertThat(testEntityManager.find(Taskgroup.class, i)).isNull(); } } + + @Test + @Sql("classpath:taskgroupRepositoryTestEntries.sql") + void delete() { + Taskgroup no_children = testEntityManager.find(Taskgroup.class, 1L); + Taskgroup taskgroup_with_children = testEntityManager.find(Taskgroup.class, 5L); + + taskgroupRepository.delete(no_children); + assertThat(testEntityManager.find(Taskgroup.class, 1L)).isNull(); + for(long i=2; i<=8; i++) { + assertThat(testEntityManager.find(Taskgroup.class, i)).isNotNull(); + } + + taskgroupRepository.delete(taskgroup_with_children); + for(long i=5; i<=8; i++) { + assertThat(testEntityManager.find(Taskgroup.class, i)).isNull(); + } + + } } -- 2.34.1 From 4d655c32ed2eeaabc36df2dd406457442c891e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Wed, 8 Nov 2023 21:22:28 +0100 Subject: [PATCH 18/36] FindAlltasksByUser Test --- backend/.idea/workspace.xml | 113 ++++++++++-------- .../java/core/tasks/TaskRepositoryTest.java | 68 +++++++++++ .../test/resources/taskRepositoryEntries.sql | 18 +++ 3 files changed, 148 insertions(+), 51 deletions(-) create mode 100644 backend/src/test/java/core/tasks/TaskRepositoryTest.java create mode 100644 backend/src/test/resources/taskRepositoryEntries.sql diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index f391dca..9f87681 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,8 +4,10 @@ - - + + + + - { + "keyToString": { + "RequestMappingsPanelOrder0": "0", + "RequestMappingsPanelOrder1": "1", + "RequestMappingsPanelWidth0": "75", + "RequestMappingsPanelWidth1": "75", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "WebServerToolWindowFactoryState": "false", + "extract.method.default.visibility": "private", + "git-widget-placeholder": "tests", + "ignore.virus.scanning.warn.message": "true", + "last_directory_selection": "D:/Programmierprojekte/TimeManager/backend/src/main/java/core/api/models/timemanager", + "last_opened_file_path": "/media/sebastian/Data2/Programmierprojekte/Storycreator", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "swagger", + "ts.external.directory.path": "/snap/intellij-idea-ultimate/459/plugins/javascript-impl/jsLanguageServicesImpl/external", + "vue.rearranger.settings.migration": "true" }, - "keyToStringList": { - "DatabaseDriversLRU": [ - "h2", - "mariadb" + "keyToStringList": { + "DatabaseDriversLRU": [ + "h2", + "mariadb" ] } -}]]> +} @@ -84,7 +86,23 @@ - + + + + + + + + @@ -132,22 +150,6 @@ - - - - - - - @@ -173,11 +175,11 @@ + - @@ -212,7 +214,8 @@ - + + - - @@ -438,7 +448,8 @@ - diff --git a/backend/src/test/java/core/tasks/TaskRepositoryTest.java b/backend/src/test/java/core/tasks/TaskRepositoryTest.java new file mode 100644 index 0000000..fde7b8c --- /dev/null +++ b/backend/src/test/java/core/tasks/TaskRepositoryTest.java @@ -0,0 +1,68 @@ +package core.tasks; + +import core.entities.User; +import core.entities.timemanager.Task; +import core.entities.timemanager.Taskgroup; +import core.repositories.timemanager.TaskRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlGroup; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +@ExtendWith(SpringExtension.class) +@DataJpaTest +public class TaskRepositoryTest { + + @Autowired private TaskRepository taskRepository; + @Autowired private TestEntityManager testEntityManager; + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void findAllByUser() { + User testUser1 = testEntityManager.find(User.class, 1L); + User testUser2 = testEntityManager.find(User.class, 2L); + + //Situation 1: Non existent user + assertEquals(0, taskRepository.findAllByUser("Rotzbakke", true).size()); + assertEquals(0, taskRepository.findAllByUser("Rotzbakke", false).size()); + + //Situation 2: User with no tasks at all + assertEquals(0, taskRepository.findAllByUser(testUser2.getUsername(), false).size()); + assertEquals(0, taskRepository.findAllByUser(testUser2.getUsername(), true).size()); + + //Situation 3: User with finished and unfinished tasks + List tasks_user1_false = taskRepository.findAllByUser(testUser1.getUsername(), false); + List tasks_user1_true = taskRepository.findAllByUser(testUser1.getUsername(), true); + assertEquals(7, tasks_user1_true.size()); + assertEquals(7, tasks_user1_false.size()); + + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 1L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 3L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 5L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 7L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 9L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 11L))); + assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 12L))); + + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 2L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 4L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 6L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 8L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 10L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 13L))); + assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 14L))); + } +} diff --git a/backend/src/test/resources/taskRepositoryEntries.sql b/backend/src/test/resources/taskRepositoryEntries.sql new file mode 100644 index 0000000..697318c --- /dev/null +++ b/backend/src/test/resources/taskRepositoryEntries.sql @@ -0,0 +1,18 @@ +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (1, NULL, 0, NULL, 'Task 1', 2, false, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (2, NULL, 0, NULL, 'Task 2', 2, true, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (3, '2022-03-20', 0, NULL, 'Task 3', 2, false, 0); + +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (4, '2022-03-20', 0, NULL, 'Task 4', 2, true, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (5, '2022-03-20', 0, '2021-03-20', 'Task 5', 2, false, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (6, '2022-03-20', 0, '2021-03-20', 'Task 6', 2, true, 0); + +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (7, NULL, 0, '2043-03-20', 'Task 6', 2, false, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (8, NULL, 0, '2043-03-20', 'Task 6', 2, true, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (9, '2044-03-20', 0, '2043-03-20', 'Task 6', 2, false, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (10, '2044-03-20', 0, '2043-03-20', 'Task 6', 2, true, 0); + +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (11, NULL, 0, '2022-03-20', 'Task 6', 2, false, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (12, '2044-03-20', 0, '2022-03-20', 'Task 6', 2, false, 0); + +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (13, NULL, 0, '2022-03-20', 'Task 6', 2, true, 0); +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (14, '2044-03-20', 0, '2022-03-20', 'Task 6', 2, true, 0); -- 2.34.1 From 2f7fb3e2b4234686acc9259da3e4d3c9c2461c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Fri, 10 Nov 2023 19:35:44 +0100 Subject: [PATCH 19/36] Test TaskRepository --- backend/.idea/workspace.xml | 111 +++++++++++------- .../timemanager/TaskRepository.java | 9 +- .../taskgroups/TaskgroupRepsitoryTest.java | 1 - .../java/core/tasks/TaskRepositoryTest.java | 92 +++++++++++++++ 4 files changed, 162 insertions(+), 51 deletions(-) diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 9f87681..ec8b0d2 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,10 +4,11 @@ - - - + + + + - - + + @@ -97,70 +98,71 @@ - + - - - - - - - - - - + - - - + - - + + + + + + + - - - - - + + + + + @@ -215,7 +217,8 @@ - + + - - @@ -449,7 +459,8 @@ - @@ -479,6 +490,16 @@ 57 diff --git a/backend/src/main/java/core/repositories/timemanager/TaskRepository.java b/backend/src/main/java/core/repositories/timemanager/TaskRepository.java index fd8d118..d4f7268 100644 --- a/backend/src/main/java/core/repositories/timemanager/TaskRepository.java +++ b/backend/src/main/java/core/repositories/timemanager/TaskRepository.java @@ -17,22 +17,21 @@ public interface TaskRepository extends CrudRepository { @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t.finished = ?2") List findAllByUser(String username, boolean finished); - @Transactional + @Modifying - @Query(value = "DELETE FROM Task t WHERE t.taskgroup = ?1") + @Transactional void deleteAllByTaskgroup(Taskgroup taskgroup); @Transactional @Modifying - @Query(value = "DELETE FROM Task t WHERE t.taskID = ?1") void deleteByTaskID(long taskID); - @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t.deadline is NOT NULL AND t.deadline > ?2 AND t.finished = FALSE") + @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t.deadline is NOT NULL AND t.deadline < ?2 AND t.finished = FALSE") List findAllOverdue(String username, LocalDate now); @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t.startDate IS NOT NULL AND t.startDate > ?2 AND t.finished = FALSE") List findAllUpcoming(String username, LocalDate now); - @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t.startDate IS NULL OR t.startDate <= ?2 AND t.finished = FALSE") + @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND (t.startDate IS NULL OR t.startDate <= ?2) AND t.finished = FALSE") List findAllActive(String username, LocalDate now); } diff --git a/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java index 3da0877..1172aa8 100644 --- a/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java +++ b/backend/src/test/java/core/taskgroups/TaskgroupRepsitoryTest.java @@ -108,6 +108,5 @@ public class TaskgroupRepsitoryTest { for(long i=5; i<=8; i++) { assertThat(testEntityManager.find(Taskgroup.class, i)).isNull(); } - } } diff --git a/backend/src/test/java/core/tasks/TaskRepositoryTest.java b/backend/src/test/java/core/tasks/TaskRepositoryTest.java index fde7b8c..5df74d5 100644 --- a/backend/src/test/java/core/tasks/TaskRepositoryTest.java +++ b/backend/src/test/java/core/tasks/TaskRepositoryTest.java @@ -13,8 +13,10 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.SqlGroup; import org.springframework.test.context.junit.jupiter.SpringExtension; +import java.time.LocalDate; import java.util.List; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -65,4 +67,94 @@ public class TaskRepositoryTest { assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 13L))); assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 14L))); } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void deleteAllByTaskgroup() { + Taskgroup taskgroup_no_tasks = testEntityManager.find(Taskgroup.class, 1L); + taskRepository.deleteAllByTaskgroup(taskgroup_no_tasks); + + for(long i=1; i<=14; i++) { + assertThat(testEntityManager.find(Task.class, i)).isNotNull(); + } + + Taskgroup taskgroup_with_task = testEntityManager.find(Taskgroup.class, 2L); + taskRepository.deleteAllByTaskgroup(taskgroup_with_task); + for(long i=1; i<=14; i++) { + Task task = testEntityManager.find(Task.class, i); + assertThat(task).isNull(); + } + } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void deleteByTaskID() { + taskRepository.deleteByTaskID(-1); + for(long i=1; i<=14; i++) { + assertThat(testEntityManager.find(Task.class, i)).isNotNull(); + } + + taskRepository.deleteByTaskID(1); + assertThat(testEntityManager.find(Task.class, 1L)).isNull(); + for(long i=2; i<=14; i++) { + assertThat(testEntityManager.find(Task.class, i)).isNotNull(); + } + } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void findAllOverdue() { + User testuser1 = testEntityManager.find(User.class, 1L); + LocalDate referenceDate = LocalDate.of(2023, 10, 11); + + List overdue = taskRepository.findAllOverdue(testuser1.getUsername(), referenceDate); + assertEquals(2, overdue.size()); + assertTrue(overdue.contains(testEntityManager.find(Task.class, 3L))); + assertTrue(overdue.contains(testEntityManager.find(Task.class, 5L))); + } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void findAllUpcoming() { + User testuser1 = testEntityManager.find(User.class, 1L); + LocalDate referenceDate = LocalDate.of(2023, 10, 11); + + List upcoming = taskRepository.findAllUpcoming(testuser1.getUsername(), referenceDate); + assertEquals(2, upcoming.size()); + assertTrue(upcoming.contains(testEntityManager.find(Task.class, 7L))); + assertTrue(upcoming.contains(testEntityManager.find(Task.class, 9L))); + + } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void findAllActive() { + User testuser1 = testEntityManager.find(User.class, 1L); + LocalDate referenceDate = LocalDate.of(2023, 10, 11); + + List active = taskRepository.findAllActive(testuser1.getUsername(), referenceDate); + //1,3,5,11,12 + assertEquals(5, active.size()); + assertTrue(active.contains(testEntityManager.find(Task.class, 1L))); + assertTrue(active.contains(testEntityManager.find(Task.class, 3L))); + assertTrue(active.contains(testEntityManager.find(Task.class, 5L))); + assertTrue(active.contains(testEntityManager.find(Task.class, 11L))); + assertTrue(active.contains(testEntityManager.find(Task.class, 12L))); + } + } -- 2.34.1 From 21015ff06d9c3a53596e60697aaab6f802c3154c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Fri, 10 Nov 2023 20:44:26 +0100 Subject: [PATCH 20/36] Initialize Testing of Testservice --- backend/.idea/workspace.xml | 104 +++++++++--------- backend/pom.xml | 7 +- .../core/taskgroups/TaskgroupServiceTest.java | 68 ++++++++++++ .../src/test/resources/application.properties | 8 +- 4 files changed, 134 insertions(+), 53 deletions(-) create mode 100644 backend/src/test/java/core/taskgroups/TaskgroupServiceTest.java diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index ec8b0d2..0590447 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,11 +4,11 @@ - + + - - - + + - - - - - - - - - - - - - - - + @@ -168,6 +136,37 @@ + + + + + + + + + + + + + + + + - - @@ -218,7 +217,7 @@ - + - - @@ -460,7 +466,8 @@ - @@ -491,14 +498,9 @@ diff --git a/backend/pom.xml b/backend/pom.xml index 8fee0eb..18787b6 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -57,9 +57,14 @@ com.h2database h2 - 1.3.176 + 2.2.224 test + + junit + junit + test + diff --git a/backend/src/test/java/core/taskgroups/TaskgroupServiceTest.java b/backend/src/test/java/core/taskgroups/TaskgroupServiceTest.java new file mode 100644 index 0000000..8494928 --- /dev/null +++ b/backend/src/test/java/core/taskgroups/TaskgroupServiceTest.java @@ -0,0 +1,68 @@ +package core.taskgroups; + +import core.entities.User; +import core.entities.timemanager.Taskgroup; +import core.repositories.UserRepository; +import core.repositories.timemanager.TaskgroupRepository; +import core.services.PermissionResult; +import core.services.ServiceExitCode; +import core.services.TaskgroupService; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlGroup; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.Optional; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +public class TaskgroupServiceTest { + + @Autowired + private TaskgroupRepository taskgroupRepository; + @Autowired + private TaskgroupService taskgroupService; + + private static final String username = "Testuser1"; + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql") + }) + void getTaskgroupByIDAndUsername() { + //Situation 1: correct taskgroup and username + assertFalse(taskgroupRepository.findById(1L).isEmpty()); + + PermissionResult permissionResult = taskgroupService.getTaskgroupByIDAndUsername(1L, username); + assertThat(permissionResult).isNotNull(); + assertTrue(permissionResult.isHasPermissions()); + assertEquals(ServiceExitCode.OK, permissionResult.getExitCode()); + assertEquals(taskgroupRepository.findById(1L).get(), permissionResult.getResult()); + + //Situation 2: invalid taskgroup + PermissionResult invalid_group = taskgroupService.getTaskgroupByIDAndUsername(-1L, username); + assertThat(invalid_group).isNotNull(); + assertEquals(ServiceExitCode.MISSING_ENTITY, invalid_group.getExitCode()); + assertFalse(invalid_group.isHasPermissions()); + + //Situation 3: invalid user + PermissionResult invalid_user = taskgroupService.getTaskgroupByIDAndUsername(1L, "Rotzbakke"); + assertThat(invalid_user).isNotNull(); + assertEquals(ServiceExitCode.OK, invalid_user.getExitCode()); + assertFalse(invalid_user.isHasPermissions()); + } + +} diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties index 04ae4dc..512dbe3 100644 --- a/backend/src/test/resources/application.properties +++ b/backend/src/test/resources/application.properties @@ -1,6 +1,12 @@ spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:file:~/testdb;MODE=LEGACY +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.h2.console.enabled=true spring.h2.console.path=/console spring.flyway.enabled=false -spring.liquibase.enabled=false \ No newline at end of file +spring.liquibase.enabled=false + +demo.webapp.jwtSecret=demoWebappSecretKey +demo.webapp.jwtExpirationMS=86400000 +spring.sql.init.mode=always +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file -- 2.34.1 From 2b9e821cf2fe3e49f96146c172dd95270035af7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Fri, 10 Nov 2023 20:58:10 +0100 Subject: [PATCH 21/36] Use @Sql instead of persit() --- backend/.idea/workspace.xml | 91 ++++++++++--------- .../java/core/users/UserRepositoryTests.java | 59 +++++------- .../resources/userRepisotoryTestEntries.sql | 2 + 3 files changed, 71 insertions(+), 81 deletions(-) create mode 100644 backend/src/test/resources/userRepisotoryTestEntries.sql diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 0590447..0d3facc 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,11 +4,10 @@ - - + + - - + - - + + - - - + - - - + - - - + - - - + - - - - - - - + + + + + @@ -217,7 +217,7 @@ - + - - @@ -467,7 +474,8 @@ - @@ -497,11 +505,6 @@ 57 diff --git a/backend/src/test/java/core/users/UserRepositoryTests.java b/backend/src/test/java/core/users/UserRepositoryTests.java index 65ce191..0b19155 100644 --- a/backend/src/test/java/core/users/UserRepositoryTests.java +++ b/backend/src/test/java/core/users/UserRepositoryTests.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Optional; @@ -16,7 +17,6 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.*; @DataJpaTest -@DirtiesContext @ExtendWith(SpringExtension.class) public class UserRepositoryTests { @@ -27,76 +27,61 @@ public class UserRepositoryTests { private TestEntityManager testEntityManager; @Test + @Sql("classpath:userRepisotoryTestEntries.sql") void test_findByUsername() { - //Situation 1: No user is present in the database, so no user should be found by a given username - assertTrue(userRepository.findByUsername("FawKes100").isEmpty()); - - //persist a user to the database, so a user is present - testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); - - //Situation 2: User with name "FawKes100" is present - Optional findResult = userRepository.findByUsername("FawKes100"); + //Situation 1: User with name "FawKes100" is present + User referenceUser = testEntityManager.find(User.class, 1L); + Optional findResult = userRepository.findByUsername(referenceUser.getUsername()); assertTrue(findResult.isPresent()); - assertEquals(new User("FawKes100", "mail@fawkes100.de", "123456"),findResult.get()); + assertEquals(referenceUser,findResult.get()); - //Situation 3: No user with the required name is present + //Situation 2: No user with the required name is present findResult = userRepository.findByUsername("fawkes1001"); assertFalse(findResult.isPresent()); } @Test + @Sql("classpath:userRepisotoryTestEntries.sql") void test_existsByMail() { + User referenceUser = testEntityManager.find(User.class, 1L); //Situation 1: invalid email format should not matter assertFalse(userRepository.existsByEmail("FawKes100")); //Situation 2: No user exists with such a mail assertFalse(userRepository.existsByEmail("mail@fawkes100.de")); - //persist a user to the database, so a user is present - testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); - //Situation 3: User with this mail exists - assertTrue(userRepository.existsByEmail("mail@fawkes100.de")); - - //Situation 4: No user exists with such a mail (non-empty db) - assertFalse(userRepository.existsByEmail("mail2@fawkes100.de")); + assertTrue(userRepository.existsByEmail(referenceUser.getEmail())); } @Test + @Sql("classpath:userRepisotoryTestEntries.sql") void test_existsByUsername() { - //Situation 1: Empty database + User referenceUser = testEntityManager.find(User.class, 1L); + //Situation 1: No such user assertFalse(userRepository.existsByUsername("FawKes100")); - //persist a user to the database, so a user is present - testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); - //Situation 3: User with this name exists - assertTrue(userRepository.existsByUsername("FawKes100")); - - //Situation 4: No user exists with such a mail (non-empty db) - assertFalse(userRepository.existsByUsername("FawKes101")); + assertTrue(userRepository.existsByUsername(referenceUser.getUsername())); } @Test + @Sql("classpath:userRepisotoryTestEntries.sql") void test_deleteUserByName() { - //persist a user to the database, so a user is present - User user = testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); - User user1 = testEntityManager.persist(new User("FawKes101", "mail@fawkes101.de", "123456")); + User referenceUser1 = testEntityManager.find(User.class, 1L); + User referenceUser2 = testEntityManager.find(User.class, 2L); - userRepository.deleteByUsername("FawKes100"); + userRepository.deleteByUsername(referenceUser2.getUsername()); - assertThat(testEntityManager.find(User.class, user.getId())).isNull(); - assertThat(testEntityManager.find(User.class, user1.getId())).isNotNull(); + assertThat(testEntityManager.find(User.class, referenceUser2.getId())).isNull(); + assertThat(testEntityManager.find(User.class, referenceUser1.getId())).isNotNull(); } @Test + @Sql("classpath:userRepisotoryTestEntries.sql") void test_countUsers() { - assertEquals(0, userRepository.countUsers()); - - testEntityManager.persist(new User("FawKes100", "mail@fawkes100.de", "123456")); - assertEquals(1, userRepository.countUsers()); - + assertEquals(2, userRepository.countUsers()); } } diff --git a/backend/src/test/resources/userRepisotoryTestEntries.sql b/backend/src/test/resources/userRepisotoryTestEntries.sql new file mode 100644 index 0000000..0caba64 --- /dev/null +++ b/backend/src/test/resources/userRepisotoryTestEntries.sql @@ -0,0 +1,2 @@ +INSERT INTO users (id, username, email, password) VALUES (1, 'Testuser1', 'test1@test.com', '123456'); +INSERT INTO users (id, username, email, password) VALUES (2, 'Testuser2', 'test2@test.com', '123456'); \ No newline at end of file -- 2.34.1 From 542e04659bef33721e56627790e5e96c1292a307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 11 Nov 2023 07:54:13 +0100 Subject: [PATCH 22/36] Testcases (and failing test fixes) of TaskgroupService --- backend/.idea/workspace.xml | 92 ++++++------ .../taskgroup/TaskgroupFieldInfo.java | 8 ++ .../core/entities/timemanager/Taskgroup.java | 2 +- .../java/core/services/TaskgroupService.java | 4 - .../core/taskgroups/TaskgroupServiceTest.java | 131 ++++++++++++++++++ 5 files changed, 189 insertions(+), 48 deletions(-) diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index 0d3facc..15eb121 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -4,10 +4,12 @@