model.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. class modelTest extends PHPUnit_Framework_TestCase
  3. {
  4. private $_conf;
  5. private $_model;
  6. public function setUp()
  7. {
  8. /* Setup Routine */
  9. $options = parse_ini_file(CONF, true);
  10. $options['model'] = array(
  11. 'class' => 'privatebin_db',
  12. );
  13. $options['model_options'] = array(
  14. 'dsn' => 'sqlite::memory:',
  15. 'usr' => null,
  16. 'pwd' => null,
  17. 'opt' => array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION),
  18. );
  19. helper::confBackup();
  20. helper::createIniFile(CONF, $options);
  21. $this->_conf = new configuration;
  22. $this->_model = new model($this->_conf);
  23. $_SERVER['REMOTE_ADDR'] = '::1';
  24. }
  25. public function tearDown()
  26. {
  27. /* Tear Down Routine */
  28. }
  29. public function testBasicWorkflow()
  30. {
  31. // storing pastes
  32. $pasteData = helper::getPaste();
  33. $this->_model->getPaste(helper::getPasteId())->delete();
  34. $paste = $this->_model->getPaste(helper::getPasteId());
  35. $this->assertFalse($paste->exists(), 'paste does not yet exist');
  36. $paste = $this->_model->getPaste();
  37. $paste->setData($pasteData['data']);
  38. $paste->setOpendiscussion();
  39. $paste->setFormatter($pasteData['meta']['formatter']);
  40. $paste->store();
  41. $paste = $this->_model->getPaste(helper::getPasteId());
  42. $this->assertTrue($paste->exists(), 'paste exists after storing it');
  43. $paste = $paste->get();
  44. $this->assertEquals($pasteData['data'], $paste->data);
  45. foreach (array('opendiscussion', 'formatter') as $key) {
  46. $this->assertEquals($pasteData['meta'][$key], $paste->meta->$key);
  47. }
  48. // storing comments
  49. $commentData = helper::getComment();
  50. $paste = $this->_model->getPaste(helper::getPasteId());
  51. $comment = $paste->getComment(helper::getPasteId(), helper::getCommentId());
  52. $this->assertFalse($comment->exists(), 'comment does not yet exist');
  53. $comment = $paste->getComment(helper::getPasteId());
  54. $comment->setData($commentData['data']);
  55. $comment->setNickname($commentData['meta']['nickname']);
  56. $comment->store();
  57. $comment = $paste->getComment(helper::getPasteId(), helper::getCommentId());
  58. $this->assertTrue($comment->exists(), 'comment exists after storing it');
  59. $comment = $comment->get();
  60. $this->assertEquals($commentData['data'], $comment->data);
  61. $this->assertEquals($commentData['meta']['nickname'], $comment->meta->nickname);
  62. // deleting pastes
  63. $this->_model->getPaste(helper::getPasteId())->delete();
  64. $paste = $this->_model->getPaste(helper::getPasteId());
  65. $this->assertFalse($paste->exists(), 'paste successfully deleted');
  66. $this->assertEquals(array(), $paste->getComments(), 'comment was deleted with paste');
  67. }
  68. /**
  69. * @expectedException Exception
  70. * @expectedExceptionCode 75
  71. */
  72. public function testPasteDuplicate()
  73. {
  74. $pasteData = helper::getPaste();
  75. $this->_model->getPaste(helper::getPasteId())->delete();
  76. $paste = $this->_model->getPaste();
  77. $paste->setData($pasteData['data']);
  78. $paste->setOpendiscussion();
  79. $paste->setFormatter($pasteData['meta']['formatter']);
  80. $paste->store();
  81. $paste = $this->_model->getPaste();
  82. $paste->setData($pasteData['data']);
  83. $paste->setOpendiscussion();
  84. $paste->setFormatter($pasteData['meta']['formatter']);
  85. $paste->store();
  86. }
  87. /**
  88. * @expectedException Exception
  89. * @expectedExceptionCode 69
  90. */
  91. public function testCommentDuplicate()
  92. {
  93. $pasteData = helper::getPaste();
  94. $commentData = helper::getComment();
  95. $this->_model->getPaste(helper::getPasteId())->delete();
  96. $paste = $this->_model->getPaste();
  97. $paste->setData($pasteData['data']);
  98. $paste->setOpendiscussion();
  99. $paste->setFormatter($pasteData['meta']['formatter']);
  100. $paste->store();
  101. $comment = $paste->getComment(helper::getPasteId());
  102. $comment->setData($commentData['data']);
  103. $comment->setNickname($commentData['meta']['nickname']);
  104. $comment->store();
  105. $comment = $paste->getComment(helper::getPasteId());
  106. $comment->setData($commentData['data']);
  107. $comment->setNickname($commentData['meta']['nickname']);
  108. $comment->store();
  109. }
  110. public function testImplicitDefaults()
  111. {
  112. $pasteData = helper::getPaste();
  113. $commentData = helper::getComment();
  114. $this->_model->getPaste(helper::getPasteId())->delete();
  115. $paste = $this->_model->getPaste();
  116. $paste->setData($pasteData['data']);
  117. $paste->setBurnafterreading();
  118. $paste->setOpendiscussion();
  119. // not setting a formatter, should use default one
  120. $paste->store();
  121. $paste = $this->_model->getPaste(helper::getPasteId())->get(); // ID was set based on data
  122. $this->assertEquals(true, property_exists($paste->meta, 'burnafterreading') && $paste->meta->burnafterreading, 'burn after reading takes precendence');
  123. $this->assertEquals(false, property_exists($paste->meta, 'opendiscussion') && $paste->meta->opendiscussion, 'opendiscussion is disabled');
  124. $this->assertEquals($this->_conf->getKey('defaultformatter'), $paste->meta->formatter, 'default formatter is set');
  125. $this->_model->getPaste(helper::getPasteId())->delete();
  126. $paste = $this->_model->getPaste();
  127. $paste->setData($pasteData['data']);
  128. $paste->setBurnafterreading('0');
  129. $paste->setOpendiscussion();
  130. $paste->store();
  131. $vz = new vizhash16x16();
  132. $pngdata = 'data:image/png;base64,' . base64_encode($vz->generate($_SERVER['REMOTE_ADDR']));
  133. $comment = $paste->getComment(helper::getPasteId());
  134. $comment->setData($commentData['data']);
  135. $comment->setNickname($commentData['meta']['nickname']);
  136. $comment->store();
  137. $comment = $paste->getComment(helper::getPasteId(), helper::getCommentId())->get();
  138. $this->assertEquals($pngdata, $comment->meta->vizhash, 'nickname triggers vizhash to be set');
  139. }
  140. public function testPasteIdValidation()
  141. {
  142. $this->assertTrue(model_paste::isValidId('a242ab7bdfb2581a'), 'valid paste id');
  143. $this->assertFalse(model_paste::isValidId('foo'), 'invalid hex values');
  144. $this->assertFalse(model_paste::isValidId('../bar/baz'), 'path attack');
  145. }
  146. /**
  147. * @expectedException Exception
  148. * @expectedExceptionCode 62
  149. */
  150. public function testInvalidComment()
  151. {
  152. $paste = $this->_model->getPaste();
  153. $paste->getComment(helper::getPasteId());
  154. }
  155. public function testExpiration()
  156. {
  157. $pasteData = helper::getPaste();
  158. $this->_model->getPaste(helper::getPasteId())->delete();
  159. $paste = $this->_model->getPaste(helper::getPasteId());
  160. $this->assertFalse($paste->exists(), 'paste does not yet exist');
  161. $paste = $this->_model->getPaste();
  162. $paste->setData($pasteData['data']);
  163. $paste->setExpiration('5min'); // = 300 seconds
  164. $paste->store();
  165. $paste = $paste->get();
  166. $this->assertEquals(300, $paste->meta->remaining_time, 'remaining time is set correctly');
  167. }
  168. /**
  169. * @expectedException Exception
  170. * @expectedExceptionCode 64
  171. */
  172. public function testCommentDeletion()
  173. {
  174. $pasteData = helper::getPaste();
  175. $this->_model->getPaste(helper::getPasteId())->delete();
  176. $paste = $this->_model->getPaste();
  177. $paste->setData($pasteData['data']);
  178. $paste->store();
  179. $paste->getComment(helper::getPasteId())->delete();
  180. }
  181. }