public function testIsAvailable()
 {
     $endpoint = new TwitterAPIEndpoint('/test/faker');
     $endpoint->setRemaining(78);
     $endpoint->setLimit(100);
     $this->assertFalse($endpoint->isAvailable(80));
     $endpoint->setRemaining(81);
     $endpoint->setLimit(100);
     $this->assertTrue($endpoint->isAvailable(80));
     $endpoint->setRemaining(180);
     $endpoint->setLimit(180);
     $this->assertTrue($endpoint->isAvailable(80));
 }
 /**
  * Make a Twitter API request.
  * @param TwitterAPIEndpoint $endpoint
  * @param arr $args URL query string parameters
  * @param str $id ID for use in endpoint path
  * @param bool $suppress_404_error Defaults to false, don't log 404 errors from deleted tweets
  * @return arr HTTP status code, payload
  */
 public function apiRequest(TwitterAPIEndpoint $endpoint, $args = array(), $id = null, $suppress_404_error = false)
 {
     $logger = Logger::getInstance();
     $attempts = 0;
     $continue = true;
     $url = $endpoint->getPathWithID($id);
     $is_rate_limit_check = $endpoint->getShortPath() == "/application/rate_limit_status";
     if ($is_rate_limit_check || $endpoint->isAvailable($this->percent_use_ceiling)) {
         while ($attempts <= $this->num_retries && $continue) {
             $content = $this->to->OAuthRequest($url, 'GET', $args);
             $status = $this->to->lastStatusCode();
             if (!$is_rate_limit_check) {
                 $endpoint->decrementRemaining();
                 $logger->logInfo($endpoint->getStatus(), __METHOD__ . ',' . __LINE__);
             }
             $status_message = "";
             if ($status > 200) {
                 $status_message = "Could not retrieve {$url}";
                 if (sizeof($args) > 0) {
                     $status_message .= "?";
                 }
                 foreach ($args as $key => $value) {
                     $status_message .= $key . "=" . $value . "&";
                 }
                 $translated_status_code = $this->translateErrorCode($status);
                 $status_message .= " | API ERROR: {$translated_status_code}";
                 //we expect a 404 when checking a tweet deletion, so suppress log line if defined
                 if ($status == 404) {
                     if ($suppress_404_error === false) {
                         $logger->logUserError($status_message, __METHOD__ . ',' . __LINE__);
                     }
                 } else {
                     //do log any other kind of error
                     $logger->logUserError($status_message, __METHOD__ . ',' . __LINE__);
                 }
                 $status_message = "";
                 if ($status != 404 && $status != 403) {
                     $attempts++;
                     if ($this->total_errors_so_far >= $this->total_errors_to_tolerate) {
                         $continue = false;
                     } else {
                         $this->total_errors_so_far = $this->total_errors_so_far + 1;
                         $logger->logUserInfo('Total API errors so far: ' . $this->total_errors_so_far . ' | Total errors to tolerate ' . $this->total_errors_to_tolerate, __METHOD__ . ',' . __LINE__);
                     }
                 } else {
                     $continue = false;
                 }
             } else {
                 $continue = false;
             }
         }
         return array($status, $content);
     } else {
         throw new APICallLimitExceededException("API call allocation limit reached. " . $endpoint->getStatus());
     }
 }