Skip to content

Jest preset for running tests with local ElasticSearch

License

Notifications You must be signed in to change notification settings

shelfio/jest-elasticsearch

Repository files navigation

jest-elasticsearch

Jest preset for running tests with local ElasticSearch

How to mock Elasticsearch with Jest?

Usage

0. Install

$ yarn add @shelf/jest-elasticsearch --dev

1. Create jest.config.js

module.exports = {
  preset: '@shelf/jest-elasticsearch'
};

If you have a custom jest.config.js make sure you remove testEnvironment property, otherwise it will conflict with the preset.

2. Create jest-es-config.js

module.exports = () => {
  return {
    esVersion: '8.4.0', // ! must be exact version. Ref: https://github.com/elastic/elasticsearch-js .
    // don't be shy to fork our code and update deps to correct.
    clusterName: 'your-cluster-name',
    nodeName: 'your-node-name',
    port: 9200,
    indexes: [
      {
        name: 'your-index-name',
        body: {
          settings: {
            number_of_shards: '1',
            number_of_replicas: '1'
          },
          aliases: {
            'your-alias': {}
          },
          mappings: {
            dynamic: false,
            properties: {
              //here you should paste your mapping
              //Example:
              id: {
                type: 'keyword'
              }
            }
          }
        }
      }
    ]
  };
};

4. PROFIT! Write tests

it();

Monorepo Support

By default the jest-es-config.js is read from cwd directory, but this might not be suitable for monorepos with nested jest projects with nested jest.config.* files nested in subdirectories.

If your jest-es-config.js file is not located at {cwd}/jest-es-config.js or you are using nested jest projects, you can define the environment variable JEST_ELASTICSEARCH_CONFIG with the absolute path of the respective jest-es-config.js file.

Example Using JEST_ELASTICSEARCH_CONFIG in nested project

// src/nested/project/jest.config.js
const path = require('path');

// Define path of project level config - extension not required as file will be imported
// via `require(process.env.JEST_ELASTICSEARCH_CONFIG)`
process.env.JEST_ELASTICSEARCH_CONFIG = path.resolve(__dirname, './jest-es-config');

module.exports = {
  preset: '@shelf/jest-elasticsearch'
  displayName: 'nested-project',
};

Troubleshooting

Issue running tests locally - Exception in thread "main"
Exception in thread "main'
java.lang.UnsupportedOperationException The Security Manager is deprecated and will be removed in a future release
at java.base/java.lang.System.setSecurityManager(System. java: 416)
at ora.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.iava:71

The main reason why this issue appears is that you have an incompatible java version installed to run elastic locally.

What to do?

  1. List current java versions
$ /usr/libexec/java_home -V
  1. If you see version 18.0.x Add this command to your bashrc, zshrc, etc
$ /usr/libexec/java_home -v 18
  1. If you see no versions or do not have a compatible version installed - Install version 18 https://www.oracle.com/java/technologies/downloads/#java18

  2. Reload the console and check the java version with

$ java -version

Output for proper work

$ java -version
java version "18.0.2.1"
Java(TM) SE Runtime Environment (build 18.0.2.1+1-1)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)
  1. Go to step 2 and set version 18.xx as a default for the shell

Note: If you need to run elastic <= v7.17.x locally, then perform the steps above but for the java version 1.8.xxx

See Also

Publish

$ git checkout master
$ yarn version
$ yarn publish
$ git push origin master --tags

Create and publish a GitHub release with your tag

  1. Go to repository
  2. Select Releases
  3. Select Draft a new release
  4. Choose a tag, fill title and describe changes
  5. Press a Publish release

License

MIT © Shelf