• Stars
    star
    322
  • Rank 126,028 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 8 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Emulates ioredis by performing all operations in-memory.

ioredis-mock ยท npm npm version Redis Compatibility: 65% semantic-release

This library emulates ioredis by performing all operations in-memory. The best way to do integration testing against redis and ioredis is on a real redis-server instance. However, there are cases where mocking the redis-server is a better option.

Cases like:

  • Your workflow already use a local redis-server instance for the dev server.
  • You're on a platform without an official redis release, that's even worse than using an emulator.
  • You're running tests on a CI, setting it up is complicated. If you combine it with CI that also run selenium acceptance testing it's even more complicated, as two redis-server instances on the same CI build is hard.
  • The GitHub repo have bots that run the testing suite and is limited through npm package.json install scripts and can't fire up servers. (Having Renovatebot notifying you when a new release of ioredis is out and wether your code breaks or not is awesome).

Check the compatibility table for supported redis commands.

Usage (try it in your browser with RunKit)

const Redis = require('ioredis-mock')
const redis = new Redis({
  // `options.data` does not exist in `ioredis`, only `ioredis-mock`
  data: {
    user_next: '3',
    emails: {
      '[email protected]': '1',
      '[email protected]': '2',
    },
    'user:1': { id: '1', username: 'superman', email: '[email protected]' },
    'user:2': { id: '2', username: 'batman', email: '[email protected]' },
  },
})
// Basically use it just like ioredis

Browser usage (Experimental)

There's a browser build available. You can import it directly (import Redis from 'ioredis-mock/browser.js'), or use it on unpkg.com:

import Redis from 'https://unpkg.com/ioredis-mock'

const redis = new Redis()
redis.set('foo', 'bar')
console.log(await redis.get('foo'))

Breaking Changes

from v7 to v8

ioredis@v4 support dropped

ioredis@v5 is the new baseline. Stay on ioredis-mock@v7 until you're ready to upgrade to ioredis@v5.

PromiseContainer has been removed.

Support for third-party Promise libraries is dropped. The native Promise library will always be used.

from v6 to v7

createConnectedClient is removed

Replace it with .duplicate() or use another new Redis instance.

Dropped support for Node v10

It's been EOL since Apr, 2021 and it's recommended to upgrade to v14.x LTS.

ioredis-mock/jest.js is removed

ioredis-mock is no longer doing a import { Command } from 'ioredis' internally, it's now doing a direct import import Command from 'ioredis/built/command' and thus the jest.js workaround is no longer needed:

-jest.mock('ioredis', () => require('ioredis-mock/jest'))
+jest.mock('ioredis', () => require('ioredis-mock'))

from v5 to v6

Before v6, each instance of ioredis-mock lived in isolation:

const Redis = require('ioredis-mock')
const redis1 = new Redis()
const redis2 = new Redis()

await redis1.set('foo', 'bar')
console.log(await redis1.get('foo'), await redis2.get('foo')) // 'bar', null

In v6 the internals were rewritten to behave more like real life redis, if the host and port is the same, the context is now shared:

const Redis = require('ioredis-mock')
const redis1 = new Redis()
const redis2 = new Redis()
const redis3 = new Redis(6380) // 6379 is the default port

await redis1.set('foo', 'bar')
console.log(
  await redis1.get('foo'), // 'bar'
  await redis2.get('foo'), // 'bar'
  await redis3.get('foo') // null
)

And since ioredis-mock now persist data between instances, you'll likely need to run flushall between testing suites:

const Redis = require('ioredis-mock')

afterEach(done => {
  new Redis().flushall().then(() => done())
})

Pub/Sub channels

We also support redis publish/subscribe channels. Like ioredis, you need two clients:

const Redis = require('ioredis-mock')
const redisPub = new Redis()
const redisSub = new Redis()

redisSub.on('message', (channel, message) => {
  console.log(`Received ${message} from ${channel}`)
})
redisSub.subscribe('emails')
redisPub.publish('emails', '[email protected]')

Lua scripting

You can use the defineCommand to define custom commands using lua or eval to directly execute lua code.

In order to create custom commands, using lua scripting, ioredis exposes the defineCommand method.

You could define a custom command multiply which accepts one key and one argument. A redis key, where you can get the multiplicand, and an argument which will be the multiplicator:

const Redis = require('ioredis-mock')
const redis = new Redis({ data: { k1: 5 } })
const commandDefinition = {
  numberOfKeys: 1,
  lua: 'return redis.call("GET", KEYS[1]) * ARGV[1]',
}
redis.defineCommand('multiply', commandDefinition) // defineCommand(name, definition)
// now we can call our brand new multiply command as an ordinary command
redis.multiply('k1', 10).then(result => {
  expect(result).toBe(5 * 10)
})

You can also achieve the same effect by using the eval command:

const Redis = require('ioredis-mock')
const redis = new Redis({ data: { k1: 5 } })
const result = redis.eval(`return redis.call("GET", "k1") * 10`)
expect(result).toBe(5 * 10)

note we are calling the ordinary redis GET command by using the global redis object's call method.

As a difference from ioredis we currently don't support:

  • dynamic key number by passing the number of keys as the first argument of the command.
  • automatic definition of the custom command buffer companion (i.e. for the custom command multiply the multiplyBuffer which returns values using Buffer.from(...))
  • the evalsha command
  • the script command

