ui = new \infolog_ui(); $this->ui->tmpl = $this->getMockBuilder('\\Egroupware\\Api\\Etemplate') ->disableOriginalConstructor() ->setMethods(array('exec', 'read')) ->getMock($this->ui); $this->bo = $this->ui->bo; $this->mockTracking($this->bo, 'infolog_tracking'); } public function tearDown() { // Double delete to make sure it's gone, not preserved due to history setting $this->bo->delete($this->info_id); $this->bo->delete($this->info_id); $this->bo = null; } /** * Test that free text in the info_contact field winds up in info_from, and * when loaded again it is put into the search of info_contact for display. */ public function testFreeText() { $content = array( 'contact' => array( 'app' => 'addressbook', 'id' => Null, 'search'=> 'Free text' ) ); $info = $this->getTestInfolog($content); // Skipping notifications - save initial state $this->info_id = $this->bo->write($info, true, true, true, true); // Read it back to check $saved = $this->bo->read($this->info_id); $this->assertEquals($content['contact']['search'], $saved['info_from']); $this->assertEquals(0, $saved['info_link_id']); // Mock the etemplate call to check the results $this->ui->tmpl->expects($this->once()) ->method('exec') ->will( $this->returnCallback(function($method, $info) { $this->assertNotNull($info['info_id']); $this->assertEquals('Free text', $info['info_contact']['title']); return true; }) ); // Make a call to edit, looks like initial load $_REQUEST['info_id'] = $this->info_id; $this->ui->edit(); // Change it $saved['info_contact']['search'] = 'Totally different'; // Skipping notifications - save initial state $this->bo->write($saved, true, true, true, true); // Read it back to check $resaved = $this->bo->read($this->info_id); $this->assertEquals('Totally different', $resaved['info_from'], 'Did not change free text'); $this->assertEquals(0, $resaved['info_link_id']); // Now clear it $saved = $resaved; $saved['info_contact']['search'] = ''; // Skipping notifications - save initial state $this->bo->write($saved, false, false); // Read it back to check $resaved = $this->bo->read($this->info_id); $this->assertEquals('', $resaved['info_from'], 'Did not clear free text'); $this->assertEquals(0, $resaved['info_link_id']); } /** * Test that a selected entry is put into info_link_id, and its link title * is put into info_from (not the search text) */ public function testLinkedEntry() { $content = array( 'contact' => array( 'app' => 'addressbook', // Linking to current user's contact 'id' => $GLOBALS['egw_info']['user']['person_id'], 'search'=> 'Free text' ) ); $link_title = $GLOBALS['egw']->contacts->link_title($content['contact']['id']); $info = $this->getTestInfolog($content); // Skipping notifications - save initial state $this->info_id = $this->bo->write($info, true, true, true, true); // Read it back to check $saved = $this->bo->read($this->info_id); $this->assertEquals($link_title, $saved['info_contact']['title'], 'Link title was missing'); $this->assertNotEquals(0, $saved['info_link_id']); // Mock the etemplate call to check the results $this->ui->tmpl->expects($this->once()) ->method('exec') ->will( $this->returnCallback(function($method, $info) use($link_title) { $this->assertNotNull($info['info_id']); $this->assertEquals('', $info['contact']['search']); $this->assertEquals($GLOBALS['egw_info']['user']['person_id'], $info['info_contact']['id']); $this->assertEquals($link_title, $info['info_contact']['title']); }) ); // Make a call to edit, looks like initial load $_REQUEST['info_id'] = $this->info_id; $this->ui->edit(); } /** * Set up a basic infolog entry for testing with the specified fields * set. * * @param Array $fields Fields to be set for initial conditions * @return Array */ protected function getTestInfolog($fields) { $info = array( 'info_subject' => 'Test Infolog Entry for ' . $this->getName() ); foreach($fields as $field => $value) { $info["info_{$field}"] = $value; } return $info; } }