# Testing

Tests are intended to be run either on development machines (`NODE_ENV=development`) or on a test server such as circleci (`NODE_ENV=circleci`). This documentation concentrates on the development testing experience.

## Setup

We use [Mocha](https://mochajs.org/) for unit-testing and [Nightwatch](http://nightwatchjs.org) for end-to-end (e2e) testing. To run end-to-end tests on your machine you will have to first install Selenium and the Google Chrome Driver manually.

### Install Selenium

Download the [selenium-server-standalone-2.44.0.jar](http://selenium-release.storage.googleapis.com/2.44/selenium-server-standalone-2.44.0.jar) and move it to `bin/selenium-server-standalone-2.44.0.jar`

On MacOSX Yosemite, you might also need to install Java (yes, I know\... don't look at me this way...). You can download it from [this page](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html).

### Install the Chrome Driver

Download the chrome driver from <https://sites.google.com/a/chromium.org/chromedriver/downloads>, unzip it and move it to `test/lib/chromedriver`

### Database

Create an `opencollective_test` database accessible to user `opencollective`; each e2e test will reset its schema as required.

```
$> createdb opencollective_test
$> psql opencollective_test -c "GRANT ALL PRIVILEGES ON DATABASE opencollective_test to opencollective"
```

### Code

Check out `api`, `website` and `app` Git repositories, preserving their original directory names.

```
$> git clone https://github.com/OpenCollective/api.git
$> git clone https://github.com/OpenCollective/website.git
$> git clone https://github.com/OpenCollective/app.git
```

### Environment

Create `.env` files in your `api`, `website` and `app` checkouts:

**`api/.env` file**

```
NODE_ENV=development
WEBSITE_DIR=/path/to/your/opencollective/website
APP_DIR=/path/to/your/opencollective/app
```

**`website/.env` and `app/.env` files**

```
NODE_ENV=development
API_DIR=/path/to/your/opencollective/api
GITHUB_CLIENT_ID=xxxx [replace with your Github app id]
GITHUB_CLIENT_SECRET=xxx [replace with your Github app client secret]
```

## Test

* run unit- and e2e-tests: `npm test`
* run unit-tests: `npm run test:unit`
* run e2e-tests: `npm run test:e2e`
* run single unit-test: instrument test `describe` or `it` with `.only` flag
* run single e2e-test file: `npm run test:e2e path/to/e2e/test.js`, e.g from API directory: `npm run test:e2e ../website/test/e2e/public_donation_page.js`. The script will detect whether it is a `website` or `api` test file and launch the client and its nightwatch test accordingly.

### How to debug an e2e test that failed?

* Run the API:

  `$opencollective-api> PG_DATABASE=opencollective_test npm run dev`
* Reset the database:

  `$> curl http://localhost:3060/database/reset`
* Run the website

  `$opencollective-website> npm run dev`
* Open your browser at the URL of the test that is failing, e.g.

  `open http://localhost:3000/testcollective`

If you want to rerun a particular e2e test file, you can run `npm run nightwatch $file` (e.g. `npm run nightwatch test/e2e/expenses_page.js`)

### How to debug when GitHub is challenging the oAuth process?

* Run the api with the `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` env variables (you can find them [here](https://github.com/organizations/OpenCollective/settings/applications/346712)).
* Run the website, go to <http://localhost:3000/opensource/apply> and go through the flow. Use the login `opencollectivetest` and the password that is stored in 1Password.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentarians.gitbook.io/metadocumentation/clone/internal/testing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