Cluster(Experimental)

Work on Cluster support has started, the current implementation is minimal and PRs welcome #359

const Redis = require('ioredis-mock')

const cluster = new Redis.Cluster(['redis://localhost:7001'])
const nodes = cluster.nodes()
expect(nodes.length).toEqual(1)

Roadmap

You can check the roadmap project page, and the compat table, to see how close we are to feature parity with ioredis.

I need a feature not listed here

Just create an issue and tell us all about it or submit a PR with it! ๐Ÿ˜„

More Repositories

1

scroll-into-view-if-needed

Element.scrollIntoView ponyfills for things like "if-needed" and "smooth"
JavaScript
1,065
star
2

react-spring-bottom-sheet

Accessible โ™ฟ๏ธ, Delightful โœจ, & Fast ๐Ÿš€
TypeScript
894
star
3

compute-scroll-into-view

Utility for calculating what should be scrolled, how it's scrolled is up to you
TypeScript
199
star
4

smooth-scroll-into-view-if-needed

Smoothly scroll elements into view, cross browser!
TypeScript
136
star
5

uikit-react

UIkit components built with React
JavaScript
111
star
6

bulma-loader

A Webpack loader for Bulma, a modern CSS framework based on Flexbox
JavaScript
34
star
7

redux-saga-sc

Provides sagas to easily dispatch redux actions over SocketCluster websockets
JavaScript
34
star
8

String.Slugify.js

Extends the String native object to have a slugify method, useful for url slugs.
JavaScript
27
star
9

epic

React example project, that takes you from fun development to high quality production
TypeScript
21
star
10

groqz

(experimental) Transforms GROQ strings to zod schemas in your TypeScript codebase.
TypeScript
14
star
11

nextjs-cv-cms-sanity-v3

My over-engineered CV
TypeScript
11
star
12

String.Inflector.js

Extends the String native with inflector methods, like pluralize and singularize.
9
star
13

uikit-loader

A Webpack CSS loader for UIkit, a lightweight and modular front-end framework for developing fast and powerful web interfaces
JavaScript
9
star
14

Element.Style.Transform.js

Provides a cross browser way of letting you use the CSS3 transform property. Inspired by http://github.com/zachstronaut/jquery-css-transform
JavaScript
9
star
15

public-talks

Slides and other stuff is all in this repo. Each talk is on its own branch
7
star
16

svgdiff

See the visual difference between two SVGs
TypeScript
7
star
17

redux-form-uikit

A set of wrapper components to facilitate using UIkit React with Redux Form
JavaScript
5
star
18

cocody.dev

My own website, wanna do some small blogging and share my fav resources.
JavaScript
3
star
19

system-font-stack

Give your web app a native look by using the font family of the users OS
TypeScript
3
star
20

react-transform-count-renders

React Transform that lets you console.count how many times your React components render
JavaScript
3
star
21

sanity-meetup-08-22

"v3 does what v2 don't"
TypeScript
3
star
22

trains

choo choo ๐Ÿš‚
JavaScript
2
star
23

postcss-import-svg

JavaScript
2
star
24

example-v3-studio

TypeScript
2
star
25

postcss-custom-properties-fallback

Adds fallbacks to your CSS var() functions
JavaScript
2
star
26

next-sanity-preview

JavaScript
2
star
27

express-pretty-error

Express compatible middleware for pretty errors in html, json, raw text, css and terminal contexts with stack traces included!
JavaScript
2
star
28

template-marketing-webapp-nextjs

TypeScript
1
star
29

serve-dynamic-favicon

middleware that serve dynamically generated favicons
JavaScript
1
star
30

redux-saga-sc-demo

A demo chat app showing redux-saga-sc in action
JavaScript
1
star
31

example-npm

An example GitHub Action using npm
JavaScript
1
star
32

stipsan.me

My own personal website, don't really need one but it's a good excuse to try new tools and experiment ๐Ÿš€
JavaScript
1
star
33

cancelpineapple.pizza

HTML
1
star
34

hyperfokus

Hyperfocus your todos until they're done
TypeScript
1
star
35

themer

Create Sanity Studio v3 themes!
TypeScript
1
star
36

stipsan

1
star
37

example-v3-studio-next-runtime

A fork of stipsan/example-v3-studio to get around Vercel's "3 linked projects per repo" limit
TypeScript
1
star
38

top-github-code-reviewers

Showcase your most active code reviewers
JavaScript
1
star
39

scroll-into-view.dev

TypeScript
1
star
40

links

Because browser bookmarks sucks
1
star
41

renovate-presets

JavaScript
1
star
42

potatoes.fyi

HTML
1
star
43

nextjs-blog-cms-sanity-v3-netlify-test

TypeScript
1
star
44

vc-app

TypeScript
1
star
45

graphql-field-resolver-to-typescript

Export ts definitions from your server .graphql files to strictly type your field resolvers
TypeScript
1
star
46

gulp-purge-sourcemaps

Cleans up after gulp-sourcemaps have done a sourcemaps.write() allowing you to combine streams that generate both dev assets with sourcemaps and minified production assets.
JavaScript
1
star
47

sanity-template-gatsby-lps

JavaScript
1
star