/tests/php/ContentReviewSettingsTest.php

https://github.com/silverstripe-labs/silverstripe-contentreview · PHP · 321 lines · 197 code · 73 blank · 51 comment · 2 complexity · f17d9742e8d96aa87414676e220ffc3e MD5 · raw file

  1. <?php
  2. namespace SilverStripe\ContentReview\Tests;
  3. use function date;
  4. use Page;
  5. use SilverStripe\CMS\Controllers\CMSPageEditController;
  6. use SilverStripe\CMS\Model\SiteTree;
  7. use SilverStripe\ContentReview\Extensions\ContentReviewCMSExtension;
  8. use SilverStripe\ContentReview\Extensions\ContentReviewDefaultSettings;
  9. use SilverStripe\ContentReview\Extensions\ContentReviewOwner;
  10. use SilverStripe\ContentReview\Extensions\SiteTreeContentReview;
  11. use SilverStripe\Dev\SapphireTest;
  12. use SilverStripe\ORM\DataObject;
  13. use SilverStripe\ORM\FieldType\DBDate;
  14. use SilverStripe\ORM\FieldType\DBDatetime;
  15. use SilverStripe\Security\Group;
  16. use SilverStripe\Security\Member;
  17. use SilverStripe\SiteConfig\SiteConfig;
  18. /**
  19. * This class tests that settings are inherited correctly based on the inherited,
  20. * custom or disabled settings.
  21. */
  22. class ContentReviewSettingsTest extends SapphireTest
  23. {
  24. /**
  25. * @var string
  26. */
  27. protected static $fixture_file = 'ContentReviewSettingsTest.yml';
  28. /**
  29. * @var array
  30. */
  31. protected static $required_extensions = [
  32. SiteTree::class => [SiteTreeContentReview::class],
  33. Group::class => [ContentReviewOwner::class],
  34. Member::class => [ContentReviewOwner::class],
  35. CMSPageEditController::class => [ContentReviewCMSExtension::class],
  36. SiteConfig::class => [ContentReviewDefaultSettings::class],
  37. ];
  38. public function testAdvanceReviewDate10Days()
  39. {
  40. /** @var Page|SiteTreeContentReview $page */
  41. $page = new Page();
  42. $page->ContentReviewType = "Custom";
  43. $page->ReviewPeriodDays = 10;
  44. $this->assertTrue($page->advanceReviewDate());
  45. $page->write();
  46. $this->assertEquals(date('Y-m-d', strtotime("now + 10 days")), $page->NextReviewDate);
  47. }
  48. public function testAdvanceReviewDateNull()
  49. {
  50. /** @var Page|SiteTreeContentReview $page */
  51. $page = new Page();
  52. $page->ContentReviewType = "Custom";
  53. $page->ReviewPeriodDays = 0;
  54. $this->assertFalse($page->advanceReviewDate());
  55. $page->write();
  56. $this->assertEquals(null, $page->NextReviewDate);
  57. }
  58. public function testAdvanceReviewFromCustomSettings()
  59. {
  60. /** @var Page|SiteTreeContentReview $page */
  61. $page = $this->objFromFixture(Page::class, "custom");
  62. $this->assertTrue($page->advanceReviewDate());
  63. $page->write();
  64. $this->assertEquals(
  65. date('Y-m-d', strtotime("now + " . $page->ReviewPeriodDays . " days")),
  66. $page->NextReviewDate
  67. );
  68. }
  69. public function testAdvanceReviewFromInheritedSettings()
  70. {
  71. // When a parent page is advanced, the next review date of the child is not automatically advanced
  72. $parentPage = $this->objFromFixture(Page::class, "page-1");
  73. $this->assertTrue($parentPage->advanceReviewDate());
  74. $parentPage->write();
  75. $page = $this->objFromFixture(Page::class, "page-1-1");
  76. $this->assertEquals(date('Y-m-d', strtotime("now + 5 days")), $parentPage->NextReviewDate);
  77. $this->assertEquals('2011-04-12', $page->NextReviewDate);
  78. // When a sub page is advanced, the next review date is advanced by the number of days in the parent
  79. $this->assertTrue($page->advanceReviewDate());
  80. $page->write();
  81. $this->assertEquals(date('Y-m-d', strtotime("now + 5 days")), $page->NextReviewDate);
  82. }
  83. public function testAdvanceReviewFromInheritedSiteConfigSettings()
  84. {
  85. /** @var Page|SiteTreeContentReview $page */
  86. $page = $this->objFromFixture(Page::class, "inherit");
  87. /** @var SiteConfig|ContentReviewDefaultSettings $siteConfig */
  88. $siteConfig = $this->objFromFixture(SiteConfig::class, "default");
  89. $this->assertTrue($page->advanceReviewDate());
  90. $page->write();
  91. $this->assertEquals(
  92. date(
  93. 'Y-m-d',
  94. strtotime("now + " . $siteConfig->ReviewPeriodDays . " days")
  95. ),
  96. $page->NextReviewDate
  97. );
  98. }
  99. public function testGetSettingsObjectFromCustom()
  100. {
  101. /** @var Page|SiteTreeContentReview $page */
  102. $page = $this->objFromFixture(Page::class, "custom");
  103. $this->assertEquals("Custom", $page->ContentReviewType);
  104. $this->assertEquals($page, $page->getOptions());
  105. }
  106. public function testGetSettingsObjectFromDisabled()
  107. {
  108. /** @var Page|SiteTreeContentReview $page */
  109. $page = $this->objFromFixture(Page::class, "disabled");
  110. $this->assertEquals("Disabled", $page->ContentReviewType);
  111. $this->assertFalse($page->getOptions());
  112. }
  113. public function testGetOptionObjectFromInheritedDisabled()
  114. {
  115. /** @var Page|SiteTreeContentReview $page */
  116. $page = $this->objFromFixture(Page::class, "page-2-1-1");
  117. $this->assertEquals("Inherit", $page->ContentReviewType);
  118. $this->assertFalse($page->getOptions());
  119. }
  120. public function testGetOptionObjectFromDeeplyInheritedPage()
  121. {
  122. /** @var Page|SiteTreeContentReview $page */
  123. $page = $this->objFromFixture(Page::class, "page-3-1-1-1");
  124. $this->assertEquals("Inherit", $page->ContentReviewType);
  125. $this->assertInstanceOf(SiteConfig::class, $page->getOptions());
  126. }
  127. public function testGetSettingsObjectFromInheritPage()
  128. {
  129. /** @var Page|SiteTreeContentReview $page */
  130. $page = $this->objFromFixture(Page::class, "page-1-1");
  131. /** @var Page|SiteTreeContentReview $parentPage */
  132. $parentPage = $this->objFromFixture(Page::class, "page-1");
  133. $this->assertEquals("Inherit", $page->ContentReviewType);
  134. $this->assertEquals(get_class($parentPage), get_class($page->getOptions()));
  135. $this->assertEquals($parentPage->ID, $page->getOptions()->ID);
  136. }
  137. public function testGetSettingsObjectFromInheritedRootPage()
  138. {
  139. /** @var Page|SiteTreeContentReview $page */
  140. $page = $this->objFromFixture(Page::class, "inherit");
  141. $this->assertEquals("Inherit", $page->ContentReviewType);
  142. $this->assertEquals(
  143. $this->objFromFixture(
  144. SiteConfig::class,
  145. "default"
  146. )->ID,
  147. $page->getOptions()->ID
  148. );
  149. }
  150. public function testGetNextReviewDateFromCustomSettings()
  151. {
  152. /** @var Page|SiteTreeContentReview $page */
  153. $page = $this->objFromFixture(Page::class, 'custom');
  154. $date = $page->getReviewDate();
  155. $this->assertEquals('2010-02-01', $date->format('Y-MM-dd'));
  156. }
  157. public function testGetNextReviewDateFromSiteConfigInheritedSetting()
  158. {
  159. /** @var Page|SiteTreeContentReview $page */
  160. $page = $this->objFromFixture(Page::class, "inherit");
  161. $nextReviewDate = $page->getReviewDate();
  162. $this->assertInstanceOf(DBDate::class, $nextReviewDate);
  163. /** @var SiteConfig|ContentReviewDefaultSettings $siteConfig */
  164. $siteConfig = $this->objFromFixture(SiteConfig::class, "default");
  165. $expected = $this->addDaysToDate(DBDatetime::now(), $siteConfig->ReviewPeriodDays);
  166. $this->assertEquals($expected, $nextReviewDate->format('Y-MM-dd'));
  167. }
  168. public function testGetNextReviewDateFromPageInheritedSetting()
  169. {
  170. // Although page-1-1 inherits from page-1, it has an independent review date
  171. $page = $this->objFromFixture(Page::class, "page-1-1");
  172. $nextReviewDate = $page->getReviewDate();
  173. $this->assertInstanceOf(DBDate::class, $nextReviewDate);
  174. $this->assertEquals('2011-04-12', $nextReviewDate->format('Y-MM-dd'));
  175. }
  176. public function testUpdateNextReviewDateFromCustomToDisabled()
  177. {
  178. /** @var Page|SiteTreeContentReview $page */
  179. $page = $this->objFromFixture(Page::class, "custom");
  180. // before write()
  181. $this->assertEquals("2010-02-01", $page->NextReviewDate);
  182. $page->ContentReviewType = "Disabled";
  183. $page->write();
  184. DataObject::flush_and_destroy_cache();
  185. unset($page);
  186. /** @var Page|SiteTreeContentReview $page */
  187. $page = $this->objFromFixture(Page::class, "custom");
  188. $this->assertNull($page->NextReviewDate);
  189. }
  190. public function testUpdateNextReviewDateFromDisabledToCustom()
  191. {
  192. /** @var Page|SiteTreeContentReview $page */
  193. $page = $this->objFromFixture(Page::class, "disabled");
  194. $this->assertNull($page->NextReviewDate);
  195. $page->ContentReviewType = "Custom";
  196. $page->ReviewPeriodDays = "7";
  197. $page->write();
  198. DataObject::flush_and_destroy_cache();
  199. unset($page);
  200. /** @var Page|SiteTreeContentReview $page */
  201. $page = $this->objFromFixture(Page::class, "disabled");
  202. $expected = date('Y-m-d', strtotime("+ " . $page->ReviewPeriodDays . " days"));
  203. $this->assertEquals($expected, $page->NextReviewDate);
  204. }
  205. public function testParentChangedOptionsAndChildShouldToo()
  206. {
  207. /** @var Page|SiteTreeContentReview $parentPage */
  208. $parentPage = $this->objFromFixture(Page::class, "page-1");
  209. /** @var Page|SiteTreeContentReview $childPage */
  210. $childPage = $this->objFromFixture(Page::class, "page-1-1");
  211. // Parent and child pages have different review dates
  212. $this->assertNotEquals($parentPage->NextReviewDate, $childPage->NextReviewDate);
  213. // But if we change the parent page ReviewPeriodDays to 10, the childs stays the same
  214. $parentPage->ReviewPeriodDays = 10;
  215. $parentPage->write();
  216. // Flush all the caches!
  217. DataObject::flush_and_destroy_cache();
  218. /** @var Page|SiteTreeContentReview $page */
  219. $parentPage = $this->objFromFixture(Page::class, "page-1");
  220. /** @var Page|SiteTreeContentReview $page */
  221. $childPage = $this->objFromFixture(Page::class, "page-1-1");
  222. // The parent page's date advances, but not the child's
  223. $this->assertEquals('2011-04-12', $childPage->NextReviewDate);
  224. $this->assertEquals($this->addDaysToDate(date('Y-m-d'), 10), $parentPage->NextReviewDate);
  225. // Reviewing the child page should, however, advance its review by 10 days
  226. $childPage->advanceReviewDate();
  227. $childPage->write();
  228. $this->assertEquals($this->addDaysToDate(date('Y-m-d'), 10), $childPage->NextReviewDate);
  229. }
  230. /**
  231. * Note: all input dates should be DBDatetime or strings in CLDR date format. See {@link DBDate} for information
  232. *
  233. * @param string|DBDatetime $date
  234. * @param int $days
  235. * @param string $format
  236. *
  237. * @return bool|string
  238. */
  239. private function addDaysToDate($date, $days, $format = 'Y-MM-dd')
  240. {
  241. if (is_object($date)) {
  242. $sec = strtotime("+ " . $days . " days", $date->getTimestamp());
  243. } else {
  244. $sec = strtotime("+ " . $days . " days", DBDate::create()->setValue($date)->getTimestamp());
  245. }
  246. return DBDate::create()->setValue($sec)->format($format);
  247. }
  248. }