Тестирование (автоматическое) - Ntditl/kpfu_service_library GitHub Wiki

На backend части приложения были реализованы тесты для модуля services.

image

  1. AuthServiceTest
🔍 Показать/скрыть код
package com.library.services

import com.library.models.LoginRequest
import com.library.models.RegisterRequest
import com.library.models.UserDTO
import com.library.repositories.UserRepository
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

class AuthServiceTest {

    private lateinit var userRepository: UserRepository
    private lateinit var jwtService: JwtService
    private lateinit var authService: AuthService

    @BeforeEach
    fun setup() {
        userRepository = mock()
        jwtService = mock()
        authService = AuthService(userRepository, jwtService)
    }

    @Test
    fun `должен успешно зарегистрировать нового пользователя`() {
        // Подготовка данных для теста
        val request = RegisterRequest(
            email = "[email protected]",
            password = "password123",
            first_name = "Иван",
            last_name = "Петров",
            phone = "+79001234567"
        )

        val userId = 1
        val mockUser = UserDTO(
            user_id = userId,
            email = request.email,
            first_name = request.first_name,
            last_name = request.last_name,
            phone = request.phone,
            role_id = 1,
            is_active = true
        )

        val mockToken = "jwt.token.example"

        // Настройка поведения моков
        whenever(userRepository.findByEmail(request.email)).thenReturn(null)
        whenever(userRepository.create(any(), any())).thenReturn(userId)
        whenever(userRepository.findById(userId)).thenReturn(mockUser)
        whenever(jwtService.generateToken(mockUser)).thenReturn(mockToken)

        // Вызов тестируемого метода
        val response = authService.register(request)

        // Проверка результата
        assert(response.token == mockToken)
        assert(response.user == mockUser)

        // Проверка вызовов методов моков
        verify(userRepository).findByEmail(request.email)
        verify(userRepository).create(any(), any())
        verify(userRepository).findById(userId)
        verify(jwtService).generateToken(mockUser)
    }

    @Test
    fun `должен выбрасывать исключение при регистрации с существующим email`() {
        // Подготовка данных для теста
        val request = RegisterRequest(
            email = "[email protected]",
            password = "password123",
            first_name = "Иван",
            last_name = "Петров",
            phone = "+79001234567"
        )

        val existingUser = UserDTO(
            user_id = 1,
            email = request.email,
            first_name = "Существующий",
            last_name = "Пользователь",
            phone = "+79009876543",
            role_id = 1,
            is_active = true
        )

        // Настройка поведения моков
        whenever(userRepository.findByEmail(request.email)).thenReturn(existingUser)

        // Проверка выброса исключения
        val exception = assertThrows<IllegalArgumentException> {
            authService.register(request)
        }

        // Проверка сообщения об ошибке
        assert(exception.message == "Пользователь с таким email уже существует")

        // Проверка вызовов методов моков
        verify(userRepository).findByEmail(request.email)
        verify(userRepository, never()).create(any(), any())
    }
}
  1. BookCopyServiceTest
🔍 Показать/скрыть код
package com.library.services

import com.library.models.*
import com.library.repositories.BookCopyRepository
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.mockito.kotlin.*

class BookCopyServiceTest {

    private lateinit var bookCopyRepository: BookCopyRepository
    private lateinit var bookCopyService: BookCopyService

    @BeforeEach
    fun setup() {
        bookCopyRepository = mock()
        bookCopyService = BookCopyService(bookCopyRepository)
    }

    @Test
    fun `должен получить список всех экземпляров книг`() {
        // Подготовка данных
        val bookCopies = listOf(
            BookCopyDTO(copy_id = 1, book_id = 1, is_in_here = true, is_in_reservation = false, borrowed_By_Other_User = false),
            BookCopyDTO(copy_id = 2, book_id = 1, is_in_here = true, is_in_reservation = true, borrowed_By_Other_User = false),
            BookCopyDTO(copy_id = 3, book_id = 2, is_in_here = false, is_in_reservation = false, borrowed_By_Other_User = true)
        )

        // Настройка поведения мока
        whenever(bookCopyRepository.getAll()).thenReturn(bookCopies)

        // Вызов тестируемого метода
        val result = bookCopyService.getAll()

        // Проверка результата
        assert(result.size == 3)
        assert(result[0].copy_id == 1)
        assert(result[0].book_id == 1)
        assert(result[0].is_in_here)
        assert(!result[0].is_in_reservation)

        // Проверка вызова мока
        verify(bookCopyRepository).getAll()
    }

