SessionTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace yiiunit\extensions\mongodb;
  3. use yii\mongodb\Session;
  4. use Yii;
  5. class SessionTest extends TestCase
  6. {
  7. /**
  8. * @var string test session collection name.
  9. */
  10. protected static $sessionCollection = '_test_session';
  11. protected function tearDown()
  12. {
  13. $this->dropCollection(static::$sessionCollection);
  14. parent::tearDown();
  15. }
  16. /**
  17. * Creates test session instance.
  18. * @return Session session instance.
  19. */
  20. protected function createSession()
  21. {
  22. return Yii::createObject([
  23. 'class' => Session::className(),
  24. 'db' => $this->getConnection(),
  25. 'sessionCollection' => static::$sessionCollection,
  26. ]);
  27. }
  28. // Tests:
  29. public function testWriteSession()
  30. {
  31. $session = $this->createSession();
  32. $id = uniqid();
  33. $data = [
  34. 'name' => 'value'
  35. ];
  36. $dataSerialized = serialize($data);
  37. $this->assertTrue($session->writeSession($id, $dataSerialized), 'Unable to write session!');
  38. $collection = $session->db->getCollection($session->sessionCollection);
  39. $rows = $this->findAll($collection);
  40. $this->assertCount(1, $rows, 'No session record!');
  41. $row = array_shift($rows);
  42. $this->assertEquals($id, $row['id'], 'Wrong session id!');
  43. $this->assertEquals($dataSerialized, $row['data'], 'Wrong session data!');
  44. $this->assertTrue($row['expire'] > time(), 'Wrong session expire!');
  45. $newData = [
  46. 'name' => 'new value'
  47. ];
  48. $newDataSerialized = serialize($newData);
  49. $this->assertTrue($session->writeSession($id, $newDataSerialized), 'Unable to update session!');
  50. $rows = $this->findAll($collection);
  51. $this->assertCount(1, $rows, 'Wrong session records after update!');
  52. $newRow = array_shift($rows);
  53. $this->assertEquals($id, $newRow['id'], 'Wrong session id after update!');
  54. $this->assertEquals($newDataSerialized, $newRow['data'], 'Wrong session data after update!');
  55. $this->assertTrue($newRow['expire'] >= $row['expire'], 'Wrong session expire after update!');
  56. }
  57. /**
  58. * @depends testWriteSession
  59. */
  60. public function testDestroySession()
  61. {
  62. $session = $this->createSession();
  63. $id = uniqid();
  64. $data = [
  65. 'name' => 'value'
  66. ];
  67. $dataSerialized = serialize($data);
  68. $session->writeSession($id, $dataSerialized);
  69. $this->assertTrue($session->destroySession($id), 'Unable to destroy session!');
  70. $collection = $session->db->getCollection($session->sessionCollection);
  71. $rows = $this->findAll($collection);
  72. $this->assertEmpty($rows, 'Session record not deleted!');
  73. }
  74. /**
  75. * @depends testWriteSession
  76. */
  77. public function testReadSession()
  78. {
  79. $session = $this->createSession();
  80. $id = uniqid();
  81. $data = [
  82. 'name' => 'value'
  83. ];
  84. $dataSerialized = serialize($data);
  85. $session->writeSession($id, $dataSerialized);
  86. $sessionData = $session->readSession($id);
  87. $this->assertEquals($dataSerialized, $sessionData, 'Unable to read session!');
  88. $collection = $session->db->getCollection($session->sessionCollection);
  89. list($row) = $this->findAll($collection);
  90. $newRow = $row;
  91. $newRow['expire'] = time() - 1;
  92. unset($newRow['_id']);
  93. $collection->update(['_id' => $row['_id']], $newRow);
  94. $sessionData = $session->readSession($id);
  95. $this->assertEquals('', $sessionData, 'Expired session read!');
  96. }
  97. public function testGcSession()
  98. {
  99. $session = $this->createSession();
  100. $collection = $session->db->getCollection($session->sessionCollection);
  101. $collection->batchInsert([
  102. [
  103. 'id' => uniqid(),
  104. 'expire' => time() + 10,
  105. 'data' => 'actual',
  106. ],
  107. [
  108. 'id' => uniqid(),
  109. 'expire' => time() - 10,
  110. 'data' => 'expired',
  111. ],
  112. ]);
  113. $this->assertTrue($session->gcSession(10), 'Unable to collection garbage session!');
  114. $rows = $this->findAll($collection);
  115. $this->assertCount(1, $rows, 'Wrong records count!');
  116. }
  117. /**
  118. * @depends testWriteSession
  119. */
  120. public function testWriteCustomField()
  121. {
  122. $session = $this->createSession();
  123. $session->writeCallback = function ($session) {
  124. return [
  125. 'user_id' => 15
  126. ];
  127. };
  128. $session->writeSession('test', 'session data');
  129. $rows = $this->findAll($session->db->getCollection($session->sessionCollection));
  130. $this->assertEquals('session data', $rows[0]['data']);
  131. $this->assertEquals(15, $rows[0]['user_id']);
  132. }
  133. }