4352655636.76543, // number test 'test1b' => '$&+,/:;=?@#%', // special char test. These should all get encoded 'test1c' => 'And now for a string test' // string test ); $service->setQueryString($params); $responseBody = $service->request($url)->getBody(); foreach ($params as $key => $value) { $this->assertContains("$value", $responseBody); $this->assertContains("$value", $responseBody); } } function testGetDataWithSetQueryString() { $service = new RestfulServiceTest_MockRestfulService(Director::absoluteBaseURL()); $url = 'RestfulServiceTest_Controller/'; $params = array( 'test1a' => 'val1a', 'test1b' => 'val1b' ); $service->setQueryString($params); $responseBody = $service->request($url)->getBody(); foreach ($params as $key => $value) { $this->assertContains("$value", $responseBody); $this->assertContains("$value", $responseBody); } } function testGetDataWithUrlParameters() { $service = new RestfulServiceTest_MockRestfulService(Director::absoluteBaseURL()); $url = 'RestfulServiceTest_Controller/'; $params = array( 'test1a' => 'val1a', 'test1b' => 'val1b' ); $url .= '?' . http_build_query($params); $responseBody = $service->request($url)->getBody(); foreach ($params as $key => $value) { $this->assertContains("$value", $responseBody); $this->assertContains("$value", $responseBody); } } function testPostData() { $service = new RestfulServiceTest_MockRestfulService(Director::absoluteBaseURL(), 0); $params = array( 'test1a' => 'val1a', 'test1b' => 'val1b' ); $responseBody = $service->request('RestfulServiceTest_Controller/', 'POST', $params)->getBody(); foreach ($params as $key => $value) { $this->assertContains("$value", $responseBody); $this->assertContains("$value", $responseBody); } } function testConnectionDoesntCacheWithDifferentUrl() { $service = new RestfulServiceTest_MockRestfulService(Director::absoluteBaseURL()); $url = 'RestfulServiceTest_Controller/'; // First run $params = array( 'test1a' => 'first run', ); $service->setQueryString($params); $responseBody = $service->request($url)->getBody(); $this->assertContains("first run", $responseBody); // Second run $params = array( 'test1a' => 'second run', ); $service->setQueryString($params); $responseBody = $service->request($url)->getBody(); $this->assertContains("second run", $responseBody); } /** * @expectedException PHPUnit_Framework_Error */ function testIncorrectData() { $connection = new RestfulService(Director::absoluteBaseURL(), 0); $test1 = $connection->request('RestfulServiceTest_Controller/invalid?usetestmanifest=1&flush=1'); $test1->xpath("\\fail"); } } class RestfulServiceTest_Controller extends Controller { public function index() { BasicAuth::protect_entire_site(false); $request = ''; foreach ($this->request->requestVars() as $key=>$value) { $request .= "\t\t$value\n"; } $get = ''; foreach ($this->request->getVars() as $key => $value) { $get .= "\t\t$value\n"; } $post = ''; foreach ($this->request->postVars() as $key => $value) { $post .= "\t\t$value\n"; } $out = << $request $get $post XML; $this->response->setBody($out); $this->response->addHeader('Content-type', 'text/xml'); return $this->response; } public function invalid() { BasicAuth::protect_entire_site(false); $out = << XML; header('Content-type: text/xml'); echo $out; } } /** * Mock implementation of {@link RestfulService}, which uses {@link Director::test()} * instead of direct curl system calls. * * @todo Less overloading of request() * @todo Currently only works with relative (internal) URLs * * @package sapphire * @subpackage tests */ class RestfulServiceTest_MockRestfulService extends RestfulService { public $session = null; public function request($subURL = '', $method = "GET", $data = null, $headers = null) { if(!$this->session) { $this->session = new Session(array()); } $url = $this->baseURL . $subURL; // Url for the request if($this->queryString) { if(strpos($url, '?') !== false) { $url .= '&' . $this->queryString; } else { $url .= '?' . $this->queryString; } } $url = str_replace(' ', '%20', $url); // Encode spaces // Custom for mock implementation: Director::test() doesn't cope with absolute URLs $url = Director::makeRelative($url); $method = strtoupper($method); assert(in_array($method, array('GET','POST','PUT','DELETE','HEAD','OPTIONS'))); // Add headers if($this->customHeaders) { $headers = array_merge((array)$this->customHeaders, (array)$headers); } // Add authentication if($this->authUsername) { $headers[] = "Authorization: Basic " . base64_encode( $this->authUsername.':'.$this->authPassword ); } // Custom for mock implementation: Use Director::test() $getVars = ($method == 'GET') ? $data : null; $postVars = ($method == 'POST') ? $data : null; $responseFromDirector = Director::test($url, $postVars, $this->session, $method, $getVars, $headers); $response = new RestfulService_Response( $responseFromDirector->getBody(), $responseFromDirector->getStatusCode() ); return $response; } } ?>