/** * Test HTTP precondition headers * * @covers ApiMain::checkConditionalRequestHeaders * @dataProvider provideCheckConditionalRequestHeaders * @param array $headers HTTP headers * @param array $conditions Return data for ApiBase::getConditionalRequestData * @param int $status Expected response status * @param bool $post Request is a POST */ public function testCheckConditionalRequestHeaders($headers, $conditions, $status, $post = false) { $request = new FauxRequest(array('action' => 'query', 'meta' => 'siteinfo'), $post); $request->setHeaders($headers); $request->response()->statusHeader(200); // Why doesn't it default? $api = new ApiMain($request); $priv = TestingAccessWrapper::newFromObject($api); $priv->mInternalMode = false; $module = $this->getMockBuilder('ApiBase')->setConstructorArgs(array($api, 'mock'))->setMethods(array('getConditionalRequestData'))->getMockForAbstractClass(); $module->expects($this->any())->method('getConditionalRequestData')->will($this->returnCallback(function ($condition) use($conditions) { return isset($conditions[$condition]) ? $conditions[$condition] : null; })); $ret = $priv->checkConditionalRequestHeaders($module); $this->assertSame($status, $request->response()->getStatusCode()); $this->assertSame($status === 200, $ret); }