# Testing

## Unit Tests

We are using Vitest.

Simply run `pnpm test` to run all the tests locally.

## Integration Tests

We are using Vitest to test the following concerns:

1. Main application flows and integration of different services
2. Containerize execution of all services
3. Cross-service network calls

Integration tests are based pre-built Docker images, so you can run it in 2 modes:

#### Running from built artifact (Docker)

**To run integration tests locally with a built artifact, you need to build a Docker image for the
services. **

Use `pnpm integration:prepare` command to set up the complete environment from locally running
integration tests.

And then, to run the tests, use the following:

```
pnpm test:integration
```

> Make sure to run the prepare command every time you change your code.

#### Running from source code (local services)

You can also run integration tests against the local-running services, during development.

To do so, use the following instructions:

1. Run Hive from VSCode (using `Start Hive` button).
2. Make sure all services are running correctly.
3. Run integration tests with `pnpm dev:integration` command (from root directory).

#### Running from Pre-Built Docker Image

To run integration tests locally, from the pre-build Docker image, follow:

1. Install all deps: `pnpm i`
2. Generate types: `pnpm graphql:generate`
3. Build only addition, local CF Workers source code, by running:
   `pnpm --filter integration-tests prepare:env`
4. Decide on the commit ID / Docker image tag you would like to use (make sure `build-and-dockerize`
   is done successfully)
5. Set the needed env vars, and use Docker Compose to run all local services:

   ```bash
   export DOCKER_REGISTRY="ghcr.io/graphql-hive/"
   export DOCKER_TAG=":IMAGE_TAG_HERE"
   
   docker compose -f ./docker/docker-compose.community.yml -f ./integration-tests/docker-compose.integration.yaml --env-file ./integration-tests/.env up -d --wait
   ```

6. Run the tests: `pnpm --filter integration-tests test:integration`

## E2E Tests

We use [Cypress](https://www.cypress.io). Any file that ends with `.cy.ts` is an E2E test.

#### Running Against Local Development Services

1. Run the [development setup](./DEVELOPMENT.md) as usual.
2. Run `pnpm test:e2e:local`

#### Running Against Locally Built Docker Images

1. Make sure you have Docker installed. If you are having issues, try to run `docker system prune`
   to clean the Docker caches.
2. Install all deps: `pnpm i`
3. Move into the `cypress` folder (`cd cypress`)
4. Run `./local.sh` for building the project and starting the Docker containers
5. Follow the output instruction from the script for starting the tests

#### Running Against Pre-Built Docker Images

1. Make sure you have Docker installed. If you are having issues, try to run `docker system prune`
   to clean the Docker caches.
2. Install all deps: `pnpm i`
3. Generate types: `pnpm graphql:generate`
4. Build source code: `pnpm build`
5. Decide on the commit ID / Docker image tag you would like to use and set it as env var:
   ```bash
   export DOCKER_REGISTRY="ghcr.io/graphql-hive/"
   export DOCKER_TAG=":IMAGE_TAG_HERE"
   ```
6. Run the e2e environment, by running:
   ```
   docker compose \
     -f ./docker/docker-compose.community.yml \
     -f ./docker/docker-compose.end2end.yml \
     --env-file ./integration-tests/.env \
     up -d --wait
   ```
7. Run Cypress: `pnpm test:e2e`

#### Docker Compose Configuration

Keep in mind that integration tests are running a combination of 2 Docker Compose files:

1. `docker-compose.community.yml` - this is also used for self-hosting Hive, so this file contains
   all services and configurations needed for running Hive core (without Cloud-specific services,
   like billing).
2. `docker-compose.integration.yaml` - An extension and overrides file: we are using that file to
   run local services such as CloudFlare CDN mock, external composition service and so on - this is
   done in order to mock a complete Hive Cloud environment and test all features. **This file also
   includes overrides such as environment variables that are specific only for integration testing -
   so make sure to choose wisely where to add environment variables!**

## Troubleshoot

If you are having issues with running Docker images, follow these instructions:

1. Make sure you have the latest Docker installed.
2. Make sure no containers are running (`docker ps` and then `docker stop CONTAINER_ID`).
3. Delete the local volume used for testing, it's located under `.hive` directory.
4. Try to run `docker system prune` to clean all the Docker images, containers, networks and caches.
