@GetMapping("/{productId}")
    @PreAuthorize("hasAnyAuthority('ADMIN', 'USER')")
    public CustomResponse<ProductResponse> getProductById(@PathVariable @UUID final String productId) {

        final Product product = productReadService.getProductById(productId);

        final ProductResponse productResponse = productToProductResponseMapper.map(product);

        return CustomResponse.successOf(productResponse);

    }
@Test
    void givenProductId_whenGetProductByIdFromAdmin_thenReturnProductResponse() throws Exception {

        // Given
        String productId = UUID.randomUUID().toString();

        Product expected = Product.builder()
                .id(productId)
                .name("Test Product")
                .unitPrice(BigDecimal.valueOf(12))
                .amount(BigDecimal.valueOf(5))
                .build();

        ProductResponse productResponse = productToProductResponseMapper.map(expected);

        // When
        when(productReadService.getProductById(productId)).thenReturn(expected);

        // Then
        mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/products/{productId}", productId)
                        .contentType(MediaType.APPLICATION_JSON)
                        .header(HttpHeaders.AUTHORIZATION, "Bearer " + mockAdminToken.getAccessToken()))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.httpStatus").value("OK"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.isSuccess").value(true))
                .andExpect(MockMvcResultMatchers.jsonPath("$.response.id").value(productResponse.getId()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.response.name").value(productResponse.getName()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.response.amount").value(productResponse.getAmount()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.response.unitPrice").value(productResponse.getUnitPrice()));

        // Verify
        verify(productReadService, times(1)).getProductById(productId);

    }