keycloak-admin 0.7.0 → 0.7.5

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 (39) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +70 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile.lock +7 -5
  6. data/README.md +149 -3
  7. data/lib/keycloak-admin.rb +13 -0
  8. data/lib/keycloak-admin/client/client.rb +11 -3
  9. data/lib/keycloak-admin/client/client_client.rb +24 -0
  10. data/lib/keycloak-admin/client/client_role_mappings_client.rb +32 -0
  11. data/lib/keycloak-admin/client/group_client.rb +46 -0
  12. data/lib/keycloak-admin/client/realm_client.rb +54 -0
  13. data/lib/keycloak-admin/client/role_client.rb +32 -0
  14. data/lib/keycloak-admin/client/role_mapper_client.rb +20 -0
  15. data/lib/keycloak-admin/client/user_client.rb +44 -2
  16. data/lib/keycloak-admin/representation/camel_json.rb +1 -1
  17. data/lib/keycloak-admin/representation/client_representation.rb +16 -0
  18. data/lib/keycloak-admin/representation/federated_identity_representation.rb +15 -0
  19. data/lib/keycloak-admin/representation/group_representation.rb +15 -0
  20. data/lib/keycloak-admin/representation/realm_representation.rb +14 -0
  21. data/lib/keycloak-admin/representation/representation.rb +5 -1
  22. data/lib/keycloak-admin/representation/role_representation.rb +17 -0
  23. data/lib/keycloak-admin/representation/user_representation.rb +21 -14
  24. data/lib/keycloak-admin/resource/base_role_containing_resource.rb +26 -0
  25. data/lib/keycloak-admin/resource/group_resource.rb +7 -0
  26. data/lib/keycloak-admin/resource/user_resource.rb +7 -0
  27. data/lib/keycloak-admin/version.rb +1 -1
  28. data/spec/client/client_client_spec.rb +53 -0
  29. data/spec/client/client_role_mappings_client_spec.rb +82 -0
  30. data/spec/client/group_client_spec.rb +125 -0
  31. data/spec/client/realm_client_spec.rb +108 -0
  32. data/spec/client/role_client_spec.rb +83 -0
  33. data/spec/client/role_mapper_client_spec.rb +47 -0
  34. data/spec/client/user_client_spec.rb +105 -14
  35. data/spec/representation/user_representation_spec.rb +15 -0
  36. data/spec/resource/group_resource_spec.rb +14 -0
  37. data/spec/resource/user_resource_spec.rb +14 -0
  38. data/spec/spec_helper.rb +7 -0
  39. metadata +25 -4