    @Test
    fun `должен получить экземпляр книги по ID`() {
        // Подготовка данных
        val copyId = 1
        val bookCopy = BookCopyDTO(
            copy_id = copyId,
            book_id = 1,
            is_in_here = true,
            is_in_reservation = false,
            borrowed_By_Other_User = false
        )

        // Настройка поведения мока
        whenever(bookCopyRepository.getById(copyId)).thenReturn(bookCopy)

        // Вызов тестируемого метода
        val result = bookCopyService.getById(copyId)

        // Проверка результата
        assert(result != null)
        assert(result?.copy_id == copyId)
        assert(result?.book_id == 1)
        assert(result?.is_in_here == true)

        // Проверка вызова мока
        verify(bookCopyRepository).getById(copyId)
    }

    @Test
    fun `должен выбросить исключение при поиске экземпляра книги с неположительным ID`() {
        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            bookCopyService.getById(0)
        }

        // Проверка что мок не вызывался
        verify(bookCopyRepository, never()).getById(any())
    }

    @Test
    fun `должен создать новый экземпляр книги`() {
        // Подготовка данных
        val bookCopyDTO = BookCopyDTO(
            book_id = 1,
            is_in_here = true,
            is_in_reservation = false,
            borrowed_By_Other_User = false
        )
        val createdCopyId = 1

        // Настройка поведения мока
        whenever(bookCopyRepository.create(bookCopyDTO)).thenReturn(createdCopyId)

        // Вызов тестируемого метода
        val result = bookCopyService.create(bookCopyDTO)

        // Проверка результата
        assert(result == createdCopyId)

        // Проверка вызова мока
        verify(bookCopyRepository).create(bookCopyDTO)
    }

    @Test
    fun `должен выбросить исключение при создании экземпляра книги с неположительным ID книги`() {
        // Подготовка данных
        val bookCopyDTO = BookCopyDTO(
            book_id = 0,  // Неположительный ID книги
            is_in_here = true,
            is_in_reservation = false,
            borrowed_By_Other_User = false
        )

        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            bookCopyService.create(bookCopyDTO)
        }

        // Проверка что мок не вызывался
        verify(bookCopyRepository, never()).create(any())
    }

    @Test
    fun `должен обновить существующий экземпляр книги`() {
        // Подготовка данных
        val copyId = 1
        val bookCopyDTO = BookCopyDTO(
            book_id = 1,
            is_in_here = false,
            is_in_reservation = true,
            borrowed_By_Other_User = true
        )

        // Настройка поведения мока
        whenever(bookCopyRepository.update(copyId, bookCopyDTO)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookCopyService.update(copyId, bookCopyDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookCopyRepository).update(copyId, bookCopyDTO)
    }

    @Test
    fun `должен удалить экземпляр книги по ID`() {
        // Подготовка данных
        val copyId = 1

        // Настройка поведения мока
        whenever(bookCopyRepository.delete(copyId)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookCopyService.delete(copyId)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookCopyRepository).delete(copyId)
    }

    @Test
    fun `должен обновить статус бронирования экземпляра книги`() {
        // Подготовка данных
        val copyId = 1
        val updateDTO = UpdateBookCopyReservationDTO(is_in_reservation = true)

        // Настройка поведения мока
        whenever(bookCopyRepository.updateReservation(copyId, updateDTO.is_in_reservation)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookCopyService.updateReservation(copyId, updateDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookCopyRepository).updateReservation(copyId, updateDTO.is_in_reservation)
    }

    @Test
    fun `должен обновить местоположение экземпляра книги`() {
        // Подготовка данных
        val copyId = 1
        val updateDTO = UpdateBookCopyLocationDTO(is_in_here = false)

        // Настройка поведения мока
        whenever(bookCopyRepository.updateLocation(copyId, updateDTO.is_in_here)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookCopyService.updateLocation(copyId, updateDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookCopyRepository).updateLocation(copyId, updateDTO.is_in_here)
    }

    @Test
    fun `должен обновить статус выдачи экземпляра книги`() {
        // Подготовка данных
        val copyId = 1
        val updateDTO = UpdateBookCopyBorrowedStatusDTO(borrowed_By_Other_User = true)

        // Настройка поведения мока
        whenever(bookCopyRepository.updateBorrowedStatus(copyId, updateDTO.borrowed_By_Other_User)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookCopyService.updateBorrowedStatus(copyId, updateDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookCopyRepository).updateBorrowedStatus(copyId, updateDTO.borrowed_By_Other_User)
    }
}
  1. BookServiceTest
🔍 Показать/скрыть код
package com.library.services

import com.library.models.BookDTO
import com.library.repositories.BookRepository
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.mockito.kotlin.*

class BookServiceTest {

    private lateinit var bookRepository: BookRepository
    private lateinit var bookService: BookService

    @BeforeEach
    fun setup() {
        bookRepository = mock()
        bookService = BookService(bookRepository)
    }

    @Test
    fun `должен получить список всех книг`() {
        // Подготовка данных
        val books = listOf(
            BookDTO(bookId = 1, title = "Война и мир", author = "Лев Толстой", isbn = "123456789",
                publicationYear = 1869, publisher = "Русский вестник", genre = "Роман",
                description = "Описание книги", keywords = "война, мир", coverUrl = "url1"),
            BookDTO(bookId = 2, title = "Мастер и Маргарита", author = "Михаил Булгаков", isbn = "987654321",
                publicationYear = 1967, publisher = "Москва", genre = "Роман",
                description = "Описание книги", keywords = "москва, дьявол", coverUrl = "url2")
        )

        // Настройка поведения мока
        whenever(bookRepository.getAll()).thenReturn(books)

        // Вызов тестируемого метода
        val result = bookService.getAll()

        // Проверка результата
        assert(result.size == 2)
        assert(result[0].title == "Война и мир")
        assert(result[1].title == "Мастер и Маргарита")

        // Проверка вызова мока
        verify(bookRepository).getAll()
    }

    @Test
    fun `должен получить книгу по ID`() {
        // Подготовка данных
        val bookId = 1
        val book = BookDTO(
            bookId = bookId,
            title = "Война и мир",
            author = "Лев Толстой",
            isbn = "123456789",
            publicationYear = 1869,
            publisher = "Русский вестник",
            genre = "Роман",
            description = "Описание книги",
            keywords = "война, мир",
            coverUrl = "url1"
        )

        // Настройка поведения мока
        whenever(bookRepository.getById(bookId)).thenReturn(book)

        // Вызов тестируемого метода
        val result = bookService.getById(bookId)

        // Проверка результата
        assert(result != null)
        assert(result?.bookId == bookId)
        assert(result?.title == "Война и мир")

        // Проверка вызова мока
        verify(bookRepository).getById(bookId)
    }

    @Test
    fun `должен выбросить исключение при поиске книги с неположительным ID`() {
        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            bookService.getById(0)
        }

        // Проверка что мок не вызывался
        verify(bookRepository, never()).getById(any())
    }

    @Test
    fun `должен создать новую книгу`() {
        // Подготовка данных
        val bookDTO = BookDTO(
            title = "Война и мир",
            author = "Лев Толстой",
            isbn = "123456789",
            publicationYear = 1869,
            publisher = "Русский вестник",
            genre = "Роман",
            description = "Описание книги",
            keywords = "война, мир",
            coverUrl = "url1"
        )
        val createdBookId = 1

        // Настройка поведения мока
        whenever(bookRepository.create(bookDTO)).thenReturn(createdBookId)

        // Вызов тестируемого метода
        val result = bookService.create(bookDTO)

        // Проверка результата
        assert(result == createdBookId)

        // Проверка вызова мока
        verify(bookRepository).create(bookDTO)
    }

    @Test
    fun `должен выбросить исключение при создании книги с пустым заголовком`() {
        // Подготовка данных
        val bookDTO = BookDTO(
            title = "",  // Пустой заголовок
            author = "Автор",
            isbn = null,
            publicationYear = null,
            publisher = null,
            genre = null,
            description = null,
            keywords = null,
            coverUrl = null
        )

        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            bookService.create(bookDTO)
        }

        // Проверка что мок не вызывался
        verify(bookRepository, never()).create(any())
    }

    @Test
    fun `должен обновить существующую книгу`() {
        // Подготовка данных
        val bookId = 1
        val bookDTO = BookDTO(
            title = "Война и мир (обновлено)",
            author = "Лев Толстой",
            isbn = "123456789",
            publicationYear = 1869,
            publisher = "Русский вестник",
            genre = "Роман",
            description = "Обновленное описание",
            keywords = "война, мир, роман",
            coverUrl = "url1_updated"
        )

        // Настройка поведения мока
        whenever(bookRepository.update(bookId, bookDTO)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookService.update(bookId, bookDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookRepository).update(bookId, bookDTO)
    }

    @Test
    fun `должен удалить книгу по ID`() {
        // Подготовка данных
        val bookId = 1

        // Настройка поведения мока
        whenever(bookRepository.delete(bookId)).thenReturn(true)

        // Вызов тестируемого метода
        val result = bookService.delete(bookId)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(bookRepository).delete(bookId)
    }

    @Test
    fun `должен выбросить исключение при удалении книги с неположительным ID`() {
        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            bookService.delete(0)
        }

        // Проверка что мок не вызывался
        verify(bookRepository, never()).delete(any())
    }
}
  1. RoleServiceTest
🔍 Показать/скрыть код
package com.library.services

import com.library.models.RoleDTO
import com.library.repositories.RoleRepository
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.mockito.kotlin.*

class RoleServiceTest {

    private lateinit var roleRepository: RoleRepository
    private lateinit var roleService: RoleService

    @BeforeEach
    fun setup() {
        roleRepository = mock()
        roleService = RoleService(roleRepository)
    }

    @Test
    fun `должен получить список всех ролей`() {
        // Подготовка данных
        val roles = listOf(
            RoleDTO(role_id = 1, role_name = "Администратор"),
            RoleDTO(role_id = 2, role_name = "Библиотекарь"),
            RoleDTO(role_id = 3, role_name = "Читатель")
        )

        // Настройка поведения мока
        whenever(roleRepository.getAll()).thenReturn(roles)

        // Вызов тестируемого метода
        val result = roleService.getAll()

        // Проверка результата
        assert(result.size == 3)
        assert(result[0].role_name == "Администратор")
        assert(result[1].role_name == "Библиотекарь")
        assert(result[2].role_name == "Читатель")

        // Проверка вызова мока
        verify(roleRepository).getAll()
    }

    @Test
    fun `должен получить роль по ID`() {
        // Подготовка данных
        val roleId = 1
        val role = RoleDTO(role_id = roleId, role_name = "Администратор")

        // Настройка поведения мока
        whenever(roleRepository.getById(roleId)).thenReturn(role)

        // Вызов тестируемого метода
        val result = roleService.getById(roleId)

        // Проверка результата
        assert(result != null)
        assert(result?.role_id == roleId)
        assert(result?.role_name == "Администратор")

        // Проверка вызова мока
        verify(roleRepository).getById(roleId)
    }

    @Test
    fun `должен выбросить исключение при поиске роли с неположительным ID`() {
        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            roleService.getById(0)
        }

        // Проверка что мок не вызывался
        verify(roleRepository, never()).getById(any())
    }

    @Test
    fun `должен создать новую роль`() {
        // Подготовка данных
        val roleDTO = RoleDTO(role_name = "Новая роль")
        val createdRoleId = 4

        // Настройка поведения мока
        whenever(roleRepository.create(roleDTO)).thenReturn(createdRoleId)

        // Вызов тестируемого метода
        val result = roleService.create(roleDTO)

        // Проверка результата
        assert(result == createdRoleId)

        // Проверка вызова мока
        verify(roleRepository).create(roleDTO)
    }

    @Test
    fun `должен выбросить исключение при создании роли с пустым названием`() {
        // Подготовка данных
        val roleDTO = RoleDTO(role_name = "")  // Пустое название роли

        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            roleService.create(roleDTO)
        }

        // Проверка что мок не вызывался
        verify(roleRepository, never()).create(any())
    }

    @Test
    fun `должен обновить существующую роль`() {
        // Подготовка данных
        val roleId = 1
        val roleDTO = RoleDTO(role_name = "Администратор (обновлено)")

        // Настройка поведения мока
        whenever(roleRepository.update(roleId, roleDTO)).thenReturn(true)

        // Вызов тестируемого метода
        val result = roleService.update(roleId, roleDTO)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(roleRepository).update(roleId, roleDTO)
    }

    @Test
    fun `должен удалить роль по ID`() {
        // Подготовка данных
        val roleId = 3

        // Настройка поведения мока
        whenever(roleRepository.delete(roleId)).thenReturn(true)

        // Вызов тестируемого метода
        val result = roleService.delete(roleId)

        // Проверка результата
        assert(result)

        // Проверка вызова мока
        verify(roleRepository).delete(roleId)
    }

    @Test
    fun `должен выбросить исключение при удалении роли с неположительным ID`() {
        // Проверка выброса исключения
        assertThrows<IllegalArgumentException> {
            roleService.delete(0)
        }

        // Проверка что мок не вызывался
        verify(roleRepository, never()).delete(any())
    }
}
⚠️ **GitHub.com Fallback** ⚠️