public function testCrudForHasOneAndHasManyEmailMessageRelations()
 {
     $emailMessage = EmailMessageTestHelper::createDraftSystemEmail('test crud relations', $this->user);
     $this->assertTrue($emailMessage->save());
     $emailMessageId = $emailMessage->id;
     $emailMessage->forgetAll();
     //Check read hasOne relation
     $emailMessage = EmailMessage::getById($emailMessageId);
     $emailMessageSender = $emailMessage->sender;
     $this->assertEquals('*****@*****.**', $emailMessageSender->fromAddress);
     //Check update hasOne relation
     $emailMessageSender->fromAddress = '*****@*****.**';
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $emailMessage = EmailMessage::getById($emailMessageId);
     $emailMessageSender = $emailMessage->sender;
     $this->assertEquals('*****@*****.**', $emailMessageSender->fromAddress);
     //Check delete hasOne relation
     $emailMessageSender2 = new EmailMessageSender();
     $emailMessageSender2->fromAddress = '*****@*****.**';
     $emailMessageSender2->fromName = 'system name';
     $emailMessage->sender = $emailMessageSender2;
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $found = true;
     try {
         EmailMessageSender::getById($emailMessageSender->id);
     } catch (NotFoundException $exception) {
         $found = false;
     }
     $this->assertFalse($found);
     //Check read hasMany relation
     $emailMessage = EmailMessage::getById($emailMessageId);
     $recipients = $emailMessage->recipients;
     $recipient = $recipients[0];
     $this->assertCount(1, $recipients);
     $this->assertEquals('*****@*****.**', $recipient->toAddress);
     //Check update hasMany relation
     $recipient->toAddress = '*****@*****.**';
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $emailMessage = EmailMessage::getById($emailMessageId);
     $recipient = $emailMessage->recipients[0];
     $this->assertEquals('*****@*****.**', $recipient->toAddress);
     //Check add hasMany relation
     $recipient = new EmailMessageRecipient();
     $recipient->toAddress = '*****@*****.**';
     $recipient->toName = 'Anne Frank';
     $recipient->type = EmailMessageRecipient::TYPE_BCC;
     $emailMessage->recipients->add($recipient);
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $emailMessage = EmailMessage::getById($emailMessageId);
     $recipients = $emailMessage->recipients;
     $recipient = $recipients[1];
     $this->assertCount(2, $recipients);
     //Check update hasMany relation with more than one model set
     $recipient->toAddress = '*****@*****.**';
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $emailMessage = EmailMessage::getById($emailMessageId);
     $recipient = $emailMessage->recipients[1];
     $this->assertEquals('*****@*****.**', $recipient->toAddress);
     //Check delete hasMany relation
     $emailMessage->recipients->remove($recipient);
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $found = true;
     try {
         EmailMessageRecipient::getById($recipient->id);
     } catch (NotFoundException $exception) {
         $found = false;
     }
     $this->assertFalse($found);
     //Check delete last hasMany relation model
     $emailMessage = EmailMessage::getById($emailMessageId);
     $recipient = $emailMessage->recipients[0];
     $emailMessage->recipients->remove($recipient);
     $this->assertTrue($emailMessage->save());
     $emailMessage->forgetAll();
     $found = true;
     try {
         EmailMessageRecipient::getById($recipient->id);
     } catch (NotFoundException $exception) {
         $found = false;
     }
     $this->assertFalse($found);
     $this->assertCount(0, $emailMessage->recipients);
 }