mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2026-09-03 05:10:16 +03:00
# Description of Changes Please provide a summary of the changes, including: - **What was changed** - **EmailController**: Added a `catch (MailSendException)` block to handle invalid-address errors, log the exception, and return a 500 response with the raw error message. - **EmailServiceTest**: Added unit tests for attachment-related error cases (missing filename, null filename, missing file, null file) and invalid “to” address (null or empty), expecting `MessagingException` or `MailSendException`. - **MailConfigTest**: New test class verifying `MailConfig.java` correctly initializes `JavaMailSenderImpl` with host, port, username, password, default encoding, and SMTP properties. - **EmailControllerTest**: Refactored into a parameterized test (`shouldHandleEmailRequests`) covering four scenarios: success, generic messaging error, missing `to` parameter, and invalid address formatting. - **Why the change was made** - To ensure invalid email addresses and missing attachments are handled gracefully at the controller layer, providing clearer feedback to API clients. - To improve overall test coverage and guard against regressions in email functionality. - To enforce correct mail configuration via automated tests. --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details.
96 lines
3.5 KiB
Java
96 lines
3.5 KiB
Java
package stirling.software.SPDF.controller.api;
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.Mockito.doNothing;
|
|
import static org.mockito.Mockito.doThrow;
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
import org.junit.jupiter.params.ParameterizedTest;
|
|
import org.junit.jupiter.params.provider.Arguments;
|
|
import org.junit.jupiter.params.provider.MethodSource;
|
|
import org.mockito.InjectMocks;
|
|
import org.mockito.Mock;
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
import org.springframework.mail.MailSendException;
|
|
import org.springframework.test.web.servlet.MockMvc;
|
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
|
|
|
import jakarta.mail.MessagingException;
|
|
|
|
import stirling.software.SPDF.config.security.mail.EmailService;
|
|
import stirling.software.SPDF.model.api.Email;
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
class EmailControllerTest {
|
|
|
|
private MockMvc mockMvc;
|
|
|
|
@Mock private EmailService emailService;
|
|
|
|
@InjectMocks private EmailController emailController;
|
|
|
|
@BeforeEach
|
|
void setUp() {
|
|
mockMvc = MockMvcBuilders.standaloneSetup(emailController).build();
|
|
}
|
|
|
|
@ParameterizedTest(name = "Case {index}: exception={0}, includeTo={1}")
|
|
@MethodSource("emailParams")
|
|
void shouldHandleEmailRequests(
|
|
Exception serviceException,
|
|
boolean includeTo,
|
|
int expectedStatus,
|
|
String expectedContent)
|
|
throws Exception {
|
|
if (serviceException == null) {
|
|
doNothing().when(emailService).sendEmailWithAttachment(any(Email.class));
|
|
} else {
|
|
doThrow(serviceException).when(emailService).sendEmailWithAttachment(any(Email.class));
|
|
}
|
|
|
|
var request =
|
|
multipart("/api/v1/general/send-email")
|
|
.file("fileInput", "dummy-content".getBytes())
|
|
.param("subject", "Test Email")
|
|
.param("body", "This is a test email.");
|
|
|
|
if (includeTo) {
|
|
request = request.param("to", "test@example.com");
|
|
}
|
|
|
|
mockMvc.perform(request)
|
|
.andExpect(status().is(expectedStatus))
|
|
.andExpect(content().string(expectedContent));
|
|
}
|
|
|
|
static Stream<Arguments> emailParams() {
|
|
return Stream.of(
|
|
// success case
|
|
Arguments.of(null, true, 200, "Email sent successfully"),
|
|
// generic messaging error
|
|
Arguments.of(
|
|
new MessagingException("Failed to send email"),
|
|
true,
|
|
500,
|
|
"Failed to send email: Failed to send email"),
|
|
// missing 'to' results in MailSendException
|
|
Arguments.of(
|
|
new MailSendException("Invalid Addresses"),
|
|
false,
|
|
500,
|
|
"Invalid Addresses"),
|
|
// invalid email address formatting
|
|
Arguments.of(
|
|
new MessagingException("Invalid Addresses"),
|
|
true,
|
|
500,
|
|
"Failed to send email: Invalid Addresses"));
|
|
}
|
|
}
|