From fea86876647c498d481f4e70fbe62cbdf2373b0f Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Mon, 17 Mar 2025 09:05:24 +0100 Subject: [PATCH 1/5] feat: now running tests --- .gitea/workflows/build-back.yaml | 12 ++++++++++-- config/.env.dev | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 config/.env.dev diff --git a/.gitea/workflows/build-back.yaml b/.gitea/workflows/build-back.yaml index 60dd4fa..fcc93f6 100644 --- a/.gitea/workflows/build-back.yaml +++ b/.gitea/workflows/build-back.yaml @@ -9,6 +9,14 @@ jobs: steps: - name: Checkout sources uses: actions/checkout@v4 + + - name: Load .env file + uses: xom9ikk/dotenv@v2.3.0 + with: + path: ./config/ + mode: dev + load-mode: strict + - name: Setup Java uses: actions/setup-java@v4 with: @@ -18,8 +26,8 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: - cache-disabled: true + cache-disabled: true # Once the code has been pushed once in main, this should be reenabled. - name: init gradle working-directory: ./MyINPulse-back/ - run: ./gradlew build -x test # todo: run test, currently fail because no database is present + run: ./gradlew build # todo: run test, currently fail because no database is present diff --git a/config/.env.dev b/config/.env.dev new file mode 100644 index 0000000..bcd45f3 --- /dev/null +++ b/config/.env.dev @@ -0,0 +1,22 @@ +POSTGRES_DB=postgres_db +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres_db_user_password + +KEYCLOAK_ADMIN=admin +KEYCLOAK_ADMIN_PASSWORD=admin +KEYCLOAK_HOSTNAME=localhost +KEYCLOAK_DB=keycloak_db +KEYCLOAK_USER=keycloak_db_user +KEYCLOAK_PASSWORD=keycloak_db_user_password + +BACKEND_DB=backend_db +BACKEND_USER=backend_db_user +BACKEND_PASSWORD=backend_db_user_password + +DATABASE_URL=localhost:5433 + +VITE_KEYCLOAK_URL=http://localhost:7080 +VITE_KEYCLOAK_CLIENT_ID=myinpulse-dev +VITE_KEYCLOAK_REALM=test +VITE_APP_URL=http://localhost:5173 +VITE_BACKEND_URL=http://localhost:8081/ From 834d68949c52cebc4a4d4185fcbbb886804d9e70 Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Mon, 17 Mar 2025 09:08:33 +0100 Subject: [PATCH 2/5] fix: tabulation error --- .gitea/workflows/build-back.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/build-back.yaml b/.gitea/workflows/build-back.yaml index fcc93f6..2526e98 100644 --- a/.gitea/workflows/build-back.yaml +++ b/.gitea/workflows/build-back.yaml @@ -10,12 +10,12 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 - - name: Load .env file - uses: xom9ikk/dotenv@v2.3.0 - with: - path: ./config/ - mode: dev - load-mode: strict + - name: Load .env file + uses: xom9ikk/dotenv@v2.3.0 + with: + path: ./config/ + mode: dev + load-mode: strict - name: Setup Java uses: actions/setup-java@v4 From 84b70f8f388aa34190ba9dc26d9884998d6c85a7 Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Mon, 17 Mar 2025 09:18:21 +0100 Subject: [PATCH 3/5] fix: sometimes, project administrators may be null. Fixing nullPointerException --- .../enseirb/myinpulse/service/AdminApiService.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java index d6efc7d..9f42d0e 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java @@ -77,7 +77,7 @@ public class AdminApiService { // TODO: check if tests are sufficient - peer verification required public void addNewProject(Project project) { project.setIdProject(null); - // We remove it from the request to be sure that it will be auto generated + // We remove the ID from the request to be sure that it will be auto generated try { this.projectService.getProjectByName(project.getProjectName(), true); throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists"); @@ -87,8 +87,12 @@ public class AdminApiService { } } Project newProject = projectService.addNewProject(project); - newProject.getProjectAdministrator().updateListProject(newProject); - newProject.getEntrepreneurProposed().setProjectProposed(newProject); + if (project.getProjectAdministrator() != null) { + newProject.getProjectAdministrator().updateListProject(newProject); + } + if (newProject.getEntrepreneurProposed() != null) { + newProject.getEntrepreneurProposed().setProjectProposed(newProject); + } newProject .getListEntrepreneurParticipation() .forEach( From 52511dd4c4609939fbb7663da36e8b4b1172e98f Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Wed, 19 Mar 2025 10:42:46 +0100 Subject: [PATCH 4/5] fix: Makefile now run everything needed to build the app --- Makefile | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 617387b..6f4e820 100644 --- a/Makefile +++ b/Makefile @@ -19,8 +19,14 @@ front/MyINPulse-front/.installed: vite: ./front/MyINPulse-front/.installed +keycloak: ./keycloak/.installed -dev-front: clean vite +keycloak/.installed: + @echo "running one time install" + @cd keycloak/CAS && sudo sh build.sh + @touch ./keycloak/.installed + +dev-front: clean vite keycloak @cp config/frontdev.env front/MyINPulse-front/.env @cp config/frontdev.env .env @cp config/frontdev.env MyINPulse-back/.env @@ -28,7 +34,7 @@ dev-front: clean vite @docker compose up -d --build @cd ./front/MyINPulse-front/ && npm run dev -prod: clean +prod: clean keycloak @cp config/prod.env front/MyINPulse-front/.env @cp config/prod.env .env @cp config/prod.env .env @@ -37,7 +43,7 @@ prod: clean -dev-back: +dev-back: keycloak @cp config/backdev.env front/MyINPulse-front/.env @cp config/backdev.env .env @cp config/backdev.env MyINPulse-back/.env @@ -46,7 +52,7 @@ dev-back: @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' @echo "./gradlew bootRun --args='--server.port=8081'" -dev: clean vite +dev: clean vite keycloak @cp config/dev.env front/MyINPulse-front/.env @cp config/dev.env .env @cp config/dev.env MyINPulse-back/.env @@ -55,3 +61,13 @@ dev: clean vite @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' @echo "./gradlew bootRun --args='--server.port=8081'" @cd ./front/MyINPulse-front/ && npm run dev & + +test-back: clean keycloak + @cp config/dev.env front/MyINPulse-front/.env + @cp config/dev.env .env + @cp config/dev.env MyINPulse-back/.env + @cp config/dev.docker-compose.yaml docker-compose.yaml + @docker compose up -d --build + @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' + @cd ./MyINPulse-back/ && ./gradlew test && ./gradlew jacocoTestReport + @firefox ./MyINPulse-back/build/jacocoHtml/index.html From 5ee375554899cc335e3dface6ee68453945f5b40 Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Wed, 19 Mar 2025 12:05:01 +0100 Subject: [PATCH 5/5] feat: added new tests and fixed few issues --- .../enseirb/myinpulse/model/Entrepreneur.java | 3 +- .../java/enseirb/myinpulse/model/User.java | 15 +++++ .../myinpulse/service/AdminApiService.java | 4 +- .../myinpulse/AdminApiServiceTest.java | 57 ++++++++++++++++++- 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java index 9763b4e..35b6e71 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java @@ -37,7 +37,6 @@ public class Entrepreneur extends User { public Entrepreneur() {} public Entrepreneur( - Long idUser, String userSurname, String username, String primaryMail, @@ -46,7 +45,7 @@ public class Entrepreneur extends User { String school, String course, boolean sneeStatus) { - super(idUser, userSurname, username, primaryMail, secondaryMail, phoneNumber); + super(userSurname, username, primaryMail, secondaryMail, phoneNumber); this.school = school; this.course = course; this.sneeStatus = sneeStatus; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java index 4d7f32f..37a551d 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java @@ -28,6 +28,8 @@ public class User { public User() {} + // TODO: this should be removed as we shouldn't be able to chose the ID. Leaving it for + // compatibility purposes, as soon as it's not used anymore, delete it public User( Long idUser, String userSurname, @@ -43,6 +45,19 @@ public class User { this.phoneNumber = phoneNumber; } + public User( + String userSurname, + String userName, + String primaryMail, + String secondaryMail, + String phoneNumber) { + this.userSurname = userSurname; + this.userName = userName; + this.primaryMail = primaryMail; + this.secondaryMail = secondaryMail; + this.phoneNumber = phoneNumber; + } + public Long getIdUser() { return idUser; } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java index 9f42d0e..38cb9e6 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java @@ -91,7 +91,9 @@ public class AdminApiService { newProject.getProjectAdministrator().updateListProject(newProject); } if (newProject.getEntrepreneurProposed() != null) { - newProject.getEntrepreneurProposed().setProjectProposed(newProject); + Entrepreneur proposed = newProject.getEntrepreneurProposed(); + proposed.setProjectProposed(newProject); + proposed.setProjectParticipation(newProject); } newProject .getListEntrepreneurParticipation() diff --git a/MyINPulse-back/src/test/java/enseirb/myinpulse/AdminApiServiceTest.java b/MyINPulse-back/src/test/java/enseirb/myinpulse/AdminApiServiceTest.java index abd21fb..676dfc9 100644 --- a/MyINPulse-back/src/test/java/enseirb/myinpulse/AdminApiServiceTest.java +++ b/MyINPulse-back/src/test/java/enseirb/myinpulse/AdminApiServiceTest.java @@ -5,10 +5,12 @@ import static enseirb.myinpulse.model.ProjectDecisionValue.*; import static org.junit.jupiter.api.Assertions.*; import enseirb.myinpulse.model.Administrator; +import enseirb.myinpulse.model.Entrepreneur; import enseirb.myinpulse.model.Project; import enseirb.myinpulse.model.ProjectDecision; import enseirb.myinpulse.service.AdminApiService; import enseirb.myinpulse.service.database.AdministratorService; +import enseirb.myinpulse.service.database.EntrepreneurService; import enseirb.myinpulse.service.database.ProjectService; import org.junit.jupiter.api.BeforeAll; @@ -26,13 +28,16 @@ import java.util.List; @Transactional public class AdminApiServiceTest { private static long administratorid; + private static Administrator administrator; + private static Entrepreneur entrepreneur; @Autowired private AdminApiService adminApiService; @Autowired private ProjectService projectService; @BeforeAll static void setup( @Autowired AdministratorService administratorService, - @Autowired ProjectService projectService) { + @Autowired ProjectService projectService, + @Autowired EntrepreneurService entrepreneurService) { administratorService.addAdministrator( new Administrator( "admin", @@ -40,7 +45,7 @@ public class AdminApiServiceTest { "testAdminEmpty@example.com", "testAdmin@example.com", "")); - Administrator a = + administrator = administratorService.addAdministrator( new Administrator( "admin2", @@ -48,7 +53,18 @@ public class AdminApiServiceTest { "testAdminFull@example.com", "testAdmin@example.com", "")); - administratorid = a.getIdUser(); + administratorid = administrator.getIdUser(); + entrepreneur = + new Entrepreneur( + "JeSuisUnEntrepreneurDeCompet", + "EtUĂ©", + "Entrepreneur@inpulse.com", + "mail2", + "phone", + "Ensimag nan jdeconne ENSEIRB (-matmeca mais on s'en fout)", + "info ofc", + false); + entrepreneurService.addEntrepreneur(entrepreneur); projectService.addNewProject( new Project( "sampleProjectAdminApiService", @@ -161,6 +177,41 @@ public class AdminApiServiceTest { assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size()); } + @Test + void addProjectToAdmin() { + assertEquals(0, administrator.getListProject().size()); + Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, administrator); + this.adminApiService.addNewProject(p1); + assertEquals(1, administrator.getListProject().size()); + } + + @Test + void addProjectToUser() { + assertNull(entrepreneur.getProjectParticipation()); + Project p1 = + new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, entrepreneur); + this.adminApiService.addNewProject(p1); + assertEquals(p1, entrepreneur.getProjectParticipation()); + } + + @Test + void addProjectWithManyUsers() { + Entrepreneur e1 = new Entrepreneur(); + Entrepreneur e2 = new Entrepreneur(); + Entrepreneur e3 = new Entrepreneur(); + assertNull(e1.getProjectParticipation()); + assertNull(e2.getProjectParticipation()); + assertNull(e3.getProjectParticipation()); + Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, null); + p1.updateListEntrepreneurParticipation(e1); + p1.updateListEntrepreneurParticipation(e2); + p1.updateListEntrepreneurParticipation(e3); + this.adminApiService.addNewProject(p1); + assertEquals(p1, e1.getProjectParticipation()); + assertEquals(p1, e2.getProjectParticipation()); + assertEquals(p1, e3.getProjectParticipation()); + } + @Test void addDuplicateProject() { Project p1 =