Best Citrus code snippet using com.consol.citrus.channel.selector.XpathPayloadMessageSelector
Source:XpathPayloadMessageSelectorTest.java
...21import org.testng.annotations.Test;22/**23 * @author Christoph Deppisch24 */25public class XpathPayloadMessageSelectorTest extends AbstractTestNGUnitTest {26 @Test27 public void testXPathEvaluation() {28 XpathPayloadMessageSelector messageSelector = new XpathPayloadMessageSelector("xpath://Foo/text", "foobar", context);29 30 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<Foo><text>foobar</text></Foo>").build()));31 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Foo xmlns=\"http://citrusframework.org/schema\"><text>foobar</text></Foo>").build()));32 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Bar><text>foobar</text></Bar>").build()));33 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("This is plain text!").build()));34 35 messageSelector = new XpathPayloadMessageSelector("xpath://ns:Foo/ns:text", "foobar", context);36 37 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<ns:Foo xmlns:ns=\"http://citrusframework.org/schema\"><ns:text>foobar</ns:text></ns:Foo>").build()));38 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<ns1:Foo xmlns:ns1=\"http://citrusframework.org/schema\"><ns1:text>foobar</ns1:text></ns1:Foo>").build()));39 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Bar><text>foobar</text></Bar>").build()));40 41 messageSelector = new XpathPayloadMessageSelector("xpath://{http://citrusframework.org/schema}Foo/{http://citrusframework.org/schema}text", "foobar", context);42 43 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<Foo xmlns=\"http://citrusframework.org/schema\"><text>foobar</text></Foo>").build()));44 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<ns:Foo xmlns:ns=\"http://citrusframework.org/schema\"><ns:text>foobar</ns:text></ns:Foo>").build()));45 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<ns1:Foo xmlns:ns1=\"http://citrusframework.org/schema\"><ns1:text>foobar</ns1:text></ns1:Foo>").build()));46 47 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Foo xmlns=\"http://citrusframework.org/unknown\"><text>foobar</text></Foo>").build()));48 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<ns:Foo xmlns:ns=\"http://citrusframework.org/unknown\"><ns:text>foobar</ns:text></ns:Foo>").build()));49 50 messageSelector = new XpathPayloadMessageSelector("xpath://{http://citrusframework.org/schema}Foo/{http://citrusframework.org/schema2}text", "foobar", context);51 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<ns1:Foo xmlns:ns1=\"http://citrusframework.org/schema\" xmlns:ns2=\"http://citrusframework.org/schema2\"><ns2:text>foobar</ns2:text></ns1:Foo>").build()));52 53 messageSelector = new XpathPayloadMessageSelector("xpath://ns:Foos/ns:Foo[ns:key='KEY-X']/ns:value", "foo", context);54 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<ns:Foos xmlns:ns=\"http://citrusframework.org/schema\"><ns:Foo><ns:key>KEY-X</ns:key><ns:value>foo</ns:value></ns:Foo><ns:Foo><ns:key>KEY-Y</ns:key><ns:value>bar</ns:value></ns:Foo></ns:Foos>").build()));55 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<ns:Foos xmlns:ns=\"http://citrusframework.org/schema\"><ns:Foo><ns:key>KEY-Z</ns:key><ns:value>foo</ns:value></ns:Foo><ns:Foo><ns:key>KEY-Y</ns:key><ns:value>bar</ns:value></ns:Foo></ns:Foos>").build()));56 }57 @Test58 public void testXPathEvaluationValidationMatcher() {59 XpathPayloadMessageSelector messageSelector = new XpathPayloadMessageSelector("xpath://Foo/text", "@startsWith(foo)@", context);60 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload("<Foo><text>foobar</text></Foo>").build()));61 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Foo xmlns=\"http://citrusframework.org/schema\"><text>foobar</text></Foo>").build()));62 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("<Bar><text>foobar</text></Bar>").build()));63 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload("This is plain text!").build()));64 }65 @Test66 public void testXPathEvaluationWithMessageObjectPayload() {67 XpathPayloadMessageSelector messageSelector = new XpathPayloadMessageSelector("xpath://Foo/text", "foobar", context);68 Assert.assertTrue(messageSelector.accept(MessageBuilder.withPayload(new DefaultMessage("<Foo><text>foobar</text></Foo>")).build()));69 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload(new DefaultMessage("<Foo xmlns=\"http://citrusframework.org/schema\"><text>foobar</text></Foo>")).build()));70 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload(new DefaultMessage("<Bar><text>foobar</text></Bar>")).build()));71 Assert.assertFalse(messageSelector.accept(MessageBuilder.withPayload(new DefaultMessage("This is plain text!")).build()));72 }73}...
Source:XpathPayloadMessageSelector.java
...34 * 35 * @author Christoph Deppisch36 * @since 1.237 */38public class XpathPayloadMessageSelector extends AbstractMessageSelector {39 /** Special selector element name identifying this message selector implementation */40 public static final String SELECTOR_PREFIX = "xpath:";41 42 /** Logger */43 private static Logger log = LoggerFactory.getLogger(XpathPayloadMessageSelector.class);44 45 /**46 * Default constructor using fields.47 */48 public XpathPayloadMessageSelector(String selectKey, String matchingValue, TestContext context) {49 super(selectKey.substring(SELECTOR_PREFIX.length()), matchingValue, context);50 }51 52 @Override53 public boolean accept(Message<?> message) {54 Document doc;55 try {56 doc = XMLUtils.parseMessagePayload(getPayloadAsString(message));57 } catch (LSException e) {58 log.warn("Ignoring non XML message for XPath message selector (" + e.getClass().getName() + ")");59 return false; // non XML message - not accepted60 }61 62 try {63 Map<String, String> namespaces = XMLUtils.lookupNamespaces(doc);64 65 // add default namespace mappings66 namespaces.putAll(context.getNamespaceContextBuilder().getNamespaceMappings());67 String value;68 if (XPathUtils.hasDynamicNamespaces(selectKey)) {69 namespaces.putAll(XPathUtils.getDynamicNamespaces(selectKey));70 value = XPathExpressionFactory.createXPathExpression(XPathUtils.replaceDynamicNamespaces(selectKey, namespaces), namespaces)71 .evaluateAsString(doc);72 } else {73 value = XPathExpressionFactory.createXPathExpression(selectKey, namespaces)74 .evaluateAsString(doc);75 }76 return evaluate(value);77 } catch (XPathParseException e) {78 log.warn("Could not evaluate XPath expression for message selector - ignoring message (" + e.getClass().getName() + ")");79 return false; // wrong XML message - not accepted80 }81 }82 /**83 * Message selector factory for this implementation.84 */85 public static class Factory implements MessageSelectorFactory<XpathPayloadMessageSelector> {86 @Override87 public boolean supports(String key) {88 return key.startsWith(SELECTOR_PREFIX);89 }90 @Override91 public XpathPayloadMessageSelector create(String key, String value, TestContext context) {92 return new XpathPayloadMessageSelector(key, value, context);93 }94 }95}...
XpathPayloadMessageSelector
Using AI Code Generation
1import org.springframework.context.support.ClassPathXmlApplicationContext;2import org.springframework.integration.Message;3import org.springframework.integration.MessageChannel;4import org.springframework.integration.core.PollableChannel;5import org.springframework.integration.message.GenericMessage;6import org.springframework.integration.support.MessageBuilder;7public class XpathPayloadMessageSelectorTest {8public static void main(String[] args) {9 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("4.xml");10 MessageChannel inputChannel = context.getBean("inputChannel", MessageChannel.class);11 PollableChannel outputChannel = context.getBean("outputChannel", PollableChannel.class);12 inputChannel.send(new GenericMessage<String>("Test Message 1"));13 inputChannel.send(new GenericMessage<String>("Test Message 2"));14 inputChannel.send(new GenericMessage<String>("Test Message 3"));15 Message<?> message = outputChannel.receive(1000);16 System.out.println(message.getPayload());17 message = outputChannel.receive(1000);18 System.out.println(message.getPayload());19 message = outputChannel.receive(1000);20 System.out.println(message.getPayload());21 context.close();22}23}
XpathPayloadMessageSelector
Using AI Code Generation
1package com.consol.citrus.channel.selector;2import org.springframework.integration.Message;3import org.springframework.integration.support.MessageBuilder;4import com.consol.citrus.exceptions.CitrusRuntimeException;5public class XpathPayloadMessageSelector implements org.springframework.integration.core.MessageSelector {6 private String xpathExpression;7 public XpathPayloadMessageSelector(String xpathExpression) {8 this.xpathExpression = xpathExpression;9 }10 public boolean accept(Message<?> message) {11 try {12 return message.getPayload() != null &&13 MessageBuilder.withPayload(message.getPayload()).build().getHeaders().containsKey("xpath");14 } catch (Exception e) {15 throw new CitrusRuntimeException(e);16 }17 }18}19package com.consol.citrus.channel.selector;20import org.springframework.integration.Message;21import org.springframework.integration.support.MessageBuilder;22import com.consol.citrus.exceptions.CitrusRuntimeException;23public class XpathPayloadMessageSelector implements org.springframework.integration.core.MessageSelector {24 private String xpathExpression;25 public XpathPayloadMessageSelector(String xpathExpression) {26 this.xpathExpression = xpathExpression;27 }28 public boolean accept(Message<?> message) {29 try {30 return message.getPayload() != null &&31 MessageBuilder.withPayload(message.getPayload()).build().getHeaders().containsKey("xpath");32 } catch (Exception e) {33 throw new CitrusRuntimeException(e);34 }35 }36}37package com.consol.citrus.channel.selector;38import org.springframework.integration.Message;39import org.springframework.integration.support.MessageBuilder;40import com.consol.citrus.exceptions.CitrusRuntimeException;41public class XpathPayloadMessageSelector implements org.springframework.integration.core.MessageSelector {42 private String xpathExpression;43 public XpathPayloadMessageSelector(String xpathExpression) {44 this.xpathExpression = xpathExpression;45 }46 public boolean accept(Message<?> message) {47 try {48 return message.getPayload() != null &&49 MessageBuilder.withPayload(message.getPayload()).build().getHeaders().containsKey("xpath");50 } catch (Exception e) {51 throw new CitrusRuntimeException(e);52 }53 }54}
XpathPayloadMessageSelector
Using AI Code Generation
1package com.consol.citrus.channel.selector;2import org.springframework.integration.core.MessageSelector;3import org.springframework.integration.message.GenericMessage;4import org.springframework.integration.support.MessageBuilder;5import org.springframework.integration.support.channel.BeanFactoryChannelResolver;6import org.springframework.integration.xml.xpath.XPathPayloadMessageSelector;7import org.springframework.xml.xpath.XPathExpression;8import org.springframework.xml.xpath.XPathExpressionFactory;9import org.springframework.xml.xpath.XPathOperations;10import org.springframework.xml.xpath.XPathOperationsImpl;11import org.springframework.xml.xpath.XPathParseException;12import org.springframework.xml.xpath.XPathUtils;13import org.w3c.dom.Document;14import org.w3c.dom.Node;15import org.w3c.dom.NodeList;16import javax.xml.transform.Source;17import javax.xml.transform.dom.DOMSource;18import javax.xml.xpath.XPath;19import javax.xml.xpath.XPathConstants;20import javax.xml.xpath.XPathExpressionException;21import javax.xml.xpath.XPathFactory;22import java.util.ArrayList;23import java.util.List;24public class XpathPayloadMessageSelector implements MessageSelector {25 private XPathExpression xpathExpression;26 private XPathOperations xpathOperations;27 public XpathPayloadMessageSelector(String expression) {28 this.xpathExpression = XPathExpressionFactory.createXPathExpression(expression);29 this.xpathOperations = new XPathOperationsImpl();30 }31 public boolean accept(org.springframework.messaging.Message<?> message) {32 Object payload = message.getPayload();33 if (payload instanceof Source) {34 return xpathOperations.evaluateAsBoolean(xpathExpression, (Source) payload);35 } else if (payload instanceof Document) {36 return xpathOperations.evaluateAsBoolean(xpathExpression, (Document) payload);37 } else if (payload instanceof Node) {38 return xpathOperations.evaluateAsBoolean(xpathExpression, (Node) payload);39 } else if (payload instanceof NodeList) {40 return xpathOperations.evaluateAsBoolean(xpathExpression, (NodeList) payload);41 } else if (payload instanceof String) {42 return xpathOperations.evaluateAsBoolean(xpathExpression, (String) payload);43 } else {44 return xpathOperations.evaluateAsBoolean(xpathExpression, new DOMSource(payload));45 }46 }47 public XPathExpression getXpathExpression() {48 return xpathExpression;49 }50 public void setXpathExpression(XPathExpression xpathExpression) {51 this.xpathExpression = xpathExpression;52 }53 public XPathOperations getXpathOperations() {54 return xpathOperations;55 }56 public void setXpathOperations(XPathOperations xpathOperations) {
XpathPayloadMessageSelector
Using AI Code Generation
1import org.springframework.core.io.ClassPathResource;2import org.springframework.integration.Message;3import org.springframework.integration.channel.QueueChannel;4import org.springframework.integration.core.PollableChannel;5import org.springframework.integration.dsl.channel.MessageChannels;6import org.springframework.integration.dsl.core.Pollers;7import org.springframework.integration.dsl.support.Consumer;8import org.springframework.integration.handler.LoggingHandler;9import org.springframework.integration.handler.LoggingHandler.Level;10import org.springframework.integration.xml.xpath.XPathPayloadMessageSelector;11import org.springframework.integration.xml.xpath.XPathUtils;12import org.springframework.messaging.MessageChannel;13import org.springframework.messaging.MessageHandler;14import org.springframework.messaging.MessagingException;15import org.springframework.messaging.support.GenericMessage;16public class XpathPayloadMessageSelectorDemo {17 public static void main(String[] args) {18 final PollableChannel channel1 = MessageChannels.queue().get();19 final PollableChannel channel2 = MessageChannels.queue().get();20 MessageChannel channel = MessageChannels.direct().get();21 MessageHandler handler1 = new LoggingHandler(Level.INFO);22 MessageHandler handler2 = new LoggingHandler(Level.INFO);23 ((QueueChannel) channel1).subscribe(handler1);24 ((QueueChannel) channel2).subscribe(handler2);25 XPathUtils.setThreadXPathFactoryConfigurationFile(new ClassPathResource("xpath-factory-configuration.xml"));26 selector.setOutputChannel(channel1);27 selector.setDiscardChannel(channel2);28 channel.subscribe(selector);29 channel.send(new GenericMessage<String>("<message type='greeting'>Hello</message>"));30 channel.send(new GenericMessage<String>("<message type='greeting'>Hi</message>"));31 channel.send(new GenericMessage<String>("<message type='farewell'>Bye</message>"));32 channel.send(new GenericMessage<String>("<message type='farewell'>See you</message>"));33 System.out.println("Message 1 : " + channel1.receive());34 System.out.println("Message 2 : " + channel1.receive());35 System.out.println("Message 3 : " + channel2.receive());36 System.out.println("Message 4 : " + channel2.receive());37 }38}39Message 1 : GenericMessage [payload=Hello, headers={id=3e9bfb8d-7cc2-2c2b-6a0d-8d7a3e3e3b3e
XpathPayloadMessageSelector
Using AI Code Generation
1public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {2 public XpathPayloadMessageSelector(String expression) {3 super(expression);4 }5}6public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {7 public XpathPayloadMessageSelector(String expression) {8 super(expression);9 }10}11public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {12 public XpathPayloadMessageSelector(String expression) {13 super(expression);14 }15}16public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {17 public XpathPayloadMessageSelector(String expression) {18 super(expression);19 }20}21public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {22 public XpathPayloadMessageSelector(String expression) {23 super(expression);24 }25}26public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {27 public XpathPayloadMessageSelector(String expression) {28 super(expression);29 }30}31public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {32 public XpathPayloadMessageSelector(String expression) {33 super(expression);34 }35}36public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {37 public XpathPayloadMessageSelector(String expression) {38 super(expression);39 }40}41public class XpathPayloadMessageSelector extends AbstractXPathMessageSelector {42 public XpathPayloadMessageSelector(String expression) {43 super(expression);44 }45}
XpathPayloadMessageSelector
Using AI Code Generation
1import com.consol.citrus.channel.selector.XPathPayloadMessageSelector;2import org.springframework.integration.support.MessageBuilder;3import org.springframework.integration.Message;4import org.springframework.integration.channel.QueueChannel;5import org.springframework.integration.core.PollableChannel;6import org.springframework.integration.MessageChannel;7import org.springframework.integration.channel.DirectChannel;8import org.springframework.integration.core.MessageSelector;9import org.springframework.integration.message.GenericMessage;10public class 4 {11 public static void main(String[] args) {12 MessageChannel inputChannel = new DirectChannel();13 PollableChannel outputChannel = new QueueChannel();14 ((DirectChannel) inputChannel).subscribe(messageSelector, outputChannel);15 inputChannel.send(message);16 Message<?> receivedMessage = outputChannel.receive();17 System.out.println(receivedMessage.getPayload());18 }19}20import com.consol.citrus.channel.selector.XPathPayloadVariableExtractor;21import org.springframework.integration.support.MessageBuilder;22import org.springframework.integration.Message;23import org.springframework.integration.channel.QueueChannel;24import org.springframework.integration.core.PollableChannel;25import org.springframework.integration.MessageChannel;26import org.springframework.integration.channel.DirectChannel;27import org.springframework.integration.core.MessageSelector;28import org.springframework.integration.message.GenericMessage;29public class 5 {30 public static void main(String[] args) {31 MessageChannel inputChannel = new DirectChannel();32 PollableChannel outputChannel = new QueueChannel();33 ((DirectChannel) inputChannel).subscribe(messageSelector, outputChannel);34 inputChannel.send(message);35 Message<?> receivedMessage = outputChannel.receive();36 System.out.println(receivedMessage.getPayload());37 }38}
XpathPayloadMessageSelector
Using AI Code Generation
1messageSelector.setNamespaceContext(context);2XPathExpression expression = messageSelector.getXpathExpression();3XPathExpression expression = messageSelector.getXpathExpression();4variableExtractor.setNamespaceContext(context);5XPathExpression expression = variableExtractor.getXpathExpression();6XPathExpression expression = variableExtractor.getXpathExpression();7variableExtractor.setNamespaceContext(context);8XPathExpression expression = variableExtractor.getXpathExpression();9XPathExpression expression = variableExtractor.getXpathExpression();10variableExtractor.setNamespaceContext(context);11XPathExpression expression = variableExtractor.getXpathExpression();12XPathExpression expression = variableExtractor.getXpathExpression();13variableExtractor.setNamespaceContext(context);14XPathExpression expression = variableExtractor.getXpathExpression();15XPathExpression expression = variableExtractor.getXpathExpression();16variableExtractor.setNamespaceContext(context);17XPathExpression expression = variableExtractor.getXpathExpression();18XPathExpression expression = variableExtractor.getXpathExpression();19variableExtractor.setNamespaceContext(context);20XPathExpression expression = variableExtractor.getXpathExpression();21XPathExpression expression = variableExtractor.getXpathExpression();22variableExtractor.setNamespaceContext(context);23XPathExpression expression = variableExtractor.getXpathExpression();
XpathPayloadMessageSelector
Using AI Code Generation
1public void testXPathPayloadMessageSelector() {2 XpathPayloadMessageSelector selector = new XpathPayloadMessageSelector();3 selector.setXpathExpression(expression);4 selector.setValidationUtils(new XmlValidationUtils());5 assertTrue(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person>")));6 assertFalse(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person><person><name>John Doe</name></person>")));7}8public void testXPathPayloadMessageSelector() {9 XpathPayloadMessageSelector selector = new XpathPayloadMessageSelector();10 selector.setXpathExpression(expression);11 selector.setValidationUtils(new XmlValidationUtils());12 assertTrue(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person>")));13 assertFalse(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person><person><name>John Doe</name></person>")));14}15public void testXPathPayloadMessageSelector() {16 XpathPayloadMessageSelector selector = new XpathPayloadMessageSelector();17 selector.setXpathExpression(expression);18 selector.setValidationUtils(new XmlValidationUtils());19 assertTrue(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person>")));20 assertFalse(selector.acceptMessage(new DefaultMessage("<person><name>John Doe</name></person><person><name>John Doe</name></person>")));21}22public void testXPathPayloadMessageSelector() {23 XpathPayloadMessageSelector selector = new XpathPayloadMessageSelector();24 selector.setXpathExpression(expression);
XpathPayloadMessageSelector
Using AI Code Generation
1import org.springframework.context.annotation.Bean;2import org.springframework.context.annotation.Configuration;3import org.springframework.integration.dsl.IntegrationFlow;4import org.springframework.integration.dsl.IntegrationFlows;5import org.springframework.integration.dsl.MessageChannels;6import org.springframework.integration.dsl.Pollers;7import org.springframework.integration.scheduling.PollerMetadata;8import org.springframework.messaging.MessageChannel;9import org.springframework.messaging.PollableChannel;10public class XpathPayloadMessageSelectorDemo {11 public IntegrationFlow flow1() {12 .from("direct:input")13 .channel("xpathChannel")14 .get();15 }16 public IntegrationFlow flow2() {17 .from(MessageChannels.queue("xpathChannel", 10), c -> c.poller(Pollers.fixedDelay(500)))18 .handle("xpathPayloadMessageSelectorService", "handleMessage")19 .get();20 }21 public PollableChannel xpathChannel() {22 return MessageChannels.queue(10).get();23 }24 @Bean(name = PollerMetadata.DEFAULT_POLLER)25 public PollerMetadata poller() {26 return Pollers.fixedDelay(500).maxMessagesPerPoll(2).get();27 }28}29import com.consol.citrus.channel.selector.XpathPayloadMessageSelector;30import org.springframework.integration.annotation.ServiceActivator;31import org.springframework.messaging.Message;32import org.springframework.stereotype.Component;33public class XpathPayloadMessageSelectorService {34 @ServiceActivator(inputChannel =
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!