File Endpoint for Citrus Framework - citrus-framework

I'm currently looking at using Citrus for our Integration Testing, however our Integration Software uses amongst others, file messages - where files are written to an inbound folder, picked up and processed which results in a new file message being written to an outbound folder or data being written to SQL.
I was wondering if Citrus can write a file with a certain payload to an inbound folder and then monitor for a file to appear in certain outbound folder and/or in a SQL table.
Example Test Case:
file()
.folder(todoInboundFolder)
.write()
.payload(new ClassPathResource("templates/todo.xml"));
file()
.folder(todoOutboundFolder)
.read()
.validate("/t:todo/t:correlationId", "${todocorrelationId}")
.validate("/t:todo/t:title", "${todoName}");
query(todoDataSource)
.statement("select count(*) as cnt from todo_entries where correlationid = '${todocorrelationId}'")
.validate("cnt", "1");
Additionaly - is there a way to specific the timeout to wait for the file/SQL entries to appear?

There is no direct implementation of the file endpoint yet in Citrus. There was a feature request but it was closed due to inactivity https://github.com/citrusframework/citrus/issues/151
You can solve this problem though by using a simple Apache Camel route to do the file transfer. Citrus is able to call the Camel route and use its outcome very easily. Read more about this here https://citrusframework.org/citrus/reference/2.8.0/html/index.html#apache-camel
This would be the workaround that can help right now. Other than that you can reopen or contribute to the issue.

Related

Problems creating a soap connection with IBM SDI

I have recently been working with IBM SDI software for identity and governance.
To get started I was given the exercise of building a calculator using a soap request to this WSDL server.
Given a CSV file, with ID, number1, number2 and operation attributes, i need to create a csv output file with the id attribute and the result of the operation.
Some advices were:
use "invoke soap" connector to make a request to the service
take FormEntry connector to take operations calculated by the SOAP, setting a parameter of this connector called "EntryRawData"
Up to now, the only thing I was able to do was to crate a file connector that reads the csv file in input.
The problems start with SOAP connector. Any help is kindly appreciated.
Even more I have some problems understanding what a WSDL server is, what it does, and what a SOAP request is. Thank you in advance.

how to collect all information about the current Job in Talend data studio

I'm Running any job then I want to log all information like ---
job name
Source detail and destination details (file name/Table name)
No of records input and number of records processed or save.
so I want log all the above information and insert into Mongodb using talend open studio Components also explain what component do I need to perform that task. need some serious response thanks.
You can use tJava component as below. Get the count of source, destination, details of the source name and target name. Now redirect the details to a file in tJava.
For more about logging functionalities, go through below tutorials,
https://www.youtube.com/watch?v=SSi8BC58v3k&list=PL2eC8CR2B2qfgDaQtUs4Wad5u-70ala35&index=2
I'd consider using log4j which has most of this information. Using MDC you could expand the log messages with custom attributes. Log4j does have a JSON format, and there seems to be a MongoDB appender as well.
It might take a bit more time to configure (I'd suggest adding the dependencies via a routine) but once configured it will require absolutely no configuration in the job. Using log4j you can create filters, etc.

How to preserve the timestamp of an io.Reader when copying a file by using a REST service in go?

I am writing some microservices in Go which handle different files.
I want to transfer files from one service, the client, to another, the server, via PUT method. The service works, but there is a small point which is not elegant. The files I transfer are getting a new modification date, when I write them on the file system of the server.
At the moment I handle the http.Request at the server like this:
ensure that there is a file at the server
copy the body from the request to the server io.Copy(myfile, r.Body)
When I do that the file has the last modification date from now(). To solve this problem I could transfer a timestamp of the original file and set it via io.Chtimes(). But the request.Body implements an io.ReadCloser interface, so I think there must be a more elegant way to implement the writing of the file onto the server. Is there a function, which takes an io.Reader which preserves the timestamp of the file?
If not, is there a solution for REST services for this problem?

CDA HL7V3 acknowledgement

I create using Mirth a channel that receives CDA messages in HL7V3 format.
I'm able to parse the message and extract all the data i need.
My question is: How do i create an acknowledgement to the receiver?
I found out that there is a message called MCCI_MT000200UV01 that i need to implement but i can't find good explanation and/or examples.
I have been working a long time with HL7V2 and the acknowledgement is very simple.
Can't find a way to implement this in HL7V3 format.
Thanks in advance for your help
I guess you are talking about a generic Accept Acknowledgment message which is MCCI_IN000002UV02 (according to the HL7v3 NE2014). If I were you, first thing to do I'd download the HL7v3 Normative Edition that matches the year of your inbound message used to transport the CDA document (unless it's HL7v2). Then I'd go to HL7v3NE > Specification Infrastructure > Messaging > Transmission Infrastructure > Generic Message Transmission and find the Accept Ack interaction. There is a related XML Schema that allows you to build an XML template for the v3 ACK (XMLSpy like tool does that by default).
Since ACKGenerator does not support HL7v3, next step is to create a code templates function that builds the v3 ACK from the template you acquired from the previous step.
(PS. The whole procedure with samples is explained in an "Unofficial Mirth Connect Developer's Guide" available at mirthconnect.shamilpublishing.com)

How do I set up a mock queue using mockrunner to test an xml filter?

I'm using the mockrunner package from http://mockrunner.sourceforge.net/ to set up a mock queue for JUnit testing an XML filter which operates like this:
sets recognized properties for an ftp server to put and get xml input and a jms queue server that keeps track of jobs. Remotely there waits a server that actually parses the xml once a queue message is received.
creates a remote directory using ftp and starts a queue connection using mqconnectionfactory to the given address of the queue server.
once the new queue entry is made in 2), the filter waits for a new queue message to appear signifying the job has been completed by the remote server. The filter then grabs the modified xml file from the ftp and passes it along to the next filter.
The JUnit test I am working on simply needs to emulate this environment by starting a local ftp and mock queue server for the filter to connect to, then waiting for the filter to connect to the queue and put the new xml input file on a local directory via a local ftp server, wait for the queue message and then modify the xml input slightly, put the modified xml in a new directory and post another message to the queue signifying the job has completed.
All of the tutorials I have found on the net have used EJB and JNDI to lookup the queue server once it has been made. If possible, I'd like to sidestep that route by just creating a mock queue on my local machine and connecting to it in the simplest manner possible, not using EJB and JNDI.
Thanks in advance!
I'm using MockEjb and there are some examples among them one for using mock queues, so take a look to the info and to the example
Hopefully it helps.
I'd recommend having a look at using Apache Camel to create your test case. Then its really easy to switch your test case from any of the available components and most importantly Camel comes with some really handy Mock Endpoints which makes it super easy to test complex routing logic particularly with asynchronous operations.
If you also use Spring, then maybe start by trying out these Spring unit tests with mock endpoints in Camel which let you inject the mock endpoints to perform assertions on together with the ProducerTemplate object to make it really easy to fire your messages for your test case. e.g. see the last example on that page.
Start off using simple endpoints like the SEDA endpoint - then when you've got your head around the core spring/mock framework, try using the JMS endpoint or FTP endpoint endpoints etc.