https://github.com/sectorlabs/keycloak-mock
Node.js package for mocking a Keycloak server in unit tests.
https://github.com/sectorlabs/keycloak-mock
Last synced: over 1 year ago
JSON representation
Node.js package for mocking a Keycloak server in unit tests.
- Host: GitHub
- URL: https://github.com/sectorlabs/keycloak-mock
- Owner: SectorLabs
- License: mit
- Created: 2020-02-26T12:02:54.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-05T10:59:06.000Z (over 3 years ago)
- Last Synced: 2025-04-11T07:17:40.524Z (over 1 year ago)
- Language: TypeScript
- Size: 486 KB
- Stars: 23
- Watchers: 26
- Forks: 17
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Keycloak Mock
[](http://doge.mit-license.org)
[](http://badge.fury.io/js/keycloak-mock)

A minimal mock for a Keycloak server to be used in unit tests.
This mock is not complete and it definitely doesn't match Keycloak completely. Improvements are welcome.
## About
This does not launch an actual HTTP server. It uses [`nock`](https://github.com/nock/nock) to patch Node.js HTTP client to intercept requests.
Tested with Node.js 8.x, 10.x, 12.x, 13.x
### What works
* `GET /[realm]/protocol/openid-connect/certs`
* `GET /[realm]/protocol/openid-connect/userinfo`
* `GET /admin/realms/[realm]/users`
* `GET /admin/realms/[realm]/users?username=myusername`
* `POST /[realm]/protocol/openid-connect/token`
* `GET /admin/realms/[realm]/users/[userid]`
* `DELETE /admin/realms/[realm]/users/[userid]`
* `POST /admin/realms/[realm]/users`
## Usage
### Basic
import * as KeycloakMock from "keycloak-node-mock";
const keycloak = await KeycloakMock.createMockInstance({
authServerURL: "https://myserver.com/auth",
realm: "myrealm",
clientID: "client-1",
clientSecret: "test",
});
// all requests to `https://myserver.com/auth` will now be
// intercepted and replied to
const mock = KeycloakMock.activateMock(keycloak);
// create a user and a token for it
const user = keycloak.database.createUser({
name: "test",
email: "hello@hello.com", // username will be email
credentials: [{
value: "mypassword",
}],
});
console.log(user.profile, user.credentials);
const token = keycloak.createBearerToken(user.profile.id);
// get active mock without a reference
const sameMock = KeycloakMock.getMock("https://myserver.com/auth");
// clear user database
mock.instance.database.clear();
// find user profile
const sameUser = mock.instance.database.findUserByID(user.profile.id);
// de-activate the mock
KeycloakMock.deactivateMock(sameMock);
## Custom handlers
import * as KeycloakMock from "keycloak-node-mock";
const keycloak = await KeycloakMock.createMockInstance({
authServerURL: "https://myserver.com/auth",
realm: "myrealm",
clientID: "client-1",
});
keycloak.activateMock(keycloak, {
listCertificatesView: (instance, request) => {
return [500, ""];
},
getUser: (instance, request) => {
// might be null if not authorized
console.log(request.user);
return [500, ""];
},
deleteUser: (instance, request) => {
return [500, ""];
},
getUserInfoView: (instance, request) => {
return [500, ""];
},
listUsers: (instance, request) => {
return [500, ""];
},
createTokenView: (instance, request, body) => {
return [500, ""];
},
createUserView: (instance, request, body) => {
return [500, ""];
},
});