query( "SELECT COUNT(*) FROM {chatmessage} " . "WHERE ikind = :kind AND tmessage = :message AND messageid > :last_msg_id", array( ':kind' => $kind, ':message' => $message, ':last_msg_id' => $last_msg_id ), array('return_rows' => Database::RETURN_ONE_ROW, 'fetch_type' => Database::FETCH_NUM) ); return $count; } /** * Get total message count from database * * @param int $last_msg_id Message id to start search from * @return int Messages count */ protected function _helper_getTotalMessagesCount($last_msg_id) { $db = Database::getInstance(); list($count) = $db->query( "SELECT COUNT(*) FROM {chatmessage} WHERE messageid > :last_msg_id", array(':last_msg_id' => $last_msg_id), array('return_rows' => Database::RETURN_ONE_ROW, 'fetch_type' => Database::FETCH_NUM) ); return $count; } /** * Returns last message id * * @return int Id of the last message */ protected function _helper_getLastMessageId() { $db = Database::getInstance(); list($last_msg_id) = $db->query( "SELECT MAX(messageid) FROM {chatmessage}", NULL, array('return_rows' => Database::RETURN_ONE_ROW, 'fetch_type' => Database::FETCH_NUM) ); if (! $last_msg_id) { $last_msg_id = 0; } return $last_msg_id; } /** * Get threads count with specified thread id * * @param int $thread_id Id of the thread * @return int Count of threads */ protected function _helper_getThreadCount($thread_id) { $db = Database::getInstance(); list($count) = $db->query( "SELECT COUNT(*) FROM {chatthread} WHERE threadid = :id", array(':id' => $thread_id), array('return_rows' => Database::RETURN_ONE_ROW, 'fetch_type' => Database::FETCH_NUM) ); return $count; } /** * Get thread info from database * * @param int $thread_id Id of the thread * @return array Thread info */ protected function _helper_getThreadInfo($thread_id) { $db = Database::getInstance(); return $db->query( "SELECT * FROM {chatthread} WHERE threadid = :id", array(':id' => $thread_id), array('return_rows' => Database::RETURN_ONE_ROW) ); } public static function setUpBeforeClass() { // Initialize database object global $db_host, $db_name, $db_user, $db_pass, $tables_prefix, $db_encoding, $force_charset_in_connection, $use_persistent_connection; Database::initialize( $db_host, $db_user, $db_pass, $use_persistent_connection, $db_name, $tables_prefix, $force_charset_in_connection, $db_encoding ); $db = Database::getInstance(); // Clear tables $db->query("TRUNCATE {chatthread}"); $db->query("TRUNCATE {chatmessage}"); self::$thread_lifetime = Settings::get('thread_lifetime'); Settings::set('thread_lifetime', 600); } public static function tearDownAfterClass() { $db = Database::getInstance(); // Clear tables $db->query("TRUNCATE {chatthread}"); $db->query("TRUNCATE {chatmessage}"); Settings::set('thread_lifetime', self::$thread_lifetime); // Destroy Database object Database::destroy(); } public function testCreate() { // Create thread $thread = Thread::create(); // Check thread $this->assertNotEmpty($thread); $this->assertNotEmpty($thread->id); // Check if thread in database $this->assertEquals(1, $this->_helper_getThreadCount($thread->id)); $threadid = $thread->id; unset($thread); return $threadid; } /** * @depends testCreate */ public function testLoad($threadid) { // Load thread $thread = Thread::load($threadid); // Check thread $this->assertNotEmpty($thread); $this->assertEquals($threadid, $thread->id); return $thread; } /** * @depends testLoad */ public function testDelete(Thread $thread) { $threadid = $thread->id; // Check if thread in database $this->assertEquals(1, $this->_helper_getThreadCount($threadid)); // Delete thread $thread->delete(); unset($thread); // Check thread in database $this->assertEquals(0, $this->_helper_getThreadCount($threadid)); } public function test__isset() { // Create new thread $thread = Thread::create(); // Property exists and not empty $this->assertNotEmpty($thread->id); // assertTrue use instead of assertEmpty because of PHPUnit don't work correctly with __isset magic method // Property exists in internal Thread::$propertyMap property but not set $this->assertTrue(empty($thread->lastToken)); $this->assertFalse(isset($thread->lastToken)); // Property does not exists $this->assertTrue(empty($thread->someFakeProp)); // Delete thread $thread->delete(); unset($thread); } public function test__set() { // Create thread $thread = Thread::create(); // Try to set value for unexistent property // Following code wait for trigger user notice, which converts by PHPUnit to an // Exception try { $thread->someFakeField = 'some_test_value'; $this->fail("Exception must be thrown"); } catch(Exception $e) {} // Try to set exist property $thread->lastToken = 129; return $thread; } /** * @depends test__set */ public function test__get(Thread $thread) { // Check property value from test_set() method $this->assertEquals(129, $thread->lastToken); // Try to get value of unexistent property // Following code wait for trigger user notice, which converts by PHPUnit to an // Exception try { $some_value = $thread->someFakeField; $this->fail("Exception must be thrown"); } catch(Exception $e) {} // Delete thread $thread->delete(); unset($thread); } public function testSave() { // Create new thread $thread = Thread::create(); // Update thread values $thread->lastRevision = $last_revision = 10; $thread->state = $state = Thread::STATE_CHATTING; $thread->lastToken = $last_token = 11; $thread->nextAgent = $next_agent = 12; $thread->groupId = $group_id = 13; $thread->shownMessageId = $shown_message_id = 14; $thread->messageCount = $message_count = 15; $thread->created = $created = time() - 200; $thread->modified = $modified = time() - 190; $thread->chatStarted = $chat_started = time() - 180; $thread->agentId = $agent_id = 16; $thread->agentName = $agent_name = '17'; $thread->agentTyping = $agent_typing = 0; $thread->lastPingAgent = $last_ping_agent = time() - 170; $thread->locale = $locale = '18'; $thread->userId = $user_id = 19; $thread->userName = $user_name = '20'; $thread->userTyping = $user_tiping = 1; $thread->lastPingUser = $last_user_ping = time() - 160; $thread->remote = $remote = '21'; $thread->referer = $referer = '22'; $thread->userAgent = $user_agent = '23'; // Save thread $thread->save(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check values $this->assertEquals($thread_info['lrevision'],$last_revision); $this->assertEquals($thread_info['istate'], $state); $this->assertEquals($thread_info['ltoken'], $last_token); $this->assertEquals($thread_info['nextagent'], $next_agent); $this->assertEquals($thread_info['groupid'], $group_id); $this->assertEquals($thread_info['shownmessageid'], $shown_message_id); $this->assertEquals($thread_info['messageCount'], $message_count); $this->assertEquals($thread_info['dtmcreated'], $created); $this->assertEquals($thread_info['dtmmodified'], $modified); $this->assertEquals($thread_info['dtmchatstarted'], $chat_started); $this->assertEquals($thread_info['agentId'], $agent_id); $this->assertEquals($thread_info['agentName'], $agent_name); $this->assertEquals($thread_info['agentTyping'], $agent_typing); $this->assertEquals($thread_info['lastpingagent'], $last_ping_agent); $this->assertEquals($thread_info['locale'], $locale); $this->assertEquals($thread_info['userid'], $user_id); $this->assertEquals($thread_info['userName'], $user_name); $this->assertEquals($thread_info['userTyping'], $user_tiping); $this->assertEquals($thread_info['lastpinguser'], $last_user_ping); $this->assertEquals($thread_info['remote'], $remote); $this->assertEquals($thread_info['referer'], $referer); $this->assertEquals($thread_info['userAgent'], $user_agent); // Delete thread $thread->delete(); unset($thread); } public function testReopen() { global $home_locale; $db = Database::getInstance(); // Create new thread $thread = Thread::create(); $thread->state = Thread::STATE_CHATTING; $thread->locale = $home_locale; $thread->lastPingAgent = time() - Settings::get('thread_lifetime') * 2; $thread->lastPingUser = time() - Settings::get('thread_lifetime') * 2; $thread->save(); // Last ping was more than life_time ago $this->assertFalse(Thread::reopen($thread->id)); // Try reopen closed thread $thread->state = Thread::STATE_CLOSED; $thread->lastPingAgent = time(); $thread->lastPingUser = time(); $thread->save(); $this->assertFalse(Thread::reopen($thread->id)); // Try to reopen left thread $thread->state = Thread::STATE_LEFT; $thread->save(); $this->assertFalse(Thread::reopen($thread->id)); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Try to reopen thread with Thread::STATE_WAITING state $thread->nextAgent = 2; $thread->state = Thread::STATE_WAITING; $thread->save(); $another_thread = Thread::reopen($thread->id); $this->assertNotEmpty($another_thread); // Load another thread info $thread_info = $this->_helper_getThreadInfo($another_thread->id); // Check next agent field $this->assertEquals(0, $another_thread->nextAgent); $this->assertEquals(0, $thread_info['nextagent']); // Check sent messages $message_count = $this->_helper_getTotalMessagesCount($last_msg_id); $this->assertEquals(1, $message_count); // Check message text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring_("chat.status.user.reopenedthread", $another_thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); unset($another_thread); // Try to reopen thread with Thread::STATE_QUEUE state $thread->nextAgent = 2; $thread->state = Thread::STATE_QUEUE; $thread->save(); $another_thread = Thread::reopen($thread->id); $this->assertNotEmpty($another_thread); // Load another thread info $thread_info = $this->_helper_getThreadInfo($another_thread->id); // Check next agent field $this->assertEquals(2, $another_thread->nextAgent); $this->assertEquals(2, $thread_info['nextagent']); unset($another_thread); // Check equlity of treads returned by reopen method and returned by load method $thread_id = $thread->id; unset($thread); $thread = Thread::load($thread_id); $another_thread = Thread::reopen($thread_id); $this->assertEquals($thread, $another_thread); unset($another_thread); // Delete thread $thread->delete(); unset($thread); } public function testCloseOldThreads() { $timeout = Settings::get('thread_lifetime'); // Create new thread $thread = Thread::create(); // Try to close thread with state = Thread::STATE_CHATTING and time no timeout // Update values $thread->state = Thread::STATE_CHATTING; $thread->lastPingAgent = time(); $thread->lastPingUser = time(); // Save thread $thread->save(); // And close all threads Thread::closeOldThreads(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertNotEquals($thread_info['istate'], Thread::STATE_CLOSED); // Try to close thread with timeout for user and no timeout for agent // Update values $thread->state = Thread::STATE_CHATTING; $thread->lastPingAgent = time(); $thread->lastPingUser = time() - $timeout * 2; // Save thread $thread->save(); // And close all threads Thread::closeOldThreads(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertNotEquals($thread_info['istate'], Thread::STATE_CLOSED); // Try to close thread with timeout for agent and no timeout for user // Update values $thread->state = Thread::STATE_CHATTING; $thread->lastPingAgent = time() - $timeout * 2; $thread->lastPingUser = time(); // Save thread $thread->save(); // And close all threads Thread::closeOldThreads(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertNotEquals($thread_info['istate'], Thread::STATE_CLOSED); // Try to close thread with timeout for agent and timeout for user // Update values $thread->state = Thread::STATE_CHATTING; $thread->lastPingAgent = time() - $timeout * 2; $thread->lastPingUser = time() - $timeout * 2; // Save thread $thread->save(); // And close all threads Thread::closeOldThreads(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals($thread_info['istate'], Thread::STATE_CLOSED); // Try to close thread with timeout for user and not started for agent(was no agent ping yet) // Update values $thread->state = Thread::STATE_CHATTING; $thread->lastPingAgent = 0; $thread->lastPingUser = time() - $timeout * 2; // Save thread $thread->save(); // And close all threads Thread::closeOldThreads(); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals($thread_info['istate'], Thread::STATE_CLOSED); // Delete thread $thread->delete(); unset($thread); } public function testPostMessage() { $db = Database::getInstance(); // Create new thread $thread = Thread::create(); // Set values $message = array( 'threadid' => $thread->id, 'ikind' => Thread::KIND_INFO, 'agentId' => 12, 'tmessage' => 'New message text', 'dtmcreated' => time(), 'tname' => 'Sender name' ); $message['messageid'] = $thread->postMessage( $message['ikind'], $message['tmessage'], $message['tname'], $message['agentId'], $message['dtmcreated'] ); // Load message info from database $msg_info = $db->query( "SELECT * FROM {chatmessage} WHERE messageid = ?", array($message['messageid']), array('return_rows' => Database::RETURN_ONE_ROW) ); // Check values $this->assertEquals($message, $msg_info); // Delete thread $thread->delete(); unset($thread); return $message['messageid']; } /** * @depends testPostMessage */ public function testGetMessages($msg_id) { // Create new thread $thread = Thread::create(); // Create messages // The first $first_message = array( 'ikind' => Thread::KIND_USER, 'tmessage' => 'The first message', 'created' => time(), 'tname' => 'System message only for agent' ); // The second $second_message = array( 'ikind' => Thread::KIND_AGENT, 'tmessage' => 'The second message', 'created' => time(), 'tname' => 'User' ); // The third $third_message = array( 'ikind' => Thread::KIND_FOR_AGENT, 'tmessage' => 'The third message', 'created' => time(), 'tname' => 'Agent' ); // Send messages // The first $first_message['messageid'] = $thread->postMessage( $first_message['ikind'], $first_message['tmessage'], $first_message['tname'], 12, $first_message['created'] ); // The second $second_message['messageid'] = $thread->postMessage( $second_message['ikind'], $second_message['tmessage'], $second_message['tname'], 14, $second_message['created'] ); // The third $third_message['messageid'] = $thread->postMessage( $third_message['ikind'], $third_message['tmessage'], $third_message['tname'], 16, $third_message['created'] ); // Check messages for agent with ids starts from $msg_id $last_id = $msg_id; $this->assertEquals( array($first_message, $second_message, $third_message), $thread->getMessages(false, $last_id) ); // Check last message id $this->assertEquals($third_message['messageid'], $last_id); // Check messages for user with ids starts from $msg_id $last_id = $msg_id; $this->assertEquals( array($first_message, $second_message), $thread->getMessages(true, $last_id) ); // Check last message id $this->assertEquals($second_message['messageid'], $last_id); // Check messages for agent with ids starts from first message's id $last_id = $first_message['messageid']; $this->assertEquals( array($second_message, $third_message), $thread->getMessages(false, $last_id) ); // Check last message id $this->assertEquals($third_message['messageid'], $last_id); // Delete thread $thread->delete(); unset($thread); } public function testRenameUser() { // Create new thread $thread = Thread::create(); // Set user initial name $thread->userName = 'User name'; $thread->locale = 'en'; $thread->save(); // Rename user $new_user_name = 'New user name'; $thread->renameUser($new_user_name); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check user name $this->assertEquals($new_user_name, $thread_info['userName']); // Delete thread $thread->delete(); unset($thread); } public function testCheckForReassign() { global $home_locale; // Create new thread $thread = Thread::create(); $thread->state = Thread::STATE_CHATTING; $thread->locale = $home_locale; $thread->agentName = "First name"; $thread->agentId = 1; $thread->nextAgent = 0; $thread->save(); // Create operator $operator = array( 'operatorid' => 2, 'vclocalename' => 'Second local name', 'vccommonname' => 'Second common name', 'vcavatar' => 'avatar' ); // Chat in progress. No reassign expected $thread->checkForReassign($operator); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(1, $thread_info['agentId']); // User waiting for another agent $thread->nextAgent = 5; $thread->state = Thread::STATE_WAITING; $thread->save(); $thread->checkForReassign($operator); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); $this->assertEquals(Thread::STATE_WAITING, $thread_info['istate']); $this->assertEquals(Thread::STATE_WAITING, $thread->state); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // User waiting for another agent, but last agent checks for reassign $thread->nextAgent = 5; $thread->agentId = 2; $thread->state = Thread::STATE_WAITING; $thread->save(); $thread->checkForReassign($operator); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check state $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); $this->assertEquals(Thread::STATE_CHATTING, $thread->state); // Check sent messages $this->assertEquals(2, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messages text: // Thread::KIND_EVENTS message $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_("chat.status.operator.returned", array($operator['vclocalename']), $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); // Thread::KIND_AVATAR message $message_count = $this->_helper_getMessagesCount(Thread::KIND_AVATAR, 'avatar', $last_msg_id); $this->assertEquals(1, $message_count); // Update last message id $last_msg_id = $this->_helper_getLastMessageId(); // User waiting for this agent. // It differs from previous test only in sent message text $thread->nextAgent = 2; $thread->agentId = 1; $thread->agentName = 'First agent'; $thread->state = Thread::STATE_WAITING; $thread->save(); $thread->checkForReassign($operator); // Check message text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_( "chat.status.operator.changed", array($operator['vclocalename'], 'First agent'), $thread->locale ), $last_msg_id ); $this->assertEquals(1, $message_count); // Delete thread $thread->delete(); unset($thread); } public function testClose() { global $home_locale; // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Create new thread $thread = Thread::create(); $thread->state = Thread::STATE_CHATTING; $thread->userName = 'User'; $thread->agentName = 'Agent'; $thread->locale = $home_locale; $thread->save(); // Check close thread by user $thread->close(true); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check state $this->assertEquals(Thread::STATE_CLOSED, $thread_info['istate']); $this->assertEquals(Thread::STATE_CLOSED, $thread->state); // Check messages count $this->assertEquals(0, $thread_info['messageCount']); // Check sent messages $this->assertEquals(1, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check message text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_("chat.status.user.left", array($thread->userName), $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Check close thread by agent. // It differs from previous test only in message text $thread->state = Thread::STATE_CHATTING; $thread->save(); $thread->close(false); // Check message text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_("chat.status.operator.left", array($thread->agentName), $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); // Check close thread with user's and agent's messages $thread->state = Thread::STATE_CHATTING; $thread->messageCount = 0; $thread->save(); // Send messages $thread->postMessage(Thread::KIND_USER, "Test message"); $thread->postMessage(Thread::KIND_USER, "Next test message"); $thread->postMessage(Thread::KIND_AGENT, "Test message"); $thread->postMessage(Thread::KIND_EVENTS, "Test message"); $thread->close(true); // Load thread info from database $thread_info = $this->_helper_getThreadInfo($thread->id); // Check messages count $this->assertEquals(2, $thread_info['messageCount']); // Delete thread $thread->delete(); unset($thread); } public function testPing() { global $home_locale; // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Create new thread $thread = Thread::create(); $thread->state = Thread::STATE_LOADING; $thread->lastPingAgent = 0; $thread->lastPingUser = 0; $thread->locale = $home_locale; $thread->save(); // Check first user ping $thread->ping(true, false); $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals(Thread::STATE_QUEUE, $thread->state); $this->assertEquals(Thread::STATE_QUEUE, $thread_info['istate']); // Check not first ping user without any connection problems at the other side // Update thread info $thread->lastPingAgent = time(); $thread->lastPingUser = 0; $thread->state = Thread::STATE_CHATTING; $thread->save(); // Ping the thread $thread->ping(true, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check no message sent $this->assertEquals($last_msg_id, $this->_helper_getLastMessageId()); // Check last ping time updated for user $this->assertLessThan($thread->lastPingUser, 0); $this->assertLessThan($thread_info['lastpinguser'], 0); // Check thread state not changed $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Check ping agent without any connection problems at the other side // Update thread info $thread->lastPingAgent = 0; $thread->save(); // Ping the thread $thread->ping(false, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check no message sent $this->assertEquals($last_msg_id, $this->_helper_getLastMessageId()); // Check last ping time updated for user $this->assertLessThan($thread->lastPingAgent, 0); $this->assertLessThan($thread_info['lastpingagent'], 0); // Check thread state not changed $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Check ping user with connection problem at the other side and thread state equals to // Thread::STATE_WAITING // Update thread info $thread->lastPingAgent = time() - Thread::CONNECTION_TIMEOUT * 2; $thread->state = Thread::STATE_WAITING; $thread->save(); // Ping the thread $thread->ping(true, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check no message sent $this->assertEquals($last_msg_id, $this->_helper_getLastMessageId()); // Check last ping agent $this->assertEquals(0, $thread->lastPingAgent); $this->assertEquals(0, $thread_info['lastpingagent']); // Check ping user with connection problem at the other side and thread state equals to Thread::STATE_CHATTING. // In this case message must be sent and state must be changed // Update thread info $thread->lastPingAgent = time() - Thread::CONNECTION_TIMEOUT * 2; $thread->state = Thread::STATE_CHATTING; $thread->nextAgent = 1; $thread->save(); // Ping the thread $thread->ping(true, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check message sent $this->assertEquals(1, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messsage text $message_count = $this->_helper_getMessagesCount( Thread::KIND_CONN, getstring_("chat.status.operator.dead", $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); // Check last ping agent $this->assertEquals(0, $thread->lastPingAgent); $this->assertEquals(0, $thread_info['lastpingagent']); // Check thread state $this->assertEquals(Thread::STATE_WAITING, $thread->state); $this->assertEquals(Thread::STATE_WAITING, $thread_info['istate']); // Check next agent $this->assertEquals(0, $thread->nextAgent); $this->assertEquals(0, $thread_info['nextagent']); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Check ping agent with connection problem at the other side // Update thread info $thread->lastPingUser = time() - Thread::CONNECTION_TIMEOUT * 2; $thread->save(); // Ping the thread $thread->ping(false, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check message sent $this->assertEquals(1, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messsage text $message_count = $this->_helper_getMessagesCount( Thread::KIND_FOR_AGENT, getstring_("chat.status.user.dead", $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); // Check last ping user $this->assertEquals(0, $thread->lastPingUser); $this->assertEquals(0, $thread_info['lastpinguser']); // Check user typing // Update thread info $thread->userTyping = '0'; $thread->save(); // Ping the thread $thread->ping(true, true); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check $this->assertEquals('1', $thread->userTyping); $this->assertEquals('1', $thread_info['userTyping']); // Check user not typing // Update thread info $thread->userTyping = '1'; $thread->save(); // Ping the thread $thread->ping(true, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check $this->assertEquals('0', $thread->userTyping); $this->assertEquals('0', $thread_info['userTyping']); // Check agent typing // Update thread info $thread->agentTyping = '0'; $thread->save(); // Ping the thread $thread->ping(false, true); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check $this->assertEquals('1', $thread->agentTyping); $this->assertEquals('1', $thread_info['agentTyping']); // Check agent not typing // Update thread info $thread->agentTyping = '1'; $thread->save(); // Ping the thread $thread->ping(false, false); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check $this->assertEquals('0', $thread->agentTyping); $this->assertEquals('0', $thread_info['agentTyping']); // Delete thread $thread->delete(); unset($thread); } public function testTake() { global $home_locale; // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Create operator $operator = array( 'operatorid' => 2, 'vclocalename' => 'Local name', 'vccommonname' => 'Common name', 'vcavatar' => 'avatar' ); // Create new thread $thread = Thread::create(); $thread->state = Thread::STATE_CLOSED; $thread->locale = $home_locale; $thread->agentName = 'Agent'; $thread->userName = 'User'; $thread->agentId = 2; $thread->save(); // Try to take closed thread $this->assertFalse($thread->take($operator)); // Try to take left thread $thread->state = Thread::STATE_LEFT; $thread->save(); $this->assertFalse($thread->take($operator)); // Try to take thread by current operator during chat $thread->state = Thread::STATE_CHATTING; $thread->save(); $this->assertTrue($thread->take($operator)); // No message must be sent $this->assertEquals(0, $this->_helper_getTotalMessagesCount($last_msg_id)); // Try to take thread during chat $thread->state = Thread::STATE_CHATTING; $thread->agentId = 1; $thread->nextAgent = 10; $thread->save(); $this->assertTrue($thread->take($operator)); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Check agent id $this->assertEquals(2, $thread->agentId); $this->assertEquals(2, $thread_info['agentId']); // Check agent name $this->assertEquals($operator['vclocalename'], $thread->agentName); $this->assertEquals($operator['vclocalename'], $thread_info['agentName']); // Check next agent id $this->assertEquals(0, $thread->nextAgent); $this->assertEquals(0, $thread_info['nextagent']); // Check chat started time $this->assertFalse(empty($thread->chatStarted)); $this->assertFalse(empty($thread_info['dtmchatstarted'])); // Two messages must be sent $this->assertEquals(2, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messages text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_( "chat.status.operator.changed", array($operator['vclocalename'], 'Agent'), $thread->locale ), $last_msg_id ); $this->assertEquals(1, $message_count); $message_count = $this->_helper_getMessagesCount( Thread::KIND_AVATAR, $operator['vcavatar'], $last_msg_id ); $this->assertEquals(1, $message_count); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Try to take thread with state Thread::STATE_WAITING by current operator $thread->state = Thread::STATE_WAITING; $thread->save(); $this->assertTrue($thread->take($operator)); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Check agent id $this->assertEquals(2, $thread->agentId); $this->assertEquals(2, $thread_info['agentId']); // Two messages must be sent $this->assertEquals(2, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messages text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_("chat.status.operator.returned", array($operator['vclocalename']), $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); $message_count = $this->_helper_getMessagesCount( Thread::KIND_AVATAR, $operator['vcavatar'], $last_msg_id ); $this->assertEquals(1, $message_count); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Try to take thread with state Thread::STATE_WAITING $thread->state = Thread::STATE_WAITING; $thread->agentId = 1; $thread->agentName = 'Agent'; $thread->save(); $this->assertTrue($thread->take($operator)); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Two messages must be sent $this->assertEquals(2, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messages text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, getstring2_( "chat.status.operator.changed", array($operator['vclocalename'], 'Agent'), $thread->locale ), $last_msg_id ); $this->assertEquals(1, $message_count); $message_count = $this->_helper_getMessagesCount( Thread::KIND_AVATAR, $operator['vcavatar'], $last_msg_id ); $this->assertEquals(1, $message_count); // Get last message id $last_msg_id = $this->_helper_getLastMessageId(); // Try to take thread with state Thread::STATE_QUEUE $thread->state = Thread::STATE_QUEUE; $thread->save(); $this->assertTrue($thread->take($operator)); // Get thread info $thread_info = $this->_helper_getThreadInfo($thread->id); // Check thread state $this->assertEquals(Thread::STATE_CHATTING, $thread->state); $this->assertEquals(Thread::STATE_CHATTING, $thread_info['istate']); // Two messages must be sent $this->assertEquals(2, $this->_helper_getTotalMessagesCount($last_msg_id)); // Check messages text $message_count = $this->_helper_getMessagesCount( Thread::KIND_EVENTS, $message = getstring2_("chat.status.operator.joined", array($operator['vclocalename']), $thread->locale), $last_msg_id ); $this->assertEquals(1, $message_count); $message_count = $this->_helper_getMessagesCount( Thread::KIND_AVATAR, $operator['vcavatar'], $last_msg_id ); $this->assertEquals(1, $message_count); // Delete thread $thread->delete(); unset($thread); } } ?>