public function testAddMessageAfterRedirect()
{
session_start();
$err_msg = 'Something is broken. Weird.';
$warn_msg = 'There was a warning. Be carefull.';
$info_msg = 'All goes well. Or not... Who knows ;)';
$this->assertEquals(false, isset($_SESSION['MESSAGE_AFTER_REDIRECT']));
//test add message in cron mode
$_SESSION['glpicronuserrunning'] = 'phpunit_cron';
Session::addMessageAfterRedirect($err_msg, false, ERROR);
//adding a message in "cron mode" does not add anything in the session
$this->assertEquals(false, isset($_SESSION['MESSAGE_AFTER_REDIRECT']));
//set not running from cron
unset($_SESSION['glpicronuserrunning']);
//test all messages types
Session::addMessageAfterRedirect($err_msg, false, ERROR);
Session::addMessageAfterRedirect($warn_msg, false, WARNING);
Session::addMessageAfterRedirect($info_msg, false, INFO);
$expected = [ERROR => [$err_msg], WARNING => [$warn_msg], INFO => [$info_msg]];
$this->assertEquals($expected, $_SESSION['MESSAGE_AFTER_REDIRECT']);
$this->expectOutputRegex('/' . str_replace('.', '\\.', $err_msg) . '/');
$this->expectOutputRegex('/' . str_replace('.', '\\.', $warn_msg) . '/');
$this->expectOutputRegex('/' . str_replace(['.', ')'], ['\\.', '\\)'], $info_msg) . '/');
Html::displayMessageAfterRedirect();
$this->assertEquals([], $_SESSION['MESSAGE_AFTER_REDIRECT']);
//test multiple messages of same type
Session::addMessageAfterRedirect($err_msg, false, ERROR);
Session::addMessageAfterRedirect($err_msg, false, ERROR);
Session::addMessageAfterRedirect($err_msg, false, ERROR);
$expected = [ERROR => [$err_msg, $err_msg, $err_msg]];
$this->assertEquals($expected, $_SESSION['MESSAGE_AFTER_REDIRECT']);
$this->expectOutputRegex('/' . str_replace('.', '\\.', $err_msg) . '/');
Html::displayMessageAfterRedirect();
$this->assertEquals([], $_SESSION['MESSAGE_AFTER_REDIRECT']);
//test message deduplication
$err_msg_bis = $err_msg . ' not the same';
Session::addMessageAfterRedirect($err_msg, true, ERROR);
Session::addMessageAfterRedirect($err_msg_bis, true, ERROR);
Session::addMessageAfterRedirect($err_msg, true, ERROR);
Session::addMessageAfterRedirect($err_msg, true, ERROR);
$expected = [ERROR => [$err_msg, $err_msg_bis]];
$this->assertEquals($expected, $_SESSION['MESSAGE_AFTER_REDIRECT']);
$this->expectOutputRegex('/' . str_replace('.', '\\.', $err_msg) . '/');
$this->expectOutputRegex('/' . str_replace('.', '\\.', $err_msg_bis) . '/');
Html::displayMessageAfterRedirect();
$this->assertEquals([], $_SESSION['MESSAGE_AFTER_REDIRECT']);
//test with reset
Session::addMessageAfterRedirect($err_msg, false, ERROR);
Session::addMessageAfterRedirect($warn_msg, false, WARNING);
Session::addMessageAfterRedirect($info_msg, false, INFO, true);
$expected = [INFO => [$info_msg]];
$this->assertEquals($expected, $_SESSION['MESSAGE_AFTER_REDIRECT']);
$this->expectOutputRegex('/' . str_replace(['.', ')'], ['\\.', '\\)'], $info_msg) . '/');
Html::displayMessageAfterRedirect();
$this->assertEquals([], $_SESSION['MESSAGE_AFTER_REDIRECT']);
}