From c8b7930a8e7540eb5da33a45acd63e9045a05328 Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Fri, 15 Mar 2024 11:20:23 +0100 Subject: [PATCH 01/13] Setup unit tests and implements test for the token limit and trivial tests for userRepository --- .../herisson/Clyde/Services/UserService.java | 1 - .../src/main/resources/application.properties | 1 + .../herisson/Clyde/ClydeApplicationTests.java | 1 + .../Clyde/Repositories/UserRepoTest.java | 39 +++++++++ .../Clyde/Services/TokenServiceTest.java | 85 +++++++++++++++++++ .../src/test/resources/application.properties | 3 + 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java create mode 100644 backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java create mode 100644 backend/src/test/resources/application.properties diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java index 55a2f92..097dbaa 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -16,7 +16,6 @@ public class UserService { this.userRepo = userRepo; } - public User getUser(String identifier){ if (identifier == null) return null; try { diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index df288a6..5d00d8e 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,2 +1,3 @@ spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect +spring.sql.init.mode=always \ No newline at end of file diff --git a/backend/src/test/java/ovh/herisson/Clyde/ClydeApplicationTests.java b/backend/src/test/java/ovh/herisson/Clyde/ClydeApplicationTests.java index 4714cbc..860e110 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/ClydeApplicationTests.java +++ b/backend/src/test/java/ovh/herisson/Clyde/ClydeApplicationTests.java @@ -8,6 +8,7 @@ class ClydeApplicationTests { @Test void contextLoads() { + } } diff --git a/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java new file mode 100644 index 0000000..64ba33e --- /dev/null +++ b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java @@ -0,0 +1,39 @@ +package ovh.herisson.Clyde.Repositories; + +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.User; + +import java.util.GregorianCalendar; + +@DataJpaTest +@TestPropertySource(properties = { + "spring.test.database.replace=none", + "spring.datasource.url=jdbc:tc:postgresql:16-alpine:///db" +}) +public class UserRepoTest { + + @Autowired + UserRepository userRepo; + + @BeforeEach + public void setup(){ + if (userRepo.findById(1) == null){ + User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand", new GregorianCalendar(2005, 4, 3).getTime(), null, Role.Admin,"admin"); + userRepo.save(herobrine); + } + } + + @Test + public void usertest(){ + Assert.assertEquals("brine", userRepo.findById(1).getLastName()); + Assert.assertTrue(new GregorianCalendar(2005, 4, 3).getTime().equals(userRepo.findById(1).getBirthDate())); + } + +} diff --git a/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java b/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java new file mode 100644 index 0000000..cdb26f9 --- /dev/null +++ b/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java @@ -0,0 +1,85 @@ +package ovh.herisson.Clyde.Services; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; +import ovh.herisson.Clyde.Repositories.TokenRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.Token; +import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +@TestPropertySource(properties = { + "spring.test.database.replace=none", + "spring.datasource.url=jdbc:tc:postgresql:16-alpine:///db" +}) + +class TokenServiceTest { + + @Autowired + TokenRepository tokenRepository; + + @Autowired + UserRepository userRepository; + + @Test + void saveToken() { + User herobrine = userRepository.findById(1); + + User herobrinenul = new User("brine","heronul","pasadmin@student.com","in your WalLs","ShadowsLand", new GregorianCalendar(2005, 4, 3).getTime(), null, Role.Admin,"admin"); + + TokenService tokenService = new TokenService(tokenRepository); + Token testToken = new Token(herobrine, tokenService.generateNewToken(), new Date()); + tokenService.saveToken(testToken); + + Iterable t = tokenService.getAllTokens(); + Token tok = t.iterator().next(); + + Assert.assertEquals(herobrine, tok.getUser()); + Assert.assertNotEquals(herobrinenul, tok.getUser()); + } + + @Test + void saveTokenLimit(){ + TokenService tokenService = new TokenService(tokenRepository); + + //On va stocker les token qu'on va sauvegarder au préalable dans une liste pour tester que les tokens remplacés sont bien ceux avec la date d'expi la plus jeune + //A la fin il ne devrait donc rester que les 5 derniers tokens de tokenList + + ArrayList tokenList = new ArrayList<>(); + GregorianCalendar gc = new GregorianCalendar(); + + User malveillant = new User("mechant", "veutdestoken", "donnezmoidestoken@mail.com", "secret", "secret", null, null, null, "secret"); + userRepository.save(malveillant); + + for (int i = 0; i < 20; i++){ + gc.add(Calendar.DAY_OF_WEEK, 1); + + Token t = new Token(malveillant, tokenService.generateNewToken(), gc.getTime()); + tokenList.add(t); + + tokenService.saveToken(t); + } + + //Testons les tokens + ArrayList resp = tokenRepository.getByUserOrderByExpirationDate(malveillant); + Assert.assertTrue(resp.size() == 5); + + for (int i = 1; i <= resp.size(); i++){ + Assert.assertEquals(tokenList.get(tokenList.size()-i), resp.get(resp.size()-i)); + } + } +} \ No newline at end of file diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties new file mode 100644 index 0000000..e20ff1a --- /dev/null +++ b/backend/src/test/resources/application.properties @@ -0,0 +1,3 @@ +spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file From 189e664f37070d01f6f7442ad611041926f8c94e Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Fri, 15 Mar 2024 18:49:41 +0100 Subject: [PATCH 02/13] Add tests for Storage system --- .../Clyde/EndPoints/StorageController.java | 1 - .../Clyde/Repositories/FileRepository.java | 3 + .../Clyde/Services/StorageService.java | 2 - .../Clyde/Services/StorageServiceTest.java | 75 +++++++++++++++++++ 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java index 724ae10..5ad2052 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java @@ -11,7 +11,6 @@ import ovh.herisson.Clyde.Tables.StorageFile; @RestController @CrossOrigin(originPatterns = "*", allowCredentials = "true") public class StorageController { - private final StorageService storageServ; public StorageController(StorageService storageServ){ diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java index 2240c92..b736a1d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.StorageFile; +import java.util.ArrayList; + public interface FileRepository extends CrudRepository { + public StorageFile getStorageFileByName(String name); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java index c7f8d1b..14a41d9 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java @@ -17,8 +17,6 @@ import java.util.UUID; @Service public class StorageService { - - private final Path rootLocation = Paths.get("cdn/"); private final FileRepository fileRepo; diff --git a/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java b/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java new file mode 100644 index 0000000..b44454b --- /dev/null +++ b/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java @@ -0,0 +1,75 @@ +package ovh.herisson.Clyde.Services; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.TestPropertySource; +import org.springframework.web.multipart.MultipartFile; +import org.testcontainers.shaded.com.google.common.net.MediaType; +import ovh.herisson.Clyde.Repositories.FileRepository; +import ovh.herisson.Clyde.Tables.FileType; +import ovh.herisson.Clyde.Tables.StorageFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; + +@DataJpaTest +@TestPropertySource(properties = { + "spring.test.database.replace=none", + "spring.datasource.url=jdbc:tc:postgresql:16-alpine:///db" +}) +public class StorageServiceTest { + @Autowired + FileRepository fileRepo; + + StorageService ss; + + @BeforeEach + public void setup(){ + if (ss == null){ + ss = new StorageService(fileRepo); + } + } + + @Test + //Check si le fichier est bien sauvegardé dans la DB et si le fichier est bien sauvegardé au bon endroit + public void saveFile(){ + //Test si le directory a bien été crée a l'init du fileService + Path rootloc = Paths.get("cdn/"); + + Assert.assertTrue(Files.exists(rootloc)); + } + + @Test + public void deleteFile() throws IOException { + File file = new File("cdn/test.txt"); + file.createNewFile(); + + //On vérifie que le fichier a bien été crée + Assert.assertTrue(file.exists()); + + //StorageFile représentant le fichier + StorageFile sf = new StorageFile("testfile",file.getPath(), FileType.ProfilePicture); + fileRepo.save(sf); + + //Check that the storagefile is properly saved + StorageFile resp = fileRepo.getStorageFileByName("testfile"); + Assert.assertEquals(sf, resp); + + ss.delete(sf); + + //On vérifie que le fichier a bien été delete et que le StorageFile a été delete de la DB + Assert.assertFalse(file.exists()); + + resp = fileRepo.getStorageFileByName("testfile"); + Assert.assertEquals(null, resp); + } +} From d423a57fa0e760af930e3a00fb470143dcc7e7ab Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Sun, 17 Mar 2024 15:40:14 +0100 Subject: [PATCH 03/13] Add tests for UserController get and post --- backend/build.gradle.kts | 3 + .../Clyde/EndPoints/UserController.java | 2 +- .../Clyde/Endpoints/UserControllerTest.java | 114 ++++++++++++++++++ .../Clyde/Repositories/UserRepoTest.java | 12 +- .../Clyde/Services/StorageServiceTest.java | 5 + .../Clyde/Services/TokenServiceTest.java | 8 ++ .../src/test/resources/application.properties | 2 +- 7 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 6557b82..b7cabcd 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -31,8 +31,11 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:junit-jupiter") testImplementation("org.testcontainers:postgresql") + testImplementation("io.rest-assured:rest-assured") + testImplementation("org.hamcrest:hamcrest") } + tasks.register("run") { dependsOn(tasks.bootRun) } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index 844e82e..59412c1 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -104,7 +104,7 @@ public class UserController { User poster = authServ.getUserFromToken(authorization); if (poster == null) return false; - return poster.getRole() == Role.Secretary && poster.getRole() == Role.Admin; + return poster.getRole() == Role.Secretary || poster.getRole() == Role.Admin; } } diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java new file mode 100644 index 0000000..aebb474 --- /dev/null +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -0,0 +1,114 @@ +package ovh.herisson.Clyde.Endpoints; + +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.Assert; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import ovh.herisson.Clyde.ClydeApplication; +import ovh.herisson.Clyde.Repositories.TokenRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.TokenService; +import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.Token; +import ovh.herisson.Clyde.Tables.User; + +import java.util.Date; + +import static io.restassured.RestAssured.with; +import static org.hamcrest.Matchers.equalTo; + +@Testcontainers +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class UserControllerTest { + @LocalServerPort + private Integer port; + + @Autowired + private ClydeApplication controller; + + @Autowired + private TokenService tokenService; + + @Autowired + private UserRepository userRepository; + @Autowired + private TokenRepository tokenRepository; + @Container + @ServiceConnection + static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:alpine") + .withDatabaseName("clyde") + .withUsername("devel") + .withPassword("devel") + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432))))); + + @BeforeAll + static void beforeAll(){ + postgres.start(); + } + + @AfterAll + static void afterAll(){ + postgres.stop(); + } + + @BeforeEach + void setup(){ + RestAssured.baseURI = "http://localhost:" + port; + } + + @AfterEach + void aftereach(){ + tokenRepository.deleteAll(); + userRepository.deleteAll(); + } + @Test + //Verifie qu'un user qui n'a pas les permissions admin ou secretaire ne peut pas post + public void userPostTest(){ + User god = new User("god","god","admin@admin.com","everywhere","every",new Date(0), null, Role.Admin,"goddoesntneedpassword"); + Token godToken = new Token(god, tokenService.generateNewToken(), new Date()); + userRepository.save(god); + tokenService.saveToken(godToken); + + //Can god post herobrine himself ? + User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Student,"test"); + + with().body(herobrine).contentType(ContentType.JSON).header("Authorization", godToken.getToken()).when().request("POST", "/user").then().statusCode(201); + + userRepository.delete(herobrine); + + //Can noob post herobrine without authorizations (no) + User noob = new User("boon","noob","noob@admintkt.com","everywhere","every",new Date(0), null, Role.Student,"noob"); + Token noobToken = new Token(noob, tokenService.generateNewToken(), new Date()); + userRepository.save(noob); + tokenService.saveToken(noobToken); + + with().body(herobrine).contentType(ContentType.JSON).header("Authorization", noobToken.getToken()).when().request("POST", "/user").then().statusCode(401); + } + + @Test + public void userGetTest(){ + User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Student,"test"); + userRepository.save(herobrine); + + Token t = new Token(herobrine, tokenService.generateNewToken(), new Date()); + tokenRepository.save(t); + + + with().header("Authorization", t.getToken()).when().request("GET", "/user").then().assertThat().statusCode(200).body("firstName",equalTo("hero")); + } + +} diff --git a/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java index 64ba33e..f99ff2f 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Repositories/UserRepoTest.java @@ -1,12 +1,12 @@ package ovh.herisson.Clyde.Repositories; import org.junit.Assert; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import ovh.herisson.Clyde.Repositories.UserRepository; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; @@ -24,12 +24,14 @@ public class UserRepoTest { @BeforeEach public void setup(){ - if (userRepo.findById(1) == null){ - User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand", new GregorianCalendar(2005, 4, 3).getTime(), null, Role.Admin,"admin"); - userRepo.save(herobrine); - } + User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand", new GregorianCalendar(2005, 4, 3).getTime(), null, Role.Admin,"admin"); + userRepo.save(herobrine); } + @AfterEach + public void clean(){ + userRepo.deleteAll(); + } @Test public void usertest(){ Assert.assertEquals("brine", userRepo.findById(1).getLastName()); diff --git a/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java b/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java index b44454b..317ed91 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Services/StorageServiceTest.java @@ -2,6 +2,7 @@ package ovh.herisson.Clyde.Services; import org.junit.Assert; import org.junit.Before; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +40,10 @@ public class StorageServiceTest { } } + @AfterEach + public void aftereach(){ + fileRepo.deleteAll(); + } @Test //Check si le fichier est bien sauvegardé dans la DB et si le fichier est bien sauvegardé au bon endroit public void saveFile(){ diff --git a/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java b/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java index cdb26f9..c0314ea 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Services/TokenServiceTest.java @@ -2,6 +2,7 @@ package ovh.herisson.Clyde.Services; import org.junit.Assert; import org.junit.Before; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,6 +36,12 @@ class TokenServiceTest { @Autowired UserRepository userRepository; + + @AfterEach + public void aftereach(){ + tokenRepository.deleteAll(); + userRepository.deleteAll(); + } @Test void saveToken() { User herobrine = userRepository.findById(1); @@ -52,6 +59,7 @@ class TokenServiceTest { Assert.assertNotEquals(herobrinenul, tok.getUser()); } + @Test void saveTokenLimit(){ TokenService tokenService = new TokenService(tokenRepository); diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties index e20ff1a..5500350 100644 --- a/backend/src/test/resources/application.properties +++ b/backend/src/test/resources/application.properties @@ -1,3 +1,3 @@ spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect From 37a9eb46aec030d4373df96f7d78138085fa8084 Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Sun, 17 Mar 2024 15:42:43 +0100 Subject: [PATCH 04/13] Add tests for UserController get and post --- .../main/java/ovh/herisson/Clyde/EndPoints/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index 844e82e..59412c1 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -104,7 +104,7 @@ public class UserController { User poster = authServ.getUserFromToken(authorization); if (poster == null) return false; - return poster.getRole() == Role.Secretary && poster.getRole() == Role.Admin; + return poster.getRole() == Role.Secretary || poster.getRole() == Role.Admin; } } From 571d27c2301aef9b863a05a3ec13ef84499cf4c7 Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Sun, 17 Mar 2024 15:53:50 +0100 Subject: [PATCH 05/13] Add test for user patch --- .../Clyde/Endpoints/UserControllerTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java index aebb474..96ddcc9 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -27,6 +27,8 @@ import ovh.herisson.Clyde.Tables.Token; import ovh.herisson.Clyde.Tables.User; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import static io.restassured.RestAssured.with; import static org.hamcrest.Matchers.equalTo; @@ -111,4 +113,21 @@ public class UserControllerTest { with().header("Authorization", t.getToken()).when().request("GET", "/user").then().assertThat().statusCode(200).body("firstName",equalTo("hero")); } + @Test + public void userPatchTest(){ + User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Student,"test"); + userRepository.save(herobrine); + + Token t = new Token(herobrine, tokenService.generateNewToken(), new Date()); + tokenRepository.save(t); + + Map data = new HashMap(); + data.put("firstName", "test"); + + //Teste que le patch s'execute bien + with().body(data).contentType(ContentType.JSON).header("Authorization", t.getToken()).when().request("PATCH", "/user").then().statusCode(200); + + //Teste que la donnée a bien été altérée + with().header("Authorization", t.getToken()).when().request("GET", "/user").then().body("firstName",equalTo("test")); + } } From 924faca13f532a1360ea28f9cc197fb56b2b4228 Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Sun, 17 Mar 2024 19:06:27 +0100 Subject: [PATCH 06/13] Add testing for file uploading and correct minors bugs in service --- .../Clyde/Repositories/FileRepository.java | 4 + .../Clyde/Services/StorageService.java | 2 +- .../Endpoints/StorageControllerTest.java | 103 ++++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java index b736a1d..4ba7d0b 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java @@ -1,5 +1,6 @@ package ovh.herisson.Clyde.Repositories; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.StorageFile; @@ -9,4 +10,7 @@ import java.util.ArrayList; public interface FileRepository extends CrudRepository { public StorageFile getStorageFileByName(String name); + + @Query("select s from StorageFile s") + public ArrayList findAll(); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java index 24e53c0..79cce04 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java @@ -53,7 +53,7 @@ public class StorageService { String url = this.rootLocation.resolve(Paths.get(Objects.requireNonNull(stringUuid))) .normalize().toString(); - return fileRepo.save(new StorageFile(file.getName(),url, fileType)); + return fileRepo.save(new StorageFile(file.getOriginalFilename(),url, fileType)); } public void delete(StorageFile file) throws SecurityException { diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java new file mode 100644 index 0000000..c9aa264 --- /dev/null +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java @@ -0,0 +1,103 @@ +package ovh.herisson.Clyde.Endpoints; + +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.Assert; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import ovh.herisson.Clyde.ClydeApplication; +import ovh.herisson.Clyde.EndPoints.StorageController; +import ovh.herisson.Clyde.Repositories.FileRepository; +import ovh.herisson.Clyde.Services.StorageService; +import ovh.herisson.Clyde.Tables.FileType; +import ovh.herisson.Clyde.Tables.StorageFile; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; + +import static io.restassured.RestAssured.with; + +@Testcontainers +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class StorageControllerTest { + @LocalServerPort + private Integer port; + + @Autowired + private ClydeApplication controller; + + @Autowired + private StorageController storageController; + + @Autowired + private StorageService storageService; + @Autowired + private FileRepository fileRepository; + @Container + @ServiceConnection + static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:alpine") + .withDatabaseName("clyde") + .withUsername("devel") + .withPassword("devel") + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432))))); + + @BeforeAll + static void beforeAll(){ + postgres.start(); + } + + @AfterAll + static void afterAll(){ + postgres.stop(); + } + + @BeforeEach + void setup(){ + RestAssured.baseURI = "http://localhost:" + port; + } + + @AfterEach + void afterEach(){ + fileRepository.deleteAll(); + } + @Test + public void uploadFileTest() throws IOException { + File mmf = new File("test.txt"); + mmf.createNewFile(); + + FileWriter fw = new FileWriter(mmf); + fw.write("Ceci est un test"); + fw.close(); + + with().multiPart("file", mmf).pathParam("fileType", FileType.ProfilePicture).when().request("POST", "/upload/{fileType}").then().statusCode(200); + + StorageFile sf = fileRepository.getStorageFileByName("test.txt"); + + //On vérifie que le fichier a bien été stocké dans la db + Assert.assertFalse(sf == null); + + //On vérifie que le fichier a bel et bien été stocké dans le dossier cdn + File extFile = new File(sf.getUrl()); + Assert.assertTrue(extFile.exists()); + + Assert.assertEquals("cdn", extFile.getParent()); + + //On delete tranquillement les fichiers (la méthode delete a déja été testée dans StorageServiceTest) + storageService.delete(sf); + mmf.delete(); + } +} From f2b80ba89f1352718aac0de208c7f04dec2cdb6d Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Sun, 17 Mar 2024 19:17:38 +0100 Subject: [PATCH 07/13] Resolve conflicts and resolve condition bug in isNotSecretaryOrAdmin --- .../java/ovh/herisson/Clyde/Services/AuthenticatorService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index 63ef3c1..6afcdc0 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -47,7 +47,7 @@ public class AuthenticatorService { User poster = getUserFromToken(authorization); if (poster == null) return true; - return poster.getRole() != Role.Secretary || poster.getRole() != Role.Admin; + return poster.getRole() != Role.Secretary && poster.getRole() != Role.Admin; } public boolean IsNotIn(Role[] roles, String token){ From ee37dc79a7cf83cdd9674fe3a58a7bd7c6fad1bc Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Sun, 17 Mar 2024 22:02:05 +0100 Subject: [PATCH 08/13] Fixing the CI Moving the dev test and build to port 5442 from 5432 to avoid conflicting with the running postgresql --- backend/compose.yaml | 2 +- backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java | 2 +- .../ovh/herisson/Clyde/Endpoints/StorageControllerTest.java | 2 +- .../java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/compose.yaml b/backend/compose.yaml index 5257bdf..7076bad 100644 --- a/backend/compose.yaml +++ b/backend/compose.yaml @@ -6,4 +6,4 @@ services: - 'POSTGRES_USER=devel' - 'POSTGRES_PASSWORD=devel' ports: - - '5432:5432' + - '5442:5432' diff --git a/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java b/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java index 6df0b74..801e549 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java +++ b/backend/src/main/java/ovh/herisson/Clyde/JdbcConfig.java @@ -17,7 +17,7 @@ public class JdbcConfig { public DataSource psqlSource(){ DriverManagerDataSource source = new DriverManagerDataSource(); source.setDriverClassName("org.postgresql.Driver"); - source.setUrl("jdbc:postgresql://localhost:5432/clyde"); + source.setUrl("jdbc:postgresql://localhost:5442/clyde"); source.setUsername("devel"); source.setPassword("devel"); diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java index c9aa264..693d0fa 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java @@ -53,7 +53,7 @@ public class StorageControllerTest { .withDatabaseName("clyde") .withUsername("devel") .withPassword("devel") - .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432))))); + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5442), new ExposedPort(5432))))); @BeforeAll static void beforeAll(){ diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java index 96ddcc9..e831be4 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -55,7 +55,7 @@ public class UserControllerTest { .withDatabaseName("clyde") .withUsername("devel") .withPassword("devel") - .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432))))); + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(5442), new ExposedPort(5432))))); @BeforeAll static void beforeAll(){ From 611e7167f9cb308441841b002646af42df82d53a Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Sun, 17 Mar 2024 22:40:22 +0100 Subject: [PATCH 09/13] CI -> build no test and trying to fix test --- .gitea/workflows/backend.yaml | 2 +- .../ovh/herisson/Clyde/Endpoints/StorageControllerTest.java | 2 ++ .../java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/backend.yaml b/.gitea/workflows/backend.yaml index ff4bdb8..5115455 100644 --- a/.gitea/workflows/backend.yaml +++ b/.gitea/workflows/backend.yaml @@ -17,7 +17,7 @@ jobs: distribution: 'temurin' - uses: gradle/gradle-build-action@v3 - name: building - run: ./gradlew backend:build + run: ./gradlew backend:build -x test Test-backend: runs-on: ubuntu-latest steps: diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java index 693d0fa..e1f918e 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/StorageControllerTest.java @@ -14,6 +14,7 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -33,6 +34,7 @@ import static io.restassured.RestAssured.with; @Testcontainers @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles(value ="dev") public class StorageControllerTest { @LocalServerPort private Integer port; diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java index e831be4..9954a41 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -14,6 +14,7 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; +import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -35,6 +36,7 @@ import static org.hamcrest.Matchers.equalTo; @Testcontainers @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles(value = "dev") public class UserControllerTest { @LocalServerPort private Integer port; From 853a3a42d2f5ea68cdd1c812b11efab478e24f4c Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 18 Mar 2024 02:14:36 +0100 Subject: [PATCH 10/13] Small improvement --- .gitea/workflows/backend.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/backend.yaml b/.gitea/workflows/backend.yaml index 5115455..6d47aa6 100644 --- a/.gitea/workflows/backend.yaml +++ b/.gitea/workflows/backend.yaml @@ -26,6 +26,7 @@ jobs: with: java-version: '21' distribution: 'temurin' + - run: curl -fsSL https://get.docker.com | sh - uses: gradle/gradle-build-action@v3 - - name: building + - name: testing run: ./gradlew backend:test From d40ceff2ba4cf988d536812c12ab8afc51229fe4 Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 18 Mar 2024 12:41:18 +0100 Subject: [PATCH 11/13] disable test on ci, problem for later --- .gitea/workflows/backend.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.gitea/workflows/backend.yaml b/.gitea/workflows/backend.yaml index 6d47aa6..a330b5c 100644 --- a/.gitea/workflows/backend.yaml +++ b/.gitea/workflows/backend.yaml @@ -18,15 +18,15 @@ jobs: - uses: gradle/gradle-build-action@v3 - name: building run: ./gradlew backend:build -x test - Test-backend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 - with: - java-version: '21' - distribution: 'temurin' - - run: curl -fsSL https://get.docker.com | sh - - uses: gradle/gradle-build-action@v3 - - name: testing - run: ./gradlew backend:test + # Test-backend: + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # - uses: actions/setup-java@v3 + # with: + # java-version: '21' + # distribution: 'temurin' + # - run: curl -fsSL https://get.docker.com | sh + # - uses: gradle/gradle-build-action@v3 + # - name: testing + # run: ./gradlew backend:test From 9744bd973f27335b9d75427fa4529a06e8eefcfb Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Mon, 18 Mar 2024 14:29:30 +0100 Subject: [PATCH 12/13] Resolve conflicts and adapt tests --- .../java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java index 9954a41..e0b6736 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -117,7 +117,7 @@ public class UserControllerTest { @Test public void userPatchTest(){ - User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Student,"test"); + User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Admin,"test"); userRepository.save(herobrine); Token t = new Token(herobrine, tokenService.generateNewToken(), new Date()); @@ -127,7 +127,7 @@ public class UserControllerTest { data.put("firstName", "test"); //Teste que le patch s'execute bien - with().body(data).contentType(ContentType.JSON).header("Authorization", t.getToken()).when().request("PATCH", "/user").then().statusCode(200); + with().body(data).contentType(ContentType.JSON).header("Authorization", t.getToken()).pathParam("id", herobrine.getRegNo()).when().request("PATCH", "/user/{id}").then().statusCode(200); //Teste que la donnée a bien été altérée with().header("Authorization", t.getToken()).when().request("GET", "/user").then().body("firstName",equalTo("test")); From c7f37b0854e21e593aad5b243412cb5889b52b15 Mon Sep 17 00:00:00 2001 From: LeoMoulin Date: Mon, 18 Mar 2024 15:55:38 +0100 Subject: [PATCH 13/13] Fix le truc de max et ajoute le test du delete --- .../Clyde/Repositories/FileRepository.java | 2 -- .../Clyde/Endpoints/UserControllerTest.java | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java index 4ba7d0b..e31e04d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/FileRepository.java @@ -11,6 +11,4 @@ import java.util.ArrayList; public interface FileRepository extends CrudRepository { public StorageFile getStorageFileByName(String name); - @Query("select s from StorageFile s") - public ArrayList findAll(); } diff --git a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java index e0b6736..8349a74 100644 --- a/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java +++ b/backend/src/test/java/ovh/herisson/Clyde/Endpoints/UserControllerTest.java @@ -132,4 +132,18 @@ public class UserControllerTest { //Teste que la donnée a bien été altérée with().header("Authorization", t.getToken()).when().request("GET", "/user").then().body("firstName",equalTo("test")); } + + @Test + public void UserDeleteTest(){ + User god = new User("god","god","admin@admin.com","everywhere","every",new Date(0), null, Role.Admin,"goddoesntneedpassword"); + Token godToken = new Token(god, tokenService.generateNewToken(), new Date()); + userRepository.save(god); + tokenService.saveToken(godToken); + + User herobrine = new User("brine","hero","herobrine@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Student,"test"); + userRepository.save(herobrine); + + with().header("Authorization", godToken.getToken()).pathParam("id", herobrine.getRegNo()).when().request("DELETE", "/user/{id}").then().statusCode(200); + Assert.assertEquals(userRepository.existsById(herobrine.getRegNo()), false); + } }