2023-02-03 10:45:11 +00:00
|
|
|
// tslint:disable:no-unused-expression
|
|
|
|
import { faker } from "@faker-js/faker";
|
|
|
|
import { fail } from "assert";
|
|
|
|
import * as chai from "chai";
|
|
|
|
import { KeycloakAdminClient } from "../src/client.js";
|
|
|
|
import type GroupRepresentation from "../src/defs/groupRepresentation.js";
|
|
|
|
import type { PartialImportRealmRepresentation } from "../src/defs/realmRepresentation.js";
|
|
|
|
import { credentials } from "./constants.js";
|
|
|
|
|
|
|
|
const expect = chai.expect;
|
|
|
|
|
|
|
|
const createRealm = async (kcAdminClient: KeycloakAdminClient) => {
|
2024-10-30 11:14:02 +00:00
|
|
|
const realmId = faker.internet.username().toLowerCase();
|
|
|
|
const realmName = faker.internet.username().toLowerCase();
|
2023-02-03 10:45:11 +00:00
|
|
|
const realm = await kcAdminClient.realms.create({
|
|
|
|
id: realmId,
|
|
|
|
realm: realmName,
|
|
|
|
});
|
|
|
|
expect(realm.realmName).to.be.equal(realmName);
|
|
|
|
|
|
|
|
return { realmId, realmName };
|
|
|
|
};
|
|
|
|
|
|
|
|
const deleteRealm = async (
|
|
|
|
kcAdminClient: KeycloakAdminClient,
|
2023-07-11 14:03:21 +00:00
|
|
|
currentRealmName: string,
|
2023-02-03 10:45:11 +00:00
|
|
|
) => {
|
|
|
|
await kcAdminClient.realms.del({ realm: currentRealmName });
|
|
|
|
const realm = await kcAdminClient.realms.findOne({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(realm).to.be.null;
|
|
|
|
};
|
|
|
|
|
|
|
|
describe("Realms", () => {
|
|
|
|
let kcAdminClient: KeycloakAdminClient;
|
|
|
|
let currentRealmId: string;
|
|
|
|
let currentRealmName: string;
|
|
|
|
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("list realms", async () => {
|
|
|
|
const realms = await kcAdminClient.realms.find();
|
|
|
|
expect(realms.length).to.be.least(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("create realm", async () => {
|
2024-10-30 11:14:02 +00:00
|
|
|
const realmId = faker.internet.username().toLowerCase();
|
|
|
|
const realmName = faker.internet.username().toLowerCase();
|
2023-02-03 10:45:11 +00:00
|
|
|
const realm = await kcAdminClient.realms.create({
|
|
|
|
id: realmId,
|
|
|
|
realm: realmName,
|
|
|
|
});
|
|
|
|
expect(realm.realmName).to.be.equal(realmName);
|
|
|
|
currentRealmId = realmId;
|
|
|
|
currentRealmName = realmName;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("get a realm", async () => {
|
|
|
|
const realm = await kcAdminClient.realms.findOne({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(realm).to.include({
|
|
|
|
id: currentRealmId,
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
const roleToImport: PartialImportRealmRepresentation = {
|
|
|
|
ifResourceExists: "FAIL",
|
|
|
|
roles: {
|
|
|
|
realm: [
|
|
|
|
{
|
|
|
|
id: "9d2638c8-4c62-4c42-90ea-5f3c836d0cc8",
|
|
|
|
name: "myRole",
|
|
|
|
scopeParamRequired: false,
|
|
|
|
composite: false,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
it("does partial import", async () => {
|
|
|
|
const result = await kcAdminClient.realms.partialImport({
|
|
|
|
realm: currentRealmName,
|
|
|
|
rep: roleToImport,
|
|
|
|
});
|
|
|
|
expect(result.added).to.be.eq(1);
|
|
|
|
expect(result.overwritten).to.be.eq(0);
|
|
|
|
expect(result.skipped).to.be.eq(0);
|
|
|
|
expect(result.results.length).to.be.eq(1);
|
|
|
|
expect(result.results[0].action).to.be.eq("ADDED");
|
|
|
|
expect(result.results[0].resourceName).to.be.eq("myRole");
|
|
|
|
expect(result.results[0].id).to.exist;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("export a realm", async () => {
|
|
|
|
const realm = await kcAdminClient.realms.export({
|
|
|
|
realm: currentRealmName,
|
|
|
|
exportClients: true,
|
|
|
|
exportGroupsAndRoles: true,
|
|
|
|
});
|
|
|
|
expect(realm).to.include({
|
|
|
|
id: currentRealmId,
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("update a realm", async () => {
|
|
|
|
await kcAdminClient.realms.update(
|
|
|
|
{ realm: currentRealmName },
|
|
|
|
{
|
|
|
|
displayName: "test",
|
2023-07-11 14:03:21 +00:00
|
|
|
},
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
const realm = await kcAdminClient.realms.findOne({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(realm).to.include({
|
|
|
|
id: currentRealmId,
|
|
|
|
realm: currentRealmName,
|
|
|
|
displayName: "test",
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("client registration policy providers", async () => {
|
|
|
|
const list =
|
|
|
|
await kcAdminClient.realms.getClientRegistrationPolicyProviders({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(list).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("delete a realm", async () => {
|
|
|
|
await kcAdminClient.realms.del({ realm: currentRealmName });
|
|
|
|
const realm = await kcAdminClient.realms.findOne({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(realm).to.be.null;
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm Client Initial Access", () => {
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
|
|
|
|
const created = await createRealm(kcAdminClient);
|
|
|
|
currentRealmName = created.realmName;
|
|
|
|
|
|
|
|
await kcAdminClient.realms.createClientsInitialAccess(
|
|
|
|
{ realm: currentRealmName },
|
2023-07-11 14:03:21 +00:00
|
|
|
{ count: 1, expiration: 0 },
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
after(async () => {
|
|
|
|
deleteRealm(kcAdminClient, currentRealmName);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("list client initial access", async () => {
|
|
|
|
const initialAccess = await kcAdminClient.realms.getClientsInitialAccess({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(initialAccess).to.be.ok;
|
|
|
|
expect(initialAccess[0].count).to.be.eq(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("del client initial access", async () => {
|
|
|
|
const access = await kcAdminClient.realms.createClientsInitialAccess(
|
|
|
|
{ realm: currentRealmName },
|
2023-07-11 14:03:21 +00:00
|
|
|
{ count: 1, expiration: 0 },
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
expect(
|
|
|
|
(
|
|
|
|
await kcAdminClient.realms.getClientsInitialAccess({
|
|
|
|
realm: currentRealmName,
|
|
|
|
})
|
2023-07-11 14:03:21 +00:00
|
|
|
).length,
|
2023-02-03 10:45:11 +00:00
|
|
|
).to.be.eq(2);
|
|
|
|
|
|
|
|
await kcAdminClient.realms.delClientsInitialAccess({
|
|
|
|
realm: currentRealmName,
|
|
|
|
id: access.id!,
|
|
|
|
});
|
|
|
|
|
|
|
|
const initialAccess = await kcAdminClient.realms.getClientsInitialAccess({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(initialAccess).to.be.ok;
|
|
|
|
expect(initialAccess[0].count).to.be.eq(1);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm default groups", () => {
|
|
|
|
const groupName = "my-group";
|
|
|
|
let currentGroup: GroupRepresentation;
|
|
|
|
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
|
|
|
|
currentRealmName = (await createRealm(kcAdminClient)).realmName;
|
|
|
|
currentGroup = await kcAdminClient.groups.create({
|
|
|
|
name: groupName,
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
after(async () => {
|
|
|
|
deleteRealm(kcAdminClient, currentRealmName);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("add group to default groups", async () => {
|
|
|
|
await kcAdminClient.realms.addDefaultGroup({
|
|
|
|
id: currentGroup.id!,
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
const defaultGroups = await kcAdminClient.realms.getDefaultGroups({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(defaultGroups).to.be.ok;
|
|
|
|
expect(defaultGroups.length).to.be.eq(1);
|
|
|
|
expect(defaultGroups[0].id).to.be.eq(currentGroup.id);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("get a group by its path name", async () => {
|
|
|
|
const queriedGroup = await kcAdminClient.realms.getGroupByPath({
|
|
|
|
realm: currentRealmName,
|
|
|
|
path: groupName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(queriedGroup).to.be.ok;
|
|
|
|
expect(queriedGroup.id).to.be.eq(currentGroup.id);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("remove group from default groups", async () => {
|
|
|
|
await kcAdminClient.realms.removeDefaultGroup({
|
|
|
|
id: currentGroup.id!,
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
const defaultGroups = await kcAdminClient.realms.getDefaultGroups({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(defaultGroups).to.be.ok;
|
|
|
|
expect(defaultGroups.length).to.be.eq(0);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm Events", () => {
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
|
|
|
|
const created = await createRealm(kcAdminClient);
|
|
|
|
currentRealmId = created.realmId;
|
|
|
|
currentRealmName = created.realmName;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("get events config for a realm", async () => {
|
|
|
|
const config = await kcAdminClient.realms.getConfigEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(config).to.be.ok;
|
|
|
|
expect(config.adminEventsEnabled).to.be.eq(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("enable events", async () => {
|
|
|
|
const config = await kcAdminClient.realms.getConfigEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
config.eventsEnabled = true;
|
|
|
|
await kcAdminClient.realms.updateConfigEvents(
|
|
|
|
{ realm: currentRealmName },
|
2023-07-11 14:03:21 +00:00
|
|
|
config,
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
const newConfig = await kcAdminClient.realms.getConfigEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(newConfig).to.be.ok;
|
|
|
|
expect(newConfig.eventsEnabled).to.be.eq(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("list events of a realm", async () => {
|
|
|
|
// @TODO: In order to test it, there have to be events
|
|
|
|
const events = await kcAdminClient.realms.findEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(events).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("list admin events of a realm", async () => {
|
|
|
|
// @TODO: In order to test it, there have to be events
|
|
|
|
const events = await kcAdminClient.realms.findAdminEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(events).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("clear events", async () => {
|
|
|
|
await kcAdminClient.realms.clearEvents({ realm: currentRealmName });
|
|
|
|
await kcAdminClient.realms.clearAdminEvents({ realm: currentRealmName });
|
|
|
|
|
|
|
|
const events = await kcAdminClient.realms.findAdminEvents({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(events).to.deep.eq([]);
|
|
|
|
});
|
|
|
|
|
|
|
|
after(async () => {
|
|
|
|
deleteRealm(kcAdminClient, currentRealmName);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm Users Management Permissions", () => {
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
|
|
|
|
const created = await createRealm(kcAdminClient);
|
|
|
|
currentRealmId = created.realmId;
|
|
|
|
currentRealmName = created.realmName;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("get users management permissions", async () => {
|
|
|
|
const managementPermissions =
|
|
|
|
await kcAdminClient.realms.getUsersManagementPermissions({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(managementPermissions).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("enable users management permissions", async () => {
|
|
|
|
const managementPermissions =
|
|
|
|
await kcAdminClient.realms.updateUsersManagementPermissions({
|
|
|
|
realm: currentRealmName,
|
|
|
|
enabled: true,
|
|
|
|
});
|
|
|
|
expect(managementPermissions).to.include({ enabled: true });
|
|
|
|
});
|
|
|
|
|
|
|
|
it("get realm keys", async () => {
|
|
|
|
const keys = await kcAdminClient.realms.getKeys({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(keys.active).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
after(async () => {
|
|
|
|
deleteRealm(kcAdminClient, currentRealmName);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm Session Management", () => {
|
|
|
|
before(async () => {
|
|
|
|
kcAdminClient = new KeycloakAdminClient();
|
|
|
|
await kcAdminClient.auth(credentials);
|
|
|
|
|
|
|
|
const created = await createRealm(kcAdminClient);
|
|
|
|
currentRealmId = created.realmId;
|
|
|
|
currentRealmName = created.realmName;
|
|
|
|
});
|
|
|
|
|
2023-02-13 12:12:08 +00:00
|
|
|
it("gets client session stats", async () => {
|
|
|
|
const sessionStats = await kcAdminClient.realms.getClientSessionStats({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(sessionStats).to.be.ok;
|
|
|
|
});
|
|
|
|
|
2023-02-03 10:45:11 +00:00
|
|
|
it("push revocation", async () => {
|
|
|
|
const push = await kcAdminClient.realms.pushRevocation({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(push).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
it("logs out all sessions", async () => {
|
|
|
|
const logout = await kcAdminClient.realms.logoutAll({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(logout).to.be.ok;
|
|
|
|
});
|
|
|
|
|
|
|
|
after(async () => {
|
|
|
|
deleteRealm(kcAdminClient, currentRealmName);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm connection settings", () => {
|
|
|
|
it("should fail with invalid ldap settings", async () => {
|
|
|
|
try {
|
|
|
|
await kcAdminClient.realms.testLDAPConnection(
|
|
|
|
{ realm: "master" },
|
|
|
|
{
|
|
|
|
action: "testConnection",
|
|
|
|
authType: "simple",
|
|
|
|
bindCredential: "1",
|
|
|
|
bindDn: "1",
|
|
|
|
connectionTimeout: "",
|
|
|
|
connectionUrl: "1",
|
|
|
|
startTls: "",
|
2023-06-16 14:39:45 +00:00
|
|
|
useTruststoreSpi: "always",
|
2023-07-11 14:03:21 +00:00
|
|
|
},
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
fail("exception should have been thrown");
|
|
|
|
} catch (error) {
|
|
|
|
expect(error).to.be.ok;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should fail with invalid smtp settings", async () => {
|
|
|
|
try {
|
|
|
|
const user = (
|
|
|
|
await kcAdminClient.users.find({ username: credentials.username })
|
|
|
|
)[0];
|
|
|
|
user.email = "test@test.com";
|
|
|
|
await kcAdminClient.users.update({ id: user.id! }, user);
|
|
|
|
await kcAdminClient.realms.testSMTPConnection(
|
|
|
|
{ realm: "master" },
|
|
|
|
{
|
|
|
|
from: "cdd1641ff4-1781a4@inbox.mailtrap.io",
|
|
|
|
host: "localhost",
|
|
|
|
port: 3025,
|
2023-07-11 14:03:21 +00:00
|
|
|
},
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
fail("exception should have been thrown");
|
|
|
|
} catch (error) {
|
|
|
|
expect(error).to.be.ok;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should fail with invalid ldap server capabilities", async () => {
|
|
|
|
try {
|
|
|
|
await kcAdminClient.realms.ldapServerCapabilities(
|
|
|
|
{ realm: "master" },
|
|
|
|
{
|
|
|
|
action: "testConnection",
|
|
|
|
authType: "simple",
|
|
|
|
bindCredential: "1",
|
|
|
|
bindDn: "1",
|
|
|
|
connectionTimeout: "",
|
|
|
|
connectionUrl: "1",
|
|
|
|
startTls: "",
|
2023-06-16 14:39:45 +00:00
|
|
|
useTruststoreSpi: "always",
|
2023-07-11 14:03:21 +00:00
|
|
|
},
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
fail("exception should have been thrown");
|
|
|
|
} catch (error) {
|
|
|
|
expect(error).to.be.ok;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Realm localization", () => {
|
|
|
|
currentRealmName = "master";
|
|
|
|
|
|
|
|
it.skip("enable localization", async () => {
|
|
|
|
await kcAdminClient.realms.getRealmLocalizationTexts({
|
|
|
|
realm: currentRealmName,
|
|
|
|
selectedLocale: "nl",
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("should add localization", async () => {
|
|
|
|
await kcAdminClient.realms.addLocalization(
|
|
|
|
{ realm: currentRealmName, selectedLocale: "nl", key: "theKey" },
|
2023-07-11 14:03:21 +00:00
|
|
|
"value",
|
2023-02-03 10:45:11 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("should get realm specific locales", async () => {
|
|
|
|
const locales = await kcAdminClient.realms.getRealmSpecificLocales({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(locales).to.be.ok;
|
|
|
|
expect(locales).to.be.deep.eq(["nl"]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("should get localization for specified locale", async () => {
|
|
|
|
const texts = await kcAdminClient.realms.getRealmLocalizationTexts({
|
|
|
|
realm: currentRealmName,
|
|
|
|
selectedLocale: "nl",
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(texts).to.be.ok;
|
|
|
|
expect(texts.theKey).to.be.eq("value");
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("should delete localization for specified locale key", async () => {
|
|
|
|
await kcAdminClient.realms.deleteRealmLocalizationTexts({
|
|
|
|
realm: currentRealmName,
|
|
|
|
selectedLocale: "nl",
|
|
|
|
key: "theKey",
|
|
|
|
});
|
|
|
|
|
|
|
|
const texts = await kcAdminClient.realms.getRealmLocalizationTexts({
|
|
|
|
realm: currentRealmName,
|
|
|
|
selectedLocale: "nl",
|
|
|
|
});
|
|
|
|
expect(texts).to.be.ok;
|
|
|
|
expect(texts).to.be.deep.eq({});
|
|
|
|
});
|
|
|
|
|
|
|
|
it.skip("should delete localization for specified locale", async () => {
|
|
|
|
await kcAdminClient.realms.deleteRealmLocalizationTexts({
|
|
|
|
realm: currentRealmName,
|
|
|
|
selectedLocale: "nl",
|
|
|
|
});
|
|
|
|
|
|
|
|
const locales = await kcAdminClient.realms.getRealmSpecificLocales({
|
|
|
|
realm: currentRealmName,
|
|
|
|
});
|
|
|
|
expect(locales).to.be.ok;
|
|
|
|
expect(locales).to.be.deep.eq([]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|