diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index c1dd12f..0000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index b7cb93e..0000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/backend/pom.xml b/backend/pom.xml index 51e592e..37ce890 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -6,6 +6,7 @@ taf 1.0.0-SNAPSHOT + ca.etsmtl.taf backend @@ -35,10 +36,9 @@ true - mysql - mysql-connector-java - 8.0.31 - runtime + org.mariadb.jdbc + mariadb-java-client + 3.4.1 io.jsonwebtoken @@ -52,6 +52,34 @@ 1.18.24 provided + + + jakarta.validation + jakarta.validation-api + 3.0.0 + + + + + jakarta.persistence + jakarta.persistence-api + 3.1.0 + + + + + jakarta.servlet + jakarta.servlet-api + [5.0.0,) + + + + + org.hibernate.validator + hibernate-validator + 7.0.2.Final + + org.springframework.boot @@ -83,11 +111,18 @@ com.squareup.okhttp3 okhttp - + com.opencsv opencsv 5.5 + + + + ca.etsmtl.taf + testrail + ${project.version} + diff --git a/backend/src/main/java/ca/etsmtl/taf/TestAutomationFrameworkApplication.java b/backend/src/main/java/ca/etsmtl/taf/TestAutomationFrameworkApplication.java index ea3565e..e036c96 100644 --- a/backend/src/main/java/ca/etsmtl/taf/TestAutomationFrameworkApplication.java +++ b/backend/src/main/java/ca/etsmtl/taf/TestAutomationFrameworkApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = {"ca.etsmtl.taf", "ca.etsmtl.taf.testrail"}) @EnableJpaAuditing public class TestAutomationFrameworkApplication { diff --git a/backend/src/main/java/ca/etsmtl/taf/security/WebSecurityConfig.java b/backend/src/main/java/ca/etsmtl/taf/security/WebSecurityConfig.java index 7df0caf..fff336e 100644 --- a/backend/src/main/java/ca/etsmtl/taf/security/WebSecurityConfig.java +++ b/backend/src/main/java/ca/etsmtl/taf/security/WebSecurityConfig.java @@ -17,6 +17,7 @@ import ca.etsmtl.taf.security.jwt.AuthEntryPointJwt; import ca.etsmtl.taf.security.jwt.AuthTokenFilter; import ca.etsmtl.taf.security.services.UserDetailsServiceImpl; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity @@ -51,7 +52,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeHttpRequests((authz) -> authz - .requestMatchers("/**").permitAll() // جایگزین antMatchers + .requestMatchers(new AntPathRequestMatcher("/**")).permitAll() // جایگزین antMatchers ); http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); diff --git a/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthEntryPointJwt.java b/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthEntryPointJwt.java index 4f000a4..189cda9 100644 --- a/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthEntryPointJwt.java +++ b/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthEntryPointJwt.java @@ -4,9 +4,9 @@ import java.util.HashMap; import java.util.Map; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthTokenFilter.java b/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthTokenFilter.java index 849943a..5f57b7c 100644 --- a/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthTokenFilter.java +++ b/backend/src/main/java/ca/etsmtl/taf/security/jwt/AuthTokenFilter.java @@ -2,10 +2,10 @@ import java.io.IOException; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 6393cdc..0cb73e6 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,9 +1,9 @@ spring: datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://nostrasoft.com:3306/nostr321_taf-db - username: nostr321_taf - password: JKaVLX75iHwtrHc + driver-class-name: org.mariadb.jdbc.Driver + url: jdbc:mariadb://127.0.0.1:3306/taf-db + username: taf + password: taf jpa: defer-datasource-initialization: true hibernate: @@ -11,14 +11,14 @@ spring: dialect : ${spring.jpa.properties.hibernate.dialect} properties: hibernate: - dialect: org.hibernate.dialect.MySQL8Dialect + dialect: org.hibernate.dialect.MariaDBDialect messages: basename: validation encoding: ISO-8859-1 sql: init: mode: always - platform: mysql + platform: mariadb taf: app: jwtSecret: bezKoderSecretKey @@ -28,5 +28,11 @@ taf: selenium_container_url: http://selenium selenium_container_port: 8090 +testrail: + base-url: "https://leofornoff.testrail.io/index.php?/api/v2/" + username: "leo.fornoff.1@ens.etsmtl.ca" + password: "Valid8-Outpost2-Caravan0-Unlovable9-Easter7" + + server: port: 8083 \ No newline at end of file diff --git a/backend/src/main/resources/testrail/SimpleSimulation.java b/backend/src/main/resources/testrail/SimpleSimulation.java new file mode 100644 index 0000000..94edb46 --- /dev/null +++ b/backend/src/main/resources/testrail/SimpleSimulation.java @@ -0,0 +1,25 @@ +package computerdatabase; + +import static io.gatling.javaapi.core.CoreDsl.*; +import static io.gatling.javaapi.http.HttpDsl.*; + +import io.gatling.javaapi.core.*; +import io.gatling.javaapi.http.*; + +public class SimpleSimulation extends Simulation { + + HttpProtocolBuilder httpProtocol = + http.baseUrl("https://wikijs.fornoff.fr") + .acceptHeader("application/json") + .contentTypeHeader("application/json"); + + ScenarioBuilder Scenario = scenario("My First Scenario") + .exec(http("Request 1") + .get("/computers/")); + + { + setUp( + Scenario.injectOpen(rampUsers(10).during(5)) + ).protocols(httpProtocol); + } +} \ No newline at end of file diff --git a/backend/src/main/resources/testrail/index.html b/backend/src/main/resources/testrail/index.html new file mode 100644 index 0000000..0f8ed5e --- /dev/null +++ b/backend/src/main/resources/testrail/index.html @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + + +
+
+
+
+ + + Documentation +
+ + Try + Gatling Enterprise + Gatling Enterprise + + +
+
+ +
+
+
+
+ ComputerDatabaseSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.12.0 + + + Released: + 2024-09-09 + +
+
+ Run Information +
+ + Date: + 2024-10-03 15:34:38 UTC + + + Duration: + 16s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + diff --git a/backend/src/test/java/ca/etsmtl/taf/TestAutomationFrameworkApplicationTests.java b/backend/src/test/java/ca/etsmtl/taf/TestAutomationFrameworkApplicationTests.java index 691ad31..f4138ff 100644 --- a/backend/src/test/java/ca/etsmtl/taf/TestAutomationFrameworkApplicationTests.java +++ b/backend/src/test/java/ca/etsmtl/taf/TestAutomationFrameworkApplicationTests.java @@ -6,8 +6,4 @@ @SpringBootTest class TestAutomationFrameworkApplicationTests { - @Test - void contextLoads() { - } - } diff --git a/pom.xml b/pom.xml index 7135164..f00da4a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 2.6.6 ca.etsmtl @@ -17,11 +17,11 @@ 17 1.18.24 - 3.3.4 + 2.6.6 pom backend - gatling + testrail \ No newline at end of file diff --git a/selenium/Dockerfile b/selenium/Dockerfile index a2d369a..cbc483b 100644 --- a/selenium/Dockerfile +++ b/selenium/Dockerfile @@ -1,11 +1,13 @@ -FROM maven:3.8.6-eclipse-temurin-17 as builder +FROM maven:3.9.9-sapmachine-17 as builder -RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false update +ARG CHROME_VERSION="130.0.6723.58-1" + +RUN apt-get update # RUN apt-get install -y gconf-service libasound2 libatk1.0-0 libcairo2 libcups2 libfontconfig1 libgdk-pixbuf2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libxss1 fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils RUN apt-get install -y wget -RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -RUN apt-get install -y ./google-chrome-stable_current_amd64.deb +RUN wget -q https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb +RUN apt-get install -y ./google-chrome-stable_${CHROME_VERSION}_amd64.deb WORKDIR / COPY pom.xml . @@ -13,4 +15,4 @@ COPY selenium ./selenium WORKDIR /selenium RUN mvn clean install EXPOSE 8090 -ENTRYPOINT ["mvn", "spring-boot:run" ] +ENTRYPOINT ["mvn", "spring-boot:run" ] \ No newline at end of file diff --git a/testrail/.gitattributes b/testrail/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/testrail/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/testrail/.gitignore b/testrail/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/testrail/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/testrail/DataSavingSequence.puml b/testrail/DataSavingSequence.puml new file mode 100644 index 0000000..90b1427 --- /dev/null +++ b/testrail/DataSavingSequence.puml @@ -0,0 +1,114 @@ +@startuml +'https://plantuml.com/sequence-diagram + + + +actor User +entity TRData +participant TRDataFactory #yellowgreen +participant DataInterface #red +participant ErrorHandler #red +participant DataSavingService #orange +participant TAFDataSavingService #orange +participant TRDataSavingService #orange +participant DataSender #lightblue +database DataStorage +collections TestRailAPI + + +== Creating From TAF to TestRail == +User -> DataInterface : new(...) + +activate DataInterface + +group Create TRData + DataInterface -> TRDataFactory : new(...) + + activate TRDataFactory + + TRDataFactory -> TRData : new(...) + + activate TRData + + TRData --> TRDataFactory : TRData + + deactivate TRData + + TRDataFactory --> DataInterface : TRData + + deactivate TRDataFactory +end + + + +DataInterface -> DataSavingService : saveData(TRData) + +activate DataSavingService + +DataSavingService -> DataSavingService : setDataUnSaved(Data) + +DataSavingService -> TRDataSavingService : saveData(TRData) + +activate TRDataSavingService + +TRDataSavingService -> DataSender : send(TRData) + +activate DataSender + +DataSender -> TestRailAPI : send(TRData) + +activate TestRailAPI +alt Success + TestRailAPI --> DataSender : success http code 200 + response + DataSender --> TRDataSavingService : success code 0 + response + TRDataSavingService -> TRDataSavingService : Update TRData with response + TRDataSavingService -> TRDataSavingService : setTRSaved(TRData) + TRDataSavingService --> DataSavingService : success code 0 + TRData + + + group Save Locally + + DataSavingService -> TAFDataSavingService : saveData(Data) + + activate TAFDataSavingService + + TAFDataSavingService -> DataStorage : send(Data) + + activate DataStorage + + DataStorage -> DataStorage : save(Data) + + DataStorage --> TAFDataSavingService : Data + + deactivate DataStorage + + TAFDataSavingService --> DataSavingService : Data + + deactivate TAFDataSavingService + end + + DataSavingService -> DataSavingService : setSaved(Data) + + +else Error + + TestRailAPI --> DataSender : error + response + deactivate TestRailAPI + + DataSender --> TRDataSavingService : error + response + + deactivate DataSender + + TRDataSavingService -> ErrorHandler : sendTRConnexionError(error, response) + + TRDataSavingService --> DataSavingService : error + TRData + + deactivate + + note over DataSavingService : Save Locally + DataSavingService -> DataSavingService : setLocallySaved(Data) +end + +DataSavingService --> DataInterface : code + TRData + +@enduml \ No newline at end of file diff --git a/testrail/DataSavingSequence.svg b/testrail/DataSavingSequence.svg new file mode 100644 index 0000000..510cd2f --- /dev/null +++ b/testrail/DataSavingSequence.svg @@ -0,0 +1 @@ +UserUserTRDataTRDataTRDataFactoryTRDataFactoryDataInterfaceDataInterfaceErrorHandlerErrorHandlerDataSavingServiceDataSavingServiceTAFDataSavingServiceTAFDataSavingServiceTRDataSavingServiceTRDataSavingServiceDataSenderDataSenderDataStorageDataStorageTestRailAPITestRailAPICreating From TAF to TestRailnew(...)Create TRDatanew(...)new(...)TRDataTRDatasaveData(TRData)setDataUnSaved(Data)saveData(TRData)send(TRData)send(TRData)alt[Success]success http code 200 + responsesuccess code 0 + responseUpdate TRData with responsesetTRSaved(TRData)success code 0 + TRDataSave LocallysaveData(Data)send(Data)save(Data)DataDatasetSaved(Data)[Error]error + responseerror + responsesendTRConnexionError(error, response)error + TRDataSave LocallysetLocallySaved(Data)code + TRData \ No newline at end of file diff --git a/testrail/README.md b/testrail/README.md new file mode 100644 index 0000000..b411526 --- /dev/null +++ b/testrail/README.md @@ -0,0 +1,251 @@ +# TestRail module of TAF project + +## Summary + +This module is responsible for the integration of the TestRail tool with the TAF project. +It provides the possibility to exchange information with TestRail, a test management app. + +It is build as a Spring Boot multi-module application with backend as the main module. + +## Getting Started + +### Prerequisites + +- Java 17 +- Spring Boot 2.6.6 +- Maven + +### Build the project + +To build the project, run the following command in the root directory of the project: + +```bash +mvn clean install +``` + +### Run the project + +To run the project, run the following command in the root directory of the project: + +```bash +mvn spring-boot:run -pl backend +``` + + +## For developers + +As we don't have access to a proper documentation system, we will use this README file to document the project. +Like this, we are sure that the next developers will have access to the information. + +### Useful links + +#### Multi-module Spring projects + +- [Spring multi-module projects](https://spring.io/guides/gs/multi-module) +- [Getting Started | Creating a Multi Module Project](https://spring.io/guides/gs/multi-module) + +--- + +--- + +### Project structure + +--- +#### Sub-module configuration + +The submodule configuration is done in the [pom.xml](pom.xml) file and also inherited from the parent [TAF/pom.xml](../pom.xml) file. +The submodule is also declared in the main module configuration file [TAF/backend/pom.xml](../backend/pom.xml). + +The spring-boot application configuration should only be defined once in the main module configuration file [application.yml](../backend/src/main/resources/application.yml). + +--- +#### Database + +--- + +##### Database configuration + +In order to facilitate the development process, we used a docker hosted MariaDB database. + +A docker-compose file is available in the [docker-compose.yaml](./docker-compose.yaml) file. + +To adapt the spring-boot application to the database, the configuration is done in the [application.yml](../backend/src/main/resources/application.yml) file. You may need to adapt "datasource", "jpa" and "sql" properties. +You may also need to add to the pom.xml file the dependency to the MariaDB driver (or whatever database you are using). + +- pom.xml +```xml + + org.mariadb.jdbc + mariadb-java-client + 3.4.1 + +``` + +- application.yml +```yaml + +spring: + datasource: + url: jdbc:mariadb://localhost:3306/taf + username: root + password: root + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + dialect: org.hibernate.dialect.MariaDBDialect + sql: + init: + platform: mariadb +``` + +- docker-compose.yaml +```yaml + services: + mariadb: + image: mariadb:latest + container_name: mariadb-taf + environment: + MYSQL_ROOT_PASSWORD: taf-root + MYSQL_DATABASE: taf-db + MYSQL_USER: taf + MYSQL_PASSWORD: taf + ports: + - "3306:3306" + networks: + - taf-network + + + networks: + taf-network: + driver: bridge +``` + +#### Database schema + +The database schema dedicated to the TestRail module is automatically generated by Hibernate. The schema is generated in the database at the application startup. +The tables corresponding to the entities are created in the database. + +#### Database for tests + +For the tests, we use an in-memory H2 database which is automatically created and destroyed at the beginning and end of the tests. + +To use it, you should create proper test files in the [src/test/java/ca.etsmtl.taf.testrail](./src/test/java/ca.etsmtl.taf.testrail) subdirectories. The next code shows an example of a test file: + +```java + 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.ContextConfiguration; + + @ContextConfiguration(classes = TestConfig.class) + @DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" + }) + public class TestUnitTestRailProject { + @Autowired + private TestRailRepository testRailRepository; + + // Your tests here + @Test + public void test() { + // Your test here + } + } +``` + +--- + +#### Module structure + +--- + +This section describes the structure of the module. +##### controller +> Contains the controllers of the module. The controllers are the classes that handle the HTTP requests. They are the entry point of the module. + +##### model +###### model/entity +>Contains the entities of the module. +>Each entity is a table in the database. Those class are meant to be used with the JPA repository. They only contain the fields of the table and the getters and setters. + +>All the data that are saved locally but are meant to be sent or received from the TestRail API start with "TestRail" followed by the name of the entity. The corresponding tables are the tables that start with "tr_". + +###### model/factory + +>Contains the factories of the entities. Those factories are used to create entities. They can be used to create entities from JSON objects. + +##### repository + +>Contains the repositories of the module. The repositories are the interfaces that handle the database operations. They are used to save, update, delete and retrieve entities from the database. + +##### service +###### service/data + +>Contains the services that handle the data of the module. They are classes to interact with the TAF database and not the TestRail API. + +###### service/manager + +>Contains the services that handle the data gesture. + +service/manager/saving + +>Those class are interfaces the user can interact with to save data. They handle the data saving between the database and the API. + +service/manager/query + +>Those class are interfaces the user can interact with to query data. They are used to send and receive data from the API and **not** the database. + +--- + +#### How the module handle data saving between the database and the API + +We consider that we have multiple constraints concerning the data. As we are never sure to be able to publish data to TestRail immediately, we need to save the data in the database and then publish it to TestRail. +But this can lead to duplication or loss of data. To avoid this, we have implemented a system that allows us to save the data in the database and then publish it to TestRail. That's why we decided to gesture that data like in the following diagram: + +- Example when user wants to add a new data (not depending on the data type) +![Data saving](./DataSavingSequence.svg) + +The module try to save the data remotely and then locally. If the remote saving fails, the local saving ensure that the data is saved and the user can continue to work. The data will be published to TestRail later. + +--- + +#### Limitations + +##### TestRail API + +As we had a limited time we haven't covered all the TestRail data. We have only covered the data that we needed to start the module. But more types can be added easily when following the same classes structures. + +We also haven't covered all the failure cases. We have only covered the more frequent and basic ones. + +##### Failure cases and reports + +Handling errors is something very important and this project doesn't report and save errors. Dedicated classes that can handle errors can be a good addition to the project and help a lot of debugging. + +##### Data from TAF + +As none of the other groups have yet a structure to save their data after testing, we had issue to use their data and to export them. That's why we focused more on TestRail API than that. Nevertheless, we started to develop interactions with gatling output. In order to do that, we simulated a potential structure for Gatling output data (entity). + +--- +#### Tests + +We have done some tests especially for entity. +Each entity have a dedicated test file that test each of the interactions with the entity. + +We also have done some integration tests to validate data creation and deletion in the database and TestRail API through the managing classes. + +Tests can be run with the following command when you are in the taf directory: + +```bash +mvn test +``` + +--- + +#### Job to be done + +We wrote "TODO" comments in the code to indicate missing parts or parts that need to be improved. We also wrote some comments to indicate what we have done and what we have not done. + +It will also be necessary to create and then link the backend with frontend pages. \ No newline at end of file diff --git a/testrail/TestRail module Class Diagram.svg b/testrail/TestRail module Class Diagram.svg new file mode 100644 index 0000000..303b6ac --- /dev/null +++ b/testrail/TestRail module Class Diagram.svg @@ -0,0 +1 @@ +ExportServiceInterfaceexportData()ExportServiceexportData()XCollectorcollectData()JmeterCollectorcollectData()SeleniumCollectorcollectData()GatlingCollectorcollectData()ExportAexportData()ExportBexportData()CollectDatacollectData()ParseDataparseData()JmeterParserparseData()SeleniumParserparseData()GatlingParserparseData()XParserparseData() \ No newline at end of file diff --git a/testrail/TestRail module configuration documentation .md b/testrail/TestRail module configuration documentation .md new file mode 100644 index 0000000..7a54d5f --- /dev/null +++ b/testrail/TestRail module configuration documentation .md @@ -0,0 +1,334 @@ + +[Spring multi-module projects](https://spring.io/guides/gs/multi-module) +[Getting Started | Creating a Multi Module Project](https://spring.io/guides/gs/multi-module) +## Lien utiles du projet + +[Github du projet](https://github.com/Yojda/TAF) + +## Commande utiles + +### Spring + +Pour compiler le projet +```bash +mvn clean install +``` + +Pour run le projet une fois compiler +```Bash +mvn spring-boot:run -pl backend +``` + +Pour compiler puis run le projet +```Bash +mvn clean install && mvn spring-boot:run -pl backend +``` + + +## Fichiers importants + +### Structure + +#### backend + +La structure du backend est une structure typique d'un application spring + +```txt +backend +├── src +│   ├── main +│   │   ├── java +│   │   │   └── ca +│   │   │   └── etsmtl +│   │   │   └── taf +│   │   │   ├── apiCommunication +│   │   │   ├── config +│   │   │   ├── controller +│   │   │   ├── dto +│   │   │   ├── entity +│   │   │   ├── jmeter +│   │   │   │   ├── controllers +│   │   │   │   ├── model +│   │   │   │   ├── provider +│   │   │   │   └── utils +│   │   │   ├── payload +│   │   │   │   ├── request +│   │   │   │   └── response +│   │   │   ├── provider +│   │   │   ├── repository +│   │   │   ├── security +│   │   │   │   ├── jwt +│   │   │   │   └── services +│   │   │   └── service +│   │   └── resources +│   │   ├── jmeter +│   │   │   └── results +│   │   ├── static +│   │   │   ├── css +│   │   │   ├── images +│   │   │   └── js +│   │   └── templates +│   │   └── edit +│   └── test +│   └── java +│   └── ca +│   └── etsmtl +│   └── taf +└── target + ├── classes + │   ├── META-INF + │   ├── ca + │   │   └── etsmtl + │   │   └── taf + │   │   ├── apiCommunication + │   │   ├── config + │   │   ├── controller + │   │   ├── dto + │   │   ├── entity + │   │   ├── jmeter + │   │   │   ├── controllers + │   │   │   ├── model + │   │   │   ├── provider + │   │   │   └── utils + │   │   ├── payload + │   │   │   ├── request + │   │   │   └── response + │   │   ├── provider + │   │   ├── repository + │   │   ├── security + │   │   │   ├── jwt + │   │   │   └── services + │   │   └── service + │   ├── jmeter + │   │   └── results + │   ├── static + │   │   ├── css + │   │   ├── images + │   │   └── js + │   └── templates + │   └── edit + ├── generated-sources + │   └── annotations + ├── generated-test-sources + │   └── test-annotations + ├── maven-archiver + ├── maven-status + │   └── maven-compiler-plugin + │   ├── compile + │   │   └── default-compile + │   └── testCompile + │   └── default-testCompile + ├── surefire-reports + └── test-classes + └── ca + └── etsmtl + └── taf + +``` + +#### testrail module + +Le module *testrail* reprend la structure classique d'un projet spring. Ci-dessous est donné sa structure partiel puisqu'elle ne précise pas encore la structure interne aux fichiers sources du module. + +```txt + testrail + ├── src + │   ├── main + │   │   ├── java + │   │   │   └── ca + │   │   │   └── etsmtl + │   │   │   └── testrail + │   │   └── resources + │   └── test + │   └── java + │   └── ca + │   └── etsmtl + │   └── testrail + └── target + ├── classes + │   └── ca + │   └── etsmtl + │   └── testrail + ├── generated-sources + │   └── annotations + ├── generated-test-sources + │   └── test-annotations + ├── maven-archiver + ├── maven-status + │   └── maven-compiler-plugin + │   ├── compile + │   │   └── default-compile + │   └── testCompile + │   └── default-testCompile + ├── surefire-reports + └── test-classes + └── ca + └── etsmtl + └── testrail + + +``` + + +#### packages + +##### controller + +gestion des requêtes HTTP + +##### service + +logique métier, notamment les interactions avec TestRail et les autres outils + +##### repository +Pour les interactions avec la base de données + +##### entity + +Les entités de la base de données JPA + +##### dto + +Les objets de transfert de données + +#### Structure + +![](TestRail%20module%20Class%20Diagram.svg) + +### Configuration +#### Java +##### /pom.xml + +> [!FILE] /pom.xml +> Contient les informations de configuration de tous les modules java du projet (backend, testrail). Il s'agit du fichier principal de configuration Java. + +Il faut décrire les modules du projet dans ce fichier pour qu'ils soient bien tous compiler + +```yml + + backend + testrail + +``` + +C'est aussi dans ce fichier que l'on retrouve la version de à utiliser + +```yml + + 17 + 1.18.24 + 2.6.6 + +``` +##### /backend/pom.xml + +> [!FILE] /backend/pom.xml +> Contient les informations de configuration propres au module java principal "backend" (ca.etsmtl.taf). +> + +##### /testrail/pom.xml + +> [!FIEL] /testrail/pom.xml +> Contient les informations de configuration propres au module java "testrail" (ca.etsmtl.testrail) + +#### Docker + +##### /docker-compose.yml + +> [!FILE] /docker-compose.yml +> Fichier utiliser pour spécifier quels docker crée pour faire tourner l'application. On retrouve aussi des informations comme le mapping des ports. + +##### /backend/Dockerfile + +> [!FILE] /backend/Dockerfile +> Fichier qui décris comment crée l'image docker du backend du projet. Cette image compile le projet avec tous les modules spécifier dans le fichier /pom.xml. + + +## Docker compose with dedicate database + + +**/docker-compose.yml** + +```yml +services: + backend: + image: back + container_name: back + build: + context: ./ + dockerfile: ./backend/Dockerfile + ports: + - "8083:8083" + env_file: + # Specifying the env file with necessaries values + - .docker_config.env + + frontend: + image: front + container_name: front + build: + context: ./frontend + ports: + - "4200:80" + depends_on: + - backend + + selenium: + image: selenium + container_name: selenium + build: + context: ./ + dockerfile: ./selenium/Dockerfile + ports: + - "8090:8090" + + + mariadb: + image: mariadb + container_name: mariadb-2 + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: taf-db + MYSQL_USER: taf + MYSQL_PASSWORD: taf + ports: + - "3306:3306" + networks: + - taf-network + +networks: + taf-network: + driver: bridge +``` + +**/.docker_config.env** + +```env +TEST_API_SERVICE_URL="http://127.0.0.1" +TEST_API_SERVICE_PORT="8082" +SPRING_DATASOURCE_URL="jdbc:mysql://127.0.0.1:3306/taf-db" +SPRING_DATASOURCE_USERNAME="taf" +SPRING_DATASOURCE_PASSWORD="taf" +``` + +**/backend/pom.xml** + +```xml + + org.mariadb.jdbc + mariadb-java-client + 3.4.1 + +``` + +**/backend/src/main/ressources/application.yml** + +```yml + spring: + datasource: + driver-class-name: org.mariadb.jdbc.Driver + url: jdbc:mariadb://127.0.0.1:3306/taf-db + username: taf + password: taf +``` + diff --git a/testrail/TestRailImport Class Diagram.puml b/testrail/TestRailImport Class Diagram.puml new file mode 100644 index 0000000..6c1811f --- /dev/null +++ b/testrail/TestRailImport Class Diagram.puml @@ -0,0 +1,81 @@ +@startuml +'https://plantuml.com/class-diagram + +interface ExportServiceInterface { + + exportData() +} + +class ExportService implements ExportServiceInterface{ + + exportData() +} + +ExportService *-up- XCollector +ExportService *-up- JmeterCollector +ExportService *-up- SeleniumCollector +ExportService *-up- GatlingCollector + +class ExportA implements ExportServiceInterface { + + exportData() +} + +ExportA -up-* ExportService + +class ExportB implements ExportServiceInterface { + + exportData() +} +ExportB -up-* ExportService + +interface CollectData { + + collectData() +} + +class JmeterCollector implements CollectData { + + collectData() +} + +class SeleniumCollector implements CollectData { + + collectData() +} + +class GatlingCollector implements CollectData { + + collectData() +} + +class XCollector implements CollectData { + + collectData() +} + +interface ParseData { + + parseData() +} + + +class JmeterParser implements ParseData { + + parseData() +} + +JmeterParser --* JmeterCollector + +class SeleniumParser implements ParseData { + + parseData() +} + +SeleniumParser --* SeleniumCollector + +class GatlingParser implements ParseData { + + parseData() +} + +GatlingParser --* GatlingCollector + +class XParser implements ParseData { + + parseData() +} + +XParser --* XCollector + + + + + +@enduml \ No newline at end of file diff --git a/testrail/docker-compose.yaml b/testrail/docker-compose.yaml new file mode 100644 index 0000000..7904dba --- /dev/null +++ b/testrail/docker-compose.yaml @@ -0,0 +1,18 @@ +services: + mariadb: + image: mariadb:latest + container_name: mariadb-taf + environment: + MYSQL_ROOT_PASSWORD: taf-root + MYSQL_DATABASE: taf-db + MYSQL_USER: taf + MYSQL_PASSWORD: taf + ports: + - "3306:3306" + networks: + - taf-network + + +networks: + taf-network: + driver: bridge \ No newline at end of file diff --git a/testrail/pom.xml b/testrail/pom.xml new file mode 100644 index 0000000..4e1e7b8 --- /dev/null +++ b/testrail/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + ca.etsmtl + taf + 1.0.0-SNAPSHOT + + ca.etsmtl.taf + testrail + 1.0.0-SNAPSHOT + testrail + testrail + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.projectlombok + lombok + provided + + + + com.h2database + h2 + test + + + + javax.persistence + persistence-api + 1.0.2 + import + + + + + + + + diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/DataClassUsage.puml b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/DataClassUsage.puml new file mode 100644 index 0000000..7ee3bcd --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/DataClassUsage.puml @@ -0,0 +1,69 @@ +@startuml +'https://plantuml.com/class-diagram + +class TestRailXXX extends TestRailData { + @Entity + @Getter & Setter + @Table tr_xxx +} + +class TestRailXXXFactory { + @Component + + + create(String name): TestRailXXX + + create(JSONObject xxxJson) : TestRailXXX +} + +interface TestRailxxxRepository extends JpaRepository { + @Repository + Optional findByTRId(Integer id); + + Optional findByName(String name); + ... +} + +class TestRailxxxService { + @Service + + - TestRailxxxRepository testRailxxxRepository + - TestRailxxxFactory testRailxxxFactory + + + create(String name): TestRailXXX + + create(JSONObject xxxJson) : TestRailXXX + + save(TestRailXXX xxx): TestRailXXX + + findById(Long id): Optional + + findByTRId(Integer id): Optional + + findByName(String name): Optional + ... +} + +class xxxSavingManager { + @Service + + - TestRailxxxService testRailxxxService + - xxxQueryTestRail xxxQueryTestRail + + + save(TestRailXXX xxx): DataResponseFromTR + + delete(TestRailXXX xxx): DataResponseFromTR + ... +} + +class xxxQueryTestRail { + @Static class + - HttpSenderToTR httpSenderToTR + + + add(String (String name) : DataResponseFromTR + + + delete(String name) : DataResponseFromTR +} + +class GeneralSavingManager { + @Service + + - xxxSavingManager xxxSavingManager + + + saveXXX(TestRailXXX xxx): void + + deleteXXX(TestRailXXX xxx): void +} + +@enduml \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingClasses.puml b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingClasses.puml new file mode 100644 index 0000000..9d12c03 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingClasses.puml @@ -0,0 +1,36 @@ +@startuml +'https://plantuml.com/class-diagram + + +class GatlingTestCase { + @Entity + @Getter & Setter + @Table tr_gatling_test_case + + - id: Long + - sectionId: int + - title: String + - templateId: int + - typeId: int + - priorityId: int + - estimate: TimeStamp + - milestoneId: int + - refs: String + +} +class GatlingResult { + @Entity + @Getter & Setter + @Table tr_gatling_result + + - id: Long + - statusId: int + - comment: String + - version: String + - elapsed: String + - defects: String + - assignedToId: int + - date: TimeStamp +} + +@enduml \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingResult.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingResult.java new file mode 100644 index 0000000..f2fc5cd --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingResult.java @@ -0,0 +1,45 @@ +package ca.etsmtl.taf.testrail.model.entity; + +import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Entity +@Table(name = "tr_gatling_result") +@Getter +@Setter +public class GatlingResult { + /* + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * */ + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "status_id", nullable = false) + private Integer statusId; + + @Column(name = "comment") + private String comment; + + @Column(name = "version") + private String version; + + @Column(name = "elapsed") + private String elapsed; + + @Column(name = "defects") + private String defects; + + @Column(name = "assignedto_id") + private Integer assignedToId; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "date") + private Date date; + +} \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingTestCase.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingTestCase.java new file mode 100644 index 0000000..653205c --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/GatlingTestCase.java @@ -0,0 +1,77 @@ +package ca.etsmtl.taf.testrail.model.entity; + +import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.sql.Timestamp; + +@Entity +@Table(name = "tr_gatling_test_case") +@Getter +@Setter +public class GatlingTestCase { + + /* + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * */ + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tr_id", unique = true, nullable = true) + private Integer TRId; + + @Column(name = "title", nullable = false, unique = true) + private String title; + + @Column(name = "section_id") + private Integer sectionId; + + @Column(name = "type_id") + private Integer typeId; + + @Column(name = "priority_id") + private Integer priorityId; + + @Column(name = "milestone_id") + private Integer milestoneId; + + @Column(name = "refs") + private String refs; + + @Column(name = "created_by") + private Integer createdBy; + + @Column(name = "created_on") + private Timestamp createdOn; + + @Column(name = "updated_by") + private Integer updatedBy; + + @Column(name = "updated_on") + private Timestamp updatedOn; + + @Column(name = "estimate") + private Timestamp estimate; + + @Column(name = "estimate_forecast") + private Timestamp estimateForecast; + + @Column(name = "suite_id") + private Integer suiteId; + + @Column(name = "template_id") + private Integer templateId; + + @Column(name = "scenario_name", nullable = false) + private String scenarioName; + + @Column(name = "base_url", nullable = false) + private String baseUrl; + + @Column(name = "user_injection") + private String userInjection; +} \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailCase.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailCase.java new file mode 100644 index 0000000..e132d78 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailCase.java @@ -0,0 +1,71 @@ +package ca.etsmtl.taf.testrail.model.entity; + + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import java.sql.Timestamp; + +@Entity +@Table(name = "tr_case") +@Getter +@Setter +public class TestRailCase extends TestRailData{ + /* + * Class to save cases from TestRail in TAF database to be used in the application. + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : + * - Unit tests : TestUnitTestRailCase + * - Integration tests : TODO + * */ + + @Id@GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tr_id", unique = true, nullable = true) + private Integer TRId; + + @Column(name = "title", nullable = false, unique = true) + private String title; + + @Column(name = "section_id") + private Integer sectionId; + + @Column(name = "type_id") + private Integer typeId; + + @Column(name = "priority_id") + private Integer priorityId; + + @Column(name = "milestone_id") + private Integer milestoneId; + + @Column(name = "refs") + private String refs; + + @Column(name = "created_by") + private Integer createdBy; + + @Column(name = "created_on") + private Timestamp createdOn; + + @Column(name = "updated_by") + private Integer updatedBy; + + @Column(name = "updated_on") + private Timestamp updatedOn; + + @Column(name = "estimate") + private Timestamp estimate; + + @Column(name = "estimate_forecast") + private Timestamp estimateForecast; + + @Column(name = "suite_id") + private Integer suiteId; + + @Column(name = "template_id") + private Integer templateId; + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailData.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailData.java new file mode 100644 index 0000000..f88866c --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailData.java @@ -0,0 +1,7 @@ +package ca.etsmtl.taf.testrail.model.entity; + +public abstract class TestRailData { + /* + * TODO : document this class + * */ +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailProject.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailProject.java new file mode 100644 index 0000000..b6c3523 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailProject.java @@ -0,0 +1,63 @@ +package ca.etsmtl.taf.testrail.model.entity; + +import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.sql.Timestamp; +import java.util.List; + +@Entity +@Table(name = "tr_project") +@Getter +@Setter +public class TestRailProject extends TestRailData { + + /* + * Class to save projects from TestRail in TAF database to be used in the application. + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : + * - Unit tests : TestUnitTestRailProject + * - Integration tests : TODO + * */ + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tr_id", unique = true, nullable = true) + private Integer TRId; + + @Column(name = "name", nullable = false, unique = true) + private String name; + + @Column(name = "announcement") + private String announcement; + + @Column(name = "show_announcement") + private Boolean showAnnouncement; + + @Column(name = "is_completed") + private Boolean isCompleted; + + @Column(name = "completed_on") + private Timestamp completedOn; + + @Column(name = "suite_mode") + private Integer suiteMode; + + @Column(name = "default_role_id") + private Integer defaultRoleId; + + @Column(name = "case_statuses_enabled") + private Boolean caseStatusesEnabled; + + @Column(name = "url") + private String url; + + @Column(name="is_saved") + private Boolean isSaved=false; + + @ManyToMany(mappedBy = "projects") + private List users; +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailSuite.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailSuite.java new file mode 100644 index 0000000..edcddb2 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailSuite.java @@ -0,0 +1,55 @@ +package ca.etsmtl.taf.testrail.model.entity; + +import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.sql.Timestamp; + +@Entity +@Table(name = "tr_suite") +@Getter +@Setter +public class TestRailSuite extends TestRailData{ + + /* + * Class to save suites from TestRail in TAF database to be used in the application. + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : + * - Unit tests : TestUnitTestRailSuite + * - Integration tests : TODO + * */ + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tr_id", unique = true) + private Integer TRId; + + @ManyToOne + @JoinColumn(name = "project_id", referencedColumnName = "id") + private TestRailProject project; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "is_master") + private Boolean isMaster; + + @Column(name = "is_baseline") + private Boolean isBaseline; + + @Column(name = "is_completed") + private Boolean isCompleted; + + @Column(name = "completed_on") + private Timestamp completedOn; + + @Column(name = "url") + private String url; + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailUser.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailUser.java new file mode 100644 index 0000000..3fb1b89 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/entity/TestRailUser.java @@ -0,0 +1,46 @@ +package ca.etsmtl.taf.testrail.model.entity; + + +import javax.persistence.*; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Entity +@Table(name = "tr_user") +@Getter +@Setter +public class TestRailUser extends TestRailData { + /* + * Class to save users from TestRail. + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : + * - Unit tests : TestUnitTestRailUser + * - Integration tests : TODO + * */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tr_id", unique = true, nullable = true) + private Integer TRId; + + @Column(name = "username", nullable = false) + private String username; + + @Column(name = "password", nullable = false) + private String password; + + @Column(name = "email", nullable = false, unique = true) + private String email; + + @ManyToMany + @JoinTable( + name = "tr_user_project", + joinColumns = @JoinColumn(name = "user_id"), + inverseJoinColumns = @JoinColumn(name = "project_id")) + private List projects; + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailCaseFactory.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailCaseFactory.java new file mode 100644 index 0000000..52b5719 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailCaseFactory.java @@ -0,0 +1,97 @@ +package ca.etsmtl.taf.testrail.model.factory; + +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; + +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Component; + +import java.sql.Timestamp; +public class TestRailCaseFactory { + + public static TestRailCase create(String title) { + TestRailCase testRailCase = new TestRailCase(); + testRailCase.setTitle(title); + return testRailCase; + } + + public static TestRailCase create(JSONObject projectJson) throws JSONException { + /* + * Create a TestRailCase object from a JSON object + * @param caseJson : JSON object containing the case data + * @return TestRailCase object + * @throws JSONException if the JSON object is not correct + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + TestRailCase testRailCase = new TestRailCase(); + + // nullable = false + if (projectJson.has("title") && !projectJson.isNull("title")) { + testRailCase.setTitle(projectJson.getString("title")); + } else { + throw new JSONException("title is required"); + } + + if (projectJson.has("id") && !projectJson.isNull("id")) { + testRailCase.setTRId(projectJson.getInt("id")); + } + + if (projectJson.has("section_id") && !projectJson.isNull("section_id")) { + testRailCase.setSectionId(projectJson.getInt("section_id")); + } + + if (projectJson.has("type_id") && !projectJson.isNull("type_id")) { + testRailCase.setTypeId(projectJson.getInt("type_id")); + } + + if (projectJson.has("priority_id") && !projectJson.isNull("priority_id")) { + testRailCase.setPriorityId(projectJson.getInt("priority_id")); + } + + if (projectJson.has("milestone_id") && !projectJson.isNull("milestone_id")) { + testRailCase.setMilestoneId(projectJson.getInt("milestone_id")); + } + + if (projectJson.has("refs") && !projectJson.isNull("refs")) { + testRailCase.setRefs(projectJson.getString("refs")); + } + + if (projectJson.has("created_by") && !projectJson.isNull("created_by")) { + testRailCase.setCreatedBy(projectJson.getInt("created_by")); + } + + if (projectJson.has("created_on") && !projectJson.isNull("created_on")) { + testRailCase.setCreatedOn(Timestamp.valueOf(String.valueOf(projectJson.getLong("created_on")))); + } + + if (projectJson.has("updated_by") && !projectJson.isNull("updated_by")) { + testRailCase.setUpdatedBy(projectJson.getInt("updated_by")); + } + + if (projectJson.has("updated_on") && !projectJson.isNull("updated_on")) { + testRailCase.setUpdatedOn(Timestamp.valueOf(String.valueOf(projectJson.getLong("updated_on")))); + } + + if (projectJson.has("estimate") && !projectJson.isNull("estimate")) { + testRailCase.setEstimate(Timestamp.valueOf(String.valueOf(projectJson.getLong("estimate")))); + } + + if (projectJson.has("estimate_forecast") && !projectJson.isNull("estimate_forecast")) { + testRailCase.setEstimateForecast(Timestamp.valueOf(String.valueOf(projectJson.getLong("estimate_forecast")))); + } + + if (projectJson.has("suite_id") && !projectJson.isNull("suite_id")) { + testRailCase.setSuiteId(projectJson.getInt("suite_id")); + } + + if (projectJson.has("template_id") && !projectJson.isNull("template_id")) { + testRailCase.setTemplateId(projectJson.getInt("template_id")); + } + + return testRailCase; + } + + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailProjectFactory.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailProjectFactory.java new file mode 100644 index 0000000..6e4c271 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailProjectFactory.java @@ -0,0 +1,75 @@ +package ca.etsmtl.taf.testrail.model.factory; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Component; + +import java.sql.Timestamp; + + +public class TestRailProjectFactory { + public static TestRailProject create(String name) { + TestRailProject project = new TestRailProject(); + project.setName(name); + return project; + } + + public static TestRailProject create(JSONObject projectJson) throws JSONException { + /* + * Create a TestRailProject object from a JSON object + * @param projectJson : JSON object containing the project data + * @return TestRailProject object + * @throws JSONException if the JSON object is not correct + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + TestRailProject project = new TestRailProject(); + + // nullable = false + if (projectJson.has("name") && !projectJson.isNull("name")) { + project.setName(projectJson.getString("name")); + } else { + throw new JSONException("name is required"); + } + + if (projectJson.has("id") && !projectJson.isNull("id")) { + project.setTRId(projectJson.getInt("id")); + } + + if (projectJson.has("announcement") && !projectJson.isNull("announcement")) { + project.setAnnouncement(projectJson.getString("announcement")); + } + + if (projectJson.has("show_announcement") && !projectJson.isNull("show_announcement")) { + project.setShowAnnouncement(projectJson.getBoolean("show_announcement")); + } + + if (projectJson.has("is_completed") && !projectJson.isNull("is_completed")) { + project.setIsCompleted(projectJson.getBoolean("is_completed")); + } + + if (projectJson.has("completed_on") && !projectJson.isNull("completed_on")) { + project.setCompletedOn(Timestamp.valueOf(String.valueOf(projectJson.getLong("completed_on")))); + } + + if (projectJson.has("suite_mode") && !projectJson.isNull("suite_mode")) { + project.setSuiteMode(projectJson.getInt("suite_mode")); + } + + if (projectJson.has("default_role_id") && !projectJson.isNull("default_role_id")) { + project.setDefaultRoleId(projectJson.getInt("default_role_id")); + } + + if (projectJson.has("case_statuses_enabled") && !projectJson.isNull("case_statuses_enabled")) { + project.setCaseStatusesEnabled(projectJson.getBoolean("case_statuses_enabled")); + } + + if (projectJson.has("url") && !projectJson.isNull("url")) { + project.setUrl(projectJson.getString("url")); + } + + return project; + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailSuiteFactory.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailSuiteFactory.java new file mode 100644 index 0000000..2dc4f60 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailSuiteFactory.java @@ -0,0 +1,66 @@ +package ca.etsmtl.taf.testrail.model.factory; + +import ca.etsmtl.taf.testrail.model.entity.TestRailSuite; +import org.json.JSONException; +import org.json.JSONObject; + +import java.sql.Timestamp; + +public class TestRailSuiteFactory { + // TODO + public static TestRailSuite create(String name) { + TestRailSuite suite = new TestRailSuite(); + suite.setName(name); + return suite; + } + + public static TestRailSuite create(JSONObject projectJson) throws JSONException { + /* + * Create a TestRailSuite object from a JSON object + * @param projectJson : JSON object containing the project data + * @return TestRailSuite object + * @throws JSONException if the JSON object is not correct + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + TestRailSuite suite = new TestRailSuite(); + + // nullable = false + if (projectJson.has("name") && !projectJson.isNull("name")) { + suite.setName(projectJson.getString("name")); + } else { + throw new JSONException("name is required"); + } + + if (projectJson.has("id") && !projectJson.isNull("id")) { + suite.setTRId(projectJson.getInt("id")); + } + + if (projectJson.has("description") && !projectJson.isNull("description")) { + suite.setDescription(projectJson.getString("description")); + } + + if (projectJson.has("is_baseline") && !projectJson.isNull("is_baseline")) { + suite.setIsBaseline(projectJson.getBoolean("is_baseline")); + } + + if (projectJson.has("is_completed") && !projectJson.isNull("is_completed")) { + suite.setIsCompleted(projectJson.getBoolean("is_completed")); + } + + if (projectJson.has("completed_on") && !projectJson.isNull("completed_on")) { + suite.setCompletedOn(Timestamp.valueOf(String.valueOf(projectJson.getLong("completed_on")))); + } + + if (projectJson.has("url") && !projectJson.isNull("url")) { + suite.setUrl(projectJson.getString("url")); + } + + if (projectJson.has("is_master") && !projectJson.isNull("is_master")) { + suite.setIsMaster(projectJson.getBoolean("is_master")); + } + + return suite; + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailUserFactory.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailUserFactory.java new file mode 100644 index 0000000..822209a --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/model/factory/TestRailUserFactory.java @@ -0,0 +1,58 @@ +package ca.etsmtl.taf.testrail.model.factory; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.model.entity.TestRailUser; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Component; + +import java.sql.Timestamp; + + +public class TestRailUserFactory { + public static TestRailUser create(String name, String password, String email) { + TestRailUser user = new TestRailUser(); + user.setUsername(name); + user.setPassword(password); + user.setEmail(email); + return user; + } + + public static TestRailUser create(JSONObject projectJson) throws JSONException { + /* + * Create a TestRailUser object from a JSON object + * @param projectJson : JSON object containing the user data + * @return TestRailUser object + * @throws JSONException if the JSON object is not correct + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + TestRailUser user = new TestRailUser(); + + // nullable = false + if (projectJson.has("username") && !projectJson.isNull("username")) { + user.setUsername(projectJson.getString("username")); + } else { + throw new JSONException("username is required"); + } + + if (projectJson.has("password") && !projectJson.isNull("password")) { + user.setPassword(projectJson.getString("password")); + } else { + throw new JSONException("password is required"); + } + + if (projectJson.has("email") && !projectJson.isNull("email")) { + user.setEmail(projectJson.getString("email")); + } else { + throw new JSONException("email is required"); + } + + if (projectJson.has("id") && !projectJson.isNull("id")) { + user.setTRId(projectJson.getInt("id")); + } + + return user; + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingResultRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingResultRepository.java new file mode 100644 index 0000000..3ae3788 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingResultRepository.java @@ -0,0 +1,19 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.GatlingResult; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface GatlingResultRepository extends JpaRepository { + /* + * This interface is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * */ + + // Search for GatlingResult by statusId + List findByStatusId(Integer statusId); +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingTestCaseRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingTestCaseRepository.java new file mode 100644 index 0000000..1f39491 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/GatlingTestCaseRepository.java @@ -0,0 +1,24 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.GatlingTestCase; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface GatlingTestCaseRepository extends JpaRepository { + /* + * This interface is used to interact with the GatlingTestCase table in the database. + * TODO + * To be completed and tested + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + + // Find GatlingTestCase entries by sectionId + List findBySectionId(Integer sectionId); + + // Find GatlingTestCase entries by title + List findByTitle(String title); +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailCaseRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailCaseRepository.java new file mode 100644 index 0000000..8f4eda4 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailCaseRepository.java @@ -0,0 +1,23 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface TestRailCaseRepository extends JpaRepository { + /* + * This interface is used to interact with the TestRailProject table in the database. + * Tests : TestUnitTestRailCase + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + Optional findByTRId(Integer id); + + Optional findByTitle(String title); + + + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailProjectRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailProjectRepository.java new file mode 100644 index 0000000..f6297b4 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailProjectRepository.java @@ -0,0 +1,22 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface TestRailProjectRepository extends JpaRepository { + + /* + * This interface is used to interact with the TestRailProject table in the database. + * Tests : TestUnitTestRailProject + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + Optional findByTRId(Integer id); + + Optional findByName(String name); + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailSuiteRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailSuiteRepository.java new file mode 100644 index 0000000..4031adb --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailSuiteRepository.java @@ -0,0 +1,21 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.TestRailSuite; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface TestRailSuiteRepository extends JpaRepository { + /* + * This interface is used to interact with the TestRailProject table in the database. + * Tests : TestUnitTestRailProject + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + Optional findByTRId(Integer id); + + Optional findByName(String name); + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailUserRepository.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailUserRepository.java new file mode 100644 index 0000000..6a8abb0 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/repository/TestRailUserRepository.java @@ -0,0 +1,26 @@ +package ca.etsmtl.taf.testrail.repository; + +import ca.etsmtl.taf.testrail.model.entity.TestRailUser; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + + +@Repository +public interface TestRailUserRepository extends JpaRepository { + /* + * This interface is used to interact with the TestRailUser table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TestUnitTestRailUser + * */ + + // Find a TestRailUser by their unique id (TR id) + Optional findByTRId(Integer id); + + // Find a TestRailUser by their unique username + Optional findByUsername(String username); + + // Find a TestRailUser by their unique email + Optional findByEmail(String email); +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempResultGatling.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempResultGatling.java new file mode 100644 index 0000000..3a8d873 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempResultGatling.java @@ -0,0 +1,5 @@ +package ca.etsmtl.taf.testrail.service.collector; + +public class TempResultGatling { + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempTestCaseGatling.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempTestCaseGatling.java new file mode 100644 index 0000000..730d7dd --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/collector/TempTestCaseGatling.java @@ -0,0 +1,108 @@ +package ca.etsmtl.taf.testrail.service.collector; + +import ca.etsmtl.taf.testrail.model.entity.GatlingTestCase; +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.FileHandler; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.logging.SimpleFormatter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class TempTestCaseGatling { + private static final Logger logger = Logger.getLogger(TempTestCaseGatling.class.getName()); + + static { + logger.setLevel(Level.OFF); + try { + String currentPath = System.getProperty("user.dir"); + logger.info("Chemin de l'exécution : " + currentPath); + + File logDir = new File("./logs"); + if (!logDir.exists()) { + logDir.mkdirs(); // Crée le dossier "logs" si inexistant + } + + FileHandler fileHandler = new FileHandler("./logs/TempTestCaseGatling.log", true); + fileHandler.setFormatter(new SimpleFormatter()); + logger.addHandler(fileHandler); + } catch (Exception e) { + logger.severe("Erreur de configuration du FileHandler."); + } + } + + private String scenarioName; + private String baseUrl; + private String userInjection; + public GatlingTestCase parse(String SimulationFile) { + logger.setLevel(Level.INFO); + logger.info("SimulationFile=" + SimulationFile); + String gatlingScript = ""; + try (InputStream inputStream = TempTestCaseGatling.class.getClassLoader().getResourceAsStream(SimulationFile); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = reader.readLine()) != null) { + gatlingScript += line + "\n"; + } + } catch (IOException e) { + e.printStackTrace(); + } + + Pattern baseUrlPattern = Pattern.compile("baseUrl\\(\"([^\"]+)\"\\)"); + Pattern scenarioTitlePattern = Pattern.compile("scenario\\(\"([^\"]+)\"\\)"); + Pattern userInjectionPattern = Pattern.compile("setUp(\\(.*?);", Pattern.DOTALL); + + // Extract base URL + Matcher baseUrlMatcher = baseUrlPattern.matcher(gatlingScript); + if (baseUrlMatcher.find()) { + this.baseUrl = baseUrlMatcher.group(1); + logger.info("Base URL: " + baseUrlMatcher.group(1)); + } else { + logger.warning("Base URL not found in the Gatling script."); + } + + // Extract scenario title + Matcher scenarioTitleMatcher = scenarioTitlePattern.matcher(gatlingScript); + if (scenarioTitleMatcher.find()) { + this.scenarioName = scenarioTitleMatcher.group(1); + logger.info("Scenario Title: " + scenarioTitleMatcher.group(1)); + } else { + logger.warning("Scenario title not found in the Gatling script."); + } + + + // Extract user injection + Matcher userInjectionMatcher = userInjectionPattern.matcher(gatlingScript); + if (userInjectionMatcher.find()) { + this.userInjection = userInjectionMatcher.group(1).replaceAll("\\s", ""); + logger.info("User Injection: " + this.userInjection); + } else { + logger.warning("User injection not found in the Gatling script."); + } + + // Stock in GatlingTestCase object + GatlingTestCase gatlingTestCase = new GatlingTestCase(); + gatlingTestCase.setScenarioName(this.scenarioName); + gatlingTestCase.setBaseUrl(this.baseUrl); + gatlingTestCase.setUserInjection(this.userInjection); + logger.info("GatlingTestCase: " + gatlingTestCase); + + return gatlingTestCase; + } + + public GatlingTestCase parse() { + return parse("SimpleSimulation.java"); + } + + public TestRailCase toTestRailCase(GatlingTestCase gatlingTestCase) { + TestRailCase testRailCase = new TestRailCase(); + testRailCase.setTitle(gatlingTestCase.getScenarioName()); + testRailCase.setSectionId(1); // Default section + return testRailCase; + } +} \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingResultService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingResultService.java new file mode 100644 index 0000000..26100a8 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingResultService.java @@ -0,0 +1,47 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.model.entity.GatlingResult; +import ca.etsmtl.taf.testrail.repository.GatlingResultRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class GatlingResultService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * To be completed and tested + * */ + + @Autowired + private GatlingResultRepository repository; + + // Save or update a GatlingResult entity + public GatlingResult save(GatlingResult result) { + return repository.save(result); + } + + // Find a GatlingResult by its unique ID + public Optional findById(Long id) { + return repository.findById(id); + } + + // Retrieve all GatlingResult entries + public List findAll() { + return repository.findAll(); + } + + // Delete a GatlingResult by its unique ID + public void deleteById(Long id) { + repository.deleteById(id); + } + + // Retrieve GatlingResults filtered by statusId + public List findByStatusId(Integer statusId) { + return repository.findByStatusId(statusId); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingTestCaseService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingTestCaseService.java new file mode 100644 index 0000000..a40f1ee --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/GatlingTestCaseService.java @@ -0,0 +1,53 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.model.entity.GatlingTestCase; +import ca.etsmtl.taf.testrail.repository.GatlingTestCaseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class GatlingTestCaseService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * To be completed and tested + * */ + + + @Autowired + private GatlingTestCaseRepository repository; + + // Save or update a GatlingTestCase entity + public GatlingTestCase save(GatlingTestCase testCase) { + return repository.save(testCase); + } + + // Find a GatlingTestCase by its unique ID + public Optional findById(Long id) { + return repository.findById(id); + } + + // Retrieve all GatlingTestCase entries + public List findAll() { + return repository.findAll(); + } + + // Delete a GatlingTestCase by its unique ID + public void deleteById(Long id) { + repository.deleteById(id); + } + + // Retrieve GatlingTestCase entries filtered by sectionId + public List findBySectionId(Integer sectionId) { + return repository.findBySectionId(sectionId); + } + + // Retrieve GatlingTestCase entries filtered by title + public List findByTitle(String title) { + return repository.findByTitle(title); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailCaseService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailCaseService.java new file mode 100644 index 0000000..c883f96 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailCaseService.java @@ -0,0 +1,45 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; +import ca.etsmtl.taf.testrail.repository.TestRailCaseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class TestRailCaseService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TestUnitTestRailCase + * */ + + + @Autowired + private TestRailCaseRepository testRailCaseRepository; + + public TestRailCase save(TestRailCase testRailCase) { + return testRailCaseRepository.save(testRailCase); + } + + public Optional findById(Long tafId) { + return testRailCaseRepository.findById(tafId); + } + + public Optional findByTRId(Integer id) { + return testRailCaseRepository.findByTRId(id); + } + + public Optional findByTitle(String title) { + return testRailCaseRepository.findByTitle(title); + } + + public void deleteById(Long tafId) { + testRailCaseRepository.deleteById(tafId); + } + + public void deleteAll() { + testRailCaseRepository.deleteAll(); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailProjectService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailProjectService.java new file mode 100644 index 0000000..1c9ac89 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailProjectService.java @@ -0,0 +1,46 @@ +package ca.etsmtl.taf.testrail.service.data; + + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.repository.TestRailProjectRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class TestRailProjectService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TestUnitTestRailProject + * */ + + + @Autowired + private TestRailProjectRepository testRailProjectRepository; + + public TestRailProject save(TestRailProject project) { + return testRailProjectRepository.save(project); + } + + public Optional findByTafId(Long tafId) { + return testRailProjectRepository.findById(tafId); + } + + public Optional findByTRId(Integer id) { + return testRailProjectRepository.findByTRId(id); + } + + public Optional findByName(String name) { + return testRailProjectRepository.findByName(name); + } + + public void deleteByTafId(Long tafId) { + testRailProjectRepository.deleteById(tafId); + } + + public void deleteAll() { + testRailProjectRepository.deleteAll(); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailSuiteService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailSuiteService.java new file mode 100644 index 0000000..b0e370b --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailSuiteService.java @@ -0,0 +1,46 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.model.entity.TestRailSuite; +import ca.etsmtl.taf.testrail.repository.TestRailSuiteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class TestRailSuiteService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TestUnitTestRailProject + * */ + + @Autowired + private TestRailSuiteRepository testRAilSuiteRepository; + + public TestRailSuite save(TestRailSuite suite) { + return testRAilSuiteRepository.save(suite); + } + + public Optional findByTafId(Long tafId) { + return testRAilSuiteRepository.findById(tafId); + } + + public Optional findByTRId(Integer id) { + return testRAilSuiteRepository.findByTRId(id); + } + + public Optional findByName(String name) { + return testRAilSuiteRepository.findByName(name); + } + + public void deleteByTafId(Long tafId) { + testRAilSuiteRepository.deleteById(tafId); + } + + public void deleteAll() { + testRAilSuiteRepository.deleteAll(); + } + + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailUserService.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailUserService.java new file mode 100644 index 0000000..7e3b597 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/data/TestRailUserService.java @@ -0,0 +1,68 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.model.entity.TestRailUser; +import ca.etsmtl.taf.testrail.repository.TestRailUserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class TestRailUserService { + /* + * This class is used to interact with the GatlingResult table in the database. + * Assisted by IA (copilot & chatGPT & intellij) + * Tests : TestUnitTestRailUser + * */ + + + @Autowired + private TestRailUserRepository repository; + + // Save or update a TestRailUser entity + public TestRailUser save(TestRailUser user) { + return repository.save(user); + } + + // Find a TestRailUser by their unique ID (tafId) + public Optional findByTafId(Long tafId) { + return repository.findById(tafId); + } + + // Find a TestRailUser by their unique ID (TR id) + public Optional findByTRId(Integer id) { + return repository.findByTRId(id); + } + + // Find a TestRailUser by their unique username + public Optional findByUsername(String username) { + return repository.findByUsername(username); + } + + // Find a TestRailUser by their unique email + public Optional findByEmail(String email) { + return repository.findByEmail(email); + } + + // Retrieve all TestRailUser entries + public List findAll() { + return repository.findAll(); + } + + // Delete a TestRailUser by their unique ID (tafId) + public void deleteById(Long tafId) { + repository.deleteById(tafId); + } + + public void deleteByTafId(Long tafId) { + repository.deleteById(tafId); + } + + // Delete all TestRailUser entries + public void deleteAll() { + repository.deleteAll(); + } + + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportGatling.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportGatling.java new file mode 100644 index 0000000..0dd0042 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportGatling.java @@ -0,0 +1,8 @@ +package ca.etsmtl.taf.testrail.service.manager.export; + +public class ExportGatling implements ExportServiceInterface { + @Override + public void exportData() { + System.out.println("Exporting Gatling data"); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportServiceInterface.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportServiceInterface.java new file mode 100644 index 0000000..70ddc30 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/export/ExportServiceInterface.java @@ -0,0 +1,5 @@ +package ca.etsmtl.taf.testrail.service.manager.export; + +public interface ExportServiceInterface { + void exportData(); +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/HttpSenderToTestRail.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/HttpSenderToTestRail.java new file mode 100644 index 0000000..86ea7da --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/HttpSenderToTestRail.java @@ -0,0 +1,63 @@ +package ca.etsmtl.taf.testrail.service.manager.query; + +import org.springframework.stereotype.Component; + +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Optional; + + +public class HttpSenderToTestRail { + /* + * This class is used to send HTTP requests to TestRail. + * The static variables assignment need recoded to work with application properties. + * The logs methods needs to be re-implemented with stronger logging. + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + */ + + private static final String baseUrl = "https://leofornoff.testrail.io/index.php?/api/v2/"; + private static final String username = "leo.fornoff.1@ens.etsmtl.ca"; + private static final String password = "Valid8-Outpost2-Caravan0-Unlovable9-Easter7"; + + public HttpSenderToTestRail() { + // TODO : baseUrl, username and password will depend on the user + } + + private SendResultData send(HttpRequest request) { + try { + HttpClient client = HttpClient.newHttpClient(); + HttpResponse response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + return new SendResultData(null, 200, response); + } else { + return new SendResultData(null, response.statusCode(), response); + } + } catch (Exception e) { + return new SendResultData(e, 500, null); + } + } + + public SendResultData postSender(String route, String body) { + HttpRequest request = HttpRequest.newBuilder() + .uri(java.net.URI.create(baseUrl + route)) + .header("Authorization", "Basic " + java.util.Base64.getEncoder().encodeToString((username + ":" + password).getBytes())) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + return send(request); + } + + public SendResultData getSender(String route) { + HttpRequest request = HttpRequest.newBuilder() + .uri(java.net.URI.create(baseUrl + route)) + .header("Authorization", "Basic " + java.util.Base64.getEncoder().encodeToString((username + ":" + password).getBytes())) + .GET() + .build(); + + return send(request); + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/ProjectQueryTestRail.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/ProjectQueryTestRail.java new file mode 100644 index 0000000..9759fb1 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/ProjectQueryTestRail.java @@ -0,0 +1,87 @@ +package ca.etsmtl.taf.testrail.service.manager.query; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.model.factory.TestRailProjectFactory; +import ca.etsmtl.taf.testrail.service.manager.saving.DataResponseFromTR; + +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + + +@Service +public class ProjectQueryTestRail implements QueryTestRail { + + /* + * Class that contains common requests about TestRail projects + * This class doesn't save the data, it only queries TestRail + * This class doesn't check if data is already loaded or in the database + * Class build assisted by IA (copilot & chatGPT & intellij) + * Tests : TODO + * */ + + private final HttpSenderToTestRail httpSenderToTestRail; + + + public ProjectQueryTestRail() { + this.httpSenderToTestRail = new HttpSenderToTestRail(); // TODO : adapt to each user and environment + } + + + @Override + public DataResponseFromTR add(String projectName) { + /* + * Add a new project to TestRail + * @param projectName : name of the project to add + * @return TestRailProject object + * @Use getByName to get the project added + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + // Send a post request to add a new project + String route = "add_project"; + SendResultData result = httpSenderToTestRail.postSender(route, "{\"name\":\"" + projectName + "\"}"); + + // Check if the response is successful + + if (result.getStatusCode() != 200) { + System.err.println("Erreur lors de l'ajout du projet dans TR"); + return new DataResponseFromTR(1, null); + } + + // Convert the JSON response to a TestRailData object + try { + JSONObject projectJson = new JSONObject(result.getResponse().body()); + TestRailProject project = TestRailProjectFactory.create(projectJson); // Create a TestRailData object (TestRailProject) from the JSON* + return new DataResponseFromTR(0, project); // Return the project and the status code of the response + } catch (JSONException e) { + e.printStackTrace(); // TODO: Améliorer la gestion des erreurs + return new DataResponseFromTR(2, null); + } + } + + @Override + public DataResponseFromTR delete(int projectId) { + /* + * Delete a project from TestRail + * @param projectId : id of the project to delete + * @return TestRailProject object + * Tests : TODO + * Assisted by IA (copilot & chatGPT & intellij) + * */ + + // Send a post request to delete a project + String route = "delete_project/" + projectId; + SendResultData result = httpSenderToTestRail.postSender(route, ""); + + // Check if the response is successful + if (result.getStatusCode() != 200) { + System.err.println("Erreur lors de la suppression du projet dans TR"); + return new DataResponseFromTR(1, null); + } + + return new DataResponseFromTR(0, null); + } + +} \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/QueryTestRail.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/QueryTestRail.java new file mode 100644 index 0000000..3a4bac5 --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/QueryTestRail.java @@ -0,0 +1,16 @@ +package ca.etsmtl.taf.testrail.service.manager.query; + + +import ca.etsmtl.taf.testrail.service.manager.saving.DataResponseFromTR; + +interface QueryTestRail { + /* + * Interface that contains common requests about TestRail data + * Those methods are implemented in the classes that will query TestRail + * */ + + + DataResponseFromTR add(String name); + + DataResponseFromTR delete(int projectId); +} \ No newline at end of file diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/SendResultData.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/SendResultData.java new file mode 100644 index 0000000..b36d31f --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/query/SendResultData.java @@ -0,0 +1,21 @@ +package ca.etsmtl.taf.testrail.service.manager.query; + +import lombok.Getter; +import lombok.Setter; + +import java.net.http.HttpResponse; + + +@Getter +@Setter +public class SendResultData { + private Exception exception; + private int statusCode; + private HttpResponse response; + + public SendResultData(Exception exception, int statusCode, HttpResponse response) { + this.exception = exception; + this.statusCode = statusCode; + this.response = response; + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/DataResponseFromTR.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/DataResponseFromTR.java new file mode 100644 index 0000000..6d9e0ac --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/DataResponseFromTR.java @@ -0,0 +1,18 @@ +package ca.etsmtl.taf.testrail.service.manager.saving; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class DataResponseFromTR { + private int statusCode; + private TestRailProject data; + + public DataResponseFromTR(int statusCode, TestRailProject data) { + this.statusCode = statusCode; + this.data = data; + } +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/GeneralSavingManager.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/GeneralSavingManager.java new file mode 100644 index 0000000..952137c --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/GeneralSavingManager.java @@ -0,0 +1,30 @@ +package ca.etsmtl.taf.testrail.service.manager.saving; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.model.factory.TestRailProjectFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class GeneralSavingManager { + + @Autowired + private ProjectSavingManager projectSavingManager; + + public TestRailProject createProject(String projectName) { + // Create the project + return TestRailProjectFactory.create(projectName); + } + + public void saveData(TestRailProject project) { + // Save the project + DataResponseFromTR dataResponseFromTR = projectSavingManager.saveData(project); + } + + public void deleteData(TestRailProject project) { + // Delete the project + DataResponseFromTR dataResponseFromTR = projectSavingManager.deleteData(project); + } + +} diff --git a/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/ProjectSavingManager.java b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/ProjectSavingManager.java new file mode 100644 index 0000000..4c2b89f --- /dev/null +++ b/testrail/src/main/java/ca/etsmtl/taf/testrail/service/manager/saving/ProjectSavingManager.java @@ -0,0 +1,86 @@ +package ca.etsmtl.taf.testrail.service.manager.saving; + +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.service.data.TestRailProjectService; +import ca.etsmtl.taf.testrail.service.manager.query.ProjectQueryTestRail; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class ProjectSavingManager { + + @Autowired + private ProjectQueryTestRail projectQueryTestRail; + + @Autowired + private TestRailProjectService testRailProjectService; + + private DataResponseFromTR newData(TestRailProject project) { + // Send the project to the TestRail + + TestRailProject trProject; + + DataResponseFromTR response = projectQueryTestRail.add(project.getName()); // TODO : Improve by adding other fields + + if (response.getStatusCode() == 0) { + trProject = response.getData(); + trProject.setIsSaved(true); + trProject = testRailProjectService.save(trProject);// Save the project in the database + return new DataResponseFromTR(0, trProject); + } else { + /* + * Even if the project is not added to TestRail, we can save it in the database to allow the user to add it later + * */ + trProject = project; + trProject.setIsSaved(false); + testRailProjectService.save(trProject); // Save the project in the database + return new DataResponseFromTR(1, trProject); // TODO : Améliorer la gestion des erreurs + } + } + + protected DataResponseFromTR saveData(TestRailProject project) { + // Check if the project already exists in the database + Optional trProject = testRailProjectService.findByName(project.getName()); + + if (trProject.isPresent()) { + // The project already exists in the database + // TODO : depending on if the project is the same or if the project isn't saved in TestRail, we can update the project + return new DataResponseFromTR(2, trProject.get()); + } else { + // The project doesn't exist in the database + return newData(project); + } + + } + + protected DataResponseFromTR deleteData(TestRailProject project) { + // Check if the project already exists in the database + Optional trProject = testRailProjectService.findByName(project.getName()); + + if (trProject.isPresent()) { + // The project already exists in the database + if (trProject.get().getTRId() != null && trProject.get().getIsSaved()) { + // The project is saved in TestRail delete it + DataResponseFromTR response = projectQueryTestRail.delete(trProject.get().getTRId()); + if (response.getStatusCode() == 0) { + // The project is deleted from TestRail + testRailProjectService.deleteByTafId(trProject.get().getId()); + return new DataResponseFromTR(0, null); + } else { + // The project is not deleted from TestRail + // TODO : Améliorer la gestion des erreurs + System.err.println("Erreur lors de la suppression du projet dans TR " + response.getStatusCode()); + return new DataResponseFromTR(1, null); + } + } else { + // The project is not saved in TestRail + testRailProjectService.deleteByTafId(trProject.get().getId()); + return new DataResponseFromTR(0, null); + } + } + // The project doesn't exist in the database + return new DataResponseFromTR(2, null); + } +} diff --git a/testrail/src/main/resources/ComputerDatabaseSimulation.java b/testrail/src/main/resources/ComputerDatabaseSimulation.java new file mode 100644 index 0000000..aff8024 --- /dev/null +++ b/testrail/src/main/resources/ComputerDatabaseSimulation.java @@ -0,0 +1,92 @@ +package computerdatabase; + +import io.gatling.javaapi.core.*; +import io.gatling.javaapi.http.*; + +import java.util.concurrent.ThreadLocalRandom; + +import static io.gatling.javaapi.core.CoreDsl.*; +import static io.gatling.javaapi.http.HttpDsl.*; + +/** + * This sample is based on our official tutorials: + * + */ +public class ComputerDatabaseSimulation extends Simulation { + + FeederBuilder feeder = csv("search.csv").random(); + + ChainBuilder search = exec( + http("Home").get("/"), + pause(1), + feed(feeder), + http("Search") + .get("/computers?f=#{searchCriterion}") + .check( + css("a:contains('#{searchComputerName}')", "href").saveAs("computerUrl") + ), + pause(1), + http("Select") + .get("#{computerUrl}") + .check(status().is(200)), + pause(1) + ); + + // repeat is a loop resolved at RUNTIME + ChainBuilder browse = + // Note how we force the counter name, so we can reuse it + repeat(4, "i").on( + http("Page #{i}").get("/computers?p=#{i}"), + pause(1) + ); + + // Note we should be using a feeder here + // let's demonstrate how we can retry: let's make the request fail randomly and retry a given + // number of times + + ChainBuilder edit = + // let's try at max 2 times + tryMax(2) + .on( + http("Form").get("/computers/new"), + pause(1), + http("Post") + .post("/computers") + .formParam("name", "Beautiful Computer") + .formParam("introduced", "2012-05-30") + .formParam("discontinued", "") + .formParam("company", "37") + .check( + status().is( + // we do a check on a condition that's been customized with + // a lambda. It will be evaluated every time a user executes + // the request + session -> 200 + ThreadLocalRandom.current().nextInt(2) + ) + ) + ) + // if the chain didn't finally succeed, have the user exit the whole scenario + .exitHereIfFailed(); + + HttpProtocolBuilder httpProtocol = + http.baseUrl("https://computer-database.gatling.io") + .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .acceptLanguageHeader("en-US,en;q=0.5") + .acceptEncodingHeader("gzip, deflate") + .userAgentHeader( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.0" + ); + + ScenarioBuilder users = scenario("Users").exec(search, browse); + ScenarioBuilder admins = scenario("Admins").exec(search, browse, edit); + + { + setUp( + users.injectOpen(rampUsers(10).during(10)), + admins.injectOpen(rampUsers(2).during(10)) + ).protocols(httpProtocol); + } +} diff --git a/testrail/src/main/resources/RecordedSimulation.java b/testrail/src/main/resources/RecordedSimulation.java new file mode 100644 index 0000000..e98c5b5 --- /dev/null +++ b/testrail/src/main/resources/RecordedSimulation.java @@ -0,0 +1,116 @@ +package computerdatabase; + +import io.gatling.javaapi.core.*; +import io.gatling.javaapi.http.*; +import io.gatling.javaapi.jdbc.*; + +import java.util.Map; + +import static io.gatling.javaapi.core.CoreDsl.*; +import static io.gatling.javaapi.core.CoreDsl.AllowList; +import static io.gatling.javaapi.core.CoreDsl.DenyList; +import static io.gatling.javaapi.core.CoreDsl.RawFileBody; +import static io.gatling.javaapi.core.CoreDsl.atOnceUsers; +import static io.gatling.javaapi.core.CoreDsl.pause; +import static io.gatling.javaapi.core.CoreDsl.scenario; +import static io.gatling.javaapi.http.HttpDsl.*; +import static io.gatling.javaapi.http.HttpDsl.http; +import static io.gatling.javaapi.jdbc.JdbcDsl.*; + +public class RecordedSimulation extends Simulation { + + private HttpProtocolBuilder httpProtocol = http + .baseUrl("https://computer-database.gatling.io") + .inferHtmlResources(AllowList(), DenyList(".*\\.js", ".*\\.css", ".*\\.gif", ".*\\.jpeg", ".*\\.jpg", ".*\\.ico", ".*\\.woff", ".*\\.woff2", ".*\\.(t|o)tf", ".*\\.png", ".*\\.svg", ".*detectportal\\.firefox\\.com.*")) + .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"); + + private Map headers_0 = Map.ofEntries( + Map.entry("Accept-Encoding", "gzip, deflate"), + Map.entry("Content-Type", "application/json"), + Map.entry("Proxy-Connection", "keep-alive"), + Map.entry("User-Agent", "Mozilla/5.0 (Windows NT 10.0.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.190 Safari/537.36 CreativeCloud/6.4.0.361"), + Map.entry("X-Goog-Update-AppId", "oimompecagnajdejgnnjijobebaeigek"), + Map.entry("X-Goog-Update-Interactivity", "bg"), + Map.entry("X-Goog-Update-Updater", "chromium-116.0.5845.190") + ); + + private Map headers_1 = Map.ofEntries( + Map.entry("Accept", "*/*"), + Map.entry("Accept-Encoding", "identity"), + Map.entry("Proxy-Connection", "Keep-Alive"), + Map.entry("User-Agent", "Microsoft BITS/7.8") + ); + + private Map headers_2 = Map.ofEntries( + Map.entry("Accept", "*/*"), + Map.entry("Accept-Encoding", "identity"), + Map.entry("If-Unmodified-Since", "Wed, 04 Sep 2024 02:15:41 GMT"), + Map.entry("Proxy-Connection", "Keep-Alive"), + Map.entry("User-Agent", "Microsoft BITS/7.8") + ); + + private Map headers_3 = Map.ofEntries( + Map.entry("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"), + Map.entry("Accept-Encoding", "gzip, deflate, br, zstd"), + Map.entry("Accept-Language", "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7"), + Map.entry("Sec-Fetch-Dest", "document"), + Map.entry("Sec-Fetch-Mode", "navigate"), + Map.entry("Sec-Fetch-Site", "same-origin"), + Map.entry("Sec-Fetch-User", "?1"), + Map.entry("Upgrade-Insecure-Requests", "1"), + Map.entry("sec-ch-ua", "\"Google Chrome\";v=\"129\", \"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"129\""), + Map.entry("sec-ch-ua-mobile", "?0"), + Map.entry("sec-ch-ua-platform", "\"Windows\"") + ); + + private Map headers_4 = Map.ofEntries( + Map.entry("Connection", "Close"), + Map.entry("User-Agent", "Microsoft NCSI") + ); + + private String uri1 = "http://www.msftconnecttest.com/connecttest.txt"; + + private String uri3 = "http://update.googleapis.com/service/update2/json"; + + private String uri4 = "http://msedge.b.tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/0c12dff9-696d-48d4-bbe8-7d8bdad98e65"; + + private ScenarioBuilder scn = scenario("RecordedSimulation") + .exec( + http("request_0") + .post(uri3 + "?cup2key=13:ETSC62eQPBdzjDvWT1nXYDpHCMJXLXm2vUlMeDZN_kI&cup2hreq=1066f8336924ff1f28a0742fff9d87b0f91dac3ab2ff0fea9b0799dc1c981fda") + .headers(headers_0) + .body(RawFileBody("computerdatabase/recordedsimulation/0000_request.json")) + .resources( + http("request_1") + .head(uri4 + "?P1=1728104938&P2=404&P3=2&P4=KUdccXgREyurgJYdWoh42hOnQj1XBpkNDhYQiYUam19le6BbBS7%2fnP2llZRqz4libseByWx%2fQWUl%2f%2bbl6g%2fuvQ%3d%3d") + .headers(headers_1), + http("request_2") + .get(uri4 + "?P1=1728104938&P2=404&P3=2&P4=KUdccXgREyurgJYdWoh42hOnQj1XBpkNDhYQiYUam19le6BbBS7%2fnP2llZRqz4libseByWx%2fQWUl%2f%2bbl6g%2fuvQ%3d%3d") + .headers(headers_2) + ), + pause(7), + http("request_3") + .get("/computers") + .headers(headers_3), + pause(4), + http("request_4") + .get(uri1) + .headers(headers_4), + pause(1), + http("request_5") + .get("/computers") + .headers(headers_3), + pause(5), + http("request_6") + .get("/computers?f=apple") + .headers(headers_3), + pause(10), + http("request_7") + .get("/computers?p=1&f=apple") + .headers(headers_3) + ); + + { + setUp(scn.injectOpen(atOnceUsers(20))).protocols(httpProtocol); + } +} diff --git a/testrail/src/main/resources/SimpleSimulation.java b/testrail/src/main/resources/SimpleSimulation.java new file mode 100644 index 0000000..94edb46 --- /dev/null +++ b/testrail/src/main/resources/SimpleSimulation.java @@ -0,0 +1,25 @@ +package computerdatabase; + +import static io.gatling.javaapi.core.CoreDsl.*; +import static io.gatling.javaapi.http.HttpDsl.*; + +import io.gatling.javaapi.core.*; +import io.gatling.javaapi.http.*; + +public class SimpleSimulation extends Simulation { + + HttpProtocolBuilder httpProtocol = + http.baseUrl("https://wikijs.fornoff.fr") + .acceptHeader("application/json") + .contentTypeHeader("application/json"); + + ScenarioBuilder Scenario = scenario("My First Scenario") + .exec(http("Request 1") + .get("/computers/")); + + { + setUp( + Scenario.injectOpen(rampUsers(10).during(5)) + ).protocols(httpProtocol); + } +} \ No newline at end of file diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/TestConfig.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/TestConfig.java new file mode 100644 index 0000000..3f9d058 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/TestConfig.java @@ -0,0 +1,23 @@ +package ca.etsmtl.taf.testrail; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@Configuration +@ComponentScan(basePackages = "ca.etsmtl.taf.testrail") +@EnableJpaRepositories(basePackages = "ca.etsmtl.taf.testrail.repository") +@EntityScan(basePackages = "ca.etsmtl.taf.testrail.model.entity") +public class TestConfig { + + public static String getRandomString(int length) { + String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + StringBuilder result = new StringBuilder(); + for (int i = 0; i < length; i++) { + int index = (int) (Math.random() * characters.length()); + result.append(characters.charAt(index)); + } + return result.toString(); + } +} diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/collector/TestTempTestCaseGatling.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/collector/TestTempTestCaseGatling.java new file mode 100644 index 0000000..cee153d --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/collector/TestTempTestCaseGatling.java @@ -0,0 +1,81 @@ +package ca.etsmtl.taf.testrail.service.collector; + +import ca.etsmtl.taf.testrail.model.entity.GatlingTestCase; +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalTime; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +//@ContextConfiguration(classes = TestConfig.class) +//@DataJpaTest(properties = { +// "spring.jpa.hibernate.ddl-auto=create-drop", +// "spring.datasource.url=jdbc:h2:mem:testdb" +//}) +public class TestTempTestCaseGatling { + private String defaultName; + + @BeforeEach + public void setUp() { + } + + @Test + public void test() { + TempTestCaseGatling tempTestCaseGatling = new TempTestCaseGatling(); + GatlingTestCase gatlingTestCase = tempTestCaseGatling.parse(); + assertNotNull(gatlingTestCase); + assertEquals("My First Scenario", gatlingTestCase.getScenarioName()); + assertEquals("https://wikijs.fornoff.fr", gatlingTestCase.getBaseUrl()); + assertEquals("(Scenario.injectOpen(rampUsers(10).during(5))).protocols(httpProtocol)", gatlingTestCase.getUserInjection()); + } + + @Test + public void testWithFileInRessources() { + String fileName = "SimpleSimulation.java"; + TempTestCaseGatling tempTestCaseGatling = new TempTestCaseGatling(); + GatlingTestCase gatlingTestCase = tempTestCaseGatling.parse(fileName); + assertNotNull(gatlingTestCase); + assertEquals("My First Scenario", gatlingTestCase.getScenarioName()); + assertEquals("https://wikijs.fornoff.fr", gatlingTestCase.getBaseUrl()); + assertEquals("(Scenario.injectOpen(rampUsers(10).during(5))).protocols(httpProtocol)", gatlingTestCase.getUserInjection()); + } + + @Test + public void testToTestRailCase() { + TempTestCaseGatling tempTestCaseGatling = new TempTestCaseGatling(); + GatlingTestCase gatlingTestCase = tempTestCaseGatling.parse(); + assertNotNull(gatlingTestCase); + + TestRailCase testRailCase = tempTestCaseGatling.toTestRailCase(gatlingTestCase); + assertEquals("My First Scenario", testRailCase.getTitle()); + assertEquals(1, testRailCase.getSectionId()); + } + + @Test + public void testRecordedSimulation() { + String fileName = "RecordedSimulation.java"; + TempTestCaseGatling tempTestCaseGatling = new TempTestCaseGatling(); + GatlingTestCase gatlingTestCase = tempTestCaseGatling.parse(fileName); + assertNotNull(gatlingTestCase); + assertEquals("RecordedSimulation", gatlingTestCase.getScenarioName()); + assertEquals("https://computer-database.gatling.io", gatlingTestCase.getBaseUrl()); + assertEquals("(scn.injectOpen(atOnceUsers(20))).protocols(httpProtocol)", gatlingTestCase.getUserInjection()); + } + + @Test + public void testComputerDatabaseSimulation() { + String fileName = "ComputerDatabaseSimulation.java"; + TempTestCaseGatling tempTestCaseGatling = new TempTestCaseGatling(); + GatlingTestCase gatlingTestCase = tempTestCaseGatling.parse(fileName); + assertNotNull(gatlingTestCase); + assertEquals("Users", gatlingTestCase.getScenarioName()); + assertEquals("https://computer-database.gatling.io", gatlingTestCase.getBaseUrl()); + assertEquals("(users.injectOpen(rampUsers(10).during(10)),admins.injectOpen(rampUsers(2).during(10))).protocols(httpProtocol)", gatlingTestCase.getUserInjection()); + } +} \ No newline at end of file diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailCase.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailCase.java new file mode 100644 index 0000000..634de53 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailCase.java @@ -0,0 +1,450 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.TestConfig; +import ca.etsmtl.taf.testrail.model.entity.TestRailCase; +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.model.entity.TestRailSuite; +import ca.etsmtl.taf.testrail.model.factory.TestRailCaseFactory; +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.ContextConfiguration; + +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ContextConfiguration(classes = TestConfig.class) +@DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" +}) +public class TestUnitTestRailCase { + + private TestRailCase testRailCase; + private TestRailCase testRailCase2; + private TestRailCase testRailCase3; + private String defaultTitle; + + @Autowired + private TestRailCaseService testRailCaseService; + + @BeforeEach + public void setUp() { + testRailCaseService.deleteAll(); // Drop all data from the table + defaultTitle = "defaultName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + testRailCase = TestRailCaseFactory.create(defaultTitle); + testRailCase2 = TestRailCaseFactory.create(defaultTitle + "_2"); + testRailCase3 = TestRailCaseFactory.create(defaultTitle + "_3"); + } + + @Test + public void testSave() { + // Arrange + testRailCase.setTRId(1); + + // Act + TestRailCase savedTestRailCase = testRailCaseService.save(testRailCase); + + // Assert + assertNotNull(savedTestRailCase); + assertEquals(testRailCase, savedTestRailCase); + assertEquals(defaultTitle, savedTestRailCase.getTitle()); + } + + public void beforeUpdate() { + testRailCase.setTRId(2); + testRailCaseService.save(testRailCase); + } + + @Test + public void testUpdateId() { + // Arrange + beforeUpdate(); + testRailCase.setTRId(3); + + // Act + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(defaultTitle, updatedTestRailCase.getTitle()); + assertEquals(3, updatedTestRailCase.getTRId()); + } + + @Test + public void testUpdateTitle() { + // Arrange + beforeUpdate(); + String newTitle = "defaultTitle_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + // Act + testRailCase.setTitle(newTitle); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(newTitle, updatedTestRailCase.getTitle()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateSectionId(){ + // Arrange + beforeUpdate(); + int newSectionId = 4; + + // Act + testRailCase.setSectionId(newSectionId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getSectionId()); + assertEquals(newSectionId, getTestRailCase.getSectionId()); + } + + @Test + public void testUpdateTypeId(){ + // Arrange + beforeUpdate(); + int newTypeId = 4; + + // Act + testRailCase.setTypeId(newTypeId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getTypeId()); + assertEquals(newTypeId, getTestRailCase.getTypeId()); + } + + @Test + public void testUpdatePriorityId(){ + // Arrange + beforeUpdate(); + int newPriorityId = 4; + + // Act + testRailCase.setPriorityId(newPriorityId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getPriorityId()); + assertEquals(newPriorityId, getTestRailCase.getPriorityId()); + } + + @Test + public void testUpdateMilestoneId(){ + // Arrange + beforeUpdate(); + int newMilestoneId = 4; + + // Act + testRailCase.setMilestoneId(newMilestoneId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getMilestoneId()); + assertEquals(newMilestoneId, getTestRailCase.getMilestoneId()); + } + + @Test + public void testUpdateRefs() { + // Arrange + beforeUpdate(); + String newRefs = "defaultRefs_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + // Act + testRailCase.setTitle(newRefs); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(newRefs, updatedTestRailCase.getTitle()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateCreatedBy(){ + // Arrange + beforeUpdate(); + int newCreatedBy = 4; + + // Act + testRailCase.setCreatedBy(newCreatedBy); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getCreatedBy()); + assertEquals(newCreatedBy, getTestRailCase.getCreatedBy()); + } + + @Test + public void testUpdateCreatedOn() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedCompletedOn = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailCase.setCreatedOn(updatedCompletedOn); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase= testRailCaseService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(updatedCompletedOn, updatedTestRailCase.getCreatedOn()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateUpdatedBy(){ + // Arrange + beforeUpdate(); + int newUpdatedBy = 4; + + // Act + testRailCase.setUpdatedBy(newUpdatedBy); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getUpdatedBy()); + assertEquals(newUpdatedBy, getTestRailCase.getUpdatedBy()); + } + + @Test + public void testUpdateUpdatedOn() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedUpdatedOn = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailCase.setUpdatedOn(updatedUpdatedOn); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase= testRailCaseService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(updatedUpdatedOn, updatedTestRailCase.getUpdatedOn()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateEstimate() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedEstimate = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailCase.setEstimate(updatedEstimate); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase= testRailCaseService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(updatedEstimate, updatedTestRailCase.getEstimate()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateEstimateForecast() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedEstimateForecast = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailCase.setEstimateForecast(updatedEstimateForecast); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase= testRailCaseService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailCase); + assertEquals(2, updatedTestRailCase.getTRId()); + assertEquals(updatedEstimateForecast, updatedTestRailCase.getEstimateForecast()); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + } + + @Test + public void testUpdateSuiteId(){ + // Arrange + beforeUpdate(); + int newSuiteId = 4; + + // Act + testRailCase.setSuiteId(newSuiteId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getSuiteId()); + assertEquals(newSuiteId, getTestRailCase.getSuiteId()); + } + + @Test + public void testUpdateTemplateId(){ + // Arrange + beforeUpdate(); + int newTemplateId = 4; + + // Act + testRailCase.setTemplateId(newTemplateId); + TestRailCase updatedTestRailCase = testRailCaseService.save(testRailCase); + TestRailCase getTestRailCase = testRailCaseService.findByTRId(2).get(); + + // Assert + assertNotNull(updatedTestRailCase); + assertEquals(testRailCase, updatedTestRailCase); + assertEquals(updatedTestRailCase, getTestRailCase); + assertEquals(4, updatedTestRailCase.getTemplateId()); + assertEquals(newTemplateId, getTestRailCase.getTemplateId()); + } + + @Test + public void testFindByTafId() { + /* Arrange */ + testRailCaseService.save(testRailCase); + testRailCaseService.save(testRailCase2); + testRailCaseService.save(testRailCase3); + Long tafId = testRailCase.getId(); + Long tafId2 = testRailCase2.getId(); + Long tafId3 = testRailCase3.getId(); + + /* Act */ + TestRailCase getTestRailCase = testRailCaseService.findById(tafId).get(); + TestRailCase getTestRailCase2 = testRailCaseService.findById(tafId2).get(); + TestRailCase getTestRailCase3 = testRailCaseService.findById(tafId3).get(); + + /* Assert */ + assertNotNull(getTestRailCase); + assertNotNull(getTestRailCase2); + assertNotNull(getTestRailCase3); + + assertEquals(testRailCase, getTestRailCase); + assertEquals(testRailCase2, getTestRailCase2); + assertEquals(testRailCase3, getTestRailCase3); + } + + @Test + public void testFindByTRId() { + /* Arrange */ + int trId = (new Random()).nextInt(Integer.MAX_VALUE); + int trId2 = (new Random()).nextInt(Integer.MAX_VALUE); + int trId3 = (new Random()).nextInt(Integer.MAX_VALUE); + + + testRailCase.setTRId(trId); + testRailCase2.setTRId(trId2); + testRailCase3.setTRId(trId3); + + testRailCaseService.save(testRailCase); + testRailCaseService.save(testRailCase2); + testRailCaseService.save(testRailCase3); + + /* Act */ + TestRailCase getTestRailCase = testRailCaseService.findByTRId(trId).get(); + TestRailCase getTestRailCase2 = testRailCaseService.findByTRId(trId2).get(); + TestRailCase getTestRailCase3 = testRailCaseService.findByTRId(trId3).get(); + + /* Assert */ + assertNotNull(getTestRailCase); + assertNotNull(getTestRailCase2); + assertNotNull(getTestRailCase3); + + assertEquals(trId, getTestRailCase.getTRId()); + assertEquals(trId2, getTestRailCase2.getTRId()); + assertEquals(trId3, getTestRailCase3.getTRId()); + + assertEquals(testRailCase, getTestRailCase); + assertEquals(testRailCase2, getTestRailCase2); + assertEquals(testRailCase3, getTestRailCase3); + } + + @Test + public void testFindByTitle() { + /* Arrange */ + testRailCaseService.save(testRailCase); + testRailCaseService.save(testRailCase2); + testRailCaseService.save(testRailCase3); + + /* Act */ + TestRailCase getTestRailCase = testRailCaseService.findByTitle(testRailCase.getTitle()).get(); + TestRailCase getTestRailCase2 = testRailCaseService.findByTitle(testRailCase2.getTitle()).get(); + TestRailCase getTestRailCase3 = testRailCaseService.findByTitle(testRailCase3.getTitle()).get(); + + /* Assert */ + assertNotNull(getTestRailCase); + assertNotNull(getTestRailCase2); + assertNotNull(getTestRailCase3); + + assertEquals(testRailCase, getTestRailCase); + assertEquals(testRailCase2, getTestRailCase2); + assertEquals(testRailCase3, getTestRailCase3); + } + + @Test + public void testDeleteByTafId() { + /* Arrange */ + testRailCaseService.save(testRailCase); + testRailCaseService.save(testRailCase2); + testRailCaseService.save(testRailCase3); + + Long tafId = testRailCase.getId(); + Long tafId2 = testRailCase2.getId(); + Long tafId3 = testRailCase3.getId(); + + /* Act */ + testRailCaseService.deleteById(tafId3); + testRailCaseService.deleteById(tafId); + testRailCaseService.deleteById(tafId2); + + /* Assert */ + assertTrue(testRailCaseService.findById(tafId).isEmpty()); + assertTrue(testRailCaseService.findById(tafId2).isEmpty()); + assertTrue(testRailCaseService.findById(tafId3).isEmpty()); + } +} diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailProject.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailProject.java new file mode 100644 index 0000000..571a786 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailProject.java @@ -0,0 +1,355 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.TestConfig; +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.model.factory.TestRailProjectFactory; +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.ContextConfiguration; + +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = TestConfig.class) +@DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" +}) +public class TestUnitTestRailProject { + + private TestRailProject testRailProject; + private TestRailProject testRailProject2; + private TestRailProject testRailProject3; + private String defaultName; + + @Autowired + private TestRailProjectService testRailProjectService; + + @BeforeEach + public void setUp() { + testRailProjectService.deleteAll(); // Drop all data from the table + defaultName = "defaultName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + testRailProject = TestRailProjectFactory.create(defaultName); + testRailProject2 = TestRailProjectFactory.create(defaultName + "_2"); + testRailProject3 = TestRailProjectFactory.create(defaultName + "_3"); + } + + @Test + public void testSave() { + // Arrange + testRailProject.setTRId(1); + + // Act + TestRailProject savedTestRailProject = testRailProjectService.save(testRailProject); + + // Assert + assertNotNull(savedTestRailProject); + assertEquals(testRailProject, savedTestRailProject); + assertEquals(defaultName, savedTestRailProject.getName()); + } + + public void beforeUpdate() { + testRailProject.setTRId(2); + testRailProjectService.save(testRailProject); + } + + @Test + public void testUpdateId() { + /* Arrange */ + beforeUpdate(); + testRailProject.setTRId(3); + + /* Act */ + TestRailProject savedTestRailProject = testRailProjectService.save(testRailProject); + + /* Assert */ + assertNotNull(savedTestRailProject); + assertEquals(testRailProject, savedTestRailProject); + assertEquals(defaultName, savedTestRailProject.getName()); + assertEquals(3, savedTestRailProject.getTRId()); + } + + @Test + public void testUpdateName() { + /* Arrange */ + beforeUpdate(); + String updatedName = "updatedName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailProject.setName(updatedName); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedName, updatedTestRailProject.getName()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateAnnouncement() { + /* Arrange */ + beforeUpdate(); + String updatedAnnouncement = "updatedAnnouncement_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailProject.setAnnouncement(updatedAnnouncement); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedAnnouncement, updatedTestRailProject.getAnnouncement()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateShowAnnouncement() { + /* Arrange */ + beforeUpdate(); + boolean updatedShowAnnouncement = true; + + /* Act */ + testRailProject.setShowAnnouncement(updatedShowAnnouncement); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedShowAnnouncement, updatedTestRailProject.getShowAnnouncement()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateIsCompleted() { + /* Arrange */ + beforeUpdate(); + boolean updatedIsCompleted = true; + + /* Act */ + testRailProject.setIsCompleted(updatedIsCompleted); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedIsCompleted, updatedTestRailProject.getIsCompleted()); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedTestRailProject, getTestRailProject); + + } + + @Test + public void testUpdateCompletedOn() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedCompletedOn = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailProject.setCompletedOn(updatedCompletedOn); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedCompletedOn, updatedTestRailProject.getCompletedOn()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + + } + + @Test + public void testUpdateSuiteMode() { + /* Arrange */ + beforeUpdate(); + int updatedSuiteMode = 1; + + /* Act */ + testRailProject.setSuiteMode(updatedSuiteMode); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedSuiteMode, updatedTestRailProject.getSuiteMode()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateDefaultRoleId() { + /* Arrange */ + beforeUpdate(); + int updatedDefaultRoleId = 1; + + /* Act */ + testRailProject.setDefaultRoleId(updatedDefaultRoleId); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedDefaultRoleId, updatedTestRailProject.getDefaultRoleId()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateCaseStatusesEnabled() { + /* Arrange */ + beforeUpdate(); + boolean updatedCaseStatusesEnabled = true; + + /* Act */ + testRailProject.setCaseStatusesEnabled(updatedCaseStatusesEnabled); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedCaseStatusesEnabled, updatedTestRailProject.getCaseStatusesEnabled()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testUpdateUrl() { + /* Arrange */ + beforeUpdate(); + String updatedUrl = "updatedUrl_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailProject.setUrl(updatedUrl); + TestRailProject updatedTestRailProject = testRailProjectService.save(testRailProject); + TestRailProject getTestRailProject = testRailProjectService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailProject); + assertEquals(2, updatedTestRailProject.getTRId()); + assertEquals(updatedUrl, updatedTestRailProject.getUrl()); + assertEquals(testRailProject, updatedTestRailProject); + assertEquals(updatedTestRailProject, getTestRailProject); + } + + @Test + public void testFindByTafId() { + /* Arrange */ + testRailProjectService.save(testRailProject); + testRailProjectService.save(testRailProject2); + testRailProjectService.save(testRailProject3); + Long tafId = testRailProject.getId(); + Long tafId2 = testRailProject2.getId(); + Long tafId3 = testRailProject3.getId(); + + /* Act */ + TestRailProject getTestRailProject = testRailProjectService.findByTafId(tafId).get(); + TestRailProject getTestRailProject2 = testRailProjectService.findByTafId(tafId2).get(); + TestRailProject getTestRailProject3 = testRailProjectService.findByTafId(tafId3).get(); + + /* Assert */ + assertNotNull(getTestRailProject); + assertNotNull(getTestRailProject2); + assertNotNull(getTestRailProject3); + + assertEquals(testRailProject, getTestRailProject); + assertEquals(testRailProject2, getTestRailProject2); + assertEquals(testRailProject3, getTestRailProject3); + } + + @Test + public void testFindByTRId() { + /* Arrange */ + int trId = (new Random()).nextInt(Integer.MAX_VALUE); + int trId2 = (new Random()).nextInt(Integer.MAX_VALUE); + int trId3 = (new Random()).nextInt(Integer.MAX_VALUE); + + + testRailProject.setTRId(trId); + testRailProject2.setTRId(trId2); + testRailProject3.setTRId(trId3); + + testRailProjectService.save(testRailProject); + testRailProjectService.save(testRailProject2); + testRailProjectService.save(testRailProject3); + + /* Act */ + TestRailProject getTestRailProject = testRailProjectService.findByTRId(trId).get(); + TestRailProject getTestRailProject2 = testRailProjectService.findByTRId(trId2).get(); + TestRailProject getTestRailProject3 = testRailProjectService.findByTRId(trId3).get(); + + /* Assert */ + assertNotNull(getTestRailProject); + assertNotNull(getTestRailProject2); + assertNotNull(getTestRailProject3); + + assertEquals(trId, getTestRailProject.getTRId()); + assertEquals(trId2, getTestRailProject2.getTRId()); + assertEquals(trId3, getTestRailProject3.getTRId()); + + assertEquals(testRailProject, getTestRailProject); + assertEquals(testRailProject2, getTestRailProject2); + assertEquals(testRailProject3, getTestRailProject3); + } + + @Test + public void testFindByName() { + /* Arrange */ + testRailProjectService.save(testRailProject); + testRailProjectService.save(testRailProject2); + testRailProjectService.save(testRailProject3); + + /* Act */ + TestRailProject getTestRailProject = testRailProjectService.findByName(testRailProject.getName()).get(); + TestRailProject getTestRailProject2 = testRailProjectService.findByName(testRailProject2.getName()).get(); + TestRailProject getTestRailProject3 = testRailProjectService.findByName(testRailProject3.getName()).get(); + + /* Assert */ + assertNotNull(getTestRailProject); + assertNotNull(getTestRailProject2); + assertNotNull(getTestRailProject3); + + assertEquals(testRailProject, getTestRailProject); + assertEquals(testRailProject2, getTestRailProject2); + assertEquals(testRailProject3, getTestRailProject3); + } + + + @Test + public void testDeleteByTafId() { + /* Arrange */ + testRailProjectService.save(testRailProject); + testRailProjectService.save(testRailProject2); + testRailProjectService.save(testRailProject3); + + Long tafId = testRailProject.getId(); + Long tafId2 = testRailProject2.getId(); + Long tafId3 = testRailProject3.getId(); + + /* Act */ + testRailProjectService.deleteByTafId(tafId3); + testRailProjectService.deleteByTafId(tafId); + testRailProjectService.deleteByTafId(tafId2); + + /* Assert */ + assertTrue(testRailProjectService.findByTafId(tafId).isEmpty()); + assertTrue(testRailProjectService.findByTafId(tafId2).isEmpty()); + assertTrue(testRailProjectService.findByTafId(tafId3).isEmpty()); + } +} \ No newline at end of file diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailSuite.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailSuite.java new file mode 100644 index 0000000..15975e6 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailSuite.java @@ -0,0 +1,313 @@ +package ca.etsmtl.taf.testrail.service.data; + + +import ca.etsmtl.taf.testrail.TestConfig; +import ca.etsmtl.taf.testrail.model.entity.TestRailSuite; +import ca.etsmtl.taf.testrail.model.factory.TestRailSuiteFactory; +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.ContextConfiguration; + +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = TestConfig.class) +@DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" +}) +public class TestUnitTestRailSuite { + + private TestRailSuite testRailSuite; + private TestRailSuite testRailSuite2; + private TestRailSuite testRailSuite3; + private String defaultName; + + @Autowired + private TestRailSuiteService testRailSuiteService; + + @BeforeEach + public void setUp() { + testRailSuiteService.deleteAll(); // Drop all data from the table + defaultName = "defaultName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + testRailSuite = TestRailSuiteFactory.create(defaultName); + testRailSuite2 = TestRailSuiteFactory.create(defaultName + "_2"); + testRailSuite3 = TestRailSuiteFactory.create(defaultName + "_3"); + } + + @Test + public void testSave() { + // Arrange + testRailSuite.setTRId(1); + + // Act + TestRailSuite savedTestRailSuite = testRailSuiteService.save(testRailSuite); + + // Assert + assertNotNull(savedTestRailSuite); + assertEquals(testRailSuite, savedTestRailSuite); + assertEquals(defaultName, savedTestRailSuite.getName()); + } + + public void beforeUpdate() { + testRailSuite.setTRId(2); + testRailSuiteService.save(testRailSuite); + } + + @Test + public void testUpdateId() { + /* Arrange */ + beforeUpdate(); + testRailSuite.setTRId(3); + + /* Act */ + TestRailSuite savedTestRailSuite = testRailSuiteService.save(testRailSuite); + + /* Assert */ + assertNotNull(savedTestRailSuite); + assertEquals(testRailSuite, savedTestRailSuite); + assertEquals(defaultName, savedTestRailSuite.getName()); + assertEquals(3, savedTestRailSuite.getTRId()); + } + + @Test + public void testUpdateName() { + /* Arrange */ + beforeUpdate(); + String updatedName = "updatedName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailSuite.setName(updatedName); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedName, updatedTestRailSuite.getName()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateDescription() { + /* Arrange */ + beforeUpdate(); + String updatedDescription = "updatedDescription_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailSuite.setDescription(updatedDescription); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedDescription, updatedTestRailSuite.getDescription()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateIsMaster() { + /* Arrange */ + beforeUpdate(); + boolean updatedIsMaster = true; + + /* Act */ + testRailSuite.setIsMaster(updatedIsMaster); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedIsMaster, updatedTestRailSuite.getIsMaster()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateIsBaseline() { + /* Arrange */ + beforeUpdate(); + boolean updatedIsBaseline = true; + + /* Act */ + testRailSuite.setIsBaseline(updatedIsBaseline); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedIsBaseline, updatedTestRailSuite.getIsBaseline()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateIsCompleted() { + /* Arrange */ + beforeUpdate(); + boolean updatedIsCompleted = true; + + /* Act */ + testRailSuite.setIsCompleted(updatedIsCompleted); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedIsCompleted, updatedTestRailSuite.getIsCompleted()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateCompletedOn() { + /* Arrange */ + beforeUpdate(); + Timestamp updatedCompletedOn = new Timestamp(System.currentTimeMillis()); + + /* Act */ + testRailSuite.setCompletedOn(updatedCompletedOn); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedCompletedOn, updatedTestRailSuite.getCompletedOn()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testUpdateUrl() { + /* Arrange */ + beforeUpdate(); + String updatedUrl = "updatedUrl_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailSuite.setUrl(updatedUrl); + TestRailSuite updatedTestRailSuite = testRailSuiteService.save(testRailSuite); + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailSuite); + assertEquals(2, updatedTestRailSuite.getTRId()); + assertEquals(updatedUrl, updatedTestRailSuite.getUrl()); + assertEquals(testRailSuite, updatedTestRailSuite); + assertEquals(updatedTestRailSuite, getTestRailSuite); + } + + @Test + public void testFindByTafId() { + /* Arrange */ + testRailSuiteService.save(testRailSuite); + testRailSuiteService.save(testRailSuite2); + testRailSuiteService.save(testRailSuite3); + Long tafId = testRailSuite.getId(); + Long tafId2 = testRailSuite2.getId(); + Long tafId3 = testRailSuite3.getId(); + + /* Act */ + TestRailSuite getTestRailSuite = testRailSuiteService.findByTafId(tafId).get(); + TestRailSuite getTestRailSuite2 = testRailSuiteService.findByTafId(tafId2).get(); + TestRailSuite getTestRailSuite3 = testRailSuiteService.findByTafId(tafId3).get(); + + /* Assert */ + assertNotNull(getTestRailSuite); + assertNotNull(getTestRailSuite2); + assertNotNull(getTestRailSuite3); + + assertEquals(testRailSuite, getTestRailSuite); + assertEquals(testRailSuite2, getTestRailSuite2); + assertEquals(testRailSuite3, getTestRailSuite3); + } + + @Test + public void testFindByTRId() { + /* Arrange */ + int trId = (new Random()).nextInt(Integer.MAX_VALUE); + int trId2 = (new Random()).nextInt(Integer.MAX_VALUE); + int trId3 = (new Random()).nextInt(Integer.MAX_VALUE); + + testRailSuite.setTRId(trId); + testRailSuite2.setTRId(trId2); + testRailSuite3.setTRId(trId3); + + testRailSuiteService.save(testRailSuite); + testRailSuiteService.save(testRailSuite2); + testRailSuiteService.save(testRailSuite3); + + /* Act */ + TestRailSuite getTestRailSuite = testRailSuiteService.findByTRId(trId).get(); + TestRailSuite getTestRailSuite2 = testRailSuiteService.findByTRId(trId2).get(); + TestRailSuite getTestRailSuite3 = testRailSuiteService.findByTRId(trId3).get(); + + /* Assert */ + assertNotNull(getTestRailSuite); + assertNotNull(getTestRailSuite2); + assertNotNull(getTestRailSuite3); + + assertEquals(trId, getTestRailSuite.getTRId()); + assertEquals(trId2, getTestRailSuite2.getTRId()); + assertEquals(trId3, getTestRailSuite3.getTRId()); + + assertEquals(testRailSuite, getTestRailSuite); + assertEquals(testRailSuite2, getTestRailSuite2); + assertEquals(testRailSuite3, getTestRailSuite3); + } + + @Test + public void testFindByName() { + /* Arrange */ + testRailSuiteService.save(testRailSuite); + testRailSuiteService.save(testRailSuite2); + testRailSuiteService.save(testRailSuite3); + + /* Act */ + TestRailSuite getTestRailSuite = testRailSuiteService.findByName(testRailSuite.getName()).get(); + TestRailSuite getTestRailSuite2 = testRailSuiteService.findByName(testRailSuite2.getName()).get(); + TestRailSuite getTestRailSuite3 = testRailSuiteService.findByName(testRailSuite3.getName()).get(); + + /* Assert */ + assertNotNull(getTestRailSuite); + assertNotNull(getTestRailSuite2); + assertNotNull(getTestRailSuite3); + + assertEquals(testRailSuite, getTestRailSuite); + assertEquals(testRailSuite2, getTestRailSuite2); + assertEquals(testRailSuite3, getTestRailSuite3); + } + + @Test + public void testDeleteByTafId() { + /* Arrange */ + testRailSuiteService.save(testRailSuite); + testRailSuiteService.save(testRailSuite2); + testRailSuiteService.save(testRailSuite3); + Long tafId = testRailSuite.getId(); + Long tafId2 = testRailSuite2.getId(); + Long tafId3 = testRailSuite3.getId(); + + /* Act */ + testRailSuiteService.deleteByTafId(tafId); + testRailSuiteService.deleteByTafId(tafId2); + testRailSuiteService.deleteByTafId(tafId3); + + /* Assert */ + assertTrue(testRailSuiteService.findByTafId(tafId).isEmpty()); + assertTrue(testRailSuiteService.findByTafId(tafId2).isEmpty()); + assertTrue(testRailSuiteService.findByTafId(tafId3).isEmpty()); + } +} diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailUser.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailUser.java new file mode 100644 index 0000000..8c1cb88 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/data/TestUnitTestRailUser.java @@ -0,0 +1,224 @@ +package ca.etsmtl.taf.testrail.service.data; + +import ca.etsmtl.taf.testrail.TestConfig; +import ca.etsmtl.taf.testrail.model.entity.TestRailUser; +import ca.etsmtl.taf.testrail.model.factory.TestRailUserFactory; +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.ContextConfiguration; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = TestConfig.class) +@DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" +}) +public class TestUnitTestRailUser { + + private TestRailUser testRailUser; + private TestRailUser testRailUser2; + private TestRailUser testRailUser3; + private String defaultName; + private String defaultPassword; + private String defaultEmail; + + @Autowired + private TestRailUserService testRailUserService; + + @BeforeEach + public void setUp() { + testRailUserService.deleteAll(); // Drop all data from the table + defaultName = "defaultName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + defaultPassword = "defaultPassword_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + defaultEmail = "defaultEmail_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + testRailUser = TestRailUserFactory.create(defaultName, defaultPassword, defaultEmail); + testRailUser2 = TestRailUserFactory.create(defaultName + "_2", defaultPassword + "_2", defaultEmail + "_2"); + testRailUser3 = TestRailUserFactory.create(defaultName + "_3", defaultPassword + "_3", defaultEmail + "_3"); + } + + @Test + public void testSave() { + /* Arrange */ + testRailUser.setTRId(1); + + /* Act */ + TestRailUser savedTestRailUser = testRailUserService.save(testRailUser); + + /* Assert */ + assertNotNull(savedTestRailUser); + assertEquals(testRailUser, savedTestRailUser); + assertEquals(defaultName, savedTestRailUser.getUsername()); + } + + public void beforeUpdate() { + testRailUser.setTRId(2); + testRailUserService.save(testRailUser); + } + + @Test + public void testUpdateUsername() { + /* Arrange */ + beforeUpdate(); + String updatedUsername = "newName_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailUser.setUsername(updatedUsername); + TestRailUser updatedTestRailUser = testRailUserService.save(testRailUser); + TestRailUser getTestRailUser = testRailUserService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailUser); + assertEquals(2, updatedTestRailUser.getTRId()); + assertEquals(updatedUsername, updatedTestRailUser.getUsername()); + assertEquals(testRailUser, updatedTestRailUser); + assertEquals(updatedTestRailUser, getTestRailUser); + } + + @Test + public void testUpdatePassword() { + /* Arrange */ + beforeUpdate(); + String updatedPassword = "newPassword_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailUser.setPassword(updatedPassword); + TestRailUser updatedTestRailUser = testRailUserService.save(testRailUser); + TestRailUser getTestRailUser = testRailUserService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailUser); + assertEquals(2, updatedTestRailUser.getTRId()); + assertEquals(updatedPassword, updatedTestRailUser.getPassword()); + assertEquals(testRailUser, updatedTestRailUser); + assertEquals(updatedTestRailUser, getTestRailUser); + } + + @Test + public void testUpdateEmail() { + /* Arrange */ + beforeUpdate(); + String updatedEmail = "newEmail_" + LocalDate.now() + LocalTime.now() + TestConfig.getRandomString(16); + + /* Act */ + testRailUser.setEmail(updatedEmail); + TestRailUser updatedTestRailUser = testRailUserService.save(testRailUser); + TestRailUser getTestRailUser = testRailUserService.findByTRId(2).get(); + + /* Assert */ + assertNotNull(updatedTestRailUser); + assertEquals(2, updatedTestRailUser.getTRId()); + assertEquals(updatedEmail, updatedTestRailUser.getEmail()); + assertEquals(testRailUser, updatedTestRailUser); + assertEquals(updatedTestRailUser, getTestRailUser); + } + + @Test + public void testFindByTafId() { + + /* Arrange */ + testRailUserService.save(testRailUser); + testRailUserService.save(testRailUser2); + testRailUserService.save(testRailUser3); + Long tafId = testRailUser.getId(); + Long tafId2 = testRailUser2.getId(); + Long tafId3 = testRailUser3.getId(); + + /* Act */ + TestRailUser getTestRailUser = testRailUserService.findByTafId(tafId).get(); + TestRailUser getTestRailUser2 = testRailUserService.findByTafId(tafId2).get(); + TestRailUser getTestRailUser3 = testRailUserService.findByTafId(tafId3).get(); + + /* Assert */ + assertNotNull(getTestRailUser); + assertNotNull(getTestRailUser2); + assertNotNull(getTestRailUser3); + assertEquals(testRailUser, getTestRailUser); + assertEquals(testRailUser2, getTestRailUser2); + assertEquals(testRailUser3, getTestRailUser3); + } + + @Test + public void testFindByTRId() { + + /* Arrange */ + int trId = (new Random()).nextInt(Integer.MAX_VALUE); + int trId2 = (new Random()).nextInt(Integer.MAX_VALUE); + int trId3 = (new Random()).nextInt(Integer.MAX_VALUE); + testRailUser.setTRId(trId); + testRailUser2.setTRId(trId2); + testRailUser3.setTRId(trId3); + testRailUserService.save(testRailUser); + testRailUserService.save(testRailUser2); + testRailUserService.save(testRailUser3); + + /* Act */ + TestRailUser getTestRailUser = testRailUserService.findByTRId(trId).get(); + TestRailUser getTestRailUser2 = testRailUserService.findByTRId(trId2).get(); + TestRailUser getTestRailUser3 = testRailUserService.findByTRId(trId3).get(); + + /* Assert */ + assertNotNull(getTestRailUser); + assertNotNull(getTestRailUser2); + assertNotNull(getTestRailUser3); + + assertEquals(trId, getTestRailUser.getTRId()); + assertEquals(trId2, getTestRailUser2.getTRId()); + assertEquals(trId3, getTestRailUser3.getTRId()); + + assertEquals(testRailUser, getTestRailUser); + assertEquals(testRailUser2, getTestRailUser2); + assertEquals(testRailUser3, getTestRailUser3); + } + + @Test + public void testFindByUsername() { + + /* Arrange */ + testRailUserService.save(testRailUser); + testRailUserService.save(testRailUser2); + testRailUserService.save(testRailUser3); + + /* Act */ + TestRailUser getTestRailUser = testRailUserService.findByUsername(testRailUser.getUsername()).get(); + TestRailUser getTestRailUser2 = testRailUserService.findByUsername(testRailUser2.getUsername()).get(); + TestRailUser getTestRailUser3 = testRailUserService.findByUsername(testRailUser3.getUsername()).get(); + + /* Assert */ + assertNotNull(getTestRailUser); + assertNotNull(getTestRailUser2); + assertNotNull(getTestRailUser3); + + assertEquals(testRailUser, getTestRailUser); + assertEquals(testRailUser2, getTestRailUser2); + assertEquals(testRailUser3, getTestRailUser3); + } + + @Test + public void testDeleteByTafId(){ + /* Arrange */ + testRailUserService.save(testRailUser); + testRailUserService.save(testRailUser2); + testRailUserService.save(testRailUser3); + + Long tafId = testRailUser.getId(); + Long tafId2 = testRailUser2.getId(); + Long tafId3 = testRailUser3.getId(); + + /* Act */ + testRailUserService.deleteByTafId(tafId); + testRailUserService.deleteByTafId(tafId2); + testRailUserService.deleteByTafId(tafId3); + + /* Assert */ + assertTrue(testRailUserService.findByTafId(tafId).isEmpty()); + assertTrue(testRailUserService.findByTafId(tafId2).isEmpty()); + assertTrue(testRailUserService.findByTafId(tafId3).isEmpty()); + } +} diff --git a/testrail/src/test/java/ca/etsmtl/taf/testrail/service/manager/TestGeneralSavingManager.java b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/manager/TestGeneralSavingManager.java new file mode 100644 index 0000000..77a72f5 --- /dev/null +++ b/testrail/src/test/java/ca/etsmtl/taf/testrail/service/manager/TestGeneralSavingManager.java @@ -0,0 +1,43 @@ +package ca.etsmtl.taf.testrail.service.manager; + + +import ca.etsmtl.taf.testrail.TestConfig; +import ca.etsmtl.taf.testrail.model.entity.TestRailProject; +import ca.etsmtl.taf.testrail.service.data.TestRailProjectService; +import ca.etsmtl.taf.testrail.service.manager.saving.GeneralSavingManager; +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.ContextConfiguration; + +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = TestConfig.class) +@DataJpaTest(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.datasource.url=jdbc:h2:mem:testdb" +}) +public class TestGeneralSavingManager { + @Autowired + private GeneralSavingManager generalSavingManager; + + @Autowired + private TestRailProjectService testRailProjectService; + + @Test + public void mainStory() { + String name = "GeneralSavingManager" + System.currentTimeMillis(); + generalSavingManager.saveData(generalSavingManager.createProject(name)); + TestRailProject project = testRailProjectService.findByName(name).orElse(null); + assertNotNull(project); + assertEquals(name, project.getName()); + assertEquals(true, project.getIsSaved()); // TODO : Only if the connection to TestRail is successful + + generalSavingManager.deleteData(project); + project = testRailProjectService.findByName(name).orElse(null); + assertNull(project); + + + } + +}