|
| 1 | +@file:Suppress("LargeClass") |
| 2 | + |
1 | 3 | package com.swisscom.health.des.cdr.client.handler |
2 | 4 |
|
3 | 5 | import com.swisscom.health.des.cdr.client.common.DTOs |
@@ -574,6 +576,35 @@ internal class ConfigValidationServiceTest { |
574 | 576 | } |
575 | 577 | } |
576 | 578 |
|
| 579 | + @OptIn(ExperimentalPathApi::class) |
| 580 | + @Test |
| 581 | + fun `validateDirectoriesAreAbsolute should fail when sourceArchiveEnabled is true but archive folder is null`() { |
| 582 | + val connector = Connector( |
| 583 | + connectorId = ConnectorId("test-connector-archive-null"), |
| 584 | + sourceFolder = sourceFolder0, |
| 585 | + targetFolder = targetFolder0, |
| 586 | + contentType = "application/xml", |
| 587 | + mode = CdrClientConfig.Mode.TEST, |
| 588 | + docTypeFolders = emptyMap(), |
| 589 | + sourceErrorFolder = null, |
| 590 | + sourceArchiveFolder = null, |
| 591 | + sourceArchiveEnabled = true |
| 592 | + ) |
| 593 | + |
| 594 | + val config = createCdrClientConfig(listOf(connector)) |
| 595 | + val service = ConfigValidationService(config) |
| 596 | + val result = service.validateDirectoriesAreAbsolute(config.toDto()) |
| 597 | + |
| 598 | + assertInstanceOf<DTOs.ValidationResult.Failure>(result) |
| 599 | + assertEquals(1, result.validationDetails.size) |
| 600 | + |
| 601 | + val validationDetail = result.validationDetails.first() |
| 602 | + assertInstanceOf<DTOs.ValidationDetail.ConfigItemDetail>(validationDetail) |
| 603 | + val configItemDetail = validationDetail |
| 604 | + assertEquals(DomainObjects.ConfigurationItem.ARCHIVE_DIRECTORY, configItemDetail.configItem) |
| 605 | + assertEquals(DTOs.ValidationMessageKey.NOT_A_DIRECTORY, configItemDetail.messageKey) |
| 606 | + } |
| 607 | + |
577 | 608 | private fun createCdrClientConfig(customers: List<Connector>, defaultLocalFolder: Path = localFolder0): CdrClientConfig = |
578 | 609 | CdrClientConfig( |
579 | 610 | fileSynchronizationEnabled = FileSynchronization.ENABLED, |
@@ -730,4 +761,97 @@ internal class ConfigValidationServiceTest { |
730 | 761 | Files.deleteIfExists(tempDir) |
731 | 762 | } |
732 | 763 | } |
| 764 | + |
| 765 | + @Test |
| 766 | + fun `test validation handles path with trailing space gracefully`() { |
| 767 | + val tempSourceDir = Files.createTempDirectory("testSourceDir") |
| 768 | + val tempTargetDir = Files.createTempDirectory("testTargetDir") |
| 769 | + try { |
| 770 | + // Create connector with valid paths |
| 771 | + val connector = Connector( |
| 772 | + connectorId = ConnectorId("test-connector"), |
| 773 | + sourceFolder = tempSourceDir, |
| 774 | + targetFolder = tempTargetDir, |
| 775 | + contentType = "application/xml", |
| 776 | + mode = CdrClientConfig.Mode.TEST, |
| 777 | + docTypeFolders = emptyMap(), |
| 778 | + sourceErrorFolder = null, |
| 779 | + sourceArchiveFolder = null, |
| 780 | + sourceArchiveEnabled = false |
| 781 | + ) |
| 782 | + |
| 783 | + val config = createCdrClientConfig(listOf(connector)) |
| 784 | + val service = ConfigValidationService(config) |
| 785 | + |
| 786 | + // Now create a DTO with paths that have trailing spaces |
| 787 | + val configDto = config.toDto() |
| 788 | + val connectorWithTrailingSpace = configDto.customer.first().copy( |
| 789 | + sourceFolder = "$tempSourceDir ", |
| 790 | + targetFolder = "$tempTargetDir " |
| 791 | + ) |
| 792 | + val configDtoWithTrailingSpace = configDto.copy( |
| 793 | + customer = listOf(connectorWithTrailingSpace) |
| 794 | + ) |
| 795 | + |
| 796 | + val result = service.validateAllConfigurationItems(configDtoWithTrailingSpace) |
| 797 | + |
| 798 | + // The paths with trailing spaces should FAIL validation |
| 799 | + // On Windows: InvalidPathException -> null path -> directory not found |
| 800 | + // On Unix: Path created with trailing space that doesn't exist -> directory not found |
| 801 | + assertInstanceOf<DTOs.ValidationResult.Failure>(result) |
| 802 | + val failure = result |
| 803 | + assertTrue(failure.validationDetails.isNotEmpty()) |
| 804 | + // Should have at least one path detail with directory not found |
| 805 | + assertTrue(failure.validationDetails.any { |
| 806 | + it is DTOs.ValidationDetail.PathDetail && |
| 807 | + it.messageKey == DTOs.ValidationMessageKey.DIRECTORY_NOT_FOUND |
| 808 | + }) |
| 809 | + } finally { |
| 810 | + Files.deleteIfExists(tempSourceDir) |
| 811 | + Files.deleteIfExists(tempTargetDir) |
| 812 | + } |
| 813 | + } |
| 814 | + |
| 815 | + @Test |
| 816 | + fun `test validation handles UNC paths without NullPointerException`() { |
| 817 | + val tempSourceDir = Files.createTempDirectory("testSourceDir") |
| 818 | + val tempTargetDir = Files.createTempDirectory("testTargetDir") |
| 819 | + try { |
| 820 | + // Create connector with a UNC path (this simulates Windows network share paths) |
| 821 | + val connector = Connector( |
| 822 | + connectorId = ConnectorId("test-connector"), |
| 823 | + sourceFolder = tempSourceDir, |
| 824 | + targetFolder = tempTargetDir, |
| 825 | + contentType = "application/xml", |
| 826 | + mode = CdrClientConfig.Mode.TEST, |
| 827 | + docTypeFolders = emptyMap(), |
| 828 | + sourceErrorFolder = null, |
| 829 | + sourceArchiveFolder = null, |
| 830 | + sourceArchiveEnabled = false |
| 831 | + ) |
| 832 | + |
| 833 | + val config = createCdrClientConfig(listOf(connector)) |
| 834 | + val service = ConfigValidationService(config) |
| 835 | + |
| 836 | + // Create a DTO with a UNC path (Windows network share) |
| 837 | + val configDto = config.toDto() |
| 838 | + val connectorWithUncPath = configDto.customer.first().copy( |
| 839 | + sourceFolder = """\\cdrintstpublic.file.core.windows.net\test-file-share""" |
| 840 | + ) |
| 841 | + val configDtoWithUncPath = configDto.copy( |
| 842 | + customer = listOf(connectorWithUncPath) |
| 843 | + ) |
| 844 | + |
| 845 | + // This should not throw NullPointerException when checking fileName |
| 846 | + // It should return a validation error (directory not found) |
| 847 | + val result = service.validateAllConfigurationItems(configDtoWithUncPath) |
| 848 | + |
| 849 | + // The UNC path likely won't exist, so we expect a failure |
| 850 | + // The important thing is that it doesn't crash with NullPointerException |
| 851 | + assertInstanceOf<DTOs.ValidationResult.Failure>(result) |
| 852 | + } finally { |
| 853 | + Files.deleteIfExists(tempSourceDir) |
| 854 | + Files.deleteIfExists(tempTargetDir) |
| 855 | + } |
| 856 | + } |
733 | 857 | } |
0 commit comments