Repository: andrej1307/java-filmorate-11-53
Pull request #6: add-most-populars
Author: login: SergikF
Created: 2025-03-06T19:28:25Z | Merged: 2025-03-10T14:03:48Z

Вывод самых популярных фильмов по жанру и годам. add-most-populars
Новые базы не создавал, добавил нужные методы в существующие классы.


Diff:
diff --git a/.gitignore b/.gitignore
index d7268a3..056cc2d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,4 +43,5 @@ build/
 .vscode/
 
 *.db
-db/*
\ No newline at end of file
+db/*
+/src/test/*
diff --git a/README.md b/README.md
index 3525801..f16b2b9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,2 @@
 # java-filmorate
 Учебный групповой проект. Группа №11 (когорта 53) 
-
-## -trubleshooting- ветка для отладки и поиска ошибок
diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
index 50a7f9e..a047169 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
@@ -17,6 +17,7 @@
 import org.springframework.web.bind.annotation.RestController;
 import ru.yandex.practicum.filmorate.model.Film;
 import ru.yandex.practicum.filmorate.service.FilmService;
+import ru.yandex.practicum.filmorate.service.PopularService;
 import ru.yandex.practicum.filmorate.validator.Marker;
 
 import java.util.Collection;
@@ -32,10 +33,12 @@
 public class FilmController {
 
     private final FilmService service;
+    private final PopularService popularService;
 
     @Autowired
-    public FilmController(FilmService service) {
+    public FilmController(FilmService service, PopularService popularService) {
         this.service = service;
+        this.popularService = popularService;
     }
 
     /**
@@ -62,12 +65,25 @@ public Film findFilm(@PathVariable Integer id) {
         return service.getFilmById(id);
     }
 
+    /**
+     * Получает список самых популярных фильмов за определенный год, жанр и лимит.
+     *
+     * @param year год, за который нужно получить список самых популярных фильмов
+     * @param genreId идентификатор жанра, по которому нужно получить список самых популярных фильмов
+     * @param count лимит количества фильмов, которые нужно получить
+     * @return коллекция самых популярных фильмов
+     */
     @GetMapping("/popular")
