8000 add test endpoint for webhooks and sample code to use them · tableau/server-client-python@04ed840 · GitHub
[go: up one dir, main page]

Skip to content

Commit 04ed840

Browse files
committed
add test endpoint for webhooks and sample code to use them
1 parent 8c3a40a commit 04ed840

File tree

3 files changed

+99
-3
lines changed

3 files changed

+99
-3
lines changed

samples/explore_webhooks.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
####
2+
# This script demonstrates how to use the Tableau Server Client
3+
# to interact with webhooks. It explores the different
4+
# functions that the Server API supports on webhooks.
5+
#
6+
# With no flags set, this sample will query all webhooks,
7+
# pick one webhook and print the name of the webhook.
8+
# Adding flags will demonstrate the specific feature
9+
# on top of the general operations.
10+
####
11+
12+
import argparse
13+
import getpass
14+
import logging
15+
import os.path
16+
17+
import tableauserverclient as TSC
18+
19+
20+
def main():
21+
22+
parser = argparse.ArgumentParser(description='Explore webhook functions supported by the Server API.')
23+
parser.add_argument('--server', '-s', required=True, help='server address')
24+
parser.add_argument('--username', '-u', required=True, help='username to sign into server')
25+
parser.add_argument('--site', '-S', default=None)
26+
parser.add_argument('-p', default=None, help='password')
27+
parser.add_argument('--create', '-c', help='create a webhook')
28+
parser.add_argument('--logging-level', '-l', choices=['debug', 'info', 'error'], default='error',
29+
help='desired logging level (set to error by default)')
30+
31+
args = parser.parse_args()
32+
33+
34+
if args.p is None:
35+
password = getpass.getpass("Password: ")
36+
else:
37+
password = args.p
38+
39+
# Set logging level based on user input, or error by default
40+
logging_level = getattr(logging, args.logging_level.upper())
41+
logging.basicConfig(level=logging_level)
42+
43+
# SIGN IN
44+
tableau_auth = TSC.TableauAuth(args.username, password, args.site)
45+
print("Signing in to " + args.server + " [" + args.site + "] as " + args.username)
46+
server = TSC.Server(args.server)
47+
48+
# Set http options to disable verifying SSL
49+
server.add_http_options({'verify': False})
50+
51+
server.use_server_version()
52+
53+
with server.auth.sign_in(tableau_auth):
54+
55+
# Publish webhook if publish flag is set (-publish, -p)
56+
if args.create:
57+
58+
new_webhook = TSC.WebhookItem()
59+
new_webhook.name = args.create
60+
new_webhook.url = "https://ifttt.com/maker-url"
61+
new_webhook.event = "datasource-created"
62+
print(new_webhook)
63+
new_webhook = server.webhooks.create(new_webhook)
64+
print("Webhook created. ID: {}".format(new_webhook.id))
65+
66+
# Gets all webhook items
67+
all_webhooks, pagination_item = server.webhooks.get()
68+
print("\nThere are {} webhooks on site: ".format(pagination_item.total_available))
69+
print([webhook.name for webhook in all_webhooks])
70+
71+
if all_webhooks:
72+
# Pick one webhook from the list and delete it
73+
sample_webhook = all_webhooks[0]
74+
# sample_webhook.delete()
75+
print("+++"+sample_webhook.name)
76+
77+
78+
79+
80+
if __name__ == '__main__':
81+
main()

tableauserverclient/server/endpoint/webhooks_endpoint.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,12 @@ def create(self, webhook_item):
5151

5252
logger.info('Created new webhook (ID: {0})'.format(new_webhook.id))
5353
return new_webhook
54+
55+
@api(version="3.6")
56+
def test(self, webhook_id):
57+
if not webhook_id:
58+
error = "Webhook ID undefined."
59+
raise ValueError(error)
60+
url = "{0}/{1}/test".format(self.baseurl, webhook_id)
61+
testOutcome = self.get_request(url)
62+
logger.info('Testing webhook (ID: {0} returned {1})'.format(webhook_id, testOutcome))

test/test_webhook.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,21 @@ def test_delete(self):
5151
def test_delete_missing_id(self):
5252
self.assertRaises(ValueError, self.server.webhooks.delete, '')
5353

54+
def test_test(self):
55+
with requests_mock.mock() as m:
56+
m.get(self.baseurl + '/ee8c6e70-43b6-11e6-af4f-f7b0d8e20760/test', status_code=200)
57+
self.server.webhooks.test('ee8c6e70-43b6-11e6-af4f-f7b0d8e20760')
58+
5459
def test_create(self):
5560
with open(CREATE_XML, 'rb') as f:
5661
response_xml = f.read().decode('utf-8')
5762
with requests_mock.mock() as m:
5863
m.post(self.baseurl, text=response_xml)
5964
new_webhook = TSC.WebhookItem()
6065
new_webhook.name = "Test Webhook"
61-
new_webhook.url = "http://ifttt.com/maker-url"
62-
new_webhook.event = "webhook-source-event-datasource-created"
66+
new_webhook.url = "https://ifttt.com/maker-url"
67+
new_webhook.event = "datasource-created"
68+
new_webhook.owner_id =
6369

6470
new_webhook = self.server.webhooks.create(new_webhook)
6571

@@ -72,6 +78,6 @@ def test_request_factory(self):
7278
webhook_item = WebhookItem()
7379
webhook_item._set_values("webhook-id", "webhook-name", "url", "api-event-name",
7480
None)
75-
webhook_request_actual = '{}\n'.format(RequestFactory.Webhook.create_req(webhook_item).decode('utf-8'))
81+
webhook_request_actual = '{}\r\n'.format(RequestFactory.Webhook.create_req(webhook_item).decode('utf-8'))
7682
self.maxDiff = None
7783
self.assertEqual(webhook_request_expected, webhook_request_actual)

0 commit comments

Comments
 (0)
0