calendlyr 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +34 -0
- data/.gitignore +25 -0
- data/CHANGELOG.md +32 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +21 -0
- data/README.md +159 -0
- data/Rakefile +10 -0
- data/bin/console +13 -0
- data/bin/setup +8 -0
- data/bin/test +6 -0
- data/calendly.gemspec +27 -0
- data/lib/calendly/client.rb +57 -0
- data/lib/calendly/collection.rb +31 -0
- data/lib/calendly/error.rb +4 -0
- data/lib/calendly/object.rb +27 -0
- data/lib/calendly/objects/event_invitees.rb +4 -0
- data/lib/calendly/objects/event_types.rb +4 -0
- data/lib/calendly/objects/events.rb +4 -0
- data/lib/calendly/objects/invitations.rb +11 -0
- data/lib/calendly/objects/memberships.rb +7 -0
- data/lib/calendly/objects/organizations.rb +27 -0
- data/lib/calendly/objects/scheduling_links.rb +4 -0
- data/lib/calendly/objects/users.rb +19 -0
- data/lib/calendly/objects/webhooks.rb +11 -0
- data/lib/calendly/resource.rb +73 -0
- data/lib/calendly/resources/data_compliance.rb +7 -0
- data/lib/calendly/resources/event_invitees.rb +12 -0
- data/lib/calendly/resources/event_types.rb +12 -0
- data/lib/calendly/resources/events.rb +12 -0
- data/lib/calendly/resources/organizations.rb +33 -0
- data/lib/calendly/resources/scheduling_links.rb +8 -0
- data/lib/calendly/resources/users.rb +11 -0
- data/lib/calendly/resources/webhooks.rb +21 -0
- data/lib/calendly/version.rb +3 -0
- data/lib/calendly.rb +35 -0
- data/test/calendly/client_test.rb +8 -0
- data/test/calendly/object_test.rb +21 -0
- data/test/calendly/resources/data_compliance.rb +13 -0
- data/test/calendly/resources/event_invitees_test.rb +29 -0
- data/test/calendly/resources/event_types_test.rb +31 -0
- data/test/calendly/resources/events_test.rb +29 -0
- data/test/calendly/resources/organizations_test.rb +140 -0
- data/test/calendly/resources/scheduling_links.rb +12 -0
- data/test/calendly/resources/users_test.rb +79 -0
- data/test/calendly/resources/webhooks_test.rb +42 -0
- data/test/calendly_test.rb +7 -0
- data/test/fixtures/data_compliance/delete_invitee_data.json +1 -0
- data/test/fixtures/event_invitees/list.json +58 -0
- data/test/fixtures/event_invitees/retrieve.json +38 -0
- data/test/fixtures/event_types/list.json +88 -0
- data/test/fixtures/event_types/retrieve.json +82 -0
- data/test/fixtures/events/list.json +39 -0
- data/test/fixtures/events/retrieve.json +33 -0
- data/test/fixtures/organizations/invite.json +9 -0
- data/test/fixtures/organizations/list_invitations.json +18 -0
- data/test/fixtures/organizations/list_memberships.json +26 -0
- data/test/fixtures/organizations/remove_user.json +1 -0
- data/test/fixtures/organizations/retrieve_invitation.json +12 -0
- data/test/fixtures/organizations/retrieve_membership.json +20 -0
- data/test/fixtures/organizations/revoke_invitation.json +1 -0
- data/test/fixtures/scheduling_links/create.json +7 -0
- data/test/fixtures/users/retrieve.json +14 -0
- data/test/fixtures/webhooks/create.json +17 -0
- data/test/fixtures/webhooks/delete.json +1 -0
- data/test/fixtures/webhooks/list.json +23 -0
- data/test/fixtures/webhooks/retrieve.json +17 -0
- data/test/test_helper.rb +27 -0
- metadata +230 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
module Calendly
|
2
|
+
class EventInviteeResource < Resource
|
3
|
+
def list(event_uuid:, **params)
|
4
|
+
response = get_request("scheduled_events/#{event_uuid}/invitees", params: params.compact)
|
5
|
+
Collection.from_response(response, key: "collection", type: EventInvitee, client: client)
|
6
|
+
end
|
7
|
+
|
8
|
+
def retrieve(event_uuid:, invitee_uuid:)
|
9
|
+
EventInvitee.new get_request("scheduled_events/#{event_uuid}/invitees/#{invitee_uuid}").merge(client: client)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Calendly
|
2
|
+
class EventTypeResource < Resource
|
3
|
+
def list(user_uri:, organization_uri:, **params)
|
4
|
+
response = get_request("event_types", params: {user: user_uri, organization: organization_uri}.merge(params))
|
5
|
+
Collection.from_response(response, key: "collection", type: EventType, client: client)
|
6
|
+
end
|
7
|
+
|
8
|
+
def retrieve(event_type_uuid:)
|
9
|
+
EventType.new get_request("event_types/#{event_type_uuid}").dig("resource").merge(client: client)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Calendly
|
2
|
+
class EventResource < Resource
|
3
|
+
def list(user_uri:, organization_uri:, **params)
|
4
|
+
response = get_request("scheduled_events", params: {user: user_uri, organization: organization_uri}.merge(params).compact)
|
5
|
+
Collection.from_response(response, key: "collection", type: Event, client: client)
|
6
|
+
end
|
7
|
+
|
8
|
+
def retrieve(event_uuid:)
|
9
|
+
Event.new get_request("scheduled_events/#{event_uuid}").dig("resource").merge(client: client)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Calendly
|
2
|
+
class OrganizationResource < Resource
|
3
|
+
def invite(organization_uuid:, email:)
|
4
|
+
Invitation.new post_request("organizations/#{organization_uuid}/invitations", body: {email: email}).merge(client: client)
|
5
|
+
end
|
6
|
+
|
7
|
+
def list_invitations(organization_uuid:, **params)
|
8
|
+
response = get_request("organizations/#{organization_uuid}/invitations", params: params)
|
9
|
+
Collection.from_response(response, key: "collection", type: Invitation, client: client)
|
10
|
+
end
|
11
|
+
|
12
|
+
def list_memberships(user_uri: nil, organization_uri: nil, **params)
|
13
|
+
response = get_request("organization_memberships", params: {user: user_uri, organization: organization_uri}.merge(params).compact)
|
14
|
+
Collection.from_response(response, key: "collection", type: Membership, client: client)
|
15
|
+
end
|
16
|
+
|
17
|
+
def retrieve_invitation(organization_uuid:, invitation_uuid:)
|
18
|
+
Invitation.new get_request("organizations/#{organization_uuid}/invitations/#{invitation_uuid}").dig("resource").merge(client: client)
|
19
|
+
end
|
20
|
+
|
21
|
+
def retrieve_membership(membership_uuid:)
|
22
|
+
Membership.new get_request("organization_memberships/#{membership_uuid}").dig("resource").merge(client: client)
|
23
|
+
end
|
24
|
+
|
25
|
+
def revoke_invitation(organization_uuid:, invitation_uuid:)
|
26
|
+
delete_request("organizations/#{organization_uuid}/invitations/#{invitation_uuid}")
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove_user(membership_uuid:)
|
30
|
+
delete_request("organization_memberships/#{membership_uuid}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Calendly
|
2
|
+
class SchedulingLinkResource < Resource
|
3
|
+
def create(owner_uri:, max_event_count:, owner_type: "EventType")
|
4
|
+
body = {owner: owner_uri, max_event_count: max_event_count, owner_type: owner_type}
|
5
|
+
SchedulingLink.new post_request("scheduling_links", body: body).dig("resource").merge(client: client)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Calendly
|
2
|
+
class WebhookResource < Resource
|
3
|
+
def list(organization_uri:, scope:, **params)
|
4
|
+
response = get_request("webhook_subscriptions", params: {organization: organization_uri, scope: scope}.merge(params).compact)
|
5
|
+
Collection.from_response(response, key: "collection", type: Webhook, client: client)
|
6
|
+
end
|
7
|
+
|
8
|
+
def create(url:, events:, organization_uri:, scope:, signing_key: nil, user_uri: nil)
|
9
|
+
body = {url: url, events: events, organization: organization_uri, user: user_uri, scope: scope, signing_key: signing_key}.compact
|
10
|
+
Webhook.new post_request("webhook_subscriptions", body: body).dig("resource").merge(client: client)
|
11
|
+
end
|
12
|
+
|
13
|
+
def retrieve(webhook_uuid:)
|
14
|
+
Webhook.new get_request("webhook_subscriptions/#{webhook_uuid}").dig("resource").merge(client: client)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete(webhook_uuid:)
|
18
|
+
delete_request("webhook_subscriptions/#{webhook_uuid}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/calendly.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "uri"
|
3
|
+
require "json"
|
4
|
+
require "openssl"
|
5
|
+
require "cgi"
|
6
|
+
require "calendly/version"
|
7
|
+
|
8
|
+
module Calendly
|
9
|
+
autoload :Client, "calendly/client"
|
10
|
+
autoload :Collection, "calendly/collection"
|
11
|
+
autoload :Error, "calendly/error"
|
12
|
+
autoload :Resource, "calendly/resource"
|
13
|
+
autoload :Object, "calendly/object"
|
14
|
+
|
15
|
+
# High-level categories of Calendly API calls
|
16
|
+
autoload :UserResource, "calendly/resources/users"
|
17
|
+
autoload :EventTypeResource, "calendly/resources/event_types"
|
18
|
+
autoload :OrganizationResource, "calendly/resources/organizations"
|
19
|
+
autoload :EventResource, "calendly/resources/events"
|
20
|
+
autoload :EventInviteeResource, "calendly/resources/event_invitees"
|
21
|
+
autoload :SchedulingLinkResource, "calendly/resources/scheduling_links"
|
22
|
+
autoload :WebhookResource, "calendly/resources/webhooks"
|
23
|
+
autoload :DataComplianceResource, "calendly/resources/data_compliance"
|
24
|
+
|
25
|
+
# Classes used to return a nicer object wrapping the response data
|
26
|
+
autoload :User, "calendly/objects/users"
|
27
|
+
autoload :EventType, "calendly/objects/event_types"
|
28
|
+
autoload :Event, "calendly/objects/events"
|
29
|
+
autoload :Organization, "calendly/objects/organizations"
|
30
|
+
autoload :Invitation, "calendly/objects/invitations"
|
31
|
+
autoload :EventInvitee, "calendly/objects/event_invitees"
|
32
|
+
autoload :SchedulingLink, "calendly/objects/scheduling_links"
|
33
|
+
autoload :Membership, "calendly/objects/memberships"
|
34
|
+
autoload :Webhook, "calendly/objects/webhooks"
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ObjectTest < Minitest::Test
|
4
|
+
def test_creating_object_from_hash
|
5
|
+
assert_equal "bar", Calendly::Object.new(foo: "bar").foo
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_nested_hash
|
9
|
+
assert_equal "foobar", Calendly::Object.new(foo: {bar: {baz: "foobar"}}, client: nil).foo.bar.baz
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_nested_number
|
13
|
+
assert_equal 1, Calendly::Object.new(foo: {bar: 1}, client: nil).foo.bar
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_array
|
17
|
+
object = Calendly::Object.new(foo: [{bar: :baz}], client: nil)
|
18
|
+
assert_equal OpenStruct, object.foo.first.class
|
19
|
+
assert_equal :baz, object.foo.first.bar
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class DataComplianceResourceTest < Minitest::Test
|
6
|
+
def test_delete_invitee_data
|
7
|
+
body = {emails: %w[test@test.com test2@test.com]}
|
8
|
+
response = {body: fixture_file("data_compliance/delete_invitee_data"), status: 202}
|
9
|
+
stub(method: :post, path: "data_compliance/deletion/invitees", body: body, response: response)
|
10
|
+
|
11
|
+
assert client.data_compliance.delete_invitee_data(**body)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class EventInviteesResourceTest < Minitest::Test
|
6
|
+
def test_list
|
7
|
+
event_uuid = "ABCDABCDABCDABCD"
|
8
|
+
response = {body: fixture_file("event_invitees/list"), status: 200}
|
9
|
+
stub(path: "scheduled_events/#{event_uuid}/invitees", response: response)
|
10
|
+
event_invitees = client.event_invitees.list(event_uuid: event_uuid)
|
11
|
+
|
12
|
+
assert_equal Calendly::Collection, event_invitees.class
|
13
|
+
assert_equal Calendly::EventInvitee, event_invitees.data.first.class
|
14
|
+
assert_equal 1, event_invitees.count
|
15
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", event_invitees.next_page_token
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_retrieve
|
19
|
+
event_uuid = "AAAAAAAAAAAAAAAA"
|
20
|
+
invitee_uuid = "AAAAAAAAAAAAAAAA"
|
21
|
+
response = {body: fixture_file("event_invitees/retrieve"), status: 200}
|
22
|
+
stub(path: "scheduled_events/#{event_uuid}/invitees/#{invitee_uuid}", response: response)
|
23
|
+
event_invitee = client.event_invitees.retrieve(event_uuid: event_uuid, invitee_uuid: invitee_uuid)
|
24
|
+
|
25
|
+
assert_equal Calendly::EventInvitee, event_invitee.class
|
26
|
+
assert_equal "https://api.calendly.com/api/v2/scheduled_events/ABCDABCDABCDABCD/invitees/ABCDABCDABCDABCD", event_invitee.uri
|
27
|
+
assert_equal "John Doe", event_invitee.name
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class EventTypesResourceTest < Minitest::Test
|
6
|
+
def test_list
|
7
|
+
user_uri = "https://api.calendly.com/users/AAAAAAAAAAAAAAAA"
|
8
|
+
organization_uri = "https://api.calendly.com/organizations/AAAAAAAAAAAAAAAA"
|
9
|
+
response = {body: fixture_file("event_types/list"), status: 200}
|
10
|
+
stub(path: "event_types?user=#{user_uri}&organization=#{organization_uri}", response: response)
|
11
|
+
event_types = client.event_types.list(user_uri: user_uri, organization_uri: organization_uri)
|
12
|
+
|
13
|
+
assert_equal Calendly::Collection, event_types.class
|
14
|
+
assert_equal Calendly::EventType, event_types.data.first.class
|
15
|
+
assert_equal 1, event_types.count
|
16
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", event_types.next_page_token
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_retrieve
|
20
|
+
event_type_uuid = "AAAAAAAAAAAAAAAA"
|
21
|
+
response = {body: fixture_file("event_types/retrieve"), status: 200}
|
22
|
+
stub(path: "event_types/#{event_type_uuid}", response: response)
|
23
|
+
event_type = client.event_types.retrieve(event_type_uuid: event_type_uuid)
|
24
|
+
|
25
|
+
assert_equal Calendly::EventType, event_type.class
|
26
|
+
assert_equal "https://api.calendly.com/event_types/AAAAAAAAAAAAAAAA", event_type.uri
|
27
|
+
assert_equal "15 Minute Meeting", event_type.name
|
28
|
+
assert_equal "acmesales", event_type.slug
|
29
|
+
assert_equal 30, event_type.duration
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class EventsResourceTest < Minitest::Test
|
6
|
+
def test_list
|
7
|
+
user_uri = "https://api.calendly.com/users/AAAAAAAAAAAAAAAA"
|
8
|
+
organization_uri = "https://api.calendly.com/organizations/AAAAAAAAAAAAAAAA"
|
9
|
+
response = {body: fixture_file("events/list"), status: 200}
|
10
|
+
stub(path: "scheduled_events?user=#{user_uri}&organization=#{organization_uri}", response: response)
|
11
|
+
events = client.events.list(user_uri: user_uri, organization_uri: organization_uri)
|
12
|
+
|
13
|
+
assert_equal Calendly::Collection, events.class
|
14
|
+
assert_equal Calendly::Event, events.data.first.class
|
15
|
+
assert_equal 1, events.count
|
16
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", events.next_page_token
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_retrieve
|
20
|
+
event_uuid = "AAAAAAAAAAAAAAAA"
|
21
|
+
response = {body: fixture_file("events/retrieve"), status: 200}
|
22
|
+
stub(path: "scheduled_events/#{event_uuid}", response: response)
|
23
|
+
event = client.events.retrieve(event_uuid: event_uuid)
|
24
|
+
|
25
|
+
assert_equal Calendly::Event, event.class
|
26
|
+
assert_equal "https://api.calendly.com/scheduled_events/GBGBDCAADAEDCRZ2", event.uri
|
27
|
+
assert_equal "15 Minute Meeting", event.name
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class OrganizationsResourceTest < Minitest::Test
|
6
|
+
def test_invite
|
7
|
+
organization_uuid = "ABCDABCDABCDABCD"
|
8
|
+
email = "email@example.com"
|
9
|
+
response = {body: fixture_file("organizations/invite"), status: 201}
|
10
|
+
stub(method: :post, path: "organizations/#{organization_uuid}/invitations", body: {email: email}, response: response)
|
11
|
+
|
12
|
+
invitation = client.organizations.invite(organization_uuid: organization_uuid, email: email)
|
13
|
+
|
14
|
+
assert_equal Calendly::Invitation, invitation.class
|
15
|
+
assert_equal email, invitation.email
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_list_invitations
|
19
|
+
organization_uuid = "AAAAAAAAAAAAAAAA"
|
20
|
+
response = {body: fixture_file("organizations/list_invitations"), status: 200}
|
21
|
+
stub(path: "organizations/#{organization_uuid}/invitations", response: response)
|
22
|
+
invitations = client.organizations.list_invitations(organization_uuid: organization_uuid)
|
23
|
+
|
24
|
+
assert_equal Calendly::Collection, invitations.class
|
25
|
+
assert_equal Calendly::Invitation, invitations.data.first.class
|
26
|
+
assert_equal 1, invitations.count
|
27
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", invitations.next_page_token
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_list_memberships
|
31
|
+
user_uri = "AAAAAAAAAAAAAAAA"
|
32
|
+
organization_uri = "AAAAAAAAAAAAAAAA"
|
33
|
+
response = {body: fixture_file("organizations/list_memberships"), status: 200}
|
34
|
+
stub(path: "organization_memberships?user=#{user_uri}&organization=#{organization_uri}", response: response)
|
35
|
+
memberships = client.organizations.list_memberships(user_uri: user_uri, organization_uri: organization_uri)
|
36
|
+
|
37
|
+
assert_equal Calendly::Collection, memberships.class
|
38
|
+
assert_equal Calendly::Membership, memberships.data.first.class
|
39
|
+
assert_equal 1, memberships.count
|
40
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", memberships.next_page_token
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_retrieve_invitation
|
44
|
+
organization_uuid = "AAAAAAAAAAAAAAAA"
|
45
|
+
invitation_uuid = "AAAAAAAAAAAAAAAA"
|
46
|
+
response = {body: fixture_file("organizations/retrieve_invitation"), status: 200}
|
47
|
+
stub(path: "organizations/#{organization_uuid}/invitations/#{invitation_uuid}", response: response)
|
48
|
+
invitation = client.organizations.retrieve_invitation(organization_uuid: organization_uuid, invitation_uuid: invitation_uuid)
|
49
|
+
|
50
|
+
assert_equal Calendly::Invitation, invitation.class
|
51
|
+
assert_equal "test@example.com", invitation.email
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_retrieve_membership
|
55
|
+
membership_uuid = "AAAAAAAAAAAAAAAA"
|
56
|
+
response = {body: fixture_file("organizations/retrieve_membership"), status: 200}
|
57
|
+
stub(path: "organization_memberships/#{membership_uuid}", response: response)
|
58
|
+
membership = client.organizations.retrieve_membership(membership_uuid: membership_uuid)
|
59
|
+
|
60
|
+
assert_equal Calendly::Membership, membership.class
|
61
|
+
assert_equal "test@example.com", membership.user.email
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_revoke_invitation
|
65
|
+
organization_uuid = "AAAAAAAAAAAAAAAA"
|
66
|
+
invitation_uuid = "AAAAAAAAAAAAAAAA"
|
67
|
+
response = {body: fixture_file("organizations/revoke_invitation")}
|
68
|
+
stub(method: :delete, path: "organizations/#{organization_uuid}/invitations/#{invitation_uuid}", response: response)
|
69
|
+
assert client.organizations.revoke_invitation(organization_uuid: organization_uuid, invitation_uuid: invitation_uuid)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_remove_user
|
73
|
+
membership_uuid = "AAAAAAAAAAAAAAAA"
|
74
|
+
response = {body: fixture_file("organizations/remove_user")}
|
75
|
+
stub(method: :delete, path: "organization_memberships/#{membership_uuid}", response: response)
|
76
|
+
assert client.organizations.remove_user(membership_uuid: membership_uuid)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_organization_invite_user
|
80
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
81
|
+
|
82
|
+
email = "email@example.com"
|
83
|
+
response = {body: fixture_file("organizations/invite"), status: 201}
|
84
|
+
stub(method: :post, path: "organizations/#{client.organization.uuid}/invitations", body: {email: email}, response: response)
|
85
|
+
|
86
|
+
invitation = client.organization.invite_user(email: email)
|
87
|
+
|
88
|
+
assert_equal Calendly::Invitation, invitation.class
|
89
|
+
assert_equal email, invitation.email
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_organization_list_invitations
|
93
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
94
|
+
stub(path: "organizations/#{client.organization.uuid}/invitations", response: {body: fixture_file("organizations/list_invitations"), status: 200})
|
95
|
+
invitations = client.organization.list_invitations
|
96
|
+
|
97
|
+
assert_equal Calendly::Collection, invitations.class
|
98
|
+
assert_equal Calendly::Invitation, invitations.data.first.class
|
99
|
+
assert_equal 1, invitations.count
|
100
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", invitations.next_page_token
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_organization_revoke_invitation
|
104
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
105
|
+
stub(method: :delete, path: "organizations/#{client.organization.uuid}/invitations/AAAAAAAAAAAAAAAA", response: {body: fixture_file("organizations/revoke_invitation")})
|
106
|
+
assert client.organization.revoke_invitation(invitation_uuid: "AAAAAAAAAAAAAAAA")
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_organization_invitation
|
110
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
111
|
+
response = {body: fixture_file("organizations/retrieve_invitation"), status: 200}
|
112
|
+
stub(path: "organizations/#{client.organization.uuid}/invitations/AAAAAAAAAAAAAAAA", response: response)
|
113
|
+
invitation = client.organization.invitation(invitation_uuid: "AAAAAAAAAAAAAAAA")
|
114
|
+
|
115
|
+
assert_equal Calendly::Invitation, invitation.class
|
116
|
+
assert_equal "test@example.com", invitation.email
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_organization_events
|
120
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
121
|
+
stub(path: "scheduled_events?organization=#{client.organization.uri}", response: {body: fixture_file("events/list"), status: 200})
|
122
|
+
events = client.organization.events
|
123
|
+
|
124
|
+
assert_equal Calendly::Collection, events.class
|
125
|
+
assert_equal Calendly::Event, events.data.first.class
|
126
|
+
assert_equal 1, events.count
|
127
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", events.next_page_token
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_organization_memberships
|
131
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
132
|
+
stub(path: "organization_memberships?organization=#{client.organization.uri}", response: {body: fixture_file("organizations/list_memberships"), status: 200})
|
133
|
+
memberships = client.organization.memberships
|
134
|
+
|
135
|
+
assert_equal Calendly::Collection, memberships.class
|
136
|
+
assert_equal Calendly::Membership, memberships.data.first.class
|
137
|
+
assert_equal 1, memberships.count
|
138
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", memberships.next_page_token
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class SchedulingLinksResourceTest < Minitest::Test
|
6
|
+
def test_create
|
7
|
+
body = {owner_uri: "https://api.calendly.com/event_types/GBGBDCAADAEDCRZ2", max_event_count: 20, owner_type: "EventType"}
|
8
|
+
stub(method: :post, path: "scheduling_links", body: body, response: {body: fixture_file("scheduling_links/create"), status: 201})
|
9
|
+
|
10
|
+
assert client.data_compliance.delete_invitee_data(**body)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class UsersResourceTest < Minitest::Test
|
6
|
+
def test_retrieve
|
7
|
+
user_uuid = "AAAAAAAAAAAAAAAA"
|
8
|
+
response = {body: fixture_file("users/retrieve"), status: 200}
|
9
|
+
stub(path: "users/#{user_uuid}", response: response)
|
10
|
+
user = client.users.retrieve(user_uuid: user_uuid)
|
11
|
+
|
12
|
+
assert_equal Calendly::User, user.class
|
13
|
+
assert_equal "https://api.calendly.com/users/AAAAAAAAAAAAAAAA", user.uri
|
14
|
+
assert_equal "John Doe", user.name
|
15
|
+
assert_equal "acmesales", user.slug
|
16
|
+
assert_equal "test@example.com", user.email
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_me
|
20
|
+
response = {body: fixture_file("users/retrieve"), status: 200}
|
21
|
+
stub(path: "users/me", response: response)
|
22
|
+
me = client.me
|
23
|
+
|
24
|
+
assert_equal Calendly::User, me.class
|
25
|
+
assert_equal "https://api.calendly.com/users/AAAAAAAAAAAAAAAA", me.uri
|
26
|
+
assert_equal "John Doe", me.name
|
27
|
+
assert_equal "acmesales", me.slug
|
28
|
+
assert_equal "test@example.com", me.email
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_organization
|
32
|
+
response = {body: fixture_file("users/retrieve"), status: 200}
|
33
|
+
stub(path: "users/me", response: response)
|
34
|
+
organization = client.organization
|
35
|
+
|
36
|
+
assert_equal Calendly::Organization, organization.class
|
37
|
+
assert_equal "https://api.calendly.com/organizations/AAAAAAAAAAAAAAAA", organization.uri
|
38
|
+
assert_equal "AAAAAAAAAAAAAAAA", organization.uuid
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_event_types
|
42
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
43
|
+
me = client.me
|
44
|
+
|
45
|
+
stub(path: "event_types?user=#{me.uri}&organization=#{me.organization.uri}", response: {body: fixture_file("event_types/list"), status: 200})
|
46
|
+
event_types = client.me.event_types
|
47
|
+
|
48
|
+
assert_equal Calendly::Collection, event_types.class
|
49
|
+
assert_equal Calendly::EventType, event_types.data.first.class
|
50
|
+
assert_equal 1, event_types.count
|
51
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", event_types.next_page_token
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_events
|
55
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
56
|
+
me = client.me
|
57
|
+
|
58
|
+
stub(path: "scheduled_events?user=#{me.uri}&organization=#{me.organization.uri}", response: {body: fixture_file("events/list"), status: 200})
|
59
|
+
events = client.me.events
|
60
|
+
|
61
|
+
assert_equal Calendly::Collection, events.class
|
62
|
+
assert_equal Calendly::Event, events.data.first.class
|
63
|
+
assert_equal 1, events.count
|
64
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", events.next_page_token
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_memberships
|
68
|
+
stub(path: "users/me", response: {body: fixture_file("users/retrieve"), status: 200})
|
69
|
+
me = client.me
|
70
|
+
|
71
|
+
stub(path: "organization_memberships?user=#{me.uri}&organization=#{me.organization.uri}", response: {body: fixture_file("organizations/list_memberships"), status: 200})
|
72
|
+
memberships = client.me.memberships(organization_uri: me.organization.uri)
|
73
|
+
|
74
|
+
assert_equal Calendly::Collection, memberships.class
|
75
|
+
assert_equal Calendly::Membership, memberships.data.first.class
|
76
|
+
assert_equal 1, memberships.count
|
77
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", memberships.next_page_token
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class WebhooksResourceTest < Minitest::Test
|
6
|
+
def test_list
|
7
|
+
organization_uri = "https://api.calendly.com/organizations/AAAAAAAAAAAAAAAA"
|
8
|
+
scope = "user"
|
9
|
+
response = {body: fixture_file("webhooks/list"), status: 200}
|
10
|
+
stub(path: "webhook_subscriptions?organization=#{organization_uri}&scope=#{scope}", response: response)
|
11
|
+
webhooks = client.webhooks.list(organization_uri: organization_uri, scope: scope)
|
12
|
+
|
13
|
+
assert_equal Calendly::Collection, webhooks.class
|
14
|
+
assert_equal Calendly::Webhook, webhooks.data.first.class
|
15
|
+
assert_equal 1, webhooks.count
|
16
|
+
assert_equal "sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi", webhooks.next_page_token
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_create
|
20
|
+
body = {url: "https://blah.foo/bar", events: ["invitee.created"], organization: "https://api.calendly.com/organizations/AAAAAAAAAAAAAAAA", scope: "user", user: "https://api.calendly.com/users/AAAAAAAAAAAAAAAA"}
|
21
|
+
stub(method: :post, path: "webhook_subscriptions", body: body, response: {body: fixture_file("webhooks/create"), status: 201})
|
22
|
+
|
23
|
+
assert client.webhooks.create(url: body[:url], events: body[:events], organization_uri: body[:organization], scope: body[:scope], user_uri: body[:user])
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_retrieve
|
27
|
+
webhook_uuid = "AAAAAAAAAAAAAAAA"
|
28
|
+
response = {body: fixture_file("webhooks/retrieve"), status: 200}
|
29
|
+
stub(path: "webhook_subscriptions/#{webhook_uuid}", response: response)
|
30
|
+
webhook = client.webhooks.retrieve(webhook_uuid: webhook_uuid)
|
31
|
+
|
32
|
+
assert_equal Calendly::Webhook, webhook.class
|
33
|
+
assert_equal "user", webhook.scope
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_delete
|
37
|
+
webhook_uuid = "AAAAAAAAAAAAAAAA"
|
38
|
+
response = {body: fixture_file("webhooks/delete")}
|
39
|
+
stub(method: :delete, path: "webhook_subscriptions/#{webhook_uuid}", response: response)
|
40
|
+
assert client.webhooks.delete(webhook_uuid: webhook_uuid)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
{
|
2
|
+
"collection": [
|
3
|
+
{
|
4
|
+
"cancel_url": "https://calendly.com/cancellations/AAAAAAAAAAAAAAAA",
|
5
|
+
"created_at": "2020-11-23T17:51:18.327602Z",
|
6
|
+
"email": "test@example.com",
|
7
|
+
"event": "https://api.calendly.com/scheduled_events/AAAAAAAAAAAAAAAA",
|
8
|
+
"name": "John Doe",
|
9
|
+
"new_invitee": null,
|
10
|
+
"old_invitee": null,
|
11
|
+
"questions_and_answers": [
|
12
|
+
{
|
13
|
+
"answer": "radio button answer",
|
14
|
+
"position": 0,
|
15
|
+
"question": "Question with Radio Buttons answer type"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"answer": "Multiple line\nAnswer",
|
19
|
+
"position": 1,
|
20
|
+
"question": "Question with Multiple Lines answer type"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"answer": "Answer 1\nAnswer 2\nAnswer 3",
|
24
|
+
"position": 2,
|
25
|
+
"question": "Question with Checkboxes answer type"
|
26
|
+
}
|
27
|
+
],
|
28
|
+
"reschedule_url": "https://calendly.com/reschedulings/AAAAAAAAAAAAAAAA",
|
29
|
+
"rescheduled": false,
|
30
|
+
"status": "active",
|
31
|
+
"text_reminder_number": null,
|
32
|
+
"timezone": "America/New_York",
|
33
|
+
"tracking": {
|
34
|
+
"utm_campaign": null,
|
35
|
+
"utm_source": null,
|
36
|
+
"utm_medium": null,
|
37
|
+
"utm_content": null,
|
38
|
+
"utm_term": null,
|
39
|
+
"salesforce_uuid": null
|
40
|
+
},
|
41
|
+
"updated_at": "2020-11-23T17:51:18.341657Z",
|
42
|
+
"uri": "https://api.calendly.com/scheduled_events/AAAAAAAAAAAAAAAA/invitees/AAAAAAAAAAAAAAAA",
|
43
|
+
"canceled": false,
|
44
|
+
"payment": {
|
45
|
+
"external_id": "ch_AAAAAAAAAAAAAAAAAAAAAAAA",
|
46
|
+
"provider": "stripe",
|
47
|
+
"amount": 1234.56,
|
48
|
+
"currency": "USD",
|
49
|
+
"terms": "sample terms of payment (up to 1,024 characters)",
|
50
|
+
"successful": true
|
51
|
+
}
|
52
|
+
}
|
53
|
+
],
|
54
|
+
"pagination": {
|
55
|
+
"count": 1,
|
56
|
+
"next_page": "https://calendly.com/scheduled_events/AAAAAAAAAAAAAAAA/invitees?count=1&page_token=sNjq4TvMDfUHEl7zHRR0k0E1PCEJWvdi"
|
57
|
+
}
|
58
|
+
}
|