diff --git a/README.md b/README.md
index 927b44b..d098345 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
# QR-code Generator and Reader
-## Application used [Java 15](https://onurdesk.com/what-are-preview-features-in-java-15/) | [Onurdesk](https://onurdesk.com/)
+## Application used [Java 17](https://onurdesk.com/what-are-preview-features-in-java-17/) and Spring Boot 3.5.0 | [Onurdesk](https://onurdesk.com/)
-###### Spring boot application exposing REST API endpoint to genrate QR-code representing custom message and another endpoint to read the decoded message, built using Java [Spring boot](https://onurdesk.com/category/spring/spring-boot/) and [google's zxing library](https://opensource.google/projects/zxing).
+###### Spring boot application exposing REST API endpoint to genrate QR-code representing custom message and another endpoint to read the decoded message, built using Java, [Spring Boot 3.5.0](https://spring.io/projects/spring-boot/) and [google's zxing library](https://opensource.google/projects/zxing).
Running Application
@@ -10,7 +10,7 @@
## Local Setup
-* Install [Java 15](https://onurdesk.com/what-are-preview-features-in-java-15/)
+* Install [Java 17](https://onurdesk.com/what-are-preview-features-in-java-17/)
* Install [Maven](https://onurdesk.com/what-is-maven-plugin/)
Recommended way is to use [sdkman](https://sdkman.io/) for installing both maven and java
@@ -33,3 +33,27 @@ Go to the below url to view swagger-ui (API docs)
```
http://localhost:9090/swagger-ui.html
```
+
+## Testing
+
+The core QR code generation and reading functionalities are tested in `src/test/java/com/onurdesk/iris/service/QrCodeServiceTests.java`. These tests cover:
+
+* **Positive Scenarios:**
+ * Successful QR code generation with valid text input.
+ * Successful reading and decoding of a valid QR code image.
+* **Negative Scenarios:**
+ * Attempting QR code generation with null or invalid DTO.
+ * Handling of empty title during QR code generation.
+ * Attempting to read invalid image files (not images or not QR codes).
+ * Attempting to read QR codes with unexpected content (not deserializable to the expected DTO).
+ * Handling I/O exceptions during file reading.
+
+### Running Tests
+
+You can run the tests using Maven:
+
+```bash
+mvn test
+```
+
+Alternatively, running `mvn clean install` will also execute the tests as part of the build lifecycle.
diff --git a/pom.xml b/pom.xml
index ac30b74..6c354db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.5.0
+ 3.5.0
com.onurdesk
@@ -15,7 +15,7 @@
spring-boot-qr-code-generator-reader
Spring Boot Application exposing REST APi endpoints to generate QR code representing custom messages and another endpoint to read it.
- 15
+ 17
@@ -43,8 +43,8 @@
org.springdoc
- springdoc-openapi-ui
- 1.5.8
+ springdoc-openapi-starter-webmvc-ui
+ 2.5.0
org.springframework.boot
diff --git a/src/main/java/com/onurdesk/iris/controller/QrCodeController.java b/src/main/java/com/onurdesk/iris/controller/QrCodeController.java
index 7f5c9c4..a93700f 100644
--- a/src/main/java/com/onurdesk/iris/controller/QrCodeController.java
+++ b/src/main/java/com/onurdesk/iris/controller/QrCodeController.java
@@ -2,8 +2,8 @@
import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.java b/src/main/java/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.java
index e428b9a..25a17b6 100644
--- a/src/main/java/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.java
+++ b/src/main/java/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.java
@@ -1,7 +1,7 @@
package com.onurdesk.iris.dto;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
diff --git a/src/main/java/com/onurdesk/iris/service/QrCodeService.java b/src/main/java/com/onurdesk/iris/service/QrCodeService.java
index 9f136be..a9a30b6 100644
--- a/src/main/java/com/onurdesk/iris/service/QrCodeService.java
+++ b/src/main/java/com/onurdesk/iris/service/QrCodeService.java
@@ -5,7 +5,7 @@
import java.io.IOException;
import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
@@ -42,6 +42,7 @@ public void generate(final QrCodeGenerationRequestDto qrCodeGenerationRequestDto
final HttpServletResponse httpServletResponse) throws IOException, WriterException {
httpServletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION,
"attachment;filename=" + qrCodeGenerationRequestDto.getTitle().trim().replace(" ", "_") + ".png");
+ httpServletResponse.setContentType("image/png"); // Explicitly set content type
final var outputStream = new BufferedOutputStream(httpServletResponse.getOutputStream());
QRCodeWriter writer = new QRCodeWriter();
diff --git a/src/test/java/com/onurdesk/iris/service/QrCodeServiceTests.java b/src/test/java/com/onurdesk/iris/service/QrCodeServiceTests.java
new file mode 100644
index 0000000..497db77
--- /dev/null
+++ b/src/test/java/com/onurdesk/iris/service/QrCodeServiceTests.java
@@ -0,0 +1,197 @@
+package com.onurdesk.iris.service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.onurdesk.iris.dto.QrCodeGenerationRequestDto;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import jakarta.servlet.ServletOutputStream;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class QrCodeServiceTests {
+
+ @InjectMocks
+ private QrCodeService qrCodeService;
+
+ private QrCodeGenerationRequestDto sampleDto;
+ private ObjectMapper objectMapper = new ObjectMapper();
+
+ @BeforeEach
+ void setUp() {
+ sampleDto = QrCodeGenerationRequestDto.builder()
+ .title("Test QR")
+ .message("This is a test payload") // Assuming 'payload' maps to 'message' in DTO based on schema
+ .generatedByName("JUnit") // Assuming 'generatedBy' maps to 'generatedByName'
+ .generatedForName("Test Target") // Adding a value for this field
+ .build();
+ }
+
+ @Test
+ void testGenerateQrCode_success() throws IOException, WriterException {
+ MockHttpServletResponse mockResponse = new MockHttpServletResponse();
+
+ qrCodeService.generate(sampleDto, mockResponse);
+
+ assertEquals("attachment;filename=Test_QR.png", mockResponse.getHeader(HttpHeaders.CONTENT_DISPOSITION));
+ assertEquals("image/png", mockResponse.getContentType()); // MatrixToImageWriter sets this implicitly
+
+ // Verify the output stream contains PNG data (basic check for non-empty)
+ assertTrue(mockResponse.getContentAsByteArray().length > 0);
+
+ // Further verification could involve trying to read the byte array as an image
+ // and potentially decoding it, but that might be too much for a unit test.
+ // For now, we trust that if MatrixToImageWriter.writeToStream ran without error
+ // and produced bytes, it's likely correct.
+
+ // We can also try to verify the content of the QR code if we mock the writer part.
+ // Let's try to capture the string passed to the QRCodeWriter.encode
+ // This requires QRCodeWriter to be a mock or using a static mock for MatrixToImageWriter
+ // For simplicity, the current check on headers and non-empty output is a good start.
+ }
+
+ @Test
+ void testGenerateQrCode_nullDto() {
+ MockHttpServletResponse mockResponse = new MockHttpServletResponse();
+ assertThrows(NullPointerException.class, () -> {
+ // The ObjectMapper().writeValueAsString(null) will throw NullPointerException
+ qrCodeService.generate(null, mockResponse);
+ });
+ }
+
+ @Test
+ void testGenerateQrCode_emptyTitleInDto() throws IOException, WriterException {
+ MockHttpServletResponse mockResponse = new MockHttpServletResponse();
+ QrCodeGenerationRequestDto dtoWithEmptyTitle = QrCodeGenerationRequestDto.builder()
+ .title("") // Empty title
+ .message("Some payload")
+ .generatedByName("JUnit")
+ .generatedForName("Test Target")
+ .build();
+
+ qrCodeService.generate(dtoWithEmptyTitle, mockResponse);
+
+ // Expecting "attachment;filename=.png" or similar, depending on implementation logic for empty title
+ assertEquals("attachment;filename=.png", mockResponse.getHeader(HttpHeaders.CONTENT_DISPOSITION));
+ assertTrue(mockResponse.getContentAsByteArray().length > 0);
+ }
+
+
+ @Test
+ void testReadQrCode_success() throws Exception {
+ // 1. Prepare a valid QR code image as byte array
+ String originalContent = objectMapper.writeValueAsString(sampleDto);
+ QRCodeWriter qrCodeWriter = new QRCodeWriter();
+ BitMatrix bitMatrix = qrCodeWriter.encode(originalContent, BarcodeFormat.QR_CODE, 200, 200);
+ ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
+ MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
+ byte[] qrCodeBytes = pngOutputStream.toByteArray();
+
+ // 2. Mock MultipartFile
+ MultipartFile multipartFile = mock(MultipartFile.class);
+ when(multipartFile.getInputStream()).thenReturn(new ByteArrayInputStream(qrCodeBytes));
+
+ // 3. Call read method
+ ResponseEntity> responseEntity = qrCodeService.read(multipartFile);
+
+ // 4. Assertions
+ assertNotNull(responseEntity);
+ assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+ assertTrue(responseEntity.getBody() instanceof QrCodeGenerationRequestDto);
+ QrCodeGenerationRequestDto resultDto = (QrCodeGenerationRequestDto) responseEntity.getBody();
+ assertEquals(sampleDto.getTitle(), resultDto.getTitle());
+ assertEquals(sampleDto.getMessage(), resultDto.getMessage()); // Changed from getPayload to getMessage
+ assertEquals(sampleDto.getGeneratedByName(), resultDto.getGeneratedByName()); // Changed from getGeneratedBy
+ }
+
+ @Test
+ void testReadQrCode_invalidImageFormat() throws IOException {
+ MultipartFile multipartFile = mock(MultipartFile.class);
+ // Simulate a file that is not a valid image (e.g., random bytes)
+ byte[] invalidImageBytes = "This is not an image".getBytes();
+ when(multipartFile.getInputStream()).thenReturn(new ByteArrayInputStream(invalidImageBytes));
+
+ // ImageIO.read is expected to return null for non-image formats it doesn't understand
+ // which will then cause NullPointerException in BufferedImageLuminanceSource constructor
+ assertThrows(NullPointerException.class, () -> {
+ qrCodeService.read(multipartFile);
+ }, "Should throw NullPointerException when ImageIO.read returns null for invalid image format that is not decodable by ImageIO");
+ }
+
+ @Test
+ void testReadQrCode_notAQrCode() throws IOException {
+ // Create a valid PNG image, but not a QR code (e.g., a blank image)
+ BufferedImage blankImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ImageIO.write(blankImage, "png", baos);
+ byte[] blankImageBytes = baos.toByteArray();
+
+ MultipartFile multipartFile = mock(MultipartFile.class);
+ when(multipartFile.getInputStream()).thenReturn(new ByteArrayInputStream(blankImageBytes));
+
+ // Expect NotFoundException because MultiFormatReader won't find a QR code
+ assertThrows(com.google.zxing.NotFoundException.class, () -> {
+ qrCodeService.read(multipartFile);
+ });
+ }
+
+ @Test
+ void testReadQrCode_ioExceptionOnInputStream() throws IOException {
+ MultipartFile multipartFile = mock(MultipartFile.class);
+ when(multipartFile.getInputStream()).thenThrow(new IOException("Failed to read input stream"));
+
+ assertThrows(IOException.class, () -> {
+ qrCodeService.read(multipartFile);
+ });
+ }
+
+ @Test
+ void testReadQrCode_unexpectedContent() throws Exception {
+ // 1. Prepare a QR code with content that is not a valid JSON for QrCodeGenerationRequestDto
+ String nonJsonContent = "Just some plain text, not JSON";
+ QRCodeWriter qrCodeWriter = new QRCodeWriter();
+ BitMatrix bitMatrix = qrCodeWriter.encode(nonJsonContent, BarcodeFormat.QR_CODE, 200, 200);
+ ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
+ MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
+ byte[] qrCodeBytes = pngOutputStream.toByteArray();
+
+ // 2. Mock MultipartFile
+ MultipartFile multipartFile = mock(MultipartFile.class);
+ when(multipartFile.getInputStream()).thenReturn(new ByteArrayInputStream(qrCodeBytes));
+
+ // 3. Call read method and expect a Jackson mapping/parsing exception
+ // The service tries to map result.getText() to QrCodeGenerationRequestDto.class
+ // This will fail if the text is not a JSON representation of that DTO.
+ assertThrows(com.fasterxml.jackson.core.JsonProcessingException.class, () -> { // Changed to broader JsonProcessingException
+ qrCodeService.read(multipartFile);
+ });
+ }
+}
diff --git a/target/classes/META-INF/spring-configuration-metadata.json b/target/classes/META-INF/spring-configuration-metadata.json
new file mode 100644
index 0000000..a10f1df
--- /dev/null
+++ b/target/classes/META-INF/spring-configuration-metadata.json
@@ -0,0 +1,57 @@
+{
+ "groups": [
+ {
+ "name": "com.onurdesk.iris.swagger",
+ "type": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties",
+ "type": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties",
+ "sourceMethod": "getProperties()"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.contact",
+ "type": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties$Contact",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties",
+ "sourceMethod": "getContact()"
+ }
+ ],
+ "properties": [
+ {
+ "name": "com.onurdesk.iris.swagger.properties.api-version",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.contact.email",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties$Contact"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.contact.name",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties$Contact"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.contact.url",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties$Contact"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.description",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties"
+ },
+ {
+ "name": "com.onurdesk.iris.swagger.properties.title",
+ "type": "java.lang.String",
+ "sourceType": "com.onurdesk.iris.configuration.properties.OpenApiConfigurationProperties$Properties"
+ }
+ ],
+ "hints": [],
+ "ignored": {
+ "properties": []
+ }
+}
\ No newline at end of file
diff --git a/target/classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplication.class b/target/classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplication.class
index ec91067..8f38ca1 100644
Binary files a/target/classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplication.class and b/target/classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplication.class differ
diff --git a/target/classes/com/onurdesk/iris/configuration/OpenApiConfiguration.class b/target/classes/com/onurdesk/iris/configuration/OpenApiConfiguration.class
index 58a9bdc..31e4249 100644
Binary files a/target/classes/com/onurdesk/iris/configuration/OpenApiConfiguration.class and b/target/classes/com/onurdesk/iris/configuration/OpenApiConfiguration.class differ
diff --git a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties$Contact.class b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties$Contact.class
index b69dbd9..59f9e79 100644
Binary files a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties$Contact.class and b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties$Contact.class differ
diff --git a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties.class b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties.class
index df6794a..3c410e7 100644
Binary files a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties.class and b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties$Properties.class differ
diff --git a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties.class b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties.class
index ba4902f..c41a36d 100644
Binary files a/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties.class and b/target/classes/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties.class differ
diff --git a/target/classes/com/onurdesk/iris/controller/QrCodeController.class b/target/classes/com/onurdesk/iris/controller/QrCodeController.class
index 00cc80a..685c704 100644
Binary files a/target/classes/com/onurdesk/iris/controller/QrCodeController.class and b/target/classes/com/onurdesk/iris/controller/QrCodeController.class differ
diff --git a/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto$QrCodeGenerationRequestDtoBuilder.class b/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto$QrCodeGenerationRequestDtoBuilder.class
new file mode 100644
index 0000000..1016245
Binary files /dev/null and b/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto$QrCodeGenerationRequestDtoBuilder.class differ
diff --git a/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.class b/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.class
index e09be29..12393d4 100644
Binary files a/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.class and b/target/classes/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.class differ
diff --git a/target/classes/com/onurdesk/iris/exception/handler/GenericExceptionHandler.class b/target/classes/com/onurdesk/iris/exception/handler/GenericExceptionHandler.class
index f5f7652..a43bcad 100644
Binary files a/target/classes/com/onurdesk/iris/exception/handler/GenericExceptionHandler.class and b/target/classes/com/onurdesk/iris/exception/handler/GenericExceptionHandler.class differ
diff --git a/target/classes/com/onurdesk/iris/exception/handler/ValidationFailureExceptionHandler.class b/target/classes/com/onurdesk/iris/exception/handler/ValidationFailureExceptionHandler.class
index 027a215..1f09a71 100644
Binary files a/target/classes/com/onurdesk/iris/exception/handler/ValidationFailureExceptionHandler.class and b/target/classes/com/onurdesk/iris/exception/handler/ValidationFailureExceptionHandler.class differ
diff --git a/target/classes/com/onurdesk/iris/service/QrCodeService.class b/target/classes/com/onurdesk/iris/service/QrCodeService.class
index 52f65bf..4cdafb4 100644
Binary files a/target/classes/com/onurdesk/iris/service/QrCodeService.class and b/target/classes/com/onurdesk/iris/service/QrCodeService.class differ
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..7d952d8
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,2 @@
+META-INF/spring-configuration-metadata.json
+com/onurdesk/iris/dto/QrCodeGenerationRequestDto$QrCodeGenerationRequestDtoBuilder.class
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..53408bd
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,8 @@
+/app/src/main/java/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplication.java
+/app/src/main/java/com/onurdesk/iris/configuration/OpenApiConfiguration.java
+/app/src/main/java/com/onurdesk/iris/configuration/properties/OpenApiConfigurationProperties.java
+/app/src/main/java/com/onurdesk/iris/controller/QrCodeController.java
+/app/src/main/java/com/onurdesk/iris/dto/QrCodeGenerationRequestDto.java
+/app/src/main/java/com/onurdesk/iris/exception/handler/GenericExceptionHandler.java
+/app/src/main/java/com/onurdesk/iris/exception/handler/ValidationFailureExceptionHandler.java
+/app/src/main/java/com/onurdesk/iris/service/QrCodeService.java
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
new file mode 100644
index 0000000..ef1836e
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
@@ -0,0 +1 @@
+com/onurdesk/iris/service/QrCodeServiceTests.class
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..16de772
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -0,0 +1,2 @@
+/app/src/test/java/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplicationTests.java
+/app/src/test/java/com/onurdesk/iris/service/QrCodeServiceTests.java
diff --git a/target/surefire-reports/TEST-com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.xml b/target/surefire-reports/TEST-com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.xml
new file mode 100644
index 0000000..bbe6352
--- /dev/null
+++ b/target/surefire-reports/TEST-com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/target/surefire-reports/TEST-com.onurdesk.iris.service.QrCodeServiceTests.xml b/target/surefire-reports/TEST-com.onurdesk.iris.service.QrCodeServiceTests.xml
new file mode 100644
index 0000000..640653d
--- /dev/null
+++ b/target/surefire-reports/TEST-com.onurdesk.iris.service.QrCodeServiceTests.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/target/surefire-reports/com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.txt b/target/surefire-reports/com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.txt
new file mode 100644
index 0000000..2f752d1
--- /dev/null
+++ b/target/surefire-reports/com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.685 s -- in com.onurdesk.iris.SpringBootQrCodeGeneratorReaderApplicationTests
diff --git a/target/surefire-reports/com.onurdesk.iris.service.QrCodeServiceTests.txt b/target/surefire-reports/com.onurdesk.iris.service.QrCodeServiceTests.txt
new file mode 100644
index 0000000..e9acdd9
--- /dev/null
+++ b/target/surefire-reports/com.onurdesk.iris.service.QrCodeServiceTests.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: com.onurdesk.iris.service.QrCodeServiceTests
+-------------------------------------------------------------------------------
+Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.827 s -- in com.onurdesk.iris.service.QrCodeServiceTests
diff --git a/target/test-classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplicationTests.class b/target/test-classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplicationTests.class
index e5acd1a..48e08e5 100644
Binary files a/target/test-classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplicationTests.class and b/target/test-classes/com/onurdesk/iris/SpringBootQrCodeGeneratorReaderApplicationTests.class differ
diff --git a/target/test-classes/com/onurdesk/iris/service/QrCodeServiceTests.class b/target/test-classes/com/onurdesk/iris/service/QrCodeServiceTests.class
new file mode 100644
index 0000000..48f2705
Binary files /dev/null and b/target/test-classes/com/onurdesk/iris/service/QrCodeServiceTests.class differ