Hello,

I would like to use Camel Infrastructure for my Spring Boot Camel End-to-End 
tests.

II have spent quite some time investigating how it works. Unfortunately the 
documentation is very limited and I was not able to find any examples either.

I started with a very simple scenario -> one route from FTP to file. After 
couple of hours I was able to come to following test that works.

@SpringBootTest
@Import({ FtpServiceTestConfig.class, Process1TestRoutes.class})
@TestPropertySource("classpath:application-e2e.yaml")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ActiveProfiles("e2e")
public class Process1E2ETest {
    @Autowired
    CamelContext camelContext;

    @RegisterExtension
    static FtpService ftpService = FtpServiceFactory.createEmbeddedService();

    @Test
    void shouldTransferFileFromInputToOutput() throws Exception {

        // Create the route after FTP server is initialized
        camelContext.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {
                from("ftp://"; + ftpService.hostname() + ":" + ftpService.port() 
+ "/" + ftpService.directoryName()
                    + "?username=" + ftpService.username()
                    + "&password=" + ftpService.password()
                    + "&delete=true&delay=1000")
                    .to("file:target/out")
                    .log("Received: ${file:name}");
            }
        });

        // Ensure target directory exists
        Files.createDirectories(Path.of("target/out"));

        // Create input file in the correct FTP directory
        Path ftpRootDir = ftpService.getFtpRootDir();
        Path ftpInputDir = ftpRootDir.resolve(ftpService.directoryName());
        Files.createDirectories(ftpInputDir);
        Path inputFile = ftpInputDir.resolve("test.txt");
        Files.writeString(inputFile, "Hello from test", 
StandardOpenOption.CREATE);

        System.out.println("Created file at: " + inputFile.toAbsolutePath());

        // Wait longer for Camel route to process the file
        Thread.sleep(5000);

        Path outputFile = Path.of("target/out/test.txt");
        assertTrue(Files.exists(outputFile), "Output file should exist at " + 
outputFile.toAbsolutePath());
        String content = Files.readString(outputFile);
        assertEquals("Hello from test", content);
    }
}

I had to copy FtpService  and FtpServiceFactory with their dependencies from 
Camel Github Repository 
(https://github.com/apache/camel/tree/camel-4.12.x/test-infra/camel-test-infra-ftp/src/test/java/org/apache/camel/test/infra/ftp/services)
 as they are not included in maven dependency jar. I am using Apache Camel 
4.12.0

I do not like the solution much as it creates the route only inside the test 
that is kind of ugly. If I try to create it in @TestConfiguration or even 
@BeforeAll the troube is that the FTP server is not initalized yet and 
ftpService.port() is 0 at that time.

Can anyone explain me how it is meant to be used and/or provide some example?

Regards

Jiří

Reply via email to