Skip to content
Merged

Dev #49

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
5e1d3cb
delete recomendation (sugerencia)
JulianKer Nov 25, 2025
d302954
Cambio paginado de prendas a 10
camilamarendazzo Nov 25, 2025
30d7637
debug: log para ver que esta pasando con tripo
rioslucas1 Nov 25, 2025
54762d6
Cambio paginado de prendas a 10
camilamarendazzo Nov 25, 2025
3b38efc
Testing user repo
FeliWeigel Nov 25, 2025
280751c
Testing user subscriptions repo
FeliWeigel Nov 26, 2025
ec93a7d
Testing user subscriptions repo
FeliWeigel Nov 26, 2025
4740641
Testing user subscriptions repo
FeliWeigel Nov 26, 2025
3fcf4d2
test/useCases/garment - refactor
JulianKer Nov 26, 2025
30f3fae
test/useCases/garments - nuevos test
JulianKer Nov 26, 2025
f377405
test/useCases/garments - todos testeados
JulianKer Nov 26, 2025
eb22e97
Testing Brand and Clima repo
FeliWeigel Nov 26, 2025
69d1b0b
Testing repo subscription, combinations, fashn, etc..
FeliWeigel Nov 26, 2025
0760ccc
Testing repo subscription, combinations, fashn, etc..
FeliWeigel Nov 26, 2025
92c298f
Testing UserSubscription and PrendaOcasion
FeliWeigel Nov 26, 2025
75413b0
Tests documentation
FeliWeigel Nov 26, 2025
130ac77
Testing Recomendation and upload image repo
FeliWeigel Nov 26, 2025
8a6c696
Testing Garment and Trippo repository
FeliWeigel Nov 26, 2025
4166cfe
Testing User Comb. Fav. and Garment Fav.
FeliWeigel Nov 26, 2025
0d7190c
refactor tests subscription
AilinVara Nov 27, 2025
37a6ee2
refactor tests subscription
AilinVara Nov 27, 2025
67ee3a0
test controllers (algunos)
JulianKer Nov 27, 2025
1026050
merge pull
JulianKer Nov 27, 2025
a7c3805
Agrega todos los tests de subscription
AilinVara Nov 27, 2025
47eef17
Agrega todos los tests de brand
AilinVara Nov 27, 2025
0b098ab
Agrega todos los tests de bucketImages
AilinVara Nov 27, 2025
8967924
Agrega todos los tests de combination
AilinVara Nov 27, 2025
5ebc04d
Agrega todos los tests de combinationAttempt
AilinVara Nov 27, 2025
52802b1
Agrega todos los tests de combinationFavorite
AilinVara Nov 27, 2025
01b64ab
Agrega todos los tests de dashboard
AilinVara Nov 27, 2025
801e192
Agrega todos los tests para gmail
AilinVara Nov 27, 2025
b8b2540
Agrega todos los tests de recomendations
AilinVara Nov 27, 2025
8ff380e
Refactor de tests de tripo
AilinVara Nov 27, 2025
241b433
Agrega todos los tests de user
AilinVara Nov 27, 2025
5d4f7e8
agrego test para controladores y presentacion
rioslucas1 Nov 27, 2025
13a3973
Merge pull request #46 from Outfit-Lab-TPI/test/useCases
rioslucas1 Nov 27, 2025
9ab89ec
Merge pull request #47 from Outfit-Lab-TPI/test/presentacion-controller
rioslucas1 Nov 27, 2025
8e1546d
Merge branch 'test/repo' into dev
rioslucas1 Nov 27, 2025
c08727b
merge: arreglo conflictos y sumo test de repositorios
rioslucas1 Nov 27, 2025
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
39 changes: 39 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,42 @@ docker compose up --build
| `MAX_FILE_SIZE` / `MAX_REQUEST_SIZE` | Límites upload | `50MB` |
| `LOG_LEVEL_ROOT` / `LOG_LEVEL_OUTFITLAB` | Logging | `INFO` / `DEBUG` |
| `SERVER_PORT` | Puerto interno | `8080` |

## Testing
Utilizacion de Patron Given - When - Then
## - Given: preparar datos y mocks. Ej:

