Deadmon commited on
Commit
ca10ff4
·
verified ·
1 Parent(s): 2cbe699

Update test_webhook_and_start.py

Browse files
Files changed (1) hide show
  1. test_webhook_and_start.py +100 -61
test_webhook_and_start.py CHANGED
@@ -4,20 +4,30 @@ import hmac
4
  import hashlib
5
  import requests
6
  from unittest.mock import patch
7
- from http.client import HTTPConnection
8
  import logging
 
9
 
10
- # Configure logging for tests
11
- logging.basicConfig(level=logging.INFO)
 
 
 
 
 
 
 
 
 
12
  logger = logging.getLogger(__name__)
13
 
14
  # Base URL of your Hugging Face Space
15
- BASE_URL = "https://<your-space>.hf.space" # Replace with your Space URL
16
- WEBHOOK_SECRET = "your-base64-encoded-secret" # Replace with your webhook secret
17
 
18
  class TestPipecatWebhookAndStart(unittest.TestCase):
19
  def setUp(self):
20
  """Set up test case with common variables."""
 
21
  self.webhook_url = f"{BASE_URL}/webhook"
22
  self.start_url = f"{BASE_URL}/start"
23
  self.valid_payload = {
@@ -37,6 +47,7 @@ class TestPipecatWebhookAndStart(unittest.TestCase):
37
 
38
  def generate_signature(self, payload):
39
  """Generate HMAC-SHA256 signature for a payload."""
 
40
  payload_str = json.dumps(payload)
41
  computed = hmac.new(
42
  WEBHOOK_SECRET.encode('utf-8'),
@@ -47,95 +58,123 @@ class TestPipecatWebhookAndStart(unittest.TestCase):
47
 
48
  def test_server_availability(self):
49
  """Test that the server is running and accessible."""
 
50
  try:
51
  response = requests.get(BASE_URL, timeout=5)
52
- # Allow 404 for root since the app doesn't serve it
53
  self.assertIn(response.status_code, [200, 404], f"Server not accessible: {response.status_code}")
54
- logger.info("Server availability test passed")
55
  except requests.RequestException as e:
 
56
  self.fail(f"Server not reachable: {str(e)}")
57
 
58
  def test_webhook_dialin_connected(self):
59
  """Test webhook handling of dialin.connected event."""
 
60
  headers = {"X-Daily-Signature": self.generate_signature(self.valid_payload)}
61
  with patch('requests.post') as mocked_post:
62
  mocked_post.return_value.status_code = 200
63
  mocked_post.return_value.text = '{"status": "Bot started"}'
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  response = requests.post(
66
  self.webhook_url,
67
- json=self.valid_payload,
68
  headers=headers,
69
  timeout=5
70
  )
71
-
72
  self.assertEqual(response.status_code, 200, f"Webhook failed: {response.text}")
73
  self.assertEqual(response.json(), {"status": "Event received"})
74
- mocked_post.assert_called_once_with(
75
- self.start_url,
76
- json=self.valid_payload,
77
- timeout=5
78
- )
79
- logger.info("Webhook dialin.connected test passed")
80
-
81
- def test_webhook_dialin_stopped(self):
82
- """Test webhook handling of dialin.stopped event."""
83
- headers = {"X-Daily-Signature": self.generate_signature(self.stopped_payload)}
84
- response = requests.post(
85
- self.webhook_url,
86
- json=self.stopped_payload,
87
- headers=headers,
88
- timeout=5
89
- )
90
-
91
- self.assertEqual(response.status_code, 200, f"Webhook failed: {response.text}")
92
- self.assertEqual(response.json(), {"status": "Event received"})
93
- logger.info("Webhook dialin.stopped test passed")
94
 
95
  def test_webhook_invalid_signature(self):
96
  """Test webhook rejects requests with invalid signature."""
 
97
  headers = {"X-Daily-Signature": "invalid-signature"}
98
- response = requests.post(
99
- self.webhook_url,
100
- json=self.valid_payload,
101
- headers=headers,
102
- timeout=5
103
- )
104
-
105
- self.assertEqual(response.status_code, 401, f"Expected 401 for invalid signature: {response.status_code}")
106
- logger.info("Webhook invalid signature test passed")
 
 
 
107
 
108
  def test_start_endpoint_valid_payload(self):
109
  """Test /start endpoint with valid dial-in payload."""
110
- response = requests.post(
111
- self.start_url,
112
- json=self.valid_payload,
113
- timeout=5
114
- )
115
-
116
- self.assertEqual(response.status_code, 200, f"Start endpoint failed: {response.text}")
117
- response_json = response.json()
118
- self.assertEqual(response_json.get("status"), "Bot started")
119
- self.assertEqual(response_json.get("bot_type"), "call_transfer")
120
- logger.info("Start endpoint valid payload test passed")
 
 
 
 
121
 
122
  def test_start_endpoint_invalid_payload(self):
123
  """Test /start endpoint with invalid payload."""
 
124
  invalid_payload = {"invalid": "data"}
125
- response = requests.post(
126
- self.start_url,
127
- json=invalid_payload,
128
- timeout=5
129
- )
130
-
131
- self.assertEqual(response.status_code, 400, f"Expected 400 for invalid payload: {response.status_code}")
132
- logger.info("Start endpoint invalid payload test passed")
 
 
 
133
 
134
  def test_404_on_root(self):
135
  """Test that root endpoint returns 404 (as seen in logs)."""
136
- response = requests.get(f"{BASE_URL}/?__theme=dark", timeout=5)
137
- self.assertEqual(response.status_code, 404, f"Expected 404 for root endpoint: {response.status_code}")
138
- logger.info("Root endpoint 404 test passed")
 
 
 
 
 
139
 
140
  if __name__ == '__main__':
141
- unittest.main()
 
 
 
4
  import hashlib
5
  import requests
6
  from unittest.mock import patch
 
7
  import logging
8
+ import os
9
 
10
+ # Configure logging to write to both file and console
11
+ LOG_FILE = "/app/test.log"
12
+ os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
13
+ logging.basicConfig(
14
+ level=logging.INFO,
15
+ format='%(asctime)s - %(levelname)s - %(message)s',
16
+ handlers=[
17
+ logging.FileHandler(LOG_FILE),
18
+ logging.StreamHandler()
19
+ ]
20
+ )
21
  logger = logging.getLogger(__name__)
22
 
23
  # Base URL of your Hugging Face Space
24
+ BASE_URL="https://deadmon-pipecat.hf.space/webhook" # Replace with your endpoint
25
+ WEBHOOK_SECRET="eW91ci1zZWNyZXQtc3RyaW5n" # Base64-encoded secret
26
 
27
  class TestPipecatWebhookAndStart(unittest.TestCase):
28
  def setUp(self):
29
  """Set up test case with common variables."""
30
+ logger.info("Setting up test case")
31
  self.webhook_url = f"{BASE_URL}/webhook"
32
  self.start_url = f"{BASE_URL}/start"
33
  self.valid_payload = {
 
47
 
48
  def generate_signature(self, payload):
49
  """Generate HMAC-SHA256 signature for a payload."""
50
+ logger.debug("Generating HMAC signature")
51
  payload_str = json.dumps(payload)
52
  computed = hmac.new(
53
  WEBHOOK_SECRET.encode('utf-8'),
 
58
 
59
  def test_server_availability(self):
60
  """Test that the server is running and accessible."""
61
+ logger.info("Starting test_server_availability")
62
  try:
63
  response = requests.get(BASE_URL, timeout=5)
 
64
  self.assertIn(response.status_code, [200, 404], f"Server not accessible: {response.status_code}")
65
+ logger.info(f"Server availability test passed: Status code {response.status_code}")
66
  except requests.RequestException as e:
67
+ logger.error(f"Server not reachable: {str(e)}")
68
  self.fail(f"Server not reachable: {str(e)}")
69
 
70
  def test_webhook_dialin_connected(self):
71
  """Test webhook handling of dialin.connected event."""
72
+ logger.info("Starting test_webhook_dialin_connected")
73
  headers = {"X-Daily-Signature": self.generate_signature(self.valid_payload)}
74
  with patch('requests.post') as mocked_post:
75
  mocked_post.return_value.status_code = 200
76
  mocked_post.return_value.text = '{"status": "Bot started"}'
77
 
78
+ try:
79
+ response = requests.post(
80
+ self.webhook_url,
81
+ json=self.valid_payload,
82
+ headers=headers,
83
+ timeout=5
84
+ )
85
+ self.assertEqual(response.status_code, 200, f"Webhook failed: {response.text}")
86
+ self.assertEqual(response.json(), {"status": "Event received"})
87
+ mocked_post.assert_called_once_with(
88
+ self.start_url,
89
+ json=self.valid_payload,
90
+ timeout=5
91
+ )
92
+ logger.info("Webhook dialin.connected test passed")
93
+ except Exception as e:
94
+ logger.error(f"Webhook dialin.connected test failed: {str(e)}")
95
+ raise
96
+
97
+ def test_webhook_dialin_stopped(self):
98
+ """Test webhook handling of dialin.stopped event."""
99
+ logger.info("Starting test_webhook_dialin_stopped")
100
+ headers = {"X-Daily-Signature": self.generate_signature(self.stopped_payload)}
101
+ try:
102
  response = requests.post(
103
  self.webhook_url,
104
+ json=self.stopped_payload,
105
  headers=headers,
106
  timeout=5
107
  )
 
108
  self.assertEqual(response.status_code, 200, f"Webhook failed: {response.text}")
109
  self.assertEqual(response.json(), {"status": "Event received"})
110
+ logger.info("Webhook dialin.stopped test passed")
111
+ except Exception as e:
112
+ logger.error(f"Webhook dialin.stopped test failed: {str(e)}")
113
+ raise
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
  def test_webhook_invalid_signature(self):
116
  """Test webhook rejects requests with invalid signature."""
117
+ logger.info("Starting test_webhook_invalid_signature")
118
  headers = {"X-Daily-Signature": "invalid-signature"}
119
+ try:
120
+ response = requests.post(
121
+ self.webhook_url,
122
+ json=self.valid_payload,
123
+ headers=headers,
124
+ timeout=5
125
+ )
126
+ self.assertEqual(response.status_code, 401, f"Expected 401 for invalid signature: {response.status_code}")
127
+ logger.info("Webhook invalid signature test passed")
128
+ except Exception as e:
129
+ logger.error(f"Webhook invalid signature test failed: {str(e)}")
130
+ raise
131
 
132
  def test_start_endpoint_valid_payload(self):
133
  """Test /start endpoint with valid dial-in payload."""
134
+ logger.info("Starting test_start_endpoint_valid_payload")
135
+ try:
136
+ response = requests.post(
137
+ self.start_url,
138
+ json=self.valid_payload,
139
+ timeout=5
140
+ )
141
+ self.assertEqual(response.status_code, 200, f"Start endpoint failed: {response.text}")
142
+ response_json = response.json()
143
+ self.assertEqual(response_json.get("status"), "Bot started")
144
+ self.assertEqual(response_json.get("bot_type"), "call_transfer")
145
+ logger.info("Start endpoint valid payload test passed")
146
+ except Exception as e:
147
+ logger.error(f"Start endpoint valid payload test failed: {str(e)}")
148
+ raise
149
 
150
  def test_start_endpoint_invalid_payload(self):
151
  """Test /start endpoint with invalid payload."""
152
+ logger.info("Starting test_start_endpoint_invalid_payload")
153
  invalid_payload = {"invalid": "data"}
154
+ try:
155
+ response = requests.post(
156
+ self.start_url,
157
+ json=invalid_payload,
158
+ timeout=5
159
+ )
160
+ self.assertEqual(response.status_code, 400, f"Expected 400 for invalid payload: {response.status_code}")
161
+ logger.info("Start endpoint invalid payload test passed")
162
+ except Exception as e:
163
+ logger.error(f"Start endpoint invalid payload test failed: {str(e)}")
164
+ raise
165
 
166
  def test_404_on_root(self):
167
  """Test that root endpoint returns 404 (as seen in logs)."""
168
+ logger.info("Starting test_404_on_root")
169
+ try:
170
+ response = requests.get(f"{BASE_URL}/?__theme=dark", timeout=5)
171
+ self.assertEqual(response.status_code, 404, f"Expected 404 for root endpoint: {response.status_code}")
172
+ logger.info("Root endpoint 404 test passed")
173
+ except Exception as e:
174
+ logger.error(f"Root endpoint 404 test failed: {str(e)}")
175
+ raise
176
 
177
  if __name__ == '__main__':
178
+ logger.info("Starting test suite")
179
+ unittest.main()
180
+ logger.info("Test suite completed")