-    public Collection<Film> findPopularFilms(@RequestParam(defaultValue = "10") @Min(1) int count) {
-        log.info("Ищем популярные {} фильмов.", count);
-        return service.findPopularFilms(count);
+    @ResponseStatus(HttpStatus.OK)
+    public Collection<Film> getReviews(@RequestParam(required = false) Integer year,
+                                       @RequestParam(required = false) Integer genreId,
+                                       @RequestParam(required = false) Integer count) {
+        log.info("Получаем список самых популярных фильмов за {} года, жанра {} и лимитом{}", year, genreId, count);
+        return popularService.getPopular(year, genreId, count);
     }
 
+
+
     @GetMapping("/common")
     public Collection<Film> findCommonFilms(@RequestParam @Min(1) int userId,
                                             @RequestParam @Min(1) int friendId) {
diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/PopularService.java b/src/main/java/ru/yandex/practicum/filmorate/service/PopularService.java
new file mode 100644
index 0000000..fd8b304
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/service/PopularService.java
@@ -0,0 +1,10 @@
+package ru.yandex.practicum.filmorate.service;
+
+import ru.yandex.practicum.filmorate.model.Film;
+
+import java.util.Collection;
+
+public interface PopularService {
+
+    Collection<Film> getPopular(Integer year, Integer genreId, Integer count);
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
new file mode 100644
index 0000000..257959b
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
@@ -0,0 +1,38 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.Collection;
+import java.util.Optional;
+
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public Collection<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+        // получаем отсортированный список фильмов по рейтингу
+        Collection<Film> listFilms = films.findPopularFilms();
+
+        // фильтруем фильмы по году и/или по жанру, если указаны
+        // и возвращаем список фильмов, ограниченный указанным количеством фильмов
+        listFilms = listFilms.stream()
+                .filter(film -> {
+                    boolean yearMatch = year == null || film.getReleaseDate().getYear() == year;
+                    boolean genreMatch = genreId == null || film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId);
+                    return yearMatch && genreMatch;
+                })
+                .limit(Optional.ofNullable(count).orElse(Integer.MAX_VALUE))
+                .toList();
+
+        return listFilms;
+    }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java
index e64d9ed..18c6c5b 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java
@@ -4,6 +4,8 @@
 import org.springframework.stereotype.Service;
 import ru.yandex.practicum.filmorate.exception.NotFoundException;
 import ru.yandex.practicum.filmorate.model.Review;
+import ru.yandex.practicum.filmorate.model.enums.EventType;
+import ru.yandex.practicum.filmorate.model.enums.Operation;
 import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
 import ru.yandex.practicum.filmorate.storage.review.ReviewStorage;
 import ru.yandex.practicum.filmorate.storage.user.UserStorage;
@@ -17,6 +19,7 @@ public class ReviewServiceImpl implements ReviewService {
     private final FilmStorage films;
     private final UserStorage users;
     private final ReviewStorage reviews;
+    private final FeedService feeds;
 
     /**
      * Добавляет новый отзыв в базу данных.
@@ -35,7 +38,8 @@ public Review addReview(Review review) {
         }
         Review result = reviews.addReview(review);
 
-        // место для ленты событий - review.getId()
+        feeds.createFeed(review.getUserId(), EventType.REVIEW, Operation.ADD,
+                review.getReviewId());
 
         return result;
     }
@@ -54,7 +58,8 @@ public void deleteReview(Integer id) {
         }
         reviews.deleteReview(id);
 
-        // место для ленты событий - id
+        feeds.createFeed(reviews.getReviewById(id).get().getUserId(), EventType.REVIEW,
+                Operation.REMOVE, id);
 
     }
 
@@ -78,7 +83,8 @@ public Review updateReview(Review review) {
         }
         Review result = reviews.updateReview(review);
 
-        // место для ленты событий - review.getId()
+        feeds.createFeed(review.getUserId(), EventType.REVIEW, Operation.UPDATE,
+                review.getReviewId());
 
         return result;
     }
diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorDbStorage.java
index e6cae69..b43f0fa 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorDbStorage.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorDbStorage.java
@@ -85,7 +85,7 @@ public void saveFilmDirectors(Film film) {
     }
 
     @Override
-    public Collection<Director> findDirectorByFilmId(Integer filmId) {
+    public Collection<Director> findDirectorsByFilmId(Integer filmId) {
         String sql = "SELECT d.id, d.name " +
                 "FROM directors d " +
                 "JOIN films_directors fd ON d.id = fd.director_id " +
@@ -117,11 +117,7 @@ public Collection<FilmDirector> findAllFilmDirector() {
             filmDirector.setFilmId(filmId);
 
             if (directorId != 0) {
-                filmDirector.setDirectorId(directorId);
-                filmDirector.setDirectorName(directorName);
-            } else {
-                filmDirector.setDirectorId(null);
-                filmDirector.setDirectorName("Без режиссёра");
+                filmDirector.setDirector(new Director(directorId, directorName));
             }
 
             filmDirectors.add(filmDirector);
diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorStorage.java
index 29a812c..9c9c56f 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorStorage.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/storage/director/DirectorStorage.java
@@ -20,7 +20,7 @@ public interface DirectorStorage {
 
     void saveFilmDirectors(Film film);
 
-    Collection<Director> findDirectorByFilmId(Integer filmId);
+    Collection<Director> findDirectorsByFilmId(Integer filmId);
 
     Collection<FilmDirector> findAllFilmDirector();
 
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 71a0274..aa40b46 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,5 +1,5 @@
 spring.sql.init.mode=always
-spring.datasource.url=jdbc:h2:file:./db/filmorate
+spring.datasource.url=jdbc:h2:mem:filmorate
 spring.datasource.driverClassName=org.h2.Driver
 spring.datasource.username=sa
 spring.datasource.password=password
diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java
deleted file mode 100644
index 02f0bf6..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package ru.yandex.practicum.filmorate;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-@AutoConfigureTestDatabase
-class FilmorateApplicationTests {
-    @Test
-    void contextLoads() throws Exception {
-    }
-}
diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/FilmControllerTest.java
deleted file mode 100644
index 2b24a07..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/controller/FilmControllerTest.java
+++ /dev/null
@@ -1,242 +0,0 @@
-package ru.yandex.practicum.filmorate.controller;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import ru.yandex.practicum.filmorate.model.Film;
-import ru.yandex.practicum.filmorate.model.Genre;
-import ru.yandex.practicum.filmorate.model.Mpa;
-import ru.yandex.practicum.filmorate.validator.LocalDateAdapter;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-/**
- * Тестируем контроллер запросов работы с данными о фильмах
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должна быть подготовлена информация о четырех тестовых фильмах и
- * о четырех тестовых пользователях.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@SpringBootTest
-@AutoConfigureMockMvc
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-class FilmControllerTest {
-    private static final int TEST_FILM_ID = 1;
-
-    @Autowired
-    MockMvc mvc;
-
-    Gson gson = new GsonBuilder()
-            .setPrettyPrinting()
-            .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
-            .create();
-
-    // Определяем тип сериализации списка
-    class FilmListTypeToken extends TypeToken<List<Film>> {
-    }
-
-    /**
-     * Генерация информации о тестовом фильме
-     * Поля должны соответствовать содержимому базы данных для фильма TEST_FILM_ID
-     *
-     * @return - объект, который ожидается для TEST_FILM_ID
-     */
-    static Film getTestFilm() {
-        Film film = new Film();
-        film.setId(TEST_FILM_ID);
-        film.setName("TestFilmName");
-        film.setDescription("TestFilmDescription");
-        film.setReleaseDate(LocalDate.of(2001, 2, 3));
-        film.setDuration(51);
-        film.setMpa(new Mpa(1));
-        film.addGenre(new Genre(1, "Комедия"));
-        return film;
-    }
-
-    /**
-     * Тестируем поиск всех фильмов
-     */
-    @Test
-    void findAllFilms() throws Exception {
-        MvcResult result = mvc.perform(get("/films"))
-                .andExpect(status().isOk())      // ожидается код статус 200
-                .andReturn();
-        List<Film> films = gson.fromJson(result.getResponse().getContentAsString(),
-                new FilmListTypeToken().getType());
-        assertTrue(!films.isEmpty(),
-                "Список фильмов пуст.");
-    }
-
-    /**
-     * Тестируем поиск фильма по идентификатору
-     */
-    @Test
-    void findFilm() throws Exception {
-        // попытка поиска несуществующего фильма
-        mvc.perform(get("/films/10000"))
-                .andExpect(status().isNotFound());      // ожидается код статус 404
-
-        // поиск тестового фильма
-        MvcResult result = mvc.perform(get("/films/" + TEST_FILM_ID))
-                .andExpect(status().isOk())      // ожидается код статус 200
-                .andReturn();
-        Film filmDb = gson.fromJson(result.getResponse().getContentAsString(), Film.class);
-        assertThat(filmDb)
-                .withFailMessage("Считанный объект не соответствует ожидаемому.")
-                .isEqualTo(getTestFilm());
-    }
-
-    /**
-     * Тестируем добавление информации о новом фильме.
-     */
-    @Test
-    void addNewFilm() throws Exception {
-        Film film = getTestFilm();
-        film.setId(null);
-        film.setName("NewTestFilm");
-        String jsonString = gson.toJson(film);
-
-        // При успешном добавлении фильма
-        // должен возвращаться статус 201 "Created"
-        MvcResult result = mvc.perform(post("/films")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isCreated())
-                .andReturn();
-        Film filmDb = gson.fromJson(result.getResponse().getContentAsString(), Film.class);
-        assertNotNull(filmDb.getId(),
-                "при добавлении фильма должен присваиваться ненулевой идентификатор.");
-    }
-
-    /**
-     * Тестируем обновление информации о фильме
-     */
-    @Test
-    void updateFilm() throws Exception {
-        Film film = getTestFilm();
-        film.setId(null);
-        film.setName("TestFilmForUpdate");
-        String jsonString = gson.toJson(film);
-
-        // При успешном добавлении фильма
-        // должен возвращаться статус 201 "Created"
-        MvcResult result = mvc.perform(post("/films")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isCreated())
-                .andReturn();
-        Film filmDb = gson.fromJson(result.getResponse().getContentAsString(), Film.class);
-
-        // Готовим информацию для обновления
-        film.setName("TestFilmNameUpdated");
-        film.setDescription("Description updated");
-        film.addGenre(new Genre(3, "Мультфильм"));
-        jsonString = gson.toJson(film);
-
-        jsonString = gson.toJson(film);
-        // При обновлении фильма с отсутствующим id
-        // должен возвращаться статус 400 "BadRequest"
-        mvc.perform(put("/films")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isBadRequest());
-
-        film.setId(1000);
-        jsonString = gson.toJson(film);
-        // При обновлении фильма с неверным id
-        // должен возвращаться статус 404 "NotFound"
-        mvc.perform(put("/films")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        film.setId(filmDb.getId());
-        jsonString = gson.toJson(film);
-        // При обновлении фильма с корректным id
-        // должен возвращаться статус 200 "Ok"
-        result = mvc.perform(put("/films")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk())
-                .andReturn();
-        filmDb = gson.fromJson(result.getResponse().getContentAsString(), Film.class);
-        assertThat(filmDb)
-                .withFailMessage("Обновленный объект не соответствует ожидаемому.")
-                .isEqualTo(film);
-    }
-
-    /**
-     * Тестируем добавление "лайка"
-     *
-     * @throws Exception
-     */
-    @Test
-    void addLike() throws Exception {
-        // При добавлении "лайка" от несуществующего пользователя
-        // должен возвращаться статус 404 "NotFound"
-        mvc.perform(put("/films/1/like/1000")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        // При добавлении "лайка"
-        // должен возвращаться статус 200 "Ok"
-        mvc.perform(put("/films/1/like/1")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-    }
-
-    /**
-     * Тестируем удаление "лайка"
-     */
-    @Test
-    void removeLike() throws Exception {
-        addLike();
-
-        // При удалении "лайка"
-        // должен возвращаться статус 200 "Ok"
-        mvc.perform(delete("/films/1/like/1")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-    }
-
-    @Test
-    void findPopularFilms() throws Exception {
-        mvc.perform(put("/films/1/like/1").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/2/like/1").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/2/like/2").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/3/like/1").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/3/like/3").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/3/like/2").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/3/like/4").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/4/like/2").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/4/like/3").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-        mvc.perform(put("/films/4/like/3").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
-
-        MvcResult result = mvc.perform(get("/films/popular?count=2"))
-                .andExpect(status().isOk())      // ожидается код статус 200
-                .andReturn();
-        List<Film> filmsPopular = gson.fromJson(result.getResponse().getContentAsString(),
-                new FilmListTypeToken().getType());
-        assertTrue(filmsPopular.size() == 2,
-                "Число популярных фильмов не соответствует ожидаемому");
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/GenreControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/GenreControllerTest.java
deleted file mode 100644
index 84245c1..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/controller/GenreControllerTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package ru.yandex.practicum.filmorate.controller;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import ru.yandex.practicum.filmorate.model.Genre;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-/**
- * Тестирование контроллера запросов работы со справочником жанров фильа
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должндолжен быть полностью заполнен справочник жанров.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@SpringBootTest
-@AutoConfigureMockMvc
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-class GenreControllerTest {
-
-    private static final List<Genre> testGenres = new ArrayList<>();
-
-    @Autowired
-    MockMvc mvc;
-
-    // Определяем тип сериализации списка
-    class GenreListTypeToken extends TypeToken<List<Genre>> {
-    }
-
-    Gson gson = new GsonBuilder()
-            .setPrettyPrinting()
-            .create();
-
-    /**
-     * Инициализация эталонного списка жанров.
-     */
-    @BeforeAll
-    static void setUp() {
-        testGenres.add(new Genre(1, "Комедия"));
-        testGenres.add(new Genre(2, "Драма"));
-        testGenres.add(new Genre(3, "Мультфильм"));
-        testGenres.add(new Genre(4, "Триллер"));
-        testGenres.add(new Genre(5, "Документальный"));
-        testGenres.add(new Genre(6, "Боевик"));
-    }
-
-    /**
-     * Тестируем список всех жанров
-     */
-    @Test
-    void findAllGenres() throws Exception {
-        MvcResult result = mvc.perform(get("/genres"))
-                .andExpect(status().isOk())
-                .andReturn();
-
-       List<Genre> genres = gson.fromJson(result.getResponse().getContentAsString(),
-               new GenreListTypeToken().getType());
-       for (Genre genre : genres) {
-            assertTrue(testGenres.contains(genre),
-                    "Получен неизвестный жанр: " + genre.toString());
-        }
-    }
-
-    /**
-     * Тестируем поиск жанра по идентификатору
-     */
-    @Test
-    void findGenreById() throws Exception {
-        for (Genre genre : testGenres) {
-            MvcResult result = mvc.perform(get("/genres/" + genre.getId()))
-                    .andExpect(status().isOk())
-                    .andReturn();
-            Genre genreDb = gson.fromJson(result.getResponse().getContentAsString(), Genre.class);
-            assertTrue(genre.equals(genreDb),
-                    "Получен неизвестный жанр: " + genreDb.toString());
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/MpaControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/MpaControllerTest.java
deleted file mode 100644
index 602f723..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/controller/MpaControllerTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package ru.yandex.practicum.filmorate.controller;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import ru.yandex.practicum.filmorate.model.Genre;
-import ru.yandex.practicum.filmorate.model.Mpa;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-/**
- * Тестирование контроллера запросов работы со справочником жанров рейтингов MPA
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должндолжен быть полностью заполнен справочник рейтингов.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@SpringBootTest
-@AutoConfigureMockMvc
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-class MpaControllerTest {
-    private static List<Mpa> testMpaList = new ArrayList<>();
-
-    private static final List<Genre> testGenres = new ArrayList<>();
-
-    @Autowired
-    MockMvc mvc;
-
-    // Определяем тип сериализации списка
-    class MpaListTypeToken extends TypeToken<List<Mpa>> {
-    }
-
-    Gson gson = new GsonBuilder()
-            .setPrettyPrinting()
-            .create();
-
-    /**
-     * Инициализация эталонного списка рейтингов.
-     */
-    @BeforeAll
-    static void setUp() {
-        testMpaList.add(new Mpa(1, "G", "у фильма нет возрастных ограничений"));
-        testMpaList.add(new Mpa(2, "PG", "детям рекомендуется смотреть фильм с родителями"));
-        testMpaList.add(new Mpa(3, "PG-13", "детям до 13 лет просмотр не желателен"));
-        testMpaList.add(new Mpa(4, "R", "лицам до 17 лет просматривать фильм можно только в присутствии взрослого"));
-        testMpaList.add(new Mpa(5, "NC-17", "лицам до 18 лет просмотр запрещён"));
-    }
-
-    /**
-     * Тестируем список всех рейтингов
-     */
-    @Test
-    void findAllMpa() throws Exception {
-        MvcResult result = mvc.perform(get("/mpa"))
-                .andExpect(status().isOk())
-                .andReturn();
-
-        List<Mpa> mpas = gson.fromJson(result.getResponse().getContentAsString(),
-                new MpaListTypeToken().getType());
-        for (Mpa mpa : mpas) {
-            assertTrue(testMpaList.contains(mpa),
-                    "Получен неизвестный рейтинг: " + mpa.toString());
-        }
-    }
-
-    /**
-     * Тестируем поиск рейтинга по идентификаторам
-     *
-     * @throws Exception
-     */
-    @Test
-    void findMpaById() throws Exception {
-        for (Mpa mpa : testMpaList) {
-            MvcResult result = mvc.perform(get("/mpa/" + mpa.getId()))
-                    .andExpect(status().isOk())
-                    .andReturn();
-            Mpa mpaDb = gson.fromJson(result.getResponse().getContentAsString(), Mpa.class);
-            assertTrue(mpa.equals(mpaDb),
-                    "Получен неизвестный рейтинг: " + mpaDb.toString());
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/controller/UserControllerTest.java b/src/test/java/ru/yandex/practicum/filmorate/controller/UserControllerTest.java
deleted file mode 100644
index 2ff733b..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/controller/UserControllerTest.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package ru.yandex.practicum.filmorate.controller;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import ru.yandex.practicum.filmorate.model.User;
-import ru.yandex.practicum.filmorate.validator.LocalDateAdapter;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-/**
- * Тестируем контроллер запросов работы с данными о пользователях
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должна быть подготовлена информация о четырех тестовых пользователях.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@SpringBootTest
-@AutoConfigureMockMvc
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-class UserControllerTest {
-    @Autowired
-    MockMvc mvc;
-
-    Gson gson = new GsonBuilder()
-            .setPrettyPrinting()
-            .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
-            .create();
-
-    // Определяем тип сериализации списка
-    class UserListTypeToken extends TypeToken<List<User>> {
-    }
-
-    /**
-     * Тестируем чтение списка пользователей
-     */
-    @Test
-    void findAllUser() throws Exception {
-        MvcResult result = mvc.perform(get("/users"))
-                .andExpect(status().isOk())      // ожидается код статус 200
-                .andReturn();
-        List<User> users = gson.fromJson(result.getResponse().getContentAsString(), new UserListTypeToken().getType());
-        assertTrue(!users.isEmpty(),
-                "Список пользователей пуст.");
-    }
-
-    /**
-     * Тестируем добавление нового пользователя
-     */
-    @Test
-    void addNewUser() throws Exception {
-        User user = new User();
-        user.setLogin("user1234");
-        user.setName("testUserName");
-        user.setBirthday(LocalDate.now().minusYears(22));
-
-        user.setEmail("User1234_domain@");
-        String jsonString = gson.toJson(user);
-        // При добавлении пользователя некорректным Email
-        // должен возвращаться статус 400 "BadRequest"
-        mvc.perform(post("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isBadRequest());
-
-        user.setEmail("User1234@domain");
-        jsonString = gson.toJson(user);
-        // При успешном добавлении пользователя
-        // должен возвращаться статус 201 "Created"
-        MvcResult result = mvc.perform(post("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isCreated())
-                .andReturn();
-        // Сохраняем созданного пользователя
-        User userDb = gson.fromJson(result.getResponse().getContentAsString(), User.class);
-        assertNotNull(userDb.getId(),
-                "При добавлении пользователя должен быть присвоен ненулевой идентификатор");
-
-        // Повторное добавление пользователя
-        // должно возвращать статус 400 "BadRequest"
-        mvc.perform(post("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isBadRequest());
-    }
-
-    /**
-     * Тестирование обновления сведений о пользователе
-     */
-    @Test
-    void updateUser() throws Exception {
-        User user = new User();
-        user.setEmail("UserUpdate@domain");
-        user.setLogin("userUpdate");
-        user.setName("testUpdateUserName");
-        user.setBirthday(LocalDate.now().minusYears(22));
-        String jsonString = gson.toJson(user);
-
-        // При успешном добавлении пользователя
-        // должен возвращаться статус 201 "Created"
-        MvcResult result = mvc.perform(post("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isCreated())
-                .andReturn();
-        // Сохраняем созданного пользователя
-        User userDb = gson.fromJson(result.getResponse().getContentAsString(), User.class);
-
-        // готовим данные для обновления
-        user.setLogin("userUpd12345");
-        user.setName("Updated user.");
-        user.setBirthday(LocalDate.now().minusYears(22));
-
-        jsonString = gson.toJson(user);
-        // Обновление записи без идентификатора пользователя
-        // должно возвращать статус 400 "BadRequest"
-        mvc.perform(put("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isBadRequest());
-
-        user.setId(1000);
-        jsonString = gson.toJson(user);
-        // Обновление записи c несуществющим идентификатором
-        // должно возвращать статус 404 "NotFound"
-        mvc.perform(put("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        user.setId(userDb.getId());
-        jsonString = gson.toJson(user);
-        // Успешное обновление записи
-        // должно возвращать статус 200 "Ok"
-        result = mvc.perform(put("/users")
-                        .content(jsonString)
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk())
-                .andReturn();
-        // Сохраняем пользователя из ответа после обновления
-        userDb = gson.fromJson(result.getResponse().getContentAsString(), User.class);
-
-        assertThat(userDb)
-                .usingRecursiveComparison()
-                .isEqualTo(user);
-    }
-
-    /**
-     * Тестирование добавления "друга"
-     *
-     * @throws Exception
-     */
-    @Test
-    void addFriends() throws Exception {
-        // Объявление в "друзья" несуществующего пользователя
-        // должно возвращать статус 404 "NotFound"
-        mvc.perform(put("/users/1000/friends/1")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        // Объявление в "друзья" несуществующего друга
-        // должно возвращать статус 404 "NotFound()"
-        mvc.perform(put("/users/1/friends/1000")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        // Объявление в "друзья" сущществующих пользователей
-        // должно возвращать статус 200 "ok"
-        mvc.perform(put("/users/1/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-    }
-
-    /**
-     * Тестирование удаления пользователя из друзей
-     *
-     * @throws Exception
-     */
-    @Test
-    void breakUpFriends() throws Exception {
-        // Добавление в "друзья" пользователея
-        // должно возвращать статус 200 "ok"
-        mvc.perform(put("/users/1/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        // Удаление из "друзьей"  не сущществующих пользователей
-        // должно возвращать статус 404 "NotFound"
-        mvc.perform(delete("/users/1/friends/1000")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        // Удаление из "друзьей" сущществующих пользователей
-        // должно возвращать статус 200 "Ok"
-        mvc.perform(delete("/users/1/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-    }
-
-    /**
-     * Тестирование поиска друзей пользователя
-     *
-     * @throws Exception
-     */
-    @Test
-    void findUsersFriends() throws Exception {
-        // Добавление в "друзья" пользователея
-        // должно возвращать статус 200 "ok"
-        mvc.perform(put("/users/4/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        // Добавление в "друзья" пользователея
-        // должно возвращать статус 200 "ok"
-        mvc.perform(put("/users/4/friends/3")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        // читаем список "друзей", несуществующего пользователя
-        // должно возвращать статус 404 "NotFound"
-        mvc.perform(get("/users/2000/friends")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isNotFound());
-
-        // читаем список "друзей"
-        // должно возвращать статус 200 "ok"
-        MvcResult result = mvc.perform(get("/users/4/friends")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk())
-                .andReturn();
-        List<User> users = gson.fromJson(result.getResponse().getContentAsString(), new UserListTypeToken().getType());
-        assertTrue(users.size() == 2,
-                "Количество найденых \"друзей\" не соответствует ожидаемому.");
-    }
-
-    /**
-     * Тестирование поиска общих друзей у пользователей
-     *
-     * @throws Exception
-     */
-    @Test
-    void findCommonFriends() throws Exception {
-        mvc.perform(put("/users/1/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/1/friends/3")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/1/friends/4")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/3/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/3/friends/1")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/4/friends/2")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        mvc.perform(put("/users/4/friends/3")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk());
-
-        // читаем список общих "друзей"
-        // должно возвращать статус 200 "ok"
-        MvcResult result = mvc.perform(get("/users/1/friends/common/4")
-                        .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk())
-                .andReturn();
-        List<User> users = gson.fromJson(result.getResponse().getContentAsString(), new UserListTypeToken().getType());
-        assertTrue(users.size() == 2,
-                "Количество общих \"друзей\" не соответствует ожидаемому.");
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/model/FilmTest.java b/src/test/java/ru/yandex/practicum/filmorate/model/FilmTest.java
deleted file mode 100644
index 621ab84..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/model/FilmTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-
-package ru.yandex.practicum.filmorate.model;
-
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
-import jakarta.validation.ValidatorFactory;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import ru.yandex.practicum.filmorate.validator.Marker;
-
-import java.time.LocalDate;
-import java.util.Set;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Тестирование ограничений на значения полей класса Film
- */
-class FilmTest {
-    private Validator validator;
-
-    /**
-     * Перед каждым тестом готовим Validator
-     */
-    @BeforeEach
-    void setUp() {
-        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
-        validator = factory.getValidator();
-    }
-
-    /**
-     * Проверка непустого названия фильма.
-     */
-    @Test
-    void testName() {
-        Film film = new Film();
-        film.setName("");
-        film.setDescription("Testing film");
-        film.setReleaseDate(LocalDate.now().minusYears(10));
-        film.setDuration(60);
-        film.setMpa(new Mpa(1));
-
-        Set<ConstraintViolation<Film>> violations = validator.validate(film, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Проверка допусимого размера описания.
-     */
-    @Test
-    void testDescription() {
-        Film film = new Film();
-        film.setName("Film");
-        film.setDescription("12345678901234567890123456789012345678901234567890"
-                + "12345678901234567890123456789012345678901234567890"
-                + "12345678901234567890123456789012345678901234567890"
-                + "12345678901234567890123456789012345678901234567890"
-                + "12345678901234567890123456789012345678901234567890");
-        film.setReleaseDate(LocalDate.now().minusYears(10));
-        film.setDuration(60);
-        film.setMpa(new Mpa(1));
-
-        Set<ConstraintViolation<Film>> violations = validator.validate(film, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Проверка допустимой даты выпуска фильма
-     */
-    @Test
-    void testReleaseDate() {
-        Film film = new Film();
-        film.setName("Film");
-        film.setDescription("Testing film ReleaseDate");
-        film.setReleaseDate(LocalDate.now().plusDays(1));
-        film.setDuration(60);
-        film.setMpa(new Mpa(1));
-
-        // Проверяем на контроль даты в будущем
-        Set<ConstraintViolation<Film>> violations = validator.validate(film, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-
-        // Проверяем на контроль минимальной даты выхода фильма
-        film.setReleaseDate(LocalDate.of(1895, 12, 27));
-
-        violations.clear();
-        violations = validator.validate(film, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Проверка допустимой длительности фильма
-     */
-    @Test
-    void testDuration() {
-        Film film = new Film();
-        film.setName("Film");
-        film.setDescription("Testing film ReleaseDate");
-        film.setReleaseDate(LocalDate.now().minusYears(10));
-        film.setDuration(0);
-        film.setMpa(new Mpa(1));
-
-        Set<ConstraintViolation<Film>> violations = validator.validate(film, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Тестируем отсутствие ограничений при корректном создании фильма
-     */
-    @Test
-    void testFilmOk() {
-        Film film = new Film();
-        film.setName("Film");
-        film.setDescription("Testing film ReleaseDate");
-        film.setReleaseDate(LocalDate.now().minusYears(10));
-        film.setDuration(60);
-        film.setMpa(new Mpa(1));
-
-        Set<ConstraintViolation<Film>> violations = validator.validate(film, Marker.OnBasic.class);
-        assertTrue(violations.isEmpty(), violations.toString());
-    }
-
-}
diff --git a/src/test/java/ru/yandex/practicum/filmorate/model/UserTest.java b/src/test/java/ru/yandex/practicum/filmorate/model/UserTest.java
deleted file mode 100644
index 43a2218..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/model/UserTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-
-package ru.yandex.practicum.filmorate.model;
-
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
-import jakarta.validation.ValidatorFactory;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import ru.yandex.practicum.filmorate.validator.Marker;
-
-import java.time.LocalDate;
-import java.util.Set;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Тестирование ограничений на значения полей класса User.
- */
-class UserTest {
-    private Validator validator;
-
-    /**
-     * Перед каждым тестом готовим Validator
-     */
-    @BeforeEach
-    void setUp() {
-        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
-        validator = factory.getValidator();
-    }
-
-    /**
-     * Тестирование email пользователя
-     */
-    @Test
-    void testInvalidEmail() throws Exception {
-        User user = new User("",
-                "userTest",
-                "Testing user",
-                LocalDate.now().minusYears(22));
-
-        Set<ConstraintViolation<User>> violations = validator.validate(user, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Тестирование login пользователя
-     */
-    @Test
-    void testInvalidLogin() throws Exception {
-        User user = new User("user1234@test",
-                "",  // login не должен быть пустым
-                "Testing user",
-                LocalDate.now().minusYears(32));
-
-        Set<ConstraintViolation<User>> violations = validator.validate(user, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-
-        // login должен содержать только буквы и цифры
-        user.setLogin("yu%3242 @#");
-        violations.clear();
-        violations = validator.validate(user, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Тестируем корректность даты рождения
-     */
-    @Test
-    void testInvalidBirthday() throws Exception {
-        User user = new User("user1234@test",
-                "user1234",
-                "Testing user",
-                LocalDate.now().plusDays(1)); // Дата рождения в будущем
-
-        Set<ConstraintViolation<User>> violations = validator.validate(user, Marker.OnBasic.class);
-        assertFalse(violations.isEmpty());
-    }
-
-    /**
-     * Тестируем отсутствие ошибок при корректном заполнение полей.
-     */
-    @Test
-    void testUserOk() {
-        User user = new User("user1234@test",
-                "user1234",
-                "Testing user",
-                LocalDate.now().minusYears(18));
-
-        Set<ConstraintViolation<User>> violations = validator.validate(user, Marker.OnBasic.class);
-        assertTrue(violations.isEmpty(), violations.toString());
-    }
-}
diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorageTest.java
deleted file mode 100644
index 8bff63e..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorageTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package ru.yandex.practicum.filmorate.storage.film;
-
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
-import org.springframework.context.annotation.Import;
-import ru.yandex.practicum.filmorate.model.Film;
-import ru.yandex.practicum.filmorate.model.Genre;
-import ru.yandex.practicum.filmorate.model.Mpa;
-import ru.yandex.practicum.filmorate.storage.director.DirectorDbStorage;
-import ru.yandex.practicum.filmorate.storage.genre.GenreDbStorage;
-
-import java.time.LocalDate;
-import java.util.*;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Тестирование Хранилища Фильмов в базе данных
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должна быть подготовлена информация о четырех тестовых фильмах.
- * Для фильма с id=TEST_FILM_ID нужно создать запись в таблице жанров.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@JdbcTest
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Import({FilmDbStorage.class, GenreDbStorage.class, DirectorDbStorage.class})
-class FilmDbStorageTest {
-    public static final int TEST_FILM_ID = 1;
-
-    @Autowired
-    private final FilmStorage filmDbStorage;
-
-    /**
-     * Генерация информации о тестовом фильме
-     * Поля должны соответствовать содержимому базы данных для фильма TEST_FILM_ID
-     *
-     * @return - объект, который ожидается для TEST_FILM_ID
-     */
-    static Film getTestFilm() {
-        Film film = new Film();
-        film.setId(TEST_FILM_ID);
-        film.setName("TestFilmName");
-        film.setDescription("TestFilmDescription");
-        film.setReleaseDate(LocalDate.of(2001, 2, 3));
-        film.setDuration(51);
-        film.setMpa(new Mpa(1));
-        film.addGenre(new Genre(1, "Комедия"));
-        return film;
-    }
-
-    /**
-     * Тестирование добавления информации о новом фильме
-     */
-    @Test
-    void addNewFilm() {
-        Film film = new Film();
-        film.setName("Фильм! Фильм! Фильм!");
-        film.setDescription("Юмористический рссказ о том, как делают кино.");
-        film.setReleaseDate(LocalDate.of(1968, 9, 1));
-        film.setDuration(20);
-        film.setMpa(new Mpa(1));
-        film.addGenre(new Genre(1, "Комедия"));
-        film.addGenre(new Genre(3, "Мультфильм"));
-
-        Film filmDb = filmDbStorage.addNewFilm(film);
-        assertNotNull(filmDb.getId(),
-                "При добавлении нового фильа должен быть присвоен ненулевой идентификатор.");
-
-        // Сравниваем исходный фильм с сохраненным по всем полям
-        Optional<Film> filmOptional = filmDbStorage.getFilmById(filmDb.getId());
-        assertThat(filmOptional)
-                .isPresent()
-                .get()
-                .usingRecursiveComparison()
-                .isEqualTo(filmDb);
-    }
-
-    /**
-     * Тестирование чтения информации о фильме по заданному идентификатору
-     */
-    @Test
-    void getFilmById() {
-        Film film = getTestFilm();
-        Optional<Film> filmOptional;
-
-        // Попытка чтения несушествующего фильма
-        filmOptional = filmDbStorage.getFilmById(10000);
-        assertThat(filmOptional)
-                .withFailMessage("При чтении несуществующего фильма должен возвращаться пустой объект")
-                .isEmpty();
-
-        filmOptional = filmDbStorage.getFilmById(film.getId());
-        assertThat(filmOptional)
-                .isPresent()
-                .get()
-                .isEqualTo(film);
-    }
-
-    /**
-     * Тестирование списка фильмов
-     */
-    @Test
-    void findAllFilms() {
-        Collection<Film> films = filmDbStorage.findAllFilms();
-        assertTrue(films.size() > 0,
-                "findAllFilms() - В базе данных отсутствует информация о фильмах.");
-    }
-
-    /**
-     * Тестирование расчета популярности фильмов
-     * <p>
-     * массив "лайков" создается заранее.
-     * Файл первоначальных данных ./src/test/resources/data.sql
-     */
-    @Test
-    void findPopularFilms() {
-        Collection<Film> films = filmDbStorage.findPopularFilms();
-        List<Film> popular = new LinkedList<>(films);
-        assertEquals(popular.get(0), filmDbStorage.getFilmById(4).get(),
-                "Самый популярный фильм расчитан неверно.");
-
-        assertEquals(popular.get(1), filmDbStorage.getFilmById(2).get(),
-                "Второй по популярности фильм расчитан неверно.");
-    }
-
-    /**
-     * Тестирование обновления информации о фильме
-     */
-    @Test
-    void updateFilm() {
-        Film film = getTestFilm();
-        film.setName("filmNameUpdated");
-        film.setReleaseDate(LocalDate.of(1999, 12, 31));
-        film.addGenre(new Genre(6, "Боевик"));
-
-        filmDbStorage.updateFilm(film);
-
-        Optional<Film> filmOptional = filmDbStorage.getFilmById(film.getId());
-        assertThat(filmOptional)
-                .isPresent()
-                .get()
-                .isEqualTo(film);
-    }
-
-    /**
-     * Тестирование добавления "лайка" к фильму
-     */
-    @Test
-    void addNewLike() {
-        Film film = getTestFilm();
-        film.setId(null);
-        film.setName("TestLikeFilmName");
-        film.setDescription("TestLikeFilmDescription");
-
-        Film filmDb = filmDbStorage.addNewFilm(film);
-
-        Integer rank = filmDbStorage.addNewLike(filmDb.getId(), 1);
-        assertEquals(1, rank, "При добавлении \"лйка\" произошла ошибка.");
-
-        rank = filmDbStorage.addNewLike(filmDb.getId(), 3);
-        assertEquals(2, rank, "При подсчете \"лйков\" произошла ошибка.");
-
-        rank = filmDbStorage.addNewLike(filmDb.getId(), 3);
-        assertEquals(2, rank, "При добавлении повторного \"лйка\" произошла ошибка счетчика.");
-    }
-
-    /**
-     * Тестирование удаления "лайка у фильма"
-     */
-    @Test
-    void removeLike() {
-        final int userId = 1;
-
-        Integer expectedRank = filmDbStorage.addNewLike(TEST_FILM_ID, userId) - 1;
-        Integer rank = filmDbStorage.removeLike(TEST_FILM_ID, userId);
-
-        assertEquals(expectedRank, rank,
-                "При удалении \"лайка\" произошла ошибка.");
-    }
-
-    /**
-     * Тестирование Удаления информации о всех фильмах
-     */
-    @Test
-    void removeAllFilms() {
-        Film film = getTestFilm();
-        film.setId(null);
-        film.setName("TestFilmNameForRmove");
-        filmDbStorage.addNewFilm(film);
-
-        filmDbStorage.removeAllFilms();
-        Collection<Film> films = filmDbStorage.findAllFilms();
-        assertTrue(films.size() == 0,
-                "При удалении фильмов произошла ошибка.");
-    }
-
-    /**
-     * Тестирование поиска общих файлов
-     * <p>
-     * массив "лайков" создается заранее.
-     * Файл первоначальных данных ./src/test/resources/data.sql
-     */
-    @Test
-    void findCommonFilms() {
-
-        ArrayList<Film> films = new ArrayList<>(filmDbStorage.findCommonFilms(2, 3));
-        assertTrue(films.size() > 0,
-                "Общие фильмы не найдены.");
-        assertEquals(4, films.get(0).getId(),
-                "Сортировка общих фильмов по популярности не верна.");
-
-    }
-
-    /**
-     * Тестирование получения фильмов по списку идентификаторов
-     */
-    @Test
-    void findFilmsByIds() {
-        List<Integer> filmsIds = new ArrayList<>();
-        filmsIds = Stream.of(3, 2, 4)
-                .collect(Collectors.toList());
-        ArrayList<Film> films = new ArrayList<>(filmDbStorage.findFilmsByIds(filmsIds));
-
-        assertTrue(!films.isEmpty(),
-                "findFilmsByIds() - фильмы не найдены.");
-        assertEquals(films.size(), filmsIds.size(),
-                "findFilmsByIds() - Количество фильмов не соответствует запрошенному.");
-
-        for (Film film : films) {
-            assertTrue(filmsIds.contains(film.getId()),
-                    "findFilmsByIds() - Полученый фильм отсутствует в исхдном списке\n"
-                            + film.toString());
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/genre/GenreDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/genre/GenreDbStorageTest.java
deleted file mode 100644
index 27c146b..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/storage/genre/GenreDbStorageTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package ru.yandex.practicum.filmorate.storage.genre;
-
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
-import org.springframework.context.annotation.Import;
-import ru.yandex.practicum.filmorate.model.Genre;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Тестирование справочника жанров фильа
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должндолжен быть полностью заполнен справочник жанров.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@JdbcTest
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Import({GenreDbStorage.class})
-class GenreDbStorageTest {
-
-    private final GenreDbStorage genreDbStorage;
-    private static final List<Genre> testGenres = new ArrayList<>();
-
-    /**
-     * Инициализация эталонного списка жанров.
-     */
-    @BeforeAll
-    static void setUp() {
-        testGenres.add(new Genre(1, "Комедия"));
-        testGenres.add(new Genre(2, "Драма"));
-        testGenres.add(new Genre(3, "Мультфильм"));
-        testGenres.add(new Genre(4, "Триллер"));
-        testGenres.add(new Genre(5, "Документальный"));
-        testGenres.add(new Genre(6, "Боевик"));
-    }
-
-    /**
-     * Тестирование списка жанров
-     */
-    @Test
-    void findAllGenres() {
-        Collection<Genre> genres = genreDbStorage.findAllGenres();
-        for (Genre genre : testGenres) {
-            assertTrue(genres.contains(genre),
-                    "В базе данных отсутствует " + genre.toString());
-        }
-    }
-
-    /**
-     * Тестирование поиска жанров по идентификатору
-     */
-    @Test
-    void findGenre() {
-        for (Genre genre : testGenres) {
-            Optional<Genre> genreOptional = genreDbStorage.findGenre(genre.getId());
-
-            assertThat(genreOptional)
-                    .isPresent()
-                    .get()
-                    .usingRecursiveComparison()
-                    .isEqualTo(genre);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/mpa/MpaDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/mpa/MpaDbStorageTest.java
deleted file mode 100644
index 8fb0bc7..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/storage/mpa/MpaDbStorageTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package ru.yandex.practicum.filmorate.storage.mpa;
-
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
-import org.springframework.context.annotation.Import;
-import ru.yandex.practicum.filmorate.model.Mpa;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Тестирование справочника рейтингов фильа
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должндолжен быть полностью заполнен справочник рейтингов MPA.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@JdbcTest
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Import({MpaDbStorage.class})
-class MpaDbStorageTest {
-
-    private final MpaDbStorage mpaDbStorage;
-    private static List<Mpa> testMpaList = new ArrayList<>();
-
-    /**
-     * Инициализация эталонного списка рейтингов.
-     */
-    @BeforeAll
-    static void setUp() {
-        testMpaList.add(new Mpa(1, "G", "у фильма нет возрастных ограничений"));
-        testMpaList.add(new Mpa(2, "PG", "детям рекомендуется смотреть фильм с родителями"));
-        testMpaList.add(new Mpa(3, "PG-13", "детям до 13 лет просмотр не желателен"));
-        testMpaList.add(new Mpa(4, "R", "лицам до 17 лет просматривать фильм можно только в присутствии взрослого"));
-        testMpaList.add(new Mpa(5, "NC-17", "лицам до 18 лет просмотр запрещён"));
-    }
-
-    /**
-     * Тестирование списка рейтингов
-     */
-    @Test
-    void findAllMpa() {
-        Collection<Mpa> genres = mpaDbStorage.findAllMpa();
-        for (Mpa mpa : testMpaList) {
-            assertTrue(genres.contains(mpa),
-                    "В базе данных отсутствует " + mpa.toString());
-        }
-    }
-
-    /**
-     * Тестирование поиска рейтинга по идентификатору
-     */
-    @Test
-    void findMpaById() {
-        for (Mpa mpa : testMpaList) {
-            Optional<Mpa> mpaOptional = mpaDbStorage.findMpa(mpa.getId());
-            assertThat(mpaOptional)
-                    .isPresent()
-                    .get()
-                    .usingRecursiveComparison()
-                    .isEqualTo(mpa);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorageTest.java
deleted file mode 100644
index 40632ae..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorageTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package ru.yandex.practicum.filmorate.storage.user;
-
-import lombok.RequiredArgsConstructor;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
-import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
-import org.springframework.context.annotation.Import;
-import org.springframework.dao.DuplicateKeyException;
-import ru.yandex.practicum.filmorate.model.User;
-
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.Optional;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Тестирование Хранилища пользователей в базе данных
- * <p>
- * Для успешного выполнения тестов, при инициализации базы данных
- * должна быть подготовлена информация о четырех тестовых пользователях.
- * Файл первоначальных данных ./src/test/resources/data.sql
- */
-@JdbcTest
-@AutoConfigureTestDatabase
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Import({UserDbStorage.class})
-class UserDbStorageTest {
-    public static final int TEST_USER_ID = 1;
-
-    private final UserDbStorage userDbStorage;
-
-    /**
-     * Генерация тестового пользователя
-     *
-     * @return - Optional<User> информация о пользователе если найден
-     */
-    static User getTestUser() {
-        User user = new User();
-        user.setId(TEST_USER_ID);
-        user.setEmail("test@test.com");
-        user.setLogin("testLogin");
-        user.setName("testName");
-        user.setBirthday(LocalDate.of(2001, 9, 22));
-        return user;
-    }
-
-    /**
-     * Чтение информации о тестовом пользователе по заданному идентификатору.
-     */
-    @Test
-    void getUserById() {
-        User user = getTestUser();
-        Optional<User> userOptional = userDbStorage.getUserById(1);
-
-        assertThat(userOptional)
-                .isPresent()
-                .get()
-                .usingRecursiveComparison()
-                .isEqualTo(user);
-    }
-
-    /**
-     * Тест добавления в базу данных нового пользователя
-     */
-    @Test
-    void addNewUser() {
-        User user = new User();
-        user.setName("TesstUserName");
-        user.setLogin("TestUserLogin");
-        user.setBirthday(LocalDate.of(2001, 7, 22));
-
-        // Проверяем попытку добавить пользвателя с неуникальным Email
-        user.setEmail(getTestUser().getEmail());
-        assertThrows(DuplicateKeyException.class,
-                () -> {
-                    userDbStorage.addNewUser(user);
-                },
-                "Попытка записи неуникального значения Email должна приводить к исключению.");
-
-        // меняем Email на уникальный
-        user.setEmail("test@user.test");
-        User userDb = userDbStorage.addNewUser(user);
-        assertNotNull(userDb.getId(),
-                "addNewUser() - При добавлении пользователя в базу должен быть присвоен не нулевой идентификатор");
-
-        Optional<User> userOptional = userDbStorage.getUserById(userDb.getId());
-        assertThat(userOptional)
-                .isPresent()
-                .get()
-                .usingRecursiveComparison()
-                .isEqualTo(user);
-    }
-
-    /**
-     * Тестирование поиска информации о всех пользователях в базе.
-     */
-    @Test
-    void findAllUsers() {
-        Collection<User> users = userDbStorage.findAllUsers();
-
-        assertTrue(users.size() > 0,
-                "findAllUsers() - В базе данных отсутствует информация о пользователях.");
-    }
-
-    /**
-     * Тестирование обновления информации о тестовом пользователе.
-     */
-    @Test
-    void updateUser() {
-        User userUpdate = getTestUser();
-        userUpdate.setEmail("updated_user@test.com");
-
-        userDbStorage.updateUser(userUpdate);
-
-        Optional<User> userOptional = userDbStorage.getUserById(userUpdate.getId());
-
-        assertThat(userOptional)
-                .isPresent()
-                .get()
-                .usingRecursiveComparison()
-                .isEqualTo(userUpdate);
-    }
-
-    /**
-     * Тестирование добавления "друга"
-     */
-    @Test
-    void addFriend() {
-        final int userId = TEST_USER_ID;
-        final int friendId = 2;
-
-        Optional<User> userOptional = userDbStorage.getUserById(userId);
-        assertThat(userOptional)
-                .withFailMessage("addFriend() - Не определен пользователь id=%s для создания \"друзей\".", userId)
-                .isPresent();
-        if (userOptional.isEmpty()) return;
-
-        userOptional = userDbStorage.getUserById(friendId);
-        assertThat(userOptional)
-                .withFailMessage("addFriend() - Не определен пользователь id=%s в качестве нового \"друга\".", friendId)
-                .isPresent();
-        if (userOptional.isEmpty()) return;
-        User friend = userOptional.get();
-
-        userDbStorage.addFriend(userId, friendId);
-        Collection<User> friends = userDbStorage.getUserFriends(userId);
-
-        assertTrue(friends.contains(friend),
-                "addFriend() - Пользователь id=" + userId + ". не удалось добавить друга id=" + friendId);
-    }
-
-    /**
-     * Тестирование списка друзей заданного пользователя
-     */
-    @Test
-    void getUserFriends() {
-        userDbStorage.addFriend(TEST_USER_ID, 2);
-        userDbStorage.addFriend(TEST_USER_ID, 3);
-        userDbStorage.addFriend(TEST_USER_ID, 4);
-
-        Collection<User> friends = userDbStorage.getUserFriends(TEST_USER_ID);
-        assertTrue(friends.size() > 0,
-                "getUserFriends() - Список друзй пользователя id="
-                        + TEST_USER_ID + " не найден.");
-        assertTrue(friends.size() == 3,
-                "getUserFriends() - Количество друзй пользователя id="
-                        + TEST_USER_ID + " не соответствует ожидаемому.");
-
-        User testFriend = userDbStorage.getUserById(2).get();
-        assertTrue(friends.contains(testFriend),
-                "getUserFriends() - В списке друзей не найден " + testFriend.toString());
-
-        testFriend = userDbStorage.getUserById(3).get();
-        assertTrue(friends.contains(testFriend),
-                "getUserFriends() - В списке друзей не найден " + testFriend.toString());
-
-        testFriend = userDbStorage.getUserById(4).get();
-        assertTrue(friends.contains(testFriend),
-                "getUserFriends() - В списке друзей не найден " + testFriend.toString());
-    }
-
-    /**
-     * Тестирование удаления пользователя из друзей
-     */
-    @Test
-    void removeFriend() {
-        final int deletedFriendId = 3;
-        getUserFriends();
-
-        userDbStorage.breakUpFriends(TEST_USER_ID, deletedFriendId);
-        Collection<User> friends = userDbStorage.getUserFriends(TEST_USER_ID);
-
-        Optional<User> friend = friends.stream()
-                .filter(user -> user.getId() == deletedFriendId)
-                .findFirst();
-
-        assertThat(friend)
-                .withFailMessage("removeFriend() - пользователь id=%s не был удален из \"друзей\"%s.",
-                        deletedFriendId, TEST_USER_ID)
-                .isEmpty();
-    }
-
-    /**
-     * Тестирование поиска общих друзей
-     */
-    @Test
-    void findCommonFriends() {
-        getUserFriends();
-        userDbStorage.addFriend(3, 1);
-        userDbStorage.addFriend(3, 4);
-
-        Collection<User> friends = userDbStorage.getCommonFriends(TEST_USER_ID, 3);
-        Optional<User> commonFriend = friends.stream().findFirst();
-
-        assertThat(commonFriend)
-                .isPresent()
-                .hasValueSatisfying(user ->
-                        assertThat(user)
-                                .hasFieldOrPropertyWithValue("id", 4));
-    }
-
-    /**
-     * Тестирование удаления пользователей
-     */
-    @Test
-    void removeAllUsers() {
-        addNewUser();
-
-        userDbStorage.removeAllUsers();
-        Collection<User> users = userDbStorage.findAllUsers();
-
-        assertTrue(users.size() == 0,
-                "removeAllUsers() - Не удалось удалить всех пользователей.");
-    }
-}
\ No newline at end of file
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
deleted file mode 100644
index 71a0274..0000000
--- a/src/test/resources/application.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-spring.sql.init.mode=always
-spring.datasource.url=jdbc:h2:file:./db/filmorate
-spring.datasource.driverClassName=org.h2.Driver
-spring.datasource.username=sa
-spring.datasource.password=password
-
-server.port=8080
-logging.level.org.zalando.logbook: TRACE 
diff --git a/src/test/resources/data.sql b/src/test/resources/data.sql
deleted file mode 100644
index 7122b10..0000000
--- a/src/test/resources/data.sql
+++ /dev/null
@@ -1,48 +0,0 @@
--- Заполняем справочник жанров
-MERGE INTO genres (id, name)
-    VALUES ( 1, 'Комедия'),
-           (2, 'Драма'),
-           (3, 'Мультфильм'),
-           (4, 'Триллер'),
-           (5, 'Документальный'),
-           (6, 'Боевик');
-
--- Заполняем справочник рейтингов MPA
-MERGE INTO MPA (id, name, description)
-    VALUES (1, 'G', 'у фильма нет возрастных ограничений'),
-           (2, 'PG', 'детям рекомендуется смотреть фильм с родителями'),
-           (3, 'PG-13', 'детям до 13 лет просмотр не желателен'),
-           (4, 'R', 'лицам до 17 лет просматривать фильм можно только в присутствии взрослого'),
-           (5, 'NC-17', 'лицам до 18 лет просмотр запрещён');
-
--- Создаем тестовоых пользователей
-INSERT INTO users (email, login, name, birthday)
-VALUES ( 'test@test.com', 'testLogin', 'testName', '2001-9-22' ),
-       ('user1@test.com', 'userTest1', 'userNane1', '2001-01-01'),
-       ('user2@test.com', 'userTest2', 'userNane2', '2002-02-02'),
-       ('user3@test.com', 'userTest3', 'userNane3', '2003-03-03');
-
--- Создаем тестовые фильмы
-INSERT INTO films (name, description, releasedate, len_min, mpa_id)
-VALUES ( 'TestFilmName',  'TestFilmDescription', '2001-02-03', 51, 1),
-       ( 'TestFilmName2',  'TestFilmDescription2', '2002-03-04', 62, 2),
-       ( 'TestFilmName3',  'TestFilmDescription3', '2003-04-05', 73, 3),
-       ( 'TestFilmName4',  'TestFilmDescription4', '2004-05-06', 92, 4);
-
--- задаем жанр  для тестового фильма
-INSERT INTO films_genres (film_id, genre_id)
-VALUES ( 1, 1 );
-
--- создаем набор "лайков для расчета популярности фильмов
-INSERT INTO likes (user_id, film_id)
-VALUES (1, 2),
-       (1, 3),
-       (1, 4),
-       (2, 2),
-       (2, 3),
-       (2, 4),
-       (3, 1),
-       (3, 2),
-       (3, 4),
-       (4, 1),
-       (4, 4);
diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql
deleted file mode 100644
index 714f97c..0000000
--- a/src/test/resources/schema.sql
+++ /dev/null
@@ -1,53 +0,0 @@
--- Создаем таблицу пользователей
-CREATE TABLE IF NOT EXISTS users (
-    id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-    email VARCHAR(255) UNIQUE NOT NULL,
-    login VARCHAR(40) NOT NULL,
-    name VARCHAR(40) NOT NULL,
-    birthday DATE NOT NULL
-    );
-
--- Создаем таблицу друзей
-CREATE TABLE IF NOT EXISTS friends (
-    user_id INTEGER NOT NULL REFERENCES users(id),
-    friend_id INTEGER NOT NULL REFERENCES users(id),
-    confirmed BOOLEAN NOT NULL DEFAULT FALSE,
-    PRIMARY KEY (user_id, friend_id)
-    );
-
--- Создаем справочник жанров фильма
-CREATE TABLE IF NOT EXISTS genres (
-    id INTEGER PRIMARY KEY,
-    name VARCHAR(40) NOT NULL
-    );
-
--- Создаем справочник рейтинга MPA
-CREATE TABLE IF NOT EXISTS MPA (
-    id INTEGER PRIMARY KEY,
-    name VARCHAR(8) NOT NULL,
-    description VARCHAR(80)
-    );
-
--- Создаем таблицу описания фильма
-CREATE TABLE IF NOT EXISTS films (
-    id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-    name VARCHAR(40) NOT NULL,
-    description VARCHAR(200),
-    releaseDate DATE,
-    len_min INTEGER,
-    MPA_id INTEGER NOT NULL REFERENCES MPA(id)
-    );
-
--- Создаем таблицу описания жанра фильма
-CREATE TABLE IF NOT EXISTS films_genres (
-    film_id INTEGER NOT NULL REFERENCES films(id),
-    genre_id INTEGER NOT NULL REFERENCES genres(id),
-    PRIMARY KEY (film_id, genre_id)
-    );
-
--- Создаем таблицу "лайков" к фильмам
-CREATE TABLE IF NOT EXISTS likes (
-    user_id INTEGER NOT NULL REFERENCES users(id),
-    film_id INTEGER NOT NULL REFERENCES films(id),
-    PRIMARY KEY (user_id, film_id)
-    );


Reviews:
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-09T16:57:32Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T02:31:43Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T06:24:24Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T06:30:22Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T07:00:10Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T07:01:55Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T07:06:49Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T07:07:57Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T07:16:35Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T07:18:40Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T07:22:04Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T07:43:04Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T07:52:10Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T08:12:04Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T08:13:29Z
user: login: andrej1307
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-10T08:18:58Z
user: login: andrej1307
body: Думаю можно объединять с develop.
state: APPROVED
author_association: OWNER
submitted_at: 2025-03-10T08:24:05Z
user: login: SergikF
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-10T08:25:14Z
user: login: andrej1307
state: APPROVED
author_association: OWNER
submitted_at: 2025-03-10T14:01:58Z
user: login: Gagarskiy-Andrey
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-10T14:02:33Z

Review comments:
diff_hunk: @@ -62,12 +65,25 @@ public Film findFilm(@PathVariable Integer id) {
         return service.getFilmById(id);
     }
 
+    /**
+     * Получает список самых популярных фильмов за определенный год, жанр и лимит.
+     *
+     * @param year год, за который нужно получить список самых популярных фильмов
+     * @param genreId идентификатор жанра, по которому нужно получить список самых популярных фильмов
+     * @param count лимит количества фильмов, которые нужно получить
+     * @return коллекция самых популярных фильмов
+     */
     @GetMapping("/popular")
-    public Collection<Film> findPopularFilms(@RequestParam(defaultValue = "10") @Min(1) int count) {
-        log.info("Ищем популярные {} фильмов.", count);
-        return service.findPopularFilms(count);
+    @ResponseStatus(HttpStatus.OK)
+    public Collection<Film> getReviews(@RequestParam(required = false) Integer year,
+                                       @RequestParam(required = false) Integer genreId,
+                                       @RequestParam(required = false) Integer count) {
+        log.info("Получаем список самых популярных фильмов за {} года, жанра {} и лимитом{}", year, genreId, count);
path: src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
user: login: andrej1307
body: Предлагаю для coun все же определить значение по умолчанию.
(@RequestParam(defaultValue = "10") int count) 
created_at: 2025-03-09T16:57:32Z
author_association: OWNER
diff_hunk: @@ -62,12 +65,25 @@ public Film findFilm(@PathVariable Integer id) {
         return service.getFilmById(id);
     }
 
+    /**
+     * Получает список самых популярных фильмов за определенный год, жанр и лимит.
+     *
+     * @param year год, за который нужно получить список самых популярных фильмов
+     * @param genreId идентификатор жанра, по которому нужно получить список самых популярных фильмов
+     * @param count лимит количества фильмов, которые нужно получить
+     * @return коллекция самых популярных фильмов
+     */
     @GetMapping("/popular")
-    public Collection<Film> findPopularFilms(@RequestParam(defaultValue = "10") @Min(1) int count) {
-        log.info("Ищем популярные {} фильмов.", count);
-        return service.findPopularFilms(count);
+    @ResponseStatus(HttpStatus.OK)
+    public Collection<Film> getReviews(@RequestParam(required = false) Integer year,
+                                       @RequestParam(required = false) Integer genreId,
+                                       @RequestParam(required = false) Integer count) {
+        log.info("Получаем список самых популярных фильмов за {} года, жанра {} и лимитом{}", year, genreId, count);
path: src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
user: login: SergikF
body: не согласен, в этой задаче нет такого условия , что по умолчанию должно быть 10 ... 
created_at: 2025-03-10T02:31:43Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: А почему не findPopularFilms?
неизвестно сколько запрашивать? или потому что потоки работают асинхронно?
created_at: 2025-03-10T06:24:23Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
+// фильтруем фильмы по году, если указан
+        if (year != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getReleaseDate().getYear() == year)
+                    .toList();
+        }
+
+// фильтруем фильмы по жанру, если указан
+        if (genreId != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId))
+                    .toList();
+        }
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: А нельзя ли втиснуть два условия в один поток? Например так:

listFilms.stream()
                    .filter(film -> film.getReleaseDate().getYear() == year)
                     .filter(film -> (genreId == null) || ((genreId != null) && film.getGenres().contains(genre))
                    .toList();
created_at: 2025-03-10T06:26:41Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: потому что findPopularFilms выдаёт список определённого количества из всей таблице, а мне нужно список определённого количества после фильтра по жанрам и годам , если такие фильтры указаны ... Разница как небо и земля ... =)
created_at: 2025-03-10T06:30:22Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
+// фильтруем фильмы по году, если указан
+        if (year != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getReleaseDate().getYear() == year)
+                    .toList();
+        }
+
+// фильтруем фильмы по жанру, если указан
+        if (genreId != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId))
+                    .toList();
+        }
+
+// сортируем фильмы по рейтингу и возвращаем необходимое количество фильмов
+        return listFilms.stream()
+                .sorted(Comparator.comparing(film ->
+                        films.getFilmRank(film.getId()), Comparator.reverseOrder()))
+                .limit(Optional.ofNullable(count).orElse(Integer.MAX_VALUE))
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: Плохая идея. SQL запросы в цикле.
Все же желательно проверить сохранится ли сортировка по популярности после фильтров в потоке...
Ведь для чего-то же вводили метод получения популярных фильмов из хранилища.
created_at: 2025-03-10T06:41:47Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: И все равно не понял. Эти условия - входящие подмножества сортировки по популярности всего списка.
Если отсортированного потока выбрать в текущей последовательности фильмы одного года, то останется последовательность с прежней сортировкой по популярности.
created_at: 2025-03-10T07:01:55Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: Предлагаю сделать хитрость. Хранилище будет всегда выдавать все фильмы с сортировкой по популярности, сервис будет отсекать от результата указанное число файлов. 
created_at: 2025-03-10T07:06:49Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: > И все равно не понял. Эти условия - входящие подмножества сортировки по популярности всего списка. Если отсортированного потока выбрать в текущей последовательности фильмы одного года, то останется последовательность с прежней сортировкой по популярности.

пример ... мне нужно 10 фильмов с фильтром по жанру 1 и по году 2000, я запрашиваю твой метод и получаю 10 фильмов но в нём в том числе фильмы и жанры другие, по рейтингу да, но нужные мне фильмы в этот список не попали, так как ограничено 10 позициями ... если сначала выбираю филтр по году и жанру и потом ограничиваю 10 позициями - тебе не кажется что именно так правильно, а не так как ты предлагаешь ?
created_at: 2025-03-10T07:07:57Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
+// фильтруем фильмы по году, если указан
+        if (year != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getReleaseDate().getYear() == year)
+                    .toList();
+        }
+
+// фильтруем фильмы по жанру, если указан
+        if (genreId != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId))
+                    .toList();
+        }
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: изначально было так 
    listFilms = listFilms.stream()
            .filter(film -> {
                boolean yearMatch = year == null || film.getReleaseDate().getYear() == year;
                boolean genreMatch = genreId == null || film.getGenres().stream().anyMatch(genre -> genre.getId() == genreId);
                return yearMatch && genreMatch;
            })
            .toList(); ... но визуально может не совсем понятно что это и почему - поэтому разделил для удобоусваемого кода ...
created_at: 2025-03-10T07:16:35Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
+// фильтруем фильмы по году, если указан
+        if (year != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getReleaseDate().getYear() == year)
+                    .toList();
+        }
+
+// фильтруем фильмы по жанру, если указан
+        if (genreId != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId))
+                    .toList();
+        }
+
+// сортируем фильмы по рейтингу и возвращаем необходимое количество фильмов
+        return listFilms.stream()
+                .sorted(Comparator.comparing(film ->
+                        films.getFilmRank(film.getId()), Comparator.reverseOrder()))
+                .limit(Optional.ofNullable(count).orElse(Integer.MAX_VALUE))
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: вот этого не понял ну соооовсем 
тот метод который вводился изначально был на начальном этапе ... 
сейчас прошлый метод отпадает как апедикс , который загноился и не поможет решить проблему...
поэтому твоего замечания не понял от слова совсем 
created_at: 2025-03-10T07:18:40Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
+// фильтруем фильмы по году, если указан
+        if (year != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getReleaseDate().getYear() == year)
+                    .toList();
+        }
+
+// фильтруем фильмы по жанру, если указан
+        if (genreId != null) {
+            listFilms = listFilms.stream()
+                    .filter(film -> film.getGenres()
+                            .stream().anyMatch(genre -> genre.getId() == genreId))
+                    .toList();
+        }
+
+// сортируем фильмы по рейтингу и возвращаем необходимое количество фильмов
+        return listFilms.stream()
+                .sorted(Comparator.comparing(film ->
+                        films.getFilmRank(film.getId()), Comparator.reverseOrder()))
+                .limit(Optional.ofNullable(count).orElse(Integer.MAX_VALUE))
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: если бы кто-то хранил set список лайков в модели фильмов не пришлось бы использовать обращение к таблицам , а сравнивать просто по размеру этого списка в модели
напомню, первоначальный вариант был с работой напрямую в таблице в твоём стородже.... 
и только после твоего скрина письма и просьбой использовать по возможности только твоим методы при обращении к таблицам - я полностью удалил старый вариант и сделал согласно твоей просьбе ...
created_at: 2025-03-10T07:22:04Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: Не кажется. Нужно запросить все фильмы отсортированные по популярности. Далее из этих выбираем фильмы за определенный год. Теоретически выборка у нас тоже получится отсортированной по популярности. Далее из этих отсортированных фильмов выбираем соответствующие искомому жанру. результат тоже должен получиться отсортирован по популярности (теоретически, я пока сомневаюсь), главное не нарушить первоначальную сортировку. Может быть использовать, что-то типа TreeHashSet? 
created_at: 2025-03-10T07:43:04Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: хорошо , давай продолжим , как ты называл "светские беседы" что я должен получить если на твой метод отправлю полученный запрос с контроллера count = null
findPopularFilms( null ) ?

created_at: 2025-03-10T07:52:10Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: Уел. Просто мой контроллер, не допускал count < 1.
Я как раз и предлагаю убрать аргумент у моего метода findPopularFilms, будет всегда вываливать весь список фильмов.
created_at: 2025-03-10T08:12:04Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: =)))))))) кстати ... а у тебя твоя эта функция популярности разве приводит фильмы с жанрами и режиссёрами ?
или я не прав ?
created_at: 2025-03-10T08:13:29Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: andrej1307
body: С жанрами да, а вот режиссеров "заглушка" в DirectorStorage выдает всегда одних и тех же - Сивен Спилберг, Люк Бессон.
created_at: 2025-03-10T08:18:58Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,44 @@
+package ru.yandex.practicum.filmorate.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class PopularServiceImpl implements PopularService {
+
+    private final FilmStorage films;
+
+    @Override
+    public List<Film> getPopular(Integer year, Integer genreId, Integer count) {
+
+// получаем из базы список всех фильмов
+        Collection<Film> listFilms = films.findAllFilms();
+
path: src/main/java/ru/yandex/practicum/filmorate/service/PopularServiceImpl.java
user: login: SergikF
body: да, мой последний комментарий не уместен ... я просто посмотрел на запрос  private static final String SQL_FIND_POPULAR_FILMS = """
            SELECT f.*, f.id AS film_id, mpa.name AS mpa_name, popular.count_film
            FROM (films AS f INNER JOIN mpa ON f.MPA_ID = mpa.ID)
                 LEFT OUTER JOIN
                 (SELECT film_id, count(film_id) as count_film
                 FROM LIKES GROUP BY film_id) AS popular
                 ON f.id = popular.film_id
            ORDER BY popular.count_film DESC
            """; 
а ты тут сделал финт .. формируешь строку запроса но не отдаёшь её, как результат, а посылаешь на другой метод ... и там уже формируешь ответ ... мда .....
created_at: 2025-03-10T08:25:14Z
author_association: COLLABORATOR

PR comments:
user: login: SergikF
created_at: 2025-03-07T09:43:45Z
body: будем переделывать , чтобы не трогать чужие таблицы
author_association: COLLABORATOR
user: login: SergikF
created_at: 2025-03-07T11:14:38Z
body: Пока не рассматривать !!! Сбросил предыдущую версию - попробую сделать так как просит Андрей - без использования напрямую таблиц, только средствами storage
author_association: COLLABORATOR