parameters = new RequestParameters('secret', 'response', 'remoteip', 'version'); } public function tearDown() { self::$assert = null; } public function testHTTPContextOptions() { $req = new Post(); self::$assert = array($this, 'httpContextOptionsCallback'); $req->submit($this->parameters); $this->assertEquals(1, $this->runcount, 'The assertion was ran'); } public function testSSLContextOptions() { $req = new Post(); self::$assert = array($this, 'sslContextOptionsCallback'); $req->submit($this->parameters); $this->assertEquals(1, $this->runcount, 'The assertion was ran'); } public function testOverrideVerifyUrl() { $req = new Post('https://over.ride/some/path'); self::$assert = array($this, 'overrideUrlOptions'); $req->submit($this->parameters); $this->assertEquals(1, $this->runcount, 'The assertion was ran'); } public function testConnectionFailureReturnsError() { $req = new Post('https://bad.connection/'); self::$assert = array($this, 'connectionFailureResponse'); $response = $req->submit($this->parameters); $this->assertEquals('{"success": false, "error-codes": ["'.ReCaptcha::E_CONNECTION_FAILED.'"]}', $response); } public function connectionFailureResponse() { return false; } public function overrideUrlOptions(array $args) { $this->runcount++; $this->assertEquals('https://over.ride/some/path', $args[0]); } public function httpContextOptionsCallback(array $args) { $this->runcount++; $this->assertCommonOptions($args); $options = stream_context_get_options($args[2]); $this->assertArrayHasKey('http', $options); $this->assertArrayHasKey('method', $options['http']); $this->assertEquals('POST', $options['http']['method']); $this->assertArrayHasKey('content', $options['http']); $this->assertEquals($this->parameters->toQueryString(), $options['http']['content']); $this->assertArrayHasKey('header', $options['http']); $headers = array( 'Content-type: application/x-www-form-urlencoded', ); foreach ($headers as $header) { $this->assertContains($header, $options['http']['header']); } } public function sslContextOptionsCallback(array $args) { $this->runcount++; $this->assertCommonOptions($args); $options = stream_context_get_options($args[2]); $this->assertArrayHasKey('http', $options); $this->assertArrayHasKey('verify_peer', $options['http']); $this->assertTrue($options['http']['verify_peer']); } protected function assertCommonOptions(array $args) { $this->assertCount(3, $args); $this->assertStringStartsWith('https://www.google.com/', $args[0]); $this->assertFalse($args[1]); $this->assertTrue(is_resource($args[2]), 'The context options should be a resource'); } } function file_get_contents() { if (PostTest::$assert) { return call_user_func(PostTest::$assert, func_get_args()); } // Since we can't represent maxlen in userland... return call_user_func_array('file_get_contents', func_get_args()); }