keycloak-api-manager 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/Handlers/attackDetectionHandler.js +64 -0
  2. package/Handlers/clientPoliciesHandler.js +120 -0
  3. package/Handlers/groupsHandler.js +32 -0
  4. package/Handlers/organizationsHandler.js +243 -0
  5. package/Handlers/serverInfoHandler.js +36 -0
  6. package/Handlers/userProfileHandler.js +121 -0
  7. package/README.md +83 -7157
  8. package/docs/architecture.md +47 -0
  9. package/docs/deployment.md +32 -0
  10. package/docs/keycloak-setup.md +47 -0
  11. package/docs/test-configuration.md +43 -0
  12. package/docs/testing.md +60 -0
  13. package/index.js +156 -240
  14. package/package.json +28 -15
  15. package/test/.mocharc.json +2 -2
  16. package/test/config/secrets.json +12 -0
  17. package/test/docker-keycloak/certs/keycloak.crt +58 -0
  18. package/test/docker-keycloak/certs/keycloak.key +28 -0
  19. package/test/docker-keycloak/docker-compose-https.yml +2 -0
  20. package/test/docker-keycloak/docker-compose.yml +4 -4
  21. package/test/helpers/matrix.js +16 -0
  22. package/test/matrix/auth.json +27 -0
  23. package/test/matrix/clients.json +45 -0
  24. package/test/matrix/realms-components-idp.json +37 -0
  25. package/test/matrix/users-roles-groups.json +26 -0
  26. package/test/package-lock.json +3032 -0
  27. package/test/specs/attackDetection.test.js +102 -0
  28. package/test/specs/clientCredentials.test.js +79 -0
  29. package/test/specs/clientPolicies.test.js +162 -0
  30. package/test/specs/{debugClientLibrary.test.js → diagnostics/debugClientLibrary.test.js} +2 -2
  31. package/test/specs/groupPermissions.test.js +87 -0
  32. package/test/specs/matrix/matrix-auth.test.js +112 -0
  33. package/test/specs/matrix/matrix-clients.test.js +59 -0
  34. package/test/specs/matrix/matrix-realms-components-idp.test.js +111 -0
  35. package/test/specs/matrix/matrix-users-roles-groups.test.js +68 -0
  36. package/test/specs/organizations.test.js +183 -0
  37. package/test/specs/serverInfo.test.js +140 -0
  38. package/test/specs/userProfile.test.js +135 -0
  39. package/test/{enableServerFeatures.js → support/enableServerFeatures.js} +43 -26
  40. package/test/{setup.js → support/setup.js} +3 -3
  41. package/test/support/testConfig.js +69 -0
  42. package/test/testConfig.js +1 -69
  43. package/test-output.log +72 -0
  44. package/test/TESTING.md +0 -327
  45. package/test/config/CONFIGURATION.md +0 -170
  46. package/test/diagnostic-protocol-mappers.js +0 -189
  47. package/test/docker-keycloak/DEPLOYMENT_GUIDE.md +0 -262
  48. package/test/helpers/setup.js +0 -186
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "keycloak-api-manager",
3
- "version": "4.0.0",
4
- "description": "Keycloak-api-manager is a lightweight Node.js wrapper for the Keycloak Admin REST API. It provides an easy-to-use functional methods and functions to manage realms, users, roles, clients, groups, and permissions directly from your application code just like you would from the Keycloak admin console.",
3
+ "version": "5.0.0",
4
+ "description": "Enhanced Node.js wrapper for Keycloak Admin REST API. Professional alternative to @keycloak/keycloak-admin-client with advanced features, bug fixes, automatic token refresh, Organizations API support, fine-grained permissions, and comprehensive resource management. Battle-tested with 113+ integration tests.",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "test": "npm --prefix test install && npm --prefix test test",
@@ -26,21 +26,34 @@
26
26
  },
27
27
  "keywords": [
28
28
  "keycloak",
29
- "user",
30
- "login",
31
- "signin",
32
- "session",
33
- "ldap",
34
- "federation",
29
+ "keycloak-admin-client",
30
+ "keycloak-admin",
31
+ "admin-rest-api",
32
+ "keycloak-wrapper",
33
+ "alternative",
34
+ "rest-api",
35
+ "admin-client",
36
+ "user-management",
37
+ "realm-management",
35
38
  "authentication",
36
- "oauth",
37
- "oauth2.0",
39
+ "authorization",
40
+ "fine-grained-permissions",
41
+ "organizations",
38
42
  "sso",
39
- "api",
40
- "client",
41
- "admin",
42
- "adapter",
43
- "express"
43
+ "oauth2",
44
+ "oidc",
45
+ "identity-provider",
46
+ "ldap",
47
+ "federation",
48
+ "roles",
49
+ "groups",
50
+ "clients",
51
+ "scopes",
52
+ "session-management",
53
+ "token-refresh",
54
+ "admin-api",
55
+ "express",
56
+ "nodejs"
44
57
  ],
