Skip to content

Commit 10c21d8

Browse files
committed
feat: Búsqueda de Películas por Atributos, ej: buscar por nombre y duración; por nombre y género; por nombre, género y duración; etc.
1 parent e5af036 commit 10c21d8

3 files changed

Lines changed: 65 additions & 7 deletions

File tree

src/main/java/com/luigi/javatest/movies/model/Movie.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
public class Movie {
66
private Integer id;
77
private String name;
8-
private int minutes;
8+
private Integer minutes;
99
private Gender gender;
1010
private String director; // Nuevo atributo
1111

1212
public Movie(String name, int minutes, Gender gender, String director) {
1313
this(null, name, minutes, gender, director);
1414
}
1515

16-
public Movie(Integer id, String name, int minutes, Gender gender, String director) {
16+
public Movie(Integer id, String name, Integer minutes, Gender gender, String director) {
1717
this.id = id;
1818
this.name = name;
1919
this.minutes = minutes;
@@ -29,7 +29,7 @@ public String getName() {
2929
return name;
3030
}
3131

32-
public int getMinutes() {
32+
public Integer getMinutes() {
3333
return minutes;
3434
}
3535

src/main/java/com/luigi/javatest/movies/service/MovieService.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,25 @@ public Collection<Movie> findMoviesByDirector(String director) {
3636
.filter(movie -> movie.getDirector().toLowerCase().contains(director.toLowerCase()))
3737
.collect(Collectors.toList());
3838
}
39+
40+
public Collection<Movie> findMoviesByTemplate(Movie template) {
41+
// Regla: Si hay ID, ignoramos lo demás
42+
if (template.getId() != null) {
43+
return movieRepository.findAll().stream()
44+
.filter(m -> m.getId().equals(template.getId()))
45+
.collect(Collectors.toList());
46+
}
47+
48+
// Regla: Minutos negativos lanzan excepción
49+
if (template.getMinutes() != null && template.getMinutes() < 0) {
50+
throw new IllegalArgumentException("Los minutos no pueden ser negativos");
51+
}
52+
53+
return movieRepository.findAll().stream()
54+
.filter(m -> template.getName() == null || m.getName().toLowerCase().contains(template.getName().toLowerCase().trim()))
55+
.filter(m -> template.getMinutes() == null || m.getMinutes() <= template.getMinutes())
56+
.filter(m -> template.getGender() == null || m.getGender().equals(template.getGender()))
57+
.filter(m -> template.getDirector() == null || m.getDirector().toLowerCase().contains(template.getDirector().toLowerCase().trim()))
58+
.collect(Collectors.toList());
59+
}
3960
}

src/test/java/com/luigi/javatest/movies/service/MovieServiceShould.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ void setUp() {
3030
Arrays.asList(
3131
new Movie(1, "Dark Knight", 152, Gender.ACTION, "Christopher Nolan"),
3232
new Movie(2, "Memento", 113, Gender.THRILLER, "Christopher Nolan"),
33-
new Movie(3, "Super 8", 112, Gender.THRILLER, "J.J. Abrams"),
34-
new Movie(4, "Superman", 103, Gender.ACTION, "Richard Donner"),
33+
new Movie(3, "Super 8", 112, Gender.DRAMA, "J.J. Abrams"),
34+
new Movie(4, "Superman", 173, Gender.ACTION, "Richard Donner"),
3535
new Movie(5, "Home Alone", 103, Gender.COMEDY, "Chris Columbus"),
3636
new Movie(6, "Home Alone", 120, Gender.COMEDY, "director1"),
37-
new Movie(7, "Matrix", 136, Gender.ACTION, "director2")
37+
new Movie(7, "Matrix", 166, Gender.ACTION, "director2")
3838
)
3939
);
4040
}
@@ -54,7 +54,7 @@ public void return_movies_by_length() {
5454
// WHEN
5555
Collection<Movie> movies = movieService.findMoviesByLength(120);
5656
// THEN
57-
assertEquals(Arrays.asList(2, 3, 4, 5, 6), getMoviesIds(movies));
57+
assertEquals(Arrays.asList(2, 3, 5, 6), getMoviesIds(movies));
5858
}
5959

6060
public static List<Integer> getMoviesIds(Collection<Movie> movies) {
@@ -79,4 +79,41 @@ void return_movies_by_director() {
7979
List<Integer> ids = movies.stream().map(Movie::getId).collect(Collectors.toList());
8080
assertEquals(Arrays.asList(1, 2), ids); // Dark Knight y Memento
8181
}
82+
@Test
83+
void find_movies_by_genre_and_max_duration() {
84+
// Buscar peliculas de ACCION de menos de 160 min (Debería salir Superman)
85+
Movie template = new Movie(null, null, 160, Gender.ACTION, null);
86+
Collection<Movie> movies = movieService.findMoviesByTemplate(template);
87+
88+
assertEquals(1, movies.size());
89+
assertTrue(movies.stream().allMatch(m -> m.getName().equals("Dark Knight")));
90+
}
91+
92+
@Test
93+
void find_movies_by_name_and_director() {
94+
// Buscar "Super" del director "Abrams"
95+
Movie template = new Movie(null, "Super", null, null, "Abrams");
96+
Collection<Movie> movies = movieService.findMoviesByTemplate(template);
97+
98+
assertEquals(1, movies.size());
99+
}
100+
101+
@Test
102+
void throw_exception_when_minutes_are_negative() {
103+
Movie template = new Movie(null, null, -10, null, null);
104+
105+
assertThrows(IllegalArgumentException.class, () -> {
106+
movieService.findMoviesByTemplate(template);
107+
});
108+
}
109+
110+
@Test
111+
void ignore_other_filters_if_id_is_present() {
112+
// Aunque pida comedia, si el ID 1 es Acción, debe devolver el 1 (Acción)
113+
Movie template = new Movie(1, "Inexistente", 10, Gender.ACTION, "Nadie");
114+
Collection<Movie> movies = movieService.findMoviesByTemplate(template);
115+
116+
assertEquals(1, movies.size());
117+
assertEquals("Dark Knight", movies.iterator().next().getName());
118+
}
82119
}

0 commit comments

Comments
 (0)