From 40965ab473558e10f30cd8412c569f5734df11f2 Mon Sep 17 00:00:00 2001 From: Stan Silvert Date: Mon, 22 Nov 2021 14:18:01 -0500 Subject: [PATCH 1/5] Add call to partial import endpoint. --- package.json | 5 ++-- src/defs/realmRepresentation.ts | 18 ++++++++++++ src/resources/realms.ts | 18 +++++++++++- test/realms.spec.ts | 49 ++++++++++++++++++++++++++------- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index b7324ebf..468465eb 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,9 @@ "clean": "rimraf lib", "lint": "tslint --force --format verbose \"src/**/*.ts\" \"test/*\"", "build": "npm run clean && tsc -p ./tsconfig.release.json --pretty", - "test": "DEBUG=kc-admin mocha --require ts-node/register --recursive \"test/**/*.spec.ts\"", - "test:grep": "DEBUG=kc-admin mocha --require ts-node/register", + "test": "mocha --require ts-node/register --recursive \"test/**/*.spec.ts\"", + "test:subset": "mocha --require ts-node/register --recursive --", + "test:grep": "mocha --require ts-node/register", "coverage": "nyc npm run test", "watch": "npm run build -- --watch", "watch:test": "npm run test -- --watch", diff --git a/src/defs/realmRepresentation.ts b/src/defs/realmRepresentation.ts index e00653ce..3cd31b0b 100644 --- a/src/defs/realmRepresentation.ts +++ b/src/defs/realmRepresentation.ts @@ -116,3 +116,21 @@ export default interface RealmRepresentation { verifyEmail?: boolean; waitIncrementSeconds?: number; } + +export type PartialImportRealmRepresentation = RealmRepresentation & { + ifResourceExists: 'FAIL' | 'SKIP' | 'OVERWRITE'; +}; + +export type PartialImportResponse = { + overwritten: number; + added: number; + skipped: number; + results: [ + { + action: string; + resourceType: string; + resourceName: string; + id: string; + }, + ]; +}; diff --git a/src/resources/realms.ts b/src/resources/realms.ts index aff0f477..d6c1373e 100644 --- a/src/resources/realms.ts +++ b/src/resources/realms.ts @@ -1,6 +1,9 @@ import Resource from './resource'; import AdminEventRepresentation from '../defs/adminEventRepresentation'; -import RealmRepresentation from '../defs/realmRepresentation'; +import RealmRepresentation, { + PartialImportRealmRepresentation, + PartialImportResponse, +} from '../defs/realmRepresentation'; import EventRepresentation from '../defs/eventRepresentation'; import EventType from '../defs/eventTypes'; import KeysMetadataRepresentation from '../defs/keyMetadataRepresentation'; @@ -53,6 +56,19 @@ export class Realms extends Resource { urlParamKeys: ['realm'], }); + public partialImport = this.makeRequest< + { + realm: string; + realmRep: PartialImportRealmRepresentation; + }, + PartialImportResponse + >({ + method: 'POST', + path: '/{realm}/partialImport', + urlParamKeys: ['realm'], + payloadKey: 'realmRep', + }); + public export = this.makeRequest< { realm: string; diff --git a/test/realms.spec.ts b/test/realms.spec.ts index 650c0b57..eb34281a 100644 --- a/test/realms.spec.ts +++ b/test/realms.spec.ts @@ -4,6 +4,7 @@ import {KeycloakAdminClient} from '../src/client'; import {credentials} from './constants'; import faker from 'faker'; import {fail} from 'assert'; +import {PartialImportRealmRepresentation} from '../src/defs/realmRepresentation'; const expect = chai.expect; const createRealm = async (kcAdminClient: KeycloakAdminClient) => { @@ -66,6 +67,34 @@ describe('Realms', () => { }); }); + 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, + realmRep: 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, @@ -237,21 +266,19 @@ describe('Realms', () => { }); it('get users management permissions', async () => { - const managementPermissions = await kcAdminClient.realms.getUsersManagementPermissions( - { + const managementPermissions = + await kcAdminClient.realms.getUsersManagementPermissions({ realm: currentRealmName, - }, - ); + }); expect(managementPermissions).to.be.ok; }); it('enable users management permissions', async () => { - const managementPermissions = await kcAdminClient.realms.updateUsersManagementPermissions( - { + const managementPermissions = + await kcAdminClient.realms.updateUsersManagementPermissions({ realm: currentRealmName, enabled: true, - }, - ); + }); expect(managementPermissions).to.include({enabled: true}); }); @@ -340,12 +367,14 @@ describe('Realms', () => { }); }); - describe('Realm localization', () => { currentRealmName = 'master'; it.skip('enable localization', async () => { - await kcAdminClient.realms.getRealmLocalizationTexts({realm: currentRealmName, selectedLocale: 'nl'}); + await kcAdminClient.realms.getRealmLocalizationTexts({ + realm: currentRealmName, + selectedLocale: 'nl', + }); }); it.skip('should add localization', async () => { From bc260948084748665807c443a9cd9fdc6e3bc4d3 Mon Sep 17 00:00:00 2001 From: Stan Silvert Date: Tue, 23 Nov 2021 07:40:14 -0500 Subject: [PATCH 2/5] Update src/resources/realms.ts Co-authored-by: Jon Koops --- src/resources/realms.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/realms.ts b/src/resources/realms.ts index d6c1373e..d1a96849 100644 --- a/src/resources/realms.ts +++ b/src/resources/realms.ts @@ -59,7 +59,7 @@ export class Realms extends Resource { public partialImport = this.makeRequest< { realm: string; - realmRep: PartialImportRealmRepresentation; + rep: PartialImportRepresentation; }, PartialImportResponse >({ From b57adad3cae56caf7448239230af656d7ef30b27 Mon Sep 17 00:00:00 2001 From: Stan Silvert Date: Tue, 23 Nov 2021 07:43:36 -0500 Subject: [PATCH 3/5] Update src/resources/realms.ts --- src/resources/realms.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/realms.ts b/src/resources/realms.ts index d1a96849..37d85035 100644 --- a/src/resources/realms.ts +++ b/src/resources/realms.ts @@ -66,7 +66,7 @@ export class Realms extends Resource { method: 'POST', path: '/{realm}/partialImport', urlParamKeys: ['realm'], - payloadKey: 'realmRep', + payloadKey: 'rep', }); public export = this.makeRequest< From d08d698d6186500b654a97206d26229d1f0402a3 Mon Sep 17 00:00:00 2001 From: Stan Silvert Date: Tue, 23 Nov 2021 07:45:17 -0500 Subject: [PATCH 4/5] Update src/resources/realms.ts --- src/resources/realms.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/realms.ts b/src/resources/realms.ts index 37d85035..851e88a8 100644 --- a/src/resources/realms.ts +++ b/src/resources/realms.ts @@ -59,7 +59,7 @@ export class Realms extends Resource { public partialImport = this.makeRequest< { realm: string; - rep: PartialImportRepresentation; + rep: PartialImportRealmRepresentation; }, PartialImportResponse >({ From 584daaa76fcb1bebfd9ca6fab4afe96771e31cac Mon Sep 17 00:00:00 2001 From: Stan Silvert Date: Tue, 23 Nov 2021 07:50:47 -0500 Subject: [PATCH 5/5] Update test/realms.spec.ts --- test/realms.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/realms.spec.ts b/test/realms.spec.ts index eb34281a..82d31ee2 100644 --- a/test/realms.spec.ts +++ b/test/realms.spec.ts @@ -84,7 +84,7 @@ describe('Realms', () => { it('does partial import', async () => { const result = await kcAdminClient.realms.partialImport({ realm: currentRealmName, - realmRep: roleToImport, + rep: roleToImport, }); expect(result.added).to.be.eq(1); expect(result.overwritten).to.be.eq(0);