45
58
  "author": "aromanino (Crs4)",
46
59
  "license": "MIT",
@@ -1,4 +1,4 @@
1
1
  {
2
- "file": ["setup.js"],
3
- "spec": ["specs/*.test.js"]
2
+ "file": ["support/setup.js"],
3
+ "spec": ["specs/**/*.test.js"]
4
4
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "test": {
3
+ "keycloak": {
4
+ "password": "admin"
5
+ },
6
+ "realm": {
7
+ "user": {
8
+ "password": "test-password"
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,58 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFDDCCA/SgAwIBAgISBcrNyeKnHT9iltEpgQZ8pj3MMA0GCSqGSIb3DQEBCwUA
3
+ MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
4
+ EwNSMTIwHhcNMjYwMTAxMTEzMDQzWhcNMjYwNDAxMTEzMDQyWjASMRAwDgYDVQQD
5
+ EwdjcnM0Lml0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1n4wnSXd
6
+ qDqYZLnuanckIHLJWRkK55umvqsTe5uyZOZmhycGn/3whfafhPl2doYhXA1QEvFW
7
+ /JH0TXnuH6Zi0/ycDwfMsU7uHHyn4gUdpvri2w2AMM/x1AkuzN2y8tp1iCqNP92o
8
+ IL/5XOSALUy5SG1VQNZg+gCOjwfbUSk8RzErMaJllsfsvQggbYNTK2xLD5sS7zIw
9
+ ElD0D0hj5QEYyxHDi4nYSoI7eLaDoaXAoStNE99gac+CxlqRttAnmXCG7N3/Fy7n
10
+ kNV6KogWLwMrf4ePL3otUStAbJcXxxrjObFtfw0y69q6QCaXtqMc6xzKWo81faqa
11
+ Rf1bxTSlLYyDewIDAQABo4ICOTCCAjUwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
12
+ MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQs
13
+ M5fzkfsNr63Yq2IJRdEUalEXxjAfBgNVHSMEGDAWgBQAtSnyLY5vMeibTK14Pvrc
14
+ 6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9yMTIuaS5s
15
+ ZW5jci5vcmcvMCwGA1UdEQQlMCOCCSouY3JzNC5pdIINKi5zcnYuY3JzNC5pdIIH
16
+ Y3JzNC5pdDATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
17
+ dHRwOi8vcjEyLmMubGVuY3Iub3JnLzc3LmNybDCCAQwGCisGAQQB1nkCBAIEgf0E
18
+ gfoA+AB+AHF+lfPCOIptseOEST0x4VqpYgh2LUIA4AUM0Ge1pmHiAAABm3mImfwA
19
+ CAAABQAFv3tzBAMARzBFAiAhkme95Z1YQSTesVBfyrfjHRbHIrLj4shjyIksq+cu
20
+ cAIhALHR2CZXOvy2+dyzVOuOASHHFylEajxaLYkhcPSSbZhqAHYA0W6ppWgHfmY1
21
+ oD83pd28A6U8QRIU1IgY9ekxsyPLlQQAAAGbeYiaCwAABAMARzBFAiEA9XP3ngll
22
+ yo2ms1ycX8Jew9rcy3WmfdE/cMgACFlo+vsCIA9T+KMahoSt7uYTaoXjhUtk/EMG
23
+ JEDOGpveXX0Tu2s4MA0GCSqGSIb3DQEBCwUAA4IBAQBXnrWMbPgIGiJdQYvQgABA
24
+ A3x2zgQF4pLOsP30nMqG7QoBL5WqW669quymTU3qHpZEm3aZs+J28IW9xjHP/Sp6
25
+ TFgPk7S98mFntw2/oGU51w98a1F05MfB1yH/Ii5hEBeOFb1daVwBfe2/nKHNTQKU
26
+ DKpGR76b2lwe+vQIavt1oMWYU47+RQYZJl0gyQLuJUok7xX0zPisF8OVqVy5HQ6o
27
+ BFWYKNgJuQz9QBMwGhgwgSB8fxf7NZL+762wLat7xC9/EZ/4H1JfbOeDRgDLYZ95
28
+ /Tg4LLbgwmchX6AKfFSzq6jNthiA/qSxDQ2Vh8TdF2/Grt1v856gem9UJcJsnH9G
29
+ -----END CERTIFICATE-----
30
+ -----BEGIN CERTIFICATE-----
31
+ MIIFBjCCAu6gAwIBAgIRAMISMktwqbSRcdxA9+KFJjwwDQYJKoZIhvcNAQELBQAw
32
+ TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
33
+ cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
34
+ WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
35
+ RW5jcnlwdDEMMAoGA1UEAxMDUjEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
36
+ CgKCAQEA2pgodK2+lP474B7i5Ut1qywSf+2nAzJ+Npfs6DGPpRONC5kuHs0BUT1M
37
+ 5ShuCVUxqqUiXXL0LQfCTUA83wEjuXg39RplMjTmhnGdBO+ECFu9AhqZ66YBAJpz
38
+ kG2Pogeg0JfT2kVhgTU9FPnEwF9q3AuWGrCf4yrqvSrWmMebcas7dA8827JgvlpL
39
+ Thjp2ypzXIlhZZ7+7Tymy05v5J75AEaz/xlNKmOzjmbGGIVwx1Blbzt05UiDDwhY
40
+ XS0jnV6j/ujbAKHS9OMZTfLuevYnnuXNnC2i8n+cF63vEzc50bTILEHWhsDp7CH4
41
+ WRt/uTp8n1wBnWIEwii9Cq08yhDsGwIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
42
+ hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
43
+ /wIBADAdBgNVHQ4EFgQUALUp8i2ObzHom0yteD763OkM0dIwHwYDVR0jBBgwFoAU
44
+ ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
45
+ hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
46
+ A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
47
+ AQELBQADggIBAI910AnPanZIZTKS3rVEyIV29BWEjAK/duuz8eL5boSoVpHhkkv3
48
+ 4eoAeEiPdZLj5EZ7G2ArIK+gzhTlRQ1q4FKGpPPaFBSpqV/xbUb5UlAXQOnkHn3m
49
+ FVj+qYv87/WeY+Bm4sN3Ox8BhyaU7UAQ3LeZ7N1X01xxQe4wIAAE3JVLUCiHmZL+
50
+ qoCUtgYIFPgcg350QMUIWgxPXNGEncT921ne7nluI02V8pLUmClqXOsCwULw+PVO
51
+ ZCB7qOMxxMBoCUeL2Ll4oMpOSr5pJCpLN3tRA2s6P1KLs9TSrVhOk+7LX28NMUlI
52
+ usQ/nxLJID0RhAeFtPjyOCOscQBA53+NRjSCak7P4A5jX7ppmkcJECL+S0i3kXVU
53
+ y5Me5BbrU8973jZNv/ax6+ZK6TM8jWmimL6of6OrX7ZU6E2WqazzsFrLG3o2kySb
54
+ zlhSgJ81Cl4tv3SbYiYXnJExKQvzf83DYotox3f0fwv7xln1A2ZLplCb0O+l/AK0
55
+ YE0DS2FPxSAHi0iwMfW2nNHJrXcY3LLHD77gRgje4Eveubi2xxa+Nmk/hmhLdIET
56
+ iVDFanoCrMVIpQ59XWHkzdFmoHXHBV7oibVjGSO7ULSQ7MJ1Nz51phuDJSgAIU7A
57
+ 0zrLnOrAj/dfrlEWRhCvAgbuwLZX1A2sjNjXoPOHbsPiy+lO1KF8/XY7
58
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDWfjCdJd2oOphk
3
+ ue5qdyQgcslZGQrnm6a+qxN7m7Jk5maHJwaf/fCF9p+E+XZ2hiFcDVAS8Vb8kfRN
4
+ ee4fpmLT/JwPB8yxTu4cfKfiBR2m+uLbDYAwz/HUCS7M3bLy2nWIKo0/3aggv/lc
5
+ 5IAtTLlIbVVA1mD6AI6PB9tRKTxHMSsxomWWx+y9CCBtg1MrbEsPmxLvMjASUPQP
6
+ SGPlARjLEcOLidhKgjt4toOhpcChK00T32Bpz4LGWpG20CeZcIbs3f8XLueQ1Xoq
7
+ iBYvAyt/h48vei1RK0BslxfHGuM5sW1/DTLr2rpAJpe2oxzrHMpajzV9qppF/VvF
8
+ NKUtjIN7AgMBAAECggEBALIxl9WWVbWjKGPWC/orDLpgYmJA6cxMhZS1r7PrP6OP
9
+ vfHePCTC5QWGRDRGw2HoQOKmtLVoBqpB30JWX7uvkT8oB8Z85lMPjcXg0eB1+5Jz
10
+ r+/oIW1r9C4Biv3r2PTlBOug3kQGs9yxYEsKEmqP6QYAvujksSBBQi4ViuC8bzV8
11
+ XxbV0nUb6Rba5wz3PzxbrOCsPNSbWpyb7VWz8ApIzb7X/OGFF12tClNUoXN8hMzI
12
+ xoFBG3mDQjb9aDgJCP8RgrS/wfo0Ay+KAhTNUqgqUzj8awtICAaVCZt1ptrQkEsL
13
+ tgmNiEA8zP6Rh+6hIv7o3XuV1GZMBRhAWrg+1PcXp4ECgYEA/fjub3xC3XW5yWqN
14
+ JhB/SsDLGfMyFzRbNk+HPgJww46R6GobB7m3pmXov+xRmjK0PBQA9rdvZFqAsXIy
15
+ 67KAWgVpNEBVQnGI8w/sub5aeBJqkGUQzTnRnlA/DWaAf8q64r8Kgzvd8TlWwipB
16
+ uXvLebxoWJL1gHLgDPL4tZKH/aECgYEA2DSSBrwMHcaO9p0bhvXhQAH1jXULntfk
17
+ VcNvTszKPdKOrXyfLKJ8xnEU92tZW8Xw/XyHDrPbmgFJ8evuKvJQfYWUQ3PnPux5
18
+ oVY2BzTRYnjXbPxoGYWpSFu/dlJP4HV/qc4Nar1iB8MtWk0drscoyFq6zcat8CLj
19
+ vhpmrhSDE5sCgYEAjJ0PfmBBMRYmJ/M7dPC7WWsGyDZS7HALdDVx/o4hWtSLyi89
20
+ Cfj0SkewJtqzj3k1OvIkWnTTUq+dAyHkOYUZ9T17svdPfTsZBOIzQd+3fTVNFOcv
21
+ 90Bk448wab3vtVFMSZBWRLSXvB/v/g6hVw3IaX08FJZBIL35eJHpy7X2XyECgYAU
22
+ XH8UG0mY1EZKe2lIQIfCG20gsVEy2GosmYc2CJtTTy0YsY/cCEFv/t5Wnsl/lxin
23
+ Br9BZzbbPhvUqL95U/C4oYfhAl1Y07RwuUnFS/gcKf0/ylWTcb8LjXhukDntjaNE
24
+ Pp+M2eENkhgHVRPijecNV14YWwmuf9qq4Jmi81OU2QKBgF22ZG6SH7y34m/v6knX
25
+ h4gCSSF9jKblNJ1Z737XOCYjpKFB2m5B20T/JDlwLca17NcZOR8J3KJZH2X7c2Ne
26
+ utTdZpmcl6HB+zdHijnhgA51g5dBs2tO/G8z0moBxAWK2bwYldX7A6jaiUyM/kix
27
+ e4PsNLp4TNicrABWSTgxOeBD
28
+ -----END PRIVATE KEY-----
@@ -29,6 +29,8 @@ services:
29
29
  # HTTPS configuration
30
30
  KC_HTTP_ENABLED: 'true' # Admin console accessible via HTTP too
31
31
  KC_PROXY: reencrypt # Trust reverse proxy headers
32
+ # Feature flags for testing (match docker-compose.yml)
33
+ KC_FEATURES: 'admin-fine-grained-authz:v1,organization,client-policies'
32
34
  volumes:
33
35
  # Mount certificates for HTTPS
34
36
  - "${KEYCLOAK_CERT_PATH}/keycloak.crt:/etc/keycloak/certs/keycloak.crt:ro"
@@ -35,15 +35,15 @@ services:
35
35
  # HTTPS configuration (only applied if KC_SCHEME=https)
36
36
  KC_HTTP_ENABLED: 'true' # Admin console accessible via HTTP too
37
37
  KC_PROXY: reencrypt # Trust reverse proxy headers
38
+ # Feature flags for advanced functionality
39
+ KC_FEATURES: 'admin-fine-grained-authz:v1,organization,client-policies'
38
40
  volumes:
39
41
  # Mount certificates if HTTPS is enabled and path is provided
40
42
  - "${KEYCLOAK_CERT_PATH:-./certs}:/etc/keycloak/certs:ro"
41
43
  command:
42
44
  - start-dev
43
- # Note: To add HTTPS flags dynamically, use environment variable substitution
44
- # For HTTPS mode, add these flags before start-dev:
45
- # - --https-certificate-file=/etc/keycloak/certs/keycloak.crt
46
- # - --https-certificate-key-file=/etc/keycloak/certs/keycloak.key
45
+ - --https-certificate-file=/etc/keycloak/certs/keycloak.crt
46
+ - --https-certificate-key-file=/etc/keycloak/certs/keycloak.key
47
47
  healthcheck:
48
48
  test: ["CMD", "curl", "-f", "http://localhost:8080/health/ready"]
49
49
  interval: 5s
@@ -0,0 +1,16 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ function loadMatrix(name) {
5
+ const filePath = path.join(__dirname, '..', 'matrix', `${name}.json`);
6
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
7
+ }
8
+
9
+ function uniqueName(prefix) {
10
+ return `${prefix}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
11
+ }
12
+
13
+ module.exports = {
14
+ loadMatrix,
15
+ uniqueName,
16
+ };
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "auth",
3
+ "cases": [
4
+ {
5
+ "name": "password-basic",
6
+ "grantType": "password"
7
+ },
8
+ {
9
+ "name": "password-with-scope",
10
+ "grantType": "password",
11
+ "scope": "openid profile email"
12
+ },
13
+ {
14
+ "name": "password-offline-token",
15
+ "grantType": "password",
16
+ "offlineToken": true
17
+ },
18
+ {
19
+ "name": "client-credentials",
20
+ "grantType": "client_credentials"
21
+ },
22
+ {
23
+ "name": "refresh-token",
24
+ "grantType": "refresh_token"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "clients",
3
+ "cases": [
4
+ {
5
+ "name": "confidential-service-account",
6
+ "publicClient": false,
7
+ "serviceAccountsEnabled": true,
8
+ "directAccessGrantsEnabled": true,
9
+ "standardFlowEnabled": true,
10
+ "consentRequired": false
11
+ },
12
+ {
13
+ "name": "public-browser",
14
+ "publicClient": true,
15
+ "serviceAccountsEnabled": false,
16
+ "directAccessGrantsEnabled": true,
17
+ "standardFlowEnabled": true,
18
+ "consentRequired": false
19
+ },
20
+ {
21
+ "name": "confidential-no-service",
22
+ "publicClient": false,
23
+ "serviceAccountsEnabled": false,
24
+ "directAccessGrantsEnabled": false,
25
+ "standardFlowEnabled": true,
26
+ "consentRequired": false
27
+ },
28
+ {
29
+ "name": "confidential-client-credentials",
30
+ "publicClient": false,
31
+ "serviceAccountsEnabled": true,
32
+ "directAccessGrantsEnabled": false,
33
+ "standardFlowEnabled": false,
34
+ "consentRequired": false
35
+ },
36
+ {
37
+ "name": "confidential-consent-required",
38
+ "publicClient": false,
39
+ "serviceAccountsEnabled": false,
40
+ "directAccessGrantsEnabled": true,
41
+ "standardFlowEnabled": true,
42
+ "consentRequired": true
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "realms-components-idp",
3
+ "realms": [
4
+ {
5
+ "name": "realm-basic",
6
+ "realmConfig": {
7
+ "enabled": true,
8
+ "registrationAllowed": false,
9
+ "rememberMe": true,
10
+ "loginWithEmailAllowed": true
11
+ }
12
+ },
13
+ {
14
+ "name": "realm-registration",
15
+ "realmConfig": {
16
+ "enabled": true,
17
+ "registrationAllowed": true,
18
+ "rememberMe": false,
19
+ "loginWithEmailAllowed": true
20
+ }
21
+ }
22
+ ],
23
+ "identityProviders": [
24
+ {
25
+ "name": "oidc-basic",
26
+ "providerId": "oidc",
27
+ "config": {
28
+ "authorizationUrl": "https://example.com/auth",
29
+ "tokenUrl": "https://example.com/token",
30
+ "userInfoUrl": "https://example.com/userinfo",
31
+ "clientId": "dummy-client-id",
32
+ "clientSecret": "dummy-client-secret",
33
+ "defaultScope": "openid profile email"
34
+ }
35
+ }
36
+ ]
37
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "users-roles-groups",
3
+ "cases": [
4
+ {
5
+ "name": "user-enabled-verified",
6
+ "user": {
7
+ "enabled": true,
8
+ "emailVerified": true
9
+ }
10
+ },
11
+ {
12
+ "name": "user-enabled-unverified",
13
+ "user": {
14
+ "enabled": true,
15
+ "emailVerified": false
16
+ }
17
+ },
18
+ {
19
+ "name": "user-disabled",
20
+ "user": {
21
+ "enabled": false,
22
+ "emailVerified": false
23
+ }
24
+ }
25
+ ]
26
+ }