From bcf89f0dfe3016935a90159e11dcdea14d71bfd1 Mon Sep 17 00:00:00 2001 From: Alexey Stoletniy Date: Tue, 21 Feb 2017 13:13:59 +0300 Subject: [PATCH] Set newsletter status as draft when restoring newsletters trashed during sending [MAILPOET-816] --- lib/Models/Newsletter.php | 19 +++++++++++ lib/Util/Sudzy/ValidModel.php | 3 ++ tests/unit/Models/NewsletterTest.php | 50 ++++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index 238d35d46a..9fd578bc83 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -715,4 +715,23 @@ class Newsletter extends Model { self::NEWSLETTER_HASH_LENGTH ); } + + function restore() { + if ($this->status == self::STATUS_SENDING) { + $this->set('status', self::STATUS_DRAFT); + $this->save(); + } + return parent::restore(); + } + + static function bulkRestore($orm) { + parent::bulkAction($orm, function($ids) { + Newsletter::whereIn('id', $ids) + ->where('status', Newsletter::STATUS_SENDING) + ->findResultSet() + ->set('status', Newsletter::STATUS_DRAFT) + ->save(); + }); + return parent::bulkRestore($orm); + } } diff --git a/lib/Util/Sudzy/ValidModel.php b/lib/Util/Sudzy/ValidModel.php index 476a5b47a5..c8e69d365c 100644 --- a/lib/Util/Sudzy/ValidModel.php +++ b/lib/Util/Sudzy/ValidModel.php @@ -136,6 +136,9 @@ abstract class ValidModel extends \Model { } else { $this->validateAndSet($key, $value); } + // we should return $this to not break Idiorm's fluent interface: + // $model->set('property', 'foo')->save(); + return $this; } diff --git a/tests/unit/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index a917472536..3e1924bc27 100644 --- a/tests/unit/Models/NewsletterTest.php +++ b/tests/unit/Models/NewsletterTest.php @@ -16,7 +16,7 @@ class NewsletterTest extends MailPoetTest { $this->newsletter = Newsletter::createOrUpdate(array( 'subject' => 'My Standard Newsletter', 'preheader' => 'Pre Header', - 'type' => 'standard' + 'type' => Newsletter::TYPE_STANDARD )); $this->segment_1 = Segment::createOrUpdate(array( @@ -162,7 +162,7 @@ class NewsletterTest extends MailPoetTest { $is_created = Newsletter::createOrUpdate( array( 'subject' => 'new newsletter', - 'type' => 'standard', + 'type' => Newsletter::TYPE_STANDARD, 'body' => 'body' )); expect($is_created->id() > 0)->true(); @@ -246,7 +246,7 @@ class NewsletterTest extends MailPoetTest { Newsletter::createOrUpdate( array( 'subject' => 'search for "pineapple"', - 'type' => 'standard', + 'type' => Newsletter::TYPE_STANDARD, 'body' => 'body' )); $newsletter = Newsletter::filter('search', 'pineapple') @@ -384,6 +384,50 @@ class NewsletterTest extends MailPoetTest { expect($this->newsletter->queue()->findOne()->id)->equals($queue->id); } + function testItCanBeRestored() { + $this->newsletter->status = Newsletter::STATUS_SENT; + $this->newsletter->trash(); + expect($this->newsletter->deleted_at)->notNull(); + $this->newsletter->restore(); + expect($this->newsletter->deleted_at)->equals('NULL'); + expect($this->newsletter->status)->equals(Newsletter::STATUS_SENT); + + // if the restored newsletter was trashed while in sending, + // its status should be set to 'draft' to be able to send it again + $this->newsletter->status = Newsletter::STATUS_SENDING; + $this->newsletter->trash(); + $this->newsletter->restore(); + expect($this->newsletter->status)->equals(Newsletter::STATUS_DRAFT); + } + + function testItCanBulkRestoreNewsletters() { + $statuses = array( + Newsletter::STATUS_DRAFT, + Newsletter::STATUS_SENT, + Newsletter::STATUS_SENDING + ); + + $newsletters = array(); + for($i = 0; $i < count($statuses); $i++) { + $newsletters[$i] = Newsletter::createOrUpdate( + array( + 'subject' => 'Test', + 'preheader' => 'Some text', + 'type' => Newsletter::TYPE_STANDARD, + 'status' => $statuses[$i] + ) + ); + } + + Newsletter::filter('bulkTrash'); + expect(Newsletter::whereNull('deleted_at')->findArray())->isEmpty(); + expect(Newsletter::where('status', Newsletter::STATUS_SENDING)->findArray())->count(1); + + Newsletter::filter('bulkRestore'); + expect(Newsletter::whereNotNull('deleted_at')->findArray())->isEmpty(); + expect(Newsletter::where('status', Newsletter::STATUS_SENDING)->findArray())->count(0); + } + function _after() { ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);