# ARMTEST

Funzionalità per il run di test su progetti Armundia.

## Basic usage

Dipendenza da utilizzare:

```xml
<dependency>
  <groupId>com.armundia.tech</groupId>
  <artifactId>armtest</artifactId>
  <version>1.0.2</version>
</dependency>
```

Utilizzo per una classe di test (con o senza `@Testable`) e metodi `@Test`:

```java
class MioPrimoTest extends ArmUnitTest {
 
  @Inject 
  private CdiTestService service;

  @Test
  void test01_base() {
    String info = service.readInfo();
    assertNotNull(info, "info must be not null");
  }
}

```

da notare l'uso di una classe base `ArmUnitTest` per i test.
Questo permetterà di avere:

* supporto completo CDI (auto discovery anche su più jar dei bean)
  * unico limite: i bean devono essere esplicitamente indicati con un'annotazione `@Dependent`, `@RequestScoped`, `@SessionScoped` o `@ApplicationScoped`
* supporto `@PersistenceContext` (normalmente disponibile solo in contesto Enterprise)

## supporto scenari DB via file H2

```java
@Scenario(name = "one", order = 1)
class ScenarioOne extends ArmUnitTest {

  @Inject
  private OneService service;
  
  @Test
  void test01_query() {
    List<ApDom> dom = service.getApDom("CMA_ASSET_CLASS_INFO");
    assertTrue(!dom.isEmpty(), "dominio CMA_ASSET_CLASS_INFO vuoto/non trovato");
  }
}
```

Dove il servizio `OneService` è, ad esempio, con accesso al db tramite `EntityManager`:

```java

@Dependent
public class OneService {

  @PersistenceContext
  private EntityManager em;

  public List<ApDom> getApDom(String cod) {
    TypedQuery<ApDom> query = em.createQuery("SELECT a FROM ApDom a WHERE a.id.codCampo = :cod", ApDom.class);
    query.setParameter("cod", cod);
    return query.getResultList();
  }

}

```

userà il database per lo scenario **`one`** che corrisponde al database, H2, in:
`resources\META-INF\scenarios`
  `one.mv.db`
  a cui corrisponde il file:
  `one.trace.db`

Oltre questa modalità con i file `.db`, è supportato il recupero di tali file da un file `.zip` (per ridurre lo spazio utilizzato).

Altre modalità supportate:

**script aggiuntivo** a partire da un database esistente:

```java
@Scenario(name = "one", scripts = "META-INF/scenarios/add-datas.sql")
```

**script db completo** a partire da un database vuoto (in memoria):

```java
@Scenario(name = "one", asResource=false, scripts = "META-INF/scenarios/from-scratch.sql")
```

**script db multipli** a partire da un database vuoto in memoria (base non esiste come risorsa):

```java
@Scenario(name = "base", scripts = "META-INF/scenarios/from-scratch.sql,META-INF/scenarios/more.sql")
```

## Auto test per tutti i Pojo di un package (!)

```java

  List<String> errors = ArmTest.instance().testPojosInPackage("com.armundia.armtest.testpojo");
  
  // eventualmente aggiungere un controllo, ma già la riga precedente
  // aumenta la coverage richiamando tanti get/set
  assertEquals(0, errors.size(), "expected no errors");

```

Oppure:

````java

  List<String> errors = ArmTest.instance().testPojos(
    null, // nessuna annotation in particolare
    "com.armundia.armtest.testpojo", "com.armundia.armtest.testpojo");
  
  // eventualmente aggiungere un controllo, ma già la riga precedente
  // aumenta la coverage richiamando tanti get/set
  assertEquals(0, errors.size(), "expected no errors");

````

## MAVEN run test commands

da bash shell:

```bash
mvn test
```

con report coverage:

```bash
mvn test jacoco:report
```

## Future features

* verifica supporto Rest JAX-RS

## Release commands

Follow the steps to release a maven package into Nexus Repository

Assure that the `pom.xml` has the `<scm>` tag that points to the git developer connection and manage takes the HEAD commit of your repository.

```xml
<scm>
    <developerConnection>scm:git:{git-http-connection}</developerConnection>
    <tag>HEAD</tag>
</scm>
```

`mvn release:clean`

`mvn release:prepare`

After, if it goes all well, **push** the commits and the tag created by the execution and run:
`mvn release:perform`

If something about `mvn release:perform` goes wrong and we want to revert all the `release` stuff, we need to remove the commit and tag created by the execution and run:
`mvn release:rollback`

## Release

Qui sono indicate le release finora effettuate.

### Next Release

#### 1.0.2

Major release con:

* supporto CDI/Junit 5
* supporto scenari di test db, basati su h2

#### 0.0.1

* Released the package... TODO
