forked from zeroclaw-labs/zeroclaw
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_telegram_integration.sh
More file actions
executable file
Β·362 lines (297 loc) Β· 14.3 KB
/
test_telegram_integration.sh
File metadata and controls
executable file
Β·362 lines (297 loc) Β· 14.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#!/bin/bash
# ZeroClaw Telegram Integration Test Suite
# Automated testing script for Telegram channel functionality
set -e # Exit on error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Test counters
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0
# Helper functions
print_header() {
echo -e "\n${BLUE}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}\n"
}
print_test() {
TOTAL_TESTS=$((TOTAL_TESTS + 1))
echo -e "${YELLOW}Test $TOTAL_TESTS:${NC} $1"
}
pass() {
PASSED_TESTS=$((PASSED_TESTS + 1))
echo -e "${GREEN}β PASS:${NC} $1\n"
}
fail() {
FAILED_TESTS=$((FAILED_TESTS + 1))
echo -e "${RED}β FAIL:${NC} $1\n"
}
warn() {
echo -e "${YELLOW}β WARNING:${NC} $1\n"
}
# Banner
clear
cat << "EOF"
β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘
βββββββββββββββββββββββ βββββββ ββββββββββ ββββββ βββ βββ
ββββββββββββββββββββββββββββββββββββββββββββ βββββββββββ βββ
βββββ ββββββ βββββββββββ ββββββ βββ βββββββββββ ββ βββ
βββββ ββββββ βββββββββββ ββββββ βββ ββββββββββββββββββ
βββββββββββββββββββ βββββββββββββββββββββββββββββββ βββββββββββββ
βββββββββββββββββββ βββ βββββββ ββββββββββββββββββ βββ ββββββββ
π§ͺ TELEGRAM INTEGRATION TEST SUITE π§ͺ
β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘β‘
EOF
echo -e "\n${BLUE}Started at:${NC} $(date)"
echo -e "${BLUE}Working directory:${NC} $(pwd)\n"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 1: Code Quality Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 1: Code Quality Tests"
# Test 1: Cargo test compilation
print_test "Compiling test suite"
if cargo test --lib --no-run &>/dev/null; then
pass "Test suite compiles successfully"
else
fail "Test suite compilation failed"
exit 1
fi
# Test 2: Unit tests
print_test "Running Telegram unit tests"
TEST_OUTPUT=$(cargo test telegram --lib 2>&1)
if echo "$TEST_OUTPUT" | grep -q "test result: ok"; then
PASSED_COUNT=$(echo "$TEST_OUTPUT" | grep -oP '\d+(?= passed)' | head -1)
pass "All Telegram unit tests passed ($PASSED_COUNT tests)"
else
fail "Some unit tests failed"
echo "$TEST_OUTPUT" | grep "FAILED\|error"
fi
# Test 3: Message splitting tests specifically
print_test "Verifying message splitting tests"
if cargo test telegram_split --lib --quiet 2>&1 | grep -q "8 passed"; then
pass "All 8 message splitting tests passed"
else
fail "Message splitting tests incomplete"
fi
# Test 4: Clippy linting
print_test "Running Clippy lint checks"
if cargo clippy --all-targets --quiet 2>&1 | grep -qv "error:"; then
pass "No clippy errors found"
else
CLIPPY_ERRORS=$(cargo clippy --all-targets 2>&1 | grep "error:" | wc -l)
fail "Clippy found $CLIPPY_ERRORS error(s)"
fi
# Test 5: Code formatting
print_test "Checking code formatting"
if cargo fmt --check &>/dev/null; then
pass "Code is properly formatted"
else
warn "Code formatting issues found (run 'cargo fmt' to fix)"
fi
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 2: Build Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 2: Build Tests"
# Test 6: Debug build
print_test "Debug build"
if cargo build --quiet 2>&1; then
pass "Debug build successful"
else
fail "Debug build failed"
fi
# Test 7: Release build
print_test "Release build with optimizations"
START_TIME=$(date +%s)
if cargo build --release --quiet 2>&1; then
END_TIME=$(date +%s)
BUILD_TIME=$((END_TIME - START_TIME))
pass "Release build successful (${BUILD_TIME}s)"
else
fail "Release build failed"
fi
# Test 8: Binary size check
print_test "Binary size verification"
if [ -f "target/release/zeroclaw" ]; then
BINARY_SIZE=$(ls -lh target/release/zeroclaw | awk '{print $5}')
SIZE_BYTES=$(stat -f%z target/release/zeroclaw 2>/dev/null || stat -c%s target/release/zeroclaw)
SIZE_MB=$((SIZE_BYTES / 1024 / 1024))
if [ $SIZE_MB -le 10 ]; then
pass "Binary size is optimal: $BINARY_SIZE (${SIZE_MB}MB)"
else
warn "Binary size is larger than expected: $BINARY_SIZE (${SIZE_MB}MB)"
fi
else
fail "Release binary not found"
fi
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 3: Configuration Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 3: Configuration Tests"
# Test 9: Config file existence
print_test "Configuration file check"
CONFIG_PATH="$HOME/.zeroclaw/config.toml"
if [ -f "$CONFIG_PATH" ]; then
pass "Config file exists at $CONFIG_PATH"
# Test 10: Telegram config
print_test "Telegram configuration check"
if grep -q "\[channels_config.telegram\]" "$CONFIG_PATH"; then
pass "Telegram configuration found"
# Test 11: Bot token configured
print_test "Bot token validation"
if grep -q "bot_token = \"" "$CONFIG_PATH"; then
pass "Bot token is configured"
else
warn "Bot token not set - integration tests will be skipped"
fi
# Test 12: Allowlist configured
print_test "User allowlist validation"
if grep -q "allowed_users = \[" "$CONFIG_PATH"; then
pass "User allowlist is configured"
else
warn "User allowlist not set"
fi
else
warn "Telegram not configured - run 'zeroclaw onboard' first"
fi
else
warn "No config file found - run 'zeroclaw onboard' first"
fi
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 4: Health Check Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 4: Health Check Tests"
# Test 13: Health check timeout
print_test "Health check timeout (should complete in <5s)"
START_TIME=$(date +%s)
HEALTH_OUTPUT=$(timeout 10 target/release/zeroclaw channel doctor 2>&1 || true)
END_TIME=$(date +%s)
HEALTH_TIME=$((END_TIME - START_TIME))
if [ $HEALTH_TIME -le 6 ]; then
pass "Health check completed in ${HEALTH_TIME}s (timeout fix working)"
else
warn "Health check took ${HEALTH_TIME}s (expected <5s)"
fi
# Test 14: Telegram connectivity
print_test "Telegram API connectivity"
if echo "$HEALTH_OUTPUT" | grep -q "Telegram.*healthy"; then
pass "Telegram channel is healthy"
elif echo "$HEALTH_OUTPUT" | grep -q "Telegram.*unhealthy"; then
warn "Telegram channel is unhealthy - check bot token"
elif echo "$HEALTH_OUTPUT" | grep -q "Telegram.*timed out"; then
warn "Telegram health check timed out - network issue?"
else
warn "Could not determine Telegram health status"
fi
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 5: Feature Validation Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 5: Feature Validation Tests"
# Test 15: Message splitting function exists
print_test "Message splitting function implementation"
if grep -q "fn split_message_for_telegram" src/channels/telegram.rs; then
pass "Message splitting function implemented"
else
fail "Message splitting function not found"
fi
# Test 16: Message length constant
print_test "Telegram message length constant"
if grep -q "const TELEGRAM_MAX_MESSAGE_LENGTH: usize = 4096" src/channels/telegram.rs; then
pass "TELEGRAM_MAX_MESSAGE_LENGTH constant defined correctly"
else
fail "Message length constant missing or incorrect"
fi
# Test 17: Timeout implementation
print_test "Health check timeout implementation"
if grep -q "tokio::time::timeout" src/channels/telegram.rs; then
pass "Timeout mechanism implemented in health_check"
else
fail "Timeout not implemented in health_check"
fi
# Test 18: chat_id validation
print_test "chat_id validation implementation"
if grep -q "let Some(chat_id) = chat_id else" src/channels/telegram.rs; then
pass "chat_id validation implemented"
else
fail "chat_id validation missing"
fi
# Test 19: Duration import
print_test "std::time::Duration import"
if grep -q "use std::time::Duration" src/channels/telegram.rs; then
pass "Duration import added"
else
fail "Duration import missing"
fi
# Test 20: Continuation markers
print_test "Multi-part message markers"
if grep -q "(continues...)" src/channels/telegram.rs && grep -q "(continued)" src/channels/telegram.rs; then
pass "Continuation markers implemented for split messages"
else
fail "Continuation markers missing"
fi
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Phase 6: Integration Test Preparation
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Phase 6: Manual Integration Tests"
echo -e "${BLUE}The following tests require manual interaction:${NC}\n"
cat << 'EOF'
π± Manual Test Checklist:
1. [ ] Start the channel:
zeroclaw channel start
2. [ ] Send a short message to your bot in Telegram:
"Hello bot!"
β Verify: Bot responds within 3 seconds
3. [ ] Send a long message (>4096 characters):
python3 -c 'print("test " * 1000)'
β Verify: Message is split into chunks
β Verify: Chunks have (continues...) and (continued) markers
β Verify: All chunks arrive in order
4. [ ] Test unauthorized access:
- Edit config: allowed_users = ["999999999"]
- Send a message
β Verify: Warning log appears
β Verify: Message is ignored
- Restore correct user ID
5. [ ] Test rapid messages (10 messages in 5 seconds):
β Verify: All messages are processed
β Verify: No rate limit errors
β Verify: Responses have delays
6. [ ] Check logs for errors:
RUST_LOG=debug zeroclaw channel start
β Verify: No unexpected errors
β Verify: "missing chat_id" appears for malformed messages
β Verify: Health check logs show "timed out" if needed
EOF
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Test Summary
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print_header "Test Summary"
echo -e "${BLUE}Total Tests:${NC} $TOTAL_TESTS"
echo -e "${GREEN}Passed:${NC} $PASSED_TESTS"
echo -e "${RED}Failed:${NC} $FAILED_TESTS"
echo -e "${YELLOW}Warnings:${NC} $((TOTAL_TESTS - PASSED_TESTS - FAILED_TESTS))"
PASS_RATE=$((PASSED_TESTS * 100 / TOTAL_TESTS))
echo -e "\n${BLUE}Pass Rate:${NC} ${PASS_RATE}%"
if [ $FAILED_TESTS -eq 0 ]; then
echo -e "\n${GREEN}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}"
echo -e "${GREEN}β ALL AUTOMATED TESTS PASSED! π${NC}"
echo -e "${GREEN}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}\n"
echo -e "${BLUE}Next Steps:${NC}"
echo -e "1. Run manual integration tests (see checklist above)"
echo -e "2. Deploy to production when ready"
echo -e "3. Monitor logs for issues\n"
exit 0
else
echo -e "\n${RED}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}"
echo -e "${RED}β SOME TESTS FAILED${NC}"
echo -e "${RED}ββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}\n"
echo -e "${BLUE}Troubleshooting:${NC}"
echo -e "1. Review failed tests above"
echo -e "2. Run: cargo test telegram --lib -- --nocapture"
echo -e "3. Check: cargo clippy --all-targets"
echo -e "4. Fix issues and re-run this script\n"
exit 1
fi