= Application Composer Advanced
:jbake-type: page
:jbake-status: published
:index-group: Testing

link:getting-started.html[Getting Started] page gives you already a lot
of inputs but you caneven go further.

== @Descriptors

You can reuse existing file descriptors using `@Descriptors`. The name
is the file name and the path either a classpath path or a file path:

[source,java]
----
// runner if needed etc...
@Descriptors(@Descriptor(name = "persistence.xml", path = "META-INF/persistence.xml"))
public class MyTest {
   //...
}
----

Note: this can be put in a `@Module` method as well.

== Services

If you want to test a JAXRS or JAXWS service you need to activate these
services.

To do so just add the needed dependency and use `@EnableServices`:

[source,java]
----
// runner if needed etc...
@EnableService("jaxrs") // jaxws supported as well
public class MyTest {
   //...
}
----

== Random port

Services like JAXRS and JAXWS relies on HTTP. Often it is nice to have a
random port to be able to deploy multiple tests/projects on the same CI
platform at the same time.

To shortcut all the needed logic you can use `@RandomPort`. It is simply
an injection giving you either the port (`int`) or the root context
(`URL`):

[source,java]
----
// runner, services if needed etc...
public class MyTest {
   @RandomPort("http")
   private int port;
}
----

Note: you can generate this way multiple ports. The value is the name of
the service it will apply on (being said http is an alias for httpejbd
which is our embedded http layer).

== Nice logs

`@SimpleLog` annotation allows you to have one liner logs

== @JaxrsProvider

`@JaxrsProvider` allows you to specify on a `@Module` method the list of
JAXRS provider you want to use.

== Dependencies without hacky code

`@Jars` allows you to add dependencies (scanned) to your application
automatically (like CDI libraries):

[source,java]
----
@Module
@Classes(cdi = true, value = { C1.class, C2.class, E1.class })
@Jars("deltaspike-")
public WebApp app() {
    return new WebApp();
}
----

== @Default

`@Default` automatically adds in the application `target/classes` as
binaries and `src/main/webapp` as resources for maven projects.

== @CdiExtensions

This annotation allows you to control which extensions are activated
during the test.

== @AppResource

This annotation allows injection of few particular test resources like:

* the test `AppModule` (application meta)
* the test `Context` (JNDI)
* the test `ApplicationComposers` (underlying runner)
* `ContextProvider`: allow to mock JAXRS contexts

== @MockInjector

Allows to mock EJB injections. It decorates a dedicated method returning
an instance (or Class) implementing `FallbackPropertyInjector`.

== @WebResource

Allow for web application to add folders containing web resources.