@@ -0,0 +1,82 @@
1
+ RSpec.describe KeycloakAdmin::ClientRoleMappingsClient do
2
+ describe "#available_url" do
3
+ let(:realm_name) { "valid-realm" }
4
+ let(:user_id) { "test_user" }
5
+ let(:client_id) { "test_client" }
6
+
7
+ before(:each) do
8
+ @built_url = KeycloakAdmin.realm(realm_name).user(user_id).client_role_mappings(client_id).list_available_url
9
+ end
10
+
11
+ it "return a proper url" do
12
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/users/test_user/role-mappings/clients/test_client/available"
13
+ end
14
+ end
15
+
16
+ describe "#list_available" do
17
+ let(:realm_name) { "valid-realm" }
18
+ let(:user_id) { "test_user" }
19
+ let(:client_id) { "test_client" }
20
+
21
+ before(:each) do
22
+ @client_role_mappings_client = KeycloakAdmin.realm(realm_name).user(user_id).client_role_mappings(client_id)
23
+
24
+ stub_token_client
25
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"test_role_id","name":"test_role_name"}]'
26
+ end
27
+
28
+ it "lists roles" do
29
+ roles = @client_role_mappings_client.list_available
30
+ expect(roles.length).to eq 1
31
+ expect(roles[0].name).to eq "test_role_name"
32
+ end
33
+
34
+ it "passes rest client options" do
35
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
36
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
37
+
38
+ expect(RestClient::Resource).to receive(:new).with(
39
+ "http://auth.service.io/auth/admin/realms/valid-realm/users/test_user/role-mappings/clients/test_client/available",
40
+ rest_client_options
41
+ ).and_call_original
42
+
43
+ roles = @client_role_mappings_client.list_available
44
+ expect(roles.length).to eq 1
45
+ expect(roles[0].name).to eq "test_role_name"
46
+ end
47
+ end
48
+
49
+ describe "#save" do
50
+ let(:realm_name) { "valid-realm" }
51
+ let(:user_id) { "test_user" }
52
+ let(:client_id) { "test_client" }
53
+ let(:role_list) { [
54
+ KeycloakAdmin::RoleRepresentation.from_hash(
55
+ "name" => "test_role_name",
56
+ "composite" => false,
57
+ "clientRole" => false
58
+ )
59
+ ] }
60
+
61
+ before(:each) do
62
+ @client_role_mappings_client = KeycloakAdmin.realm(realm_name).user(user_id).client_role_mappings(client_id)
63
+
64
+ stub_token_client
65
+ expect_any_instance_of(RestClient::Resource).to receive(:post).with(role_list.to_json, anything)
66
+ end
67
+
68
+ it "saves client role mappings" do
69
+ @client_role_mappings_client.save(role_list)
70
+ end
71
+
72
+ it "passes rest client options" do
73
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
74
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
75
+
76
+ expect(RestClient::Resource).to receive(:new).with(
77
+ "http://auth.service.io/auth/admin/realms/valid-realm/users/test_user/role-mappings/clients/test_client", rest_client_options).and_call_original
78
+
79
+ @client_role_mappings_client.save(role_list)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,125 @@
1
+ RSpec.describe KeycloakAdmin::GroupClient do
2
+ describe "#groups_url" do
3
+ let(:realm_name) { "valid-realm" }
4
+ let(:group_id) { nil }
5
+
6
+ before(:each) do
7
+ @built_url = KeycloakAdmin.realm(realm_name).groups.groups_url(group_id)
8
+ end
9
+
10
+ context "when group_id is not defined" do
11
+ let(:group_id) { nil }
12
+ it "return a proper url without group id" do
13
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/groups"
14
+ end
15
+ end
16
+
17
+ context "when group_id is defined" do
18
+ let(:group_id) { "95985b21-d884-4bbd-b852-cb8cd365afc2" }
19
+ it "return a proper url with the group id" do
20
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/groups/95985b21-d884-4bbd-b852-cb8cd365afc2"
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#list" do
26
+ let(:realm_name) { "valid-realm" }
27
+
28
+ before(:each) do
29
+ @group_client = KeycloakAdmin.realm(realm_name).groups
30
+
31
+ stub_token_client
32
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"test_group_id","name":"test_group_name"}]'
33
+ end
34
+
35
+ it "lists groups" do
36
+ groups = @group_client.list
37
+ expect(groups.length).to eq 1
38
+ expect(groups[0].name).to eq "test_group_name"
39
+ end
40
+
41
+ it "passes rest client options" do
42
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
43
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
44
+
45
+ expect(RestClient::Resource).to receive(:new).with(
46
+ "http://auth.service.io/auth/admin/realms/valid-realm/groups", rest_client_options).and_call_original
47
+
48
+ groups = @group_client.list
49
+ expect(groups.length).to eq 1
50
+ expect(groups[0].name).to eq "test_group_name"
51
+ end
52
+ end
53
+
54
+ describe "#save" do
55
+ let(:realm_name) { "valid-realm" }
56
+ let(:group) { KeycloakAdmin::GroupRepresentation.from_hash(
57
+ "name" => "test_group_name"
58
+ )}
59
+
60
+ before(:each) do
61
+ @group_client = KeycloakAdmin.realm(realm_name).groups
62
+
63
+ stub_token_client
64
+ response = double
65
+ allow(response).to receive(:headers).and_return(
66
+ { location: 'http://auth.service.io/auth/admin/realms/valid-realm/groups/be061c48-6edd-4783-a726-1a57d4bfa22b' }
67
+ )
68
+ expect_any_instance_of(RestClient::Resource).to receive(:post).with(group.to_json, anything).and_return response
69
+ end
70
+
71
+ it "saves a group" do
72
+ @group_client.save(group)
73
+ end
74
+
75
+ it "passes rest client options" do
76
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
77
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
78
+
79
+ expect(RestClient::Resource).to receive(:new).with(
80
+ "http://auth.service.io/auth/admin/realms/valid-realm/groups", rest_client_options).and_call_original
81
+
82
+ @group_client.save(group)
83
+ end
84
+ end
85
+
86
+ describe "#create" do
87
+ let(:realm_name) { "valid-realm" }
88
+
89
+ before(:each) do
90
+ @group_client = KeycloakAdmin.realm(realm_name).groups
91
+
92
+ stub_token_client
93
+ @response = double
94
+ allow(@response).to receive(:headers).and_return(
95
+ { location: 'http://auth.service.io/auth/admin/realms/valid-realm/groups/be061c48-6edd-4783-a726-1a57d4bfa22b' }
96
+ )
97
+ allow_any_instance_of(RestClient::Resource).to receive(:post).and_return @response
98
+ end
99
+
100
+ it "creates a group" do
101
+ stub_net_http_res(Net::HTTPCreated, 201, 'Created')
102
+
103
+ group_id = @group_client.create!("test_group_name")
104
+ expect(group_id).to eq 'be061c48-6edd-4783-a726-1a57d4bfa22b'
105
+ end
106
+
107
+ it "detects unexpected response to create a group" do
108
+ stub_net_http_res(Net::HTTPOK, 200, 'OK')
109
+
110
+ expect{ @group_client.create!("test_group_name") }.to raise_error(
111
+ 'Create method returned status OK (Code: 200); expected status: Created (201)'
112
+ )
113
+ end
114
+
115
+ def stub_net_http_res(res_class, code, message)
116
+ net_http_res = double
117
+ allow(net_http_res).to receive(:message).and_return message
118
+ allow(net_http_res).to receive(:code).and_return code
119
+ allow(net_http_res).to receive(:is_a?) do |target_class|
120
+ target_class == res_class
121
+ end
122
+ allow(@response).to receive(:net_http_res).and_return net_http_res
123
+ end
124
+ end
125
+ end
@@ -44,4 +44,112 @@ RSpec.describe KeycloakAdmin::RealmClient do
44
44
  end
