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..851e88a8 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; + rep: PartialImportRealmRepresentation; + }, + PartialImportResponse + >({ + method: 'POST', + path: '/{realm}/partialImport', + urlParamKeys: ['realm'], + payloadKey: 'rep', + }); + public export = this.makeRequest< { realm: string; diff --git a/test/realms.spec.ts b/test/realms.spec.ts index 650c0b57..82d31ee2 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, + 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, @@ -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 () => {