npm package: @genx/test
Description: Gen-X test framework
Author: Rockie Guo
Latest version: 2.1.5

# @genx/test

Gen-X test framework

## Usage

### testSuite

```
const testSuite = require('@genx/test');
testSuite(async (suite) => { ... }, options);
```

* Options:
    * before: async function run bofore the whole test suite
    * after: async function run after the whole test suite
    * beforeEach: async function run bofore each test suite
    * afterEach: async function run after each test suite
    * serverEntry {string}: server entry file to be instrumented for code coverage
    * verbose {boolean}: verbose output mode
    * skip {boolean}: skip the whole test suite
    * only {boolean}: run this test suite only
    * testDir {string='test'}: test case root directory 

### testCase

```
suite.testCase('test case name', async () => { ... }, options);
```

* Options:
    * data
    * cleanUp
    * skip
    * only

### testCaseFromFixtures

```
suite.testCaseFromFixtures('test case name', async (data) => { ... }, options);
```

data are loaded from `fixtures/<suite name>.js`
```
{
    cases: {
        '<test case name>': [
            {
                params: {
                    key1: 'value1',
                    key2: () => 'value2' //generator 
                },
                expected: {}
            }
        ]
    },
    // others to be added into test report
    // description, epic, feature, owner, tag, issues, severity
}
```

## Helpers inside test case

### startWebServer_

Start a @genx/server instance for code coverage testing.

### startWorker_

Start a @genx/app worker to faciliate testing with features.

### startRestClient_

Start a http client with customzable authencation

### benchmark_

Run benchmark against a group of different methods.

### testStep

Define a test step to show progress in the test report.

### attathObject

Attach an object to the test report.

## Setup test scripts

* Add below scripts into package.json
  * Set NODE_RT=babel to enable directly testing against untranspiled ES code.
  * Set COVER_MODE=1 to enable web server code coverage and replace superagent with supertest.

```
"test:clean": "rm -rf allure-results",
```

```
"test": "npm run test:clean && cross-env NODE_RT=babel mocha --reporter mocha-multi --reporter-options mocha-multi=test/mocha-multi-reporters.json test/*.spec.js",
```

```
"cover": "npm run test:clean && cross-env COVER_MODE=1 NODE_RT=babel nyc --reporter=html --reporter=text -- mocha --reporter progress test/*.spec.js && open ./coverage/index.html",
```

```
"report": "allure generate allure-results --clean -o allure-report && allure open allure-report"
```

## Setup test configs

* test/mocha-multi-reporters.json
```
{    
    "progress": {
        "stdout": "-",        
        "options": {
            "verbose": true
        }
    },
    "allure-mocha": {
        "stdout": "-",
        "options": {
            "resultsDir": "./allure-results"
        }
    }
}
```

* test/conf/test.*.json e.g. test.default.json
See 

## Test spec file sample

```
const testSuite = require("@genx/test");
const Expression = require("@genx/jes");

testSuite(function (suite) {
    suite.testCase("login and get profile", async function () {
        await suite.startRestClient_("<endpointKey>", "<userIdentityKey>", async (app, client) => {
            await suite.testStep_("my-profile", async () => {
                const myProfile = await client.get(["my-profile"]);

                Expression.match(myProfile, {
                    status: "success",
                    response: {
                        id: { $exists: true },
                        agency: { $exists: true },
                        user: { $exists: true },
                    },
                })[0].should.be.ok();
            });
        });
    }, {});
}, { verbose: true });
```

## Local config to run specific cases only or to skip specified cases

```
module.exports = {
    only: [
        // similar to describe.only
        // 
    ],
    skip: [
        // similar to describe.skip
    ]
}
```

Note: another way to do the same thing is to put skip or only in the suite options or test case options passed in through testSuite() and suite.testCase(). 

"skip" and "only" option will override those specified in the config.

## License

  MIT