<?php
require_once QA_INCLUDE_DIR . 'db/post-create.php';
// For qa_create_new_user(), qa_set_user_blocked(), qa_delete_user()
require_once QA_INCLUDE_DIR . 'app/users-edit.php';
// For qa_handle_to_userid()
require_once QA_INCLUDE_DIR . 'app/users.php';
// For qa_post_create(), qa_post_set_selchildid(), qa_post_set_closed()
require_once QA_INCLUDE_DIR . 'app/posts.php';
// For qa_vote_set()
require_once QA_INCLUDE_DIR . 'app/votes.php';
// For qa_suspend_notifications()
require_once QA_INCLUDE_DIR . 'app/emails.php';
// For qa_question_set_status(), qa_answer_set_status(), qa_comment_set_status(), qa_question_delete(), qa_answer_delete(), qa_comment_delete()
require_once QA_INCLUDE_DIR . 'app/post-update.php';
/**
* @group database
*/
class DbCachedOptionsTest extends \PHPUnit\Framework\TestCase
{
protected static $user1 = array(
'userid' => null,
'handle' => 'user1',
'email' => 'user1@example.com',
'password' => 'passpass',
'level' => QA_USER_LEVEL_BASIC,
'confirmed' => true,
);
protected static $user2 = array(
'userid' => null,
'handle' => 'user2',
'email' => 'user2@example.com',
'password' => 'passpass',
'level' => QA_USER_LEVEL_BASIC,
'confirmed' => true,
);
public static function setUpBeforeClass(): void
{
$handlesToUserIds = qa_handles_to_userids(array(
self::$user1['handle'],
self::$user2['handle'],
));
foreach ($handlesToUserIds as $userId) {
if (isset($userId)) {
qa_delete_user($userId);
}
}
self::$user1['userid'] = qa_create_new_user(self::$user1['email'], self::$user1['password'], self::$user1['handle'], self::$user1['level'], self::$user1['confirmed']);
self::$user2['userid'] = qa_create_new_user(self::$user2['email'], self::$user2['password'], self::$user2['handle'], self::$user2['level'], self::$user2['confirmed']);
qa_suspend_event_reports();
qa_suspend_notifications();
// Avoid issues with session_start() being called in qa_set_user_blocked()
global $qa_logged_in_userid_checked;
$qa_logged_in_userid_checked = true;
}
public function test__qa_question_create()
{
Q2A_TestsUtils::removeAllCachedOptions();
$qcount = (int)qa_opt('cache_qcount');
$unaqcount = (int)qa_opt('cache_unaqcount');
$unselqcount = (int)qa_opt('cache_unselqcount');
$unupaqcount = (int)qa_opt('cache_unupaqcount');
$queuedcount = (int)qa_opt('cache_queuedcount');
$questionId = qa_post_create('Q', null, 'Question title: test_question_create', 'Dummy post content');
$testValues = function () use ($qcount, $unaqcount, $unselqcount, $unupaqcount, $queuedcount) {
Q2A_TestsUtils::removeAllCachedOptions();
$this->assertSame($qcount + 1, (int)qa_opt('cache_qcount'));
$this->assertSame($unaqcount + 1, (int)qa_opt('cache_unaqcount'));
$this->assertSame($unselqcount + 1, (int)qa_opt('cache_unselqcount'));
$this->assertSame($unupaqcount + 1, (int)qa_opt('cache_unupaqcount'));
$this->assertSame($queuedcount, (int)qa_opt('cache_queuedcount'));
};
$testValues();
qa_update_counts_for_q($questionId);
qa_db_queuedcount_update();
$testValues();
}
public function test__qa_question_create_queued()
{
Q2A_TestsUtils::removeAllCachedOptions();
$qcount = (int)qa_opt('cache_qcount');
$unaqcount = (int)qa_opt('cache_unaqcount');
$unselqcount = (int)qa_opt('cache_unselqcount');
$unupaqcount = (int)qa_opt('cache_unupaqcount');
$queuedcount = (int)qa_opt('cache_queuedcount');
$questionId = qa_post_create('Q_QUEUED', null, 'Question title: test_question_create_queued', 'Dummy post content');
$testValues = function () use ($qcount, $unaqcount, $unselqcount, $unupaqcount, $queuedcount) {
Q2A_TestsUtils::removeAllCachedOptions();
$this->assertSame($qcount, (int)qa_opt('cache_qcount'));
$this->assertSame($unaqcount, (int)qa_opt('cache_unaqcount'));
$this->assertSame($unselqcount, (int)qa_opt('cache_unselqcount'));
$this->assertSame($unupaqcount, (int)qa_opt('cache_unupaqcount'));
$this->assertSame($queuedcount + 1, (int)qa_opt('cache_queuedcount'));
};
$testValues();
qa_update_counts_for_q($questionId);
qa_db_queuedcount_update();
$testValues();
}
public function test__qa_question_set_content_without_remoderation()
{
$questionId = qa_post_create('Q', null, 'Question title: question_set_content_without_remoderation', 'Dummy post content');
$question = qa_post_get_full($questionId);
Q2A_TestsUtils::removeAllCachedOptions();
$qcount = (int)qa_opt('cache_qcount');
$unaqcount = (int)qa_opt('cache_unaqcount');
$unselqcount = (int)qa_opt('cache_unselqcount');
$unupaqcount = (int)qa_opt('cache_unupaqcount');
$queuedcount = (int)qa_opt('cache_queuedcount');
qa_question_set_content($question, 'New Question title: question_set_content_without_remoderation', 'New question content', '', 'New question content', '', null, null, null, null);
$testValues = function () use ($qcount, $unaqcount, $unselqcount, $unupaqcount, $queuedcount) {
Q2A_TestsUtils::removeAllCachedOptions();
$this->assertSame($qcount, (int)qa_opt('cache_qcount'));
$this->assertSame($unaqcount, (int)qa_opt('cache_unaqcount'));
$this->assertSame($unselqcount, (int)qa_opt('cache_unselqcount'));
$this->assertSame($unupaqcount, (int)qa_opt('cache_unupaqcount'));
$this->assertSame($queuedcount, (int)qa_opt('cache_queuedcount'));
};
$testValues();
qa_update_counts_for_q($questionId);
qa_db_queuedcount_update();
$testValues();
}
public function test__qa_question_set_content_with_remoderation_closed_question()
{
$questionId = qa_post_create('Q', null, 'Question title: question_set_content_with_remoderation_closed_question', 'Dummy post content');
qa_post_set_closed($questionId, true, null, 'Irrelevant question', self::$user1['userid']);
$question = qa_post_get_full($questionId);
Q2A_TestsUtils::removeAllCachedOptions();
$qcount = (int)qa_opt('cache_qcount');
$unaqcount = (int)qa_opt('cache_unaqcount');
$unselqcount = (int)qa_opt('cache_unselqcount');
$unupaqcount = (int)qa_opt('cache_unupaqcount');
$queuedcount = (int)qa_opt('cache_queuedcount');
qa_question_set_content($question, 'New Question title: question_set_content_with_remoderation_closed_question', 'New question content', '', 'New question content', '', null, null, null, null, null, null, true);
$testValues = function () use ($qcount, $unaqcount, $unselqcount, $unupaqcount, $queuedcount) {
Q2A_TestsUtils::removeAllCachedOptions();
$this->assertSame($qcount - 1, (int)qa_opt('cache_qcount'));
$this->assertSame($unaqcount, (int)qa_opt('cache_unaqcount'));
$this->assertSame($unselqcount, (int)qa_opt('cache_unselqcount'));
$this->assertSame($unupaqcount, (int)qa_opt('cache_unupaqcount'));
$this->assertSame($queuedcount + 1, (int)qa_opt('cache_queuedcount'));
};
$testValues();
qa_update_counts_for_q($questionId);
qa_db_queuedcount_update();
$testValues();
}
public function test__qa_question_set_content_with_remoderation_without_recalculating_unaqcount_unupaqcount_unselqcount()
{
$questionId = qa_post_create('Q', null, 'Question title: question_set_content_with_remoderation_without_recalculating_unaqcount_unupaqcount_unselqcount', 'Dummy post content');
$answerId = qa_post_create('A', $questionId, null, 'This is the content of the answer');
qa_post_set_selchildid($questionId, $answerId);
$answer = qa_post_get_full($answerId);
qa_vote_set($answer, self::$user1['userid'], self::$user1['handle'], null, 1);
$question = qa_post_get_full($questionId);
Q2A_TestsUtils::removeAllCachedOptions();
$qcount = (int)qa_opt('cache_qcount');
$unaqcount = (int)qa_opt('cache_unaqcount');
$unselqcount = (int)qa_opt('cache_unselqcount');
$unupaqcount = (int)qa_opt('cache_unupaqcount');
$queuedcount = (int)qa_opt('cache_queuedcount');
qa_question_set_content($question, 'New Question title: question_set_content_with_remoderation_without_recalculating_unaqcount_unupaqcount_unselqcount', 'New