Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workflow for SonarCloud #8

Merged
merged 9 commits into from
Nov 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions .github/workflows/maven-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,29 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run tests with Maven
run: mvn test

- name: Cache SonarCloud packages
uses: actions/cache@v4
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar

- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Build and analyze
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn clean verify sonar:sonar
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Meli APC

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=angelodpadron_meli-apc-back&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=angelodpadron_meli-apc-back)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=angelodpadron_meli-apc-back&metric=coverage)](https://sonarcloud.io/summary/new_code?id=angelodpadron_meli-apc-back)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=angelodpadron_meli-apc-back&metric=bugs)](https://sonarcloud.io/summary/new_code?id=angelodpadron_meli-apc-back)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=angelodpadron_meli-apc-back&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=angelodpadron_meli-apc-back)
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=angelodpadron_meli-apc-back&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=angelodpadron_meli-apc-back)

## Overview
Este repositorio contiene el backend de Meli APC, Asesor Personal de Compras.

Expand Down
186 changes: 186 additions & 0 deletions pom-alt.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
<relativePath/> <!-- lookup parent from reposxitory -->
</parent>
<groupId>org.meliapp</groupId>
<artifactId>backend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>backend</name>
<description>backend</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<kotlin.version>1.9.24</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version> <!-- Ensure version compatibility with jjwt-jackson -->
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.4</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.3.232</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
</args>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.17.1</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<configuration>
<excludes>
<exclude>**/config/**</exclude>
<exclude>**/dto/**</exclude>
<exclude>**/exception/**</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>
33 changes: 32 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
<relativePath/> <!-- lookup parent from reposxitory -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.meliapp</groupId>
<artifactId>backend</artifactId>
Expand All @@ -29,6 +29,13 @@
<properties>
<java.version>17</java.version>
<kotlin.version>1.9.24</kotlin.version>
<!-- exclusion patterns for test coverage -->
<exclusions.patterns>**/config/**, **/dto/**, **/exception/**</exclusions.patterns>
<!-- sonar config -->
<sonar.organization>angelodpadron</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.projectKey>angelodpadron_meli-apc-back</sonar.projectKey>
<sonar.coverage.exclusions>${exclusions.patterns}</sonar.coverage.exclusions>
</properties>
<dependencies>
<dependency>
Expand Down Expand Up @@ -154,6 +161,30 @@
<artifactId>versions-maven-plugin</artifactId>
<version>2.17.1</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<configuration>
<excludes>
<exclude>${exclusions.patterns}</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
16 changes: 16 additions & 0 deletions src/test/kotlin/org/meliapp/backend/service/AuthServiceUnitTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,20 @@ class AuthServiceUnitTest {

}

@Test
fun `should return a jwt when login`() {
// Arrange
val request = AuthRequestBody("pepe@email.com", "password")
val mockUser = mock(User::class.java)

whenever(userRepository.findByEmail(request.email)).thenReturn(Optional.of(mockUser))
whenever(mockUser.email).thenReturn(request.email)
whenever(jwtHelper.generateToken(request.email)).thenReturn("JWT")

val result = authService.login(request)

assertEquals("JWT", result)

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.meliapp.backend.service

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.extension.ExtendWith
import org.meliapp.backend.model.Role
import org.meliapp.backend.model.RoleName
import org.meliapp.backend.model.User
import org.meliapp.backend.repository.UserRepository
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.junit.jupiter.MockitoExtension
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UsernameNotFoundException
import java.util.*
import org.mockito.Mockito.`when` as whenever


@ExtendWith(MockitoExtension::class)
class CustomUserDetailsServiceUnitTest {

@Mock
private lateinit var userRepository: UserRepository

@InjectMocks
private lateinit var customUserDetailsService: CustomUserDetailsService

@Test
fun `loadUserByUsername should return UserDetails when user is found`() {
// Arrange
val username = "test@example.com"
val password = "password"
val roles = listOf(Role().apply { name = RoleName.ROLE_USER })

val user = mock(User::class.java)

whenever(user.email).thenReturn(username)
whenever(user.password).thenReturn(password)
whenever(user.roles).thenReturn(roles)
whenever(userRepository.findByEmail(username)).thenReturn(Optional.of(user))

// Act
val userDetails: UserDetails = customUserDetailsService.loadUserByUsername(username)

// Assert
assertEquals(username, userDetails.username)
assertEquals(password, userDetails.password)
assertTrue(userDetails.authorities.contains(SimpleGrantedAuthority("ROLE_USER")))
}

@Test
fun `loadUserByUsername should throw UsernameNotFoundException when user is not found`() {
// Arrange
val username = "test@example.com"

whenever(userRepository.findByEmail(username)).thenReturn(Optional.empty())

// Act & Assert
assertThrows<UsernameNotFoundException> {
customUserDetailsService.loadUserByUsername(username)
}
}

}
Loading