value === true || $this->value === 'true' || $this->value === 1 || $this->value === '1'; } public function getVariableValue(): mixed { return $this->value; } } class DummyConfig { public DummyVar $enabled; public DummyVar $api_key; public DummyVar $server_url; public function __construct() { $this->enabled = new DummyVar('true'); $this->api_key = new DummyVar('test_api_key'); $this->server_url = new DummyVar('https://example.test'); } public function getModuleName(): string { return 'bird'; } } class FakeBird extends BirdClient { public array $last = []; public function __construct() { // Bypass DB-backed config classes with our dummy config $this->config = new DummyConfig(); } protected function doHttpRequest(string $method, string $url, array $headers, string $body = ''): array { $this->last = compact('method','url','headers','body'); // Return a canned success response $resp = ['id' => 'call_123', 'status' => 'queued']; return ['status_code' => 200, 'body' => json_encode($resp)]; } } function assert_true($cond, $msg) { if ($cond) { echo "✔ $msg\n"; } else { echo "✘ $msg\n"; exit(1); } } // Test: create call (POST /voice/calls) $client = new FakeBird(); $payload = [ 'to' => '+4511122233', 'from' => '+4599988877', 'tts' => [ 'message' => 'Hello from test' ], ]; $res = $client->sendPostRequest('/voice/calls', $payload); assert_true(is_object($res) || is_array($res), 'Response is JSON-decodable'); assert_true(str_starts_with($client->last['url'], 'https://example.test/voice/calls'), 'POST URL composed correctly'); assert_true($client->last['method'] === 'POST', 'HTTP method is POST'); assert_true(in_array('Authorization: Bearer test_api_key', $client->last['headers'], true), 'Authorization header is set'); assert_true(json_decode($client->last['body'], true)['to'] === '+4511122233', 'POST body encoded correctly'); // Test: get call (GET /voice/calls/{id}) $client2 = new FakeBird(); $res2 = $client2->sendGetRequest('/voice/calls/call_123'); assert_true(str_starts_with($client2->last['url'], 'https://example.test/voice/calls/call_123'), 'GET URL composed correctly'); assert_true($client2->last['method'] === 'GET', 'HTTP method is GET'); assert_true(empty($client2->last['body']), 'GET body is empty'); echo "VoiceCallsApiTest completed.\n";