private UserSubscriptionEntity givenExistingSubscriptionReturningEntity(String email, String planCode, int combinations) {
UserSubscriptionEntity entity = givenSubscriptionEntity(email, planCode, 10L, combinations);
when(userSubscriptionJpaRepository.findByUserEmail(email))
.thenReturn(Optional.of(entity));
return entity;
}
## - WHEN: ejecutar el método a probar. Ej:

private void whenFindingSubscriptionByUserEmail(String email, UserSubscriptionEntity entity) {
when(userSubscriptionJpaRepository.findByUserEmail(email)).thenReturn(Optional.of(entity));
}

## - THEN: verificar resultados o excepciones. Ej:

private void thenSubscriptionShouldHaveCombinationsUsed(UserSubscriptionModel model, int expected) {
assertThat(model).isNotNull();
assertThat(model.getCombinationsUsed()).isEqualTo(expected);
}

## - Test completo del metodo
@Test
void shouldReturnSubscriptionModelWhenEmailExists() throws SubscriptionNotFoundException {
String email = "[email protected]";
UserSubscriptionEntity entity = givenExistingSubscriptionReturningEntity(email, "BASIC", 10);

whenFindingSubscriptionByUserEmail(email, entity);

UserSubscriptionModel result = whenFindByUserEmail(email);

thenSubscriptionShouldHaveCombinationsUsed(result, 10);
verify(userSubscriptionJpaRepository).findByUserEmail(email);
}


Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface GarmentRecomendationRepository {
void deleteRecomendationsByGarmentCode(String garmentCode);

void createSugerenciasByGarmentCode(String garmentCode, String type, List<String> sugerencias);

void deleteRecomendationByGarmentsCode(String garmentCodePrimary, String garmentCodeSecondary, String type);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.outfitlab.project.domain.interfaces.repositories;

public interface PrendaOcasionRepository {

void deleteAllPrendaOcasionByGarment(String garmentCode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ public UserModel(long id, String email) {
this.email = email;
}

public UserModel() {

}

/*
* public String getPassword() {
* return "";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.outfitlab.project.domain.useCases.recomendations;

import com.outfitlab.project.domain.interfaces.repositories.PrendaOcacionRepository;
import com.outfitlab.project.domain.interfaces.repositories.PrendaOcasionRepository;

public class DeleteAllPrendaOcacionRelatedToGarment {

private final PrendaOcacionRepository prendaOcacionRepository;
private final PrendaOcasionRepository prendaOcacionRepository;

public DeleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
this.prendaOcacionRepository = prendaOcacionRepository;
}

public void execute(String garmentCode){
this.prendaOcacionRepository.deleteAllPrendaOcacionByGarment(garmentCode);
this.prendaOcacionRepository.deleteAllPrendaOcasionByGarment(garmentCode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.outfitlab.project.domain.useCases.recomendations;

import com.outfitlab.project.domain.interfaces.repositories.GarmentRecomendationRepository;

public class DeleteRecomendationByPrimaryAndSecondaryGarmentCode {

private final GarmentRecomendationRepository garmentRecomendationRepository;

public DeleteRecomendationByPrimaryAndSecondaryGarmentCode(GarmentRecomendationRepository garmentRecomendationRepository) {
this.garmentRecomendationRepository = garmentRecomendationRepository;
}

public String execute(String garmentCodePrimary, String garmentCodeSecondary, String type) {
this.garmentRecomendationRepository.deleteRecomendationByGarmentsCode(garmentCodePrimary, garmentCodeSecondary, type);
return "Sugerencia eliminada con éxito.";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class GarmentConfig {
@Bean
public GarmentRepository garmentRepository(GarmentJpaRepository jpaRepository, BrandJpaRepository brandJpaRepository,
ClimaJpaRepository climaJpaRepository, ColorJpaRepository colorJpaRepository,
OcacionJpaRepository ocacionJpaRepository) {
OcasionJpaRepository ocacionJpaRepository) {
return new GarmentRepositoryImpl(jpaRepository, brandJpaRepository, colorJpaRepository, climaJpaRepository, ocacionJpaRepository);
}

Expand All @@ -41,7 +41,7 @@ public DeleteAllFavoritesRelatedToGarment deleteAllFavoritesRelatedToGarment(Use
}

@Bean
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
return new DeleteAllPrendaOcacionRelatedToGarment(prendaOcacionRepository);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ public DeleteGarmentRecomentationsRelatedToGarment deleteGarmentRecomentationsRe
}

@Bean
public PrendaOcacionRepository prendaOcacionRepository(PrendaOcacionJpaRepository prendaOcacionJpaRepository){
return new PrendaOcacionRepositoryImpl(prendaOcacionJpaRepository);
public PrendaOcasionRepository prendaOcacionRepository(PrendaOcasionJpaRepository prendaOcacionJpaRepository){
return new PrendaOcasionRepositoryImpl(prendaOcacionJpaRepository);
}

@Bean
public DeleteRecomendationByPrimaryAndSecondaryGarmentCode deleteRecomendationByPrimaryAndSecondaryGarmentCode(GarmentRecomendationRepository recomendationRepository){
return new DeleteRecomendationByPrimaryAndSecondaryGarmentCode(recomendationRepository);
}

@Bean
Expand All @@ -37,7 +42,7 @@ public CreateSugerenciasByGarmentsCode createSugerenciasByGarmentsCode(GarmentRe
}

@Bean
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
return new DeleteAllPrendaOcacionRelatedToGarment(prendaOcacionRepository);
}

Expand All @@ -47,8 +52,8 @@ public ColorRepository colorRepository(ColorJpaRepository colorJpaRepository){
}

@Bean
public OcacionRepository ocacionRepository(OcacionJpaRepository ocacionJpaRepository){
return new OcacionRepositoryImpl(ocacionJpaRepository);
public OcacionRepository ocacionRepository(OcasionJpaRepository ocacionJpaRepository){
return new OcasionRepositoryImpl(ocacionJpaRepository);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ public class MarcaEntity {
private String urlSite;

public MarcaEntity(){}

public MarcaEntity(String codigoMarca, String nombre) {
this.codigoMarca = codigoMarca;
this.nombre = nombre;
}
public MarcaEntity(String codigoMarca, String nombre, String logoUrl, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.codigoMarca = codigoMarca;
this.nombre = nombre;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ public class SubscriptionEntity {
@Column(name = "has_advanced_reports", columnDefinition = "boolean default false")
private boolean hasAdvancedReports = false;

public SubscriptionEntity(String name, String planCode) {
this.name = name;
this.planCode = planCode;
}

public Long getId() {
return id;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ public class UserEntity implements UserDetails {

public UserEntity() {
}
public UserEntity(String email) {
this.email = email;
}

public UserEntity(String name, String lastName, String email, String satulation, String secondName, Integer years,
String password) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public ColorRepositoryImpl(ColorJpaRepository colorJpaRepository) {
@Override
public List<ColorModel> findAllColores() {
List<ColorEntity> colors = this.colorJpaRepository.findAll();
if (colors.isEmpty()) throw new ColorNotFoundException("No encontramos ocaciones.");
if (colors.isEmpty()) throw new ColorNotFoundException("No encontramos ocasiones.");
return colors.stream().map(ColorEntity::convertEntityToModel)
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.exceptions.GarmentNotFoundException;
import com.outfitlab.project.domain.interfaces.repositories.ClimaRepository;
import com.outfitlab.project.domain.interfaces.repositories.GarmentRepository;
import com.outfitlab.project.domain.model.ClimaModel;
import com.outfitlab.project.domain.model.ColorModel;
Expand All @@ -20,14 +19,14 @@

public class GarmentRepositoryImpl implements GarmentRepository {

private final int PAGE_SIZE = 20;
private final int PAGE_SIZE = 10;
private final GarmentJpaRepository garmentJpaRepository;
private final BrandJpaRepository brandJpaRepository;
private final ColorJpaRepository colorJpaRepository;
private final ClimaJpaRepository climaJpaRepository;
private final OcacionJpaRepository ocacionJpaRepository;
private final OcasionJpaRepository ocacionJpaRepository;

public GarmentRepositoryImpl(GarmentJpaRepository garmentJpaRepository, BrandJpaRepository brandJpaRepository, ColorJpaRepository colorJpaRepository, ClimaJpaRepository climaJpaRepository, OcacionJpaRepository ocacionJpaRepository) {
public GarmentRepositoryImpl(GarmentJpaRepository garmentJpaRepository, BrandJpaRepository brandJpaRepository, ColorJpaRepository colorJpaRepository, ClimaJpaRepository climaJpaRepository, OcasionJpaRepository ocacionJpaRepository) {
this.garmentJpaRepository = garmentJpaRepository;
this.brandJpaRepository = brandJpaRepository;
this.colorJpaRepository = colorJpaRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private String buildRequestBody(String peticionUsuario) throws com.fasterxml.jac
return objectMapper.writeValueAsString(directRequest);
}

private String extractJsonContent(String apiResponseBody) throws Exception {
protected String extractJsonContent(String apiResponseBody) throws Exception {
Map<String, Object> responseMap = objectMapper.readValue(apiResponseBody, Map.class);

List<Map<String, Object>> candidates = (List<Map<String, Object>>) responseMap.get("candidates");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.exceptions.ClimaNotFoundException;
import com.outfitlab.project.domain.exceptions.OcasionNotFoundException;
import com.outfitlab.project.domain.interfaces.repositories.OcacionRepository;
import com.outfitlab.project.domain.model.OcasionModel;
import com.outfitlab.project.infrastructure.model.ClimaEntity;
import com.outfitlab.project.infrastructure.model.OcasionEntity;
import com.outfitlab.project.infrastructure.repositories.interfaces.OcacionJpaRepository;
import com.outfitlab.project.infrastructure.repositories.interfaces.OcasionJpaRepository;

import java.util.List;

public class OcacionRepositoryImpl implements OcacionRepository {
public class OcasionRepositoryImpl implements OcacionRepository {

private final OcacionJpaRepository ocacionJpaRepository;

public OcacionRepositoryImpl(OcacionJpaRepository ocacionJpaRepository) {
this.ocacionJpaRepository = ocacionJpaRepository;
private final OcasionJpaRepository ocasionJpaRepository;

public OcasionRepositoryImpl(OcasionJpaRepository ocasionJpaRepository) {
this.ocasionJpaRepository = ocasionJpaRepository;
}

@Override
public List<OcasionModel> findAllOcasiones() {
List<OcasionEntity> ocaciones = this.ocacionJpaRepository.findAll();
List<OcasionEntity> ocaciones = this.ocasionJpaRepository.findAll();
if (ocaciones.isEmpty()) throw new OcasionNotFoundException("No encontramos ocaciones.");
return ocaciones.stream().map(OcasionEntity::convertEntityToModel)
.toList();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.interfaces.repositories.PrendaOcasionRepository;
import com.outfitlab.project.infrastructure.repositories.interfaces.PrendaOcasionJpaRepository;

public class PrendaOcasionRepositoryImpl implements PrendaOcasionRepository {

private final PrendaOcasionJpaRepository prendaOcasionJpaRepository;

public PrendaOcasionRepositoryImpl(PrendaOcasionJpaRepository prendaOcasionJpaRepository){
this.prendaOcasionJpaRepository = prendaOcasionJpaRepository;
}

@Override
public void deleteAllPrendaOcasionByGarment(String garmentCode) {
this.prendaOcasionJpaRepository.deleteAllByGarmentCode(garmentCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ public void createSugerenciasByGarmentCode(String garmentCode, String type, List
this.recomendationJpaRepository.saveAll(sugerenciasToCeate);
}

@Override
public void deleteRecomendationByGarmentsCode(String garmentCodePrimary, String garmentCodeSecondary, String type) {
if (type.equalsIgnoreCase("inferior"))
this.recomendationJpaRepository.deleteWhenPrimaryIsBottom(garmentCodePrimary, garmentCodeSecondary);
else
this.recomendationJpaRepository.deleteWhenPrimaryIsTop(garmentCodePrimary, garmentCodeSecondary);
}

private List<GarmentRecomendationEntity> getGarmentRecomendationEntitiesToCreate(String type, List<String> sugerencias, PrendaEntity prendaPrincipal) {
List<GarmentRecomendationEntity> sugerenciasToCeate = new ArrayList<>();

Expand Down
Loading