45
45
  end
46
46
  end
47
+
48
+ describe "#list" do
49
+ before(:each) do
50
+ @realm_client = KeycloakAdmin.realm('master')
51
+
52
+ stub_token_client
53
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"test_realm","realm":"test_realm"}]'
54
+ end
55
+
56
+ it "lists realms" do
57
+ realms = @realm_client.list
58
+ expect(realms.length).to eq 1
59
+ expect(realms[0].realm).to eq "test_realm"
60
+ end
61
+
62
+ it "passes rest client options" do
63
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
64
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
65
+
66
+ expect(RestClient::Resource).to receive(:new).with(
67
+ "http://auth.service.io/auth/admin/realms", rest_client_options).and_call_original
68
+
69
+ realms = @realm_client.list
70
+ expect(realms.length).to eq 1
71
+ expect(realms[0].realm).to eq "test_realm"
72
+ end
73
+ end
74
+
75
+ describe "#delete" do
76
+ let(:realm_name) { "valid-realm" }
77
+
78
+ before(:each) do
79
+ @realm_client = KeycloakAdmin.realm(realm_name)
80
+
81
+ stub_token_client
82
+ allow_any_instance_of(RestClient::Resource).to receive(:delete)
83
+ end
84
+
85
+ it "delete realm" do
86
+ expect(@realm_client.delete).to be_truthy
87
+ end
88
+
89
+ it "passes rest client options" do
90
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
91
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
92
+
93
+ expect(RestClient::Resource).to receive(:new).with(
94
+ "http://auth.service.io/auth/admin/realms/valid-realm", rest_client_options).and_call_original
95
+
96
+ expect(@realm_client.delete).to be_truthy
97
+ end
98
+ end
99
+
100
+ describe "#save" do
101
+ let(:realm_name) { "valid-realm" }
102
+ let(:realm) { KeycloakAdmin::RealmRepresentation.from_hash(
103
+ "id" => realm_name,
104
+ "realm" => realm_name
105
+ )}
106
+
107
+ before(:each) do
108
+ @realm_client = KeycloakAdmin.realm(nil)
109
+
110
+ stub_token_client
111
+
112
+ expect_any_instance_of(RestClient::Resource).to receive(:post).with(realm.to_json, anything)
113
+ end
114
+
115
+ it "saves a realm" do
116
+ @realm_client.save(realm)
117
+ end
118
+
119
+ it "passes rest client options" do
120
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
121
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
122
+
123
+ expect(RestClient::Resource).to receive(:new).with(
124
+ "http://auth.service.io/auth/admin/realms", rest_client_options).and_call_original
125
+
126
+ @realm_client.save(realm)
127
+ end
128
+ end
129
+
130
+ describe "#update" do
131
+ let(:realm_name) { "valid-realm" }
132
+ let(:realm_json) { { smtpServer: { host: 'test_host' } } }
133
+
134
+ before(:each) do
135
+ @realm_client = KeycloakAdmin.realm(realm_name)
136
+
137
+ stub_token_client
138
+ expect_any_instance_of(RestClient::Resource).to receive(:put).with(realm_json.to_json, anything)
139
+ end
140
+
141
+ it "updates a realm" do
142
+ @realm_client.update(realm_json)
143
+ end
144
+
145
+ it "passes rest client options" do
146
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
147
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
148
+
149
+ expect(RestClient::Resource).to receive(:new).with(
150
+ "http://auth.service.io/auth/admin/realms/valid-realm", rest_client_options).and_call_original
151
+
152
+ @realm_client.update(realm_json)
153
+ end
154
+ end
47
155
  end
@@ -0,0 +1,83 @@
1
+ RSpec.describe KeycloakAdmin::RoleClient do
2
+ describe "#roles_url" do
3
+ let(:realm_name) { "valid-realm" }
4
+ let(:role_id) { nil }
5
+
6
+ before(:each) do
7
+ @built_url = KeycloakAdmin.realm(realm_name).roles.roles_url(role_id)
8
+ end
9
+
10
+ context "when role_id is not defined" do
11
+ let(:role_id) { nil }
12
+ it "return a proper url without role id" do
13
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/roles"
14
+ end
15
+ end
16
+
17
+ context "when role_id is defined" do
18
+ let(:role_id) { "95985b21-d884-4bbd-b852-cb8cd365afc2" }
19
+ it "return a proper url with the role id" do
20
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/roles/95985b21-d884-4bbd-b852-cb8cd365afc2"
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#list" do
26
+ let(:realm_name) { "valid-realm" }
27
+
28
+ before(:each) do
29
+ @role_client = KeycloakAdmin.realm(realm_name).roles
30
+
31
+ stub_token_client
32
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"test_role_id","name":"test_role_name"}]'
33
+ end
34
+
35
+ it "lists roles" do
36
+ roles = @role_client.list
37
+ expect(roles.length).to eq 1
38
+ expect(roles[0].name).to eq "test_role_name"
39
+ end
40
+
41
+ it "passes rest client options" do
42
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
43
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
44
+
45
+ expect(RestClient::Resource).to receive(:new).with(
46
+ "http://auth.service.io/auth/admin/realms/valid-realm/roles", rest_client_options).and_call_original
47
+
48
+ roles = @role_client.list
49
+ expect(roles.length).to eq 1
50
+ expect(roles[0].name).to eq "test_role_name"
51
+ end
52
+ end
53
+
54
+ describe "#save" do
55
+ let(:realm_name) { "valid-realm" }
56
+ let(:role) { KeycloakAdmin::RoleRepresentation.from_hash(
57
+ "name" => "test_role_name",
58
+ "composite" => false,
59
+ "clientRole" => false
60
+ )}
61
+
62
+ before(:each) do
63
+ @role_client = KeycloakAdmin.realm(realm_name).roles
64
+
65
+ stub_token_client
66
+ expect_any_instance_of(RestClient::Resource).to receive(:post).with(role.to_json, anything)
67
+ end
68
+
69
+ it "saves a role" do
70
+ @role_client.save(role)
71
+ end
72
+
73
+ it "passes rest client options" do
74
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
75
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
76
+
77
+ expect(RestClient::Resource).to receive(:new).with(
78
+ "http://auth.service.io/auth/admin/realms/valid-realm/roles", rest_client_options).and_call_original
79
+
80
+ @role_client.save(role)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,47 @@
1
+ RSpec.describe KeycloakAdmin::RoleMapperClient do
2
+ describe "#available_url" do
3
+ let(:realm_name) { "valid-realm" }
4
+ let(:user_id) { "test_user" }
5
+
6
+ before(:each) do
7
+ @built_url = KeycloakAdmin.realm(realm_name).user(user_id).role_mapper.realm_level_url
8
+ end
9
+
10
+ it "return a proper url" do
11
+ expect(@built_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/users/test_user/role-mappings/realm"
12
+ end
13
+ end
14
+
15
+ describe "#save_realm_level" do
16
+ let(:realm_name) { "valid-realm" }
17
+ let(:user_id) { "test_user" }
18
+ let(:role_list) { [
19
+ KeycloakAdmin::RoleRepresentation.from_hash(
20
+ "name" => "test_role_name",
21
+ "composite" => false,
22
+ "clientRole" => false
23
+ )
24
+ ] }
25
+
26
+ before(:each) do
27
+ @role_mapper_client = KeycloakAdmin.realm(realm_name).user(user_id).role_mapper
28
+
29
+ stub_token_client
30
+ expect_any_instance_of(RestClient::Resource).to receive(:post).with(role_list.to_json, anything)
31
+ end
32
+
33
+ it "saves realm-elevel role mappings" do
34
+ @role_mapper_client.save_realm_level(role_list)
35
+ end
36
+
37
+ it "passes rest client options" do
38
+ rest_client_options = {verify_ssl: OpenSSL::SSL::VERIFY_NONE}
39
+ allow_any_instance_of(KeycloakAdmin::Configuration).to receive(:rest_client_options).and_return rest_client_options
40
+
41
+ expect(RestClient::Resource).to receive(:new).with(
42
+ "http://auth.service.io/auth/admin/realms/valid-realm/users/test_user/role-mappings/realm", rest_client_options).and_call_original
43
+
44
+ @role_mapper_client.save_realm_level(role_list)
45
+ end
46
+ end
47
+ end