From 6da3d9cbcf2005f6cca64564e778954de6dd82ff Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 28 Dec 2023 11:27:52 +0000 Subject: [PATCH] Extend specs to cover target_calendars --- pycronofy/client.py | 2 +- pycronofy/tests/test_real_time_scheduling.py | 150 ++++++++++++++++++- 2 files changed, 150 insertions(+), 2 deletions(-) diff --git a/pycronofy/client.py b/pycronofy/client.py index 872d742..5f81909 100644 --- a/pycronofy/client.py +++ b/pycronofy/client.py @@ -654,7 +654,7 @@ def real_time_scheduling(self, will be redirected to after choosing a slot :param string event_creation: - A string to determine behaviour of event creation. The value of 'single' will create the resulting event in a single - calendar. 'default' if omitted, creates an event in each calendar + calendar. 'default' or omitted, creates an event in each calendar listed in target_calendars. See docs for more details. (Optional) See https://docs.cronofy.com/developers/api/scheduling/real-time-scheduling/ for reference. diff --git a/pycronofy/tests/test_real_time_scheduling.py b/pycronofy/tests/test_real_time_scheduling.py index 801c742..a2f9a1b 100644 --- a/pycronofy/tests/test_real_time_scheduling.py +++ b/pycronofy/tests/test_real_time_scheduling.py @@ -67,6 +67,124 @@ def request_callback(request): assert payload['callback_url'] == 'http://www.example.com/callback' assert payload['redirect_urls']['completed_url'] == 'http://www.example.com/completed' + assert request.headers['Authorization'] == "Bearer %s" % client.auth.client_secret + + return (200, {}, json.dumps(REAL_TIME_SCHEDULING_RESPONSE)) + + responses.add_callback( + responses.POST, + url='%s/%s/real_time_scheduling' % (settings.API_BASE_URL, settings.API_VERSION), + callback=request_callback, + content_type='application/json', + ) + + periods = ( + {'start': "2017-01-03T09:00:00Z", 'end': "2017-01-03T18:00:00Z"}, + {'start': "2017-01-04T09:00:00Z", 'end': "2017-01-04T18:00:00Z"} + ) + example_participants = ({ + 'members': [ + "acc_567236000909002", + "acc_678347111010113", + ], + }) + + availability = { + 'participants': example_participants, + 'available_periods': periods, + 'required_duration': 30, + 'start_interval': 30, + 'buffer': { + 'before': 30, + 'after': 45, + }, + } + + oauth = { + 'scope': 'foo', + 'redirect_uri': 'http://www.example.com', + 'state': 'bar' + } + + minimum_notice = { + 'hours': 4 + } + + callback_url = 'http://www.example.com/callback' + + redirect_urls = { + 'completed_url': 'http://www.example.com/completed' + } + + result = client.real_time_scheduling(availability, oauth, TEST_EVENT, [], minimum_notice, callback_url=callback_url, redirect_urls=redirect_urls) + assert result == REAL_TIME_SCHEDULING_RESPONSE + + +@responses.activate +def test_real_time_scheduling_with_target_calendars(client): + """Test Client.availability(). + + :param Client client: Client instance with test data. + """ + + def request_callback(request): + payload = json.loads(request.body) + + availability = payload['availability'] + assert availability['required_duration'] == {'minutes': 30} + assert availability['start_interval'] == {'minutes': 30} + assert availability['buffer']['before'] == {'minutes': 30} + assert availability['buffer']['after'] == {'minutes': 45} + assert availability['available_periods'] == [ + {'start': '2017-01-03T09:00:00Z', 'end': '2017-01-03T18:00:00Z'}, + {'start': '2017-01-04T09:00:00Z', 'end': '2017-01-04T18:00:00Z'} + ] + assert availability['participants'] == [ + { + 'required': 1, + 'members': [ + {'sub': 'acc_567236000909002'}, + {'sub': 'acc_678347111010113'} + ] + } + ] + + assert payload['target_calendars'] == [ + { + 'sub': "acc_567236000909002", + 'calendar_id': "cal_ABCDEF2ubSrL4a7x_aBCDE@f7mZzc2ufdgAciZvA", + 'event': { + 'conferencing': { + 'profile_id': "integrated" + } + }, + 'attendee': { + 'email': "support@cronofy.com", + 'display_name': "Marty McFly" + } + }, + { + 'sub': "acc_678347111010113", + 'calendar_id': "cal_HIJKLM2ubSrL0a2e_lFGHI@f5mZzc6ufdgBciYvZ", + 'event': { + 'conferencing': { + 'profile_id': "pro_ZYwjVpYOFWgx6eYl" + } + }, + 'attendee': { + 'email': "support@cronofy.com", + 'display_name': "Doc Brown" + } + } + ] + + assert payload['event'] == TEST_EVENT + assert payload['oauth'] == oauth + assert payload['minimum_notice'] == {'hours': 4} + + assert payload['callback_url'] == 'http://www.example.com/callback' + assert payload['redirect_urls']['completed_url'] == 'http://www.example.com/completed' + assert payload['event_creation'] == "single" assert request.headers['Authorization'] == "Bearer %s" % client.auth.client_secret @@ -89,6 +207,7 @@ def request_callback(request): "acc_567236000909002", "acc_678347111010113", ], + 'required': 1 }) availability = { @@ -108,6 +227,35 @@ def request_callback(request): 'state': 'bar' } + target_calendars = ( + { + 'sub': "acc_567236000909002", + 'calendar_id': "cal_ABCDEF2ubSrL4a7x_aBCDE@f7mZzc2ufdgAciZvA", + 'event': { + 'conferencing': { + 'profile_id': "integrated" + } + }, + 'attendee': { + 'email': "support@cronofy.com", + 'display_name': "Marty McFly" + } + }, + { + 'sub': "acc_678347111010113", + 'calendar_id': "cal_HIJKLM2ubSrL0a2e_lFGHI@f5mZzc6ufdgBciYvZ", + 'event': { + 'conferencing': { + 'profile_id': "pro_ZYwjVpYOFWgx6eYl" + } + }, + 'attendee': { + 'email': "support@cronofy.com", + 'display_name': "Doc Brown" + } + } + ) + minimum_notice = { 'hours': 4 } @@ -120,7 +268,7 @@ def request_callback(request): event_creation = "single" - result = client.real_time_scheduling(availability, oauth, TEST_EVENT, [], minimum_notice, callback_url=callback_url, redirect_urls=redirect_urls, event_creation=event_creation) + result = client.real_time_scheduling(availability, oauth, TEST_EVENT, target_calendars, minimum_notice, callback_url=callback_url, redirect_urls=redirect_urls, event_creation=event_creation) assert result == REAL_TIME_SCHEDULING_RESPONSE