diff --git a/lib/Database.php b/lib/Database.php index 55c21e0f..08e3f050 100644 --- a/lib/Database.php +++ b/lib/Database.php @@ -1713,7 +1713,7 @@ class Database { // set starred, hidden, and/or note marks (unless all requested editions actually do not exist) if ($context->article || $context->articles) { $q = $this->articleQuery($user, $context, ["id", "subscription"]); - $q->setWhere("(arsse_marks.note <> coalesce(?,arsse_marks.note) or arsse_marks.starred <> coalesce(?,arsse_marks.starred))", ["str", "bool"], [$data['note'], $data['starred']]); + $q->setWhere("(arsse_marks.note <> coalesce(?,arsse_marks.note) or arsse_marks.starred <> coalesce(?,arsse_marks.starred) or arsse_marks.hidden <> coalesce(?,arsse_marks.hidden))", ["str", "bool", "bool"], [$data['note'], $data['starred'], $data['hidden']]); $q->pushCTE("target_articles(article,subscription)"); $data = array_filter($data, function($v) { return isset($v); @@ -1737,7 +1737,7 @@ class Database { } } $q = $this->articleQuery($user, $context, ["id", "subscription"]); - $q->setWhere("(arsse_marks.note <> coalesce(?,arsse_marks.note) or arsse_marks.starred <> coalesce(?,arsse_marks.starred) or arsse_marks.read <> coalesce(?,arsse_marks.read))", ["str", "bool", "bool"], [$data['note'], $data['starred'], $data['read']]); + $q->setWhere("(arsse_marks.note <> coalesce(?,arsse_marks.note) or arsse_marks.starred <> coalesce(?,arsse_marks.starred) or arsse_marks.read <> coalesce(?,arsse_marks.read) or arsse_marks.hidden <> coalesce(?,arsse_marks.hidden))", ["str", "bool", "bool", "bool"], [$data['note'], $data['starred'], $data['read'], $data['hidden']]); $q->pushCTE("target_articles(article,subscription)"); $data = array_filter($data, function($v) { return isset($v); diff --git a/tests/cases/Database/SeriesArticle.php b/tests/cases/Database/SeriesArticle.php index a6b6bdbd..0653b580 100644 --- a/tests/cases/Database/SeriesArticle.php +++ b/tests/cases/Database/SeriesArticle.php @@ -253,6 +253,7 @@ trait SeriesArticle { [1, 2,0,0,'2010-01-01 00:00:00','Some Note',0], [3, 5,0,0,'2000-01-01 00:00:00','',1], [6, 1,0,1,'2010-01-01 00:00:00','',1], + [6, 2,1,0,'2010-01-01 00:00:00','',1], ], ], 'arsse_categories' => [ // author-supplied categories @@ -1035,4 +1036,114 @@ trait SeriesArticle { yield [$method]; } } -} + + public function testMarkAllArticlesNotHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['hidden' => false]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][14][6] = 0; + $state['arsse_marks']['rows'][14][4] = $now; + $state['arsse_marks']['rows'][15][6] = 0; + $state['arsse_marks']['rows'][15][4] = $now; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAllArticlesHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['hidden' => true]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $state['arsse_marks']['rows'][] = [7,19,0,0,$now,'',1]; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAllArticlesUnreadAndNotHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => false, 'hidden' => false]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][2] = 0; + $state['arsse_marks']['rows'][3][4] = $now; + $state['arsse_marks']['rows'][14][6] = 0; + $state['arsse_marks']['rows'][14][4] = $now; + $state['arsse_marks']['rows'][15][2] = 0; + $state['arsse_marks']['rows'][15][6] = 0; + $state['arsse_marks']['rows'][15][4] = $now; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAllArticlesReadAndHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => true, 'hidden' => true]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $state['arsse_marks']['rows'][14][2] = 1; + $state['arsse_marks']['rows'][14][4] = $now; + $state['arsse_marks']['rows'][] = [7,19,1,0,$now,'',1]; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAllArticlesUnreadAndHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => false,'hidden' => true]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][2] = 0; + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $state['arsse_marks']['rows'][15][2] = 0; + $state['arsse_marks']['rows'][15][4] = $now; + $state['arsse_marks']['rows'][] = [7,19,0,0,$now,'',1]; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAllArticlesReadAndNotHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => true,'hidden' => false]); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][14][2] = 1; + $state['arsse_marks']['rows'][14][6] = 0; + $state['arsse_marks']['rows'][14][4] = $now; + $state['arsse_marks']['rows'][15][6] = 0; + $state['arsse_marks']['rows'][15][4] = $now; + $state['arsse_marks']['rows'][] = [7,19,1,0,$now,'',0]; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkMultipleEditionsUnreadAndHiddenWithStale(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => false,'hidden' => true], (new Context)->editions([1,2,19,20])); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $state['arsse_marks']['rows'][15][2] = 0; + $state['arsse_marks']['rows'][15][6] = 1; + $state['arsse_marks']['rows'][15][4] = $now; + $state['arsse_marks']['rows'][] = [7,19,0,0,$now,'',1]; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAStaleEditionHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['hidden' => true], (new Context)->edition(20)); + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAStaleEditionUnreadAndHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => false,'hidden' => true], (new Context)->edition(20)); // only starred is changed + $now = Date::transform(time(), "sql"); + $state = $this->primeExpectations($this->data, $this->checkTables); + $state['arsse_marks']['rows'][3][6] = 1; + $state['arsse_marks']['rows'][3][4] = $now; + $this->compareExpectations(static::$drv, $state); + } + + public function testMarkAStaleEditionUnreadAndNotHidden(): void { + Arsse::$db->articleMark("jane.doe@example.com", ['read' => false,'hidden' => false], (new Context)->edition(20)); // no changes occur + $state = $this->primeExpectations($this->data, $this->checkTables); + $this->compareExpectations(static::$drv, $state); + } +} \ No newline at end of file