protected function resolveEmailMessage($subject = 'Subject', $textContent = 'My First Message', $htmlContent = 'Some fake HTML content', $fromAddress = '*****@*****.**', $fromName = 'Zurmo', $toAddress = '*****@*****.**', $toName = null, $contact = null) { if (!isset($contact)) { $contact = ContactTestHelper::createContactByNameForOwner('emailContact', Yii::app()->user->userModel); } $emailMessage = new EmailMessage(); $emailMessage->owner = $contact->owner; $emailMessage->subject = $subject; $emailContent = new EmailMessageContent(); $emailContent->textContent = $textContent; $emailContent->htmlContent = $htmlContent; $emailMessage->content = $emailContent; $sender = new EmailMessageSender(); $sender->fromAddress = $fromAddress; $sender->fromName = $fromName; $sender->personsOrAccounts->add(Yii::app()->user->userModel); $emailMessage->sender = $sender; $recipient = new EmailMessageRecipient(); $recipient->toAddress = $toAddress; if (!isset($toName)) { $toName = strval($contact); } $recipient->toName = $toName; $recipient->personsOrAccounts->add($contact); $recipient->type = EmailMessageRecipient::TYPE_TO; $emailMessage->recipients->add($recipient); $emailBox = EmailBoxUtil::getDefaultEmailBoxByUser(Yii::app()->user->userModel); $emailMessage->folder = EmailFolder::getByBoxAndType($emailBox, EmailFolder::TYPE_OUTBOX); $saved = $emailMessage->save(); if (!$saved) { var_dump($emailMessage->getErrors()); throw new FailedToSaveModelException(); } return $emailMessage; }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); SecurityTestHelper::createUsers(); $super = User::getByUsername('super'); $super->primaryEmail->emailAddress = '*****@*****.**'; $saved = $super->save(); if (!$saved) { throw new FailedToSaveModelException(); } MarketingListTestHelper::createMarketingListByName('testMarketingList'); $campaign = CampaignTestHelper::createCampaign('testCampaign', 'testSubject', 'testContent', 'testHtmlContent'); $contact = ContactTestHelper::createContactByNameForOwner('test', $super); $emailMessage = EmailMessageTestHelper::createArchivedUnmatchedSentMessage($super); $campaignItem = new CampaignItem(); $campaignItem->contact = $contact; $campaignItem->processed = true; $campaignItem->campaign = $campaign; $campaignItem->emailMessage = $emailMessage; $campaignItem->unrestrictedSave(); if (!$saved) { throw new FailedToSaveModelException(); } AllPermissionsOptimizationUtil::rebuild(); }
public function testSuperUserGlobalList() { $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super'); //Test if actionGlobalList return a list view for all modules $this->setGetArray(array('MixedModelsSearchForm' => array('anyMixedAttributesScope' => array('All'), 'term' => 't'))); $this->resetPostArray(); $content = $this->runControllerWithNoExceptionsAndGetContent('zurmo/default/globallist'); $this->assertContains('<div class="cgrid-view type-accounts" id="list-view-accounts">', $content); $this->assertContains('<div class="cgrid-view type-contacts" id="list-view-contacts">', $content); $this->assertContains('<div class="cgrid-view type-leads" id="list-view-leads">', $content); $this->assertContains('<div class="cgrid-view type-opportunities" id="list-view-opportunities">', $content); //Even if there are results it should return a cgridview with no text $this->assertNotContains('No results found.', $content); //Test if actionGlobalList only show the module requested ContactTestHelper::createContactByNameForOwner('tim', $super); $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; $this->setGetArray(array('MixedModelsSearchForm' => array('term' => 'd'), 'ajax' => 'list-view-accounts')); $this->resetPostArray(); $content = $this->runControllerWithNoExceptionsAndGetContent('zurmo/default/globallist'); $this->assertContains('id="AccountsForMixedModelsSearchListView"', $content); $this->assertNotContains('id="ContactsForMixedModelsSearchListView"', $content); $this->assertNotContains('id="LeadsForMixedModelsSearchListView"', $content); $this->assertNotContains('id="OpportunitiesForMixedModelsSearchListView">', $content); //TODO: Should test if the accounts created is shown }
public function testCreateAddAndSaveAndRemoveByIndexRelatedModels() { Yii::app()->user->userModel = User::getByUsername('super'); $user = UserTestHelper::createBasicUser('Billy'); $account = new Account(); $account->owner = $user; $account->name = 'Wibble Corp'; $this->assertTrue($account->save()); for ($i = 0; $i < self::CONTACTS; $i++) { $contact = ContactTestHelper::createContactByNameForOwner('sampleContact' . $i, Yii::app()->user->userModel); $account->contacts->add($contact); } $this->assertTrue($account->save()); $contact = $account->contacts[0]; $this->assertFalse($account->isModified()); $this->assertFalse($contact->isModified()); $this->assertTrue($account->save()); $this->assertFalse($account->isModified()); $this->assertFalse($contact->isModified()); $accountId = $account->id; unset($account); $account = Account::getById($accountId); $this->assertEquals('Wibble Corp', $account->name); $this->assertEquals(self::CONTACTS, $account->contacts->count()); $this->assertEquals("{$account->contacts->count()} records.", strval($account->contacts)); $contact = $account->contacts[0]; $description = $contact->description; $contact->description = "this is a contact"; $this->assertTrue($account->isModified()); $this->assertTrue($contact->isModified()); $this->assertTrue($account->save()); $this->assertFalse($account->isModified()); $this->assertFalse($contact->isModified()); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $user = UserTestHelper::createBasicUser('steve'); $user->primaryEmail->emailAddress = '*****@*****.**'; $user->setRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS); assert($user->save()); // Not Coding Standard $contact1 = ContactTestHelper::createContactByNameForOwner('peter', $user); $contact1->primaryEmail->emailAddress = '*****@*****.**'; $contact1->secondaryEmail->emailAddress = '*****@*****.**'; assert($contact1->save()); // Not Coding Standard $contactsOrLeads = ContactSearch::getContactsByAnyEmailAddress('*****@*****.**', null, null); $contact2 = ContactTestHelper::createContactByNameForOwner('jim', $user); $contact2->primaryEmail->emailAddress = '*****@*****.**'; assert($contact2->save()); // Not Coding Standard $nonExistingUserEmail = '*****@*****.**'; self::$user = $user; self::$contact1 = $contact1; self::$contact2 = $contact2; self::$nonExistingUserEmail = $nonExistingUserEmail; Yii::app()->imap->imapUsername = '******'; }
public function testSuperUserThatContactsAndLeadsShowZeroModelUserInterfaceCorrectly() { $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super'); $this->assertEquals(0, Contact::getCount()); //At this point the zero model ui should show up for contacts and leads $content = $this->runControllerWithNoExceptionsAndGetContent('contacts/default/list'); $this->assertContains('Arthur Conan', $content); $content = $this->runControllerWithNoExceptionsAndGetContent('leads/default/list'); $this->assertContains('Thomas Paine', $content); $contact = ContactTestHelper::createContactByNameForOwner('Jimmy', $super); //At this point leads should still show the zero model message $content = $this->runControllerWithNoExceptionsAndGetContent('contacts/default/list'); $this->assertNotContains('Arthur Conan', $content); $content = $this->runControllerWithNoExceptionsAndGetContent('leads/default/list'); $this->assertContains('Thomas Paine', $content); $this->assertTrue($contact->delete()); $this->assertEquals(0, Contact::getCount()); //Create lead. $lead = LeadTestHelper::createLeadByNameForOwner('Jammy', $super); //At this point contacts should still show the zero model message $content = $this->runControllerWithNoExceptionsAndGetContent('contacts/default/list'); $this->assertContains('Arthur Conan', $content); $content = $this->runControllerWithNoExceptionsAndGetContent('leads/default/list'); $this->assertNotContains('Thomas Paine', $content); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); Yii::app()->user->userModel = User::getByUsername('super'); ReadPermissionsOptimizationUtil::rebuild(); SecurityTestHelper::createUsers(); $billy = User::getByUsername('billy'); EmailMessageTestHelper::createEmailAccount($billy); $billy->setRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS); $billy->setRight('ContactsModule', ContactsModule::RIGHT_CREATE_CONTACTS); $billy->setRight('ContactsModule', ContactsModule::RIGHT_DELETE_CONTACTS); assert($billy->save()); // Not Coding Standard $contact = ContactTestHelper::createContactByNameForOwner('sally', Yii::app()->user->userModel); $contact->primaryEmail = new Email(); $contact->primaryEmail->emailAddress = '*****@*****.**'; $contact->secondaryEmail->emailAddress = '*****@*****.**'; $contact->addPermissions($billy, Permission::READ); $contact->addPermissions($billy, Permission::WRITE); $contact->save(); $molly = ContactTestHelper::createContactByNameForOwner('molly', User::getByUsername('bobby')); $molly->primaryEmail = new Email(); $molly->primaryEmail->emailAddress = '*****@*****.**'; $molly->secondaryEmail->emailAddress = '*****@*****.**'; $contact->save(); ReadPermissionsOptimizationUtil::securableItemGivenPermissionsForUser($contact, $billy); }
/** * @depends testIsSpecialMergeTag */ public function testResolveModelUrl() { $contact = ContactTestHelper::createContactByNameForOwner('contact 01', Yii::app()->user->userModel); $resolvedModelUrl = SpecialMergeTagsAdapter::resolve('modelUrl', $contact); $this->assertNotNull($resolvedModelUrl); $expectedSuffix = '/contacts/default/details?id=' . $contact->id; $this->assertContains($expectedSuffix, $resolvedModelUrl); }
public function testRenderCorrectStateTranslationAfterCallingContactStateLabel() { $super = User::getByUsername('super'); $contact = ContactTestHelper::createContactByNameForOwner('test', $super); ZurmoHtml::activeLabel($contact, 'state'); $element = new AddressElement($contact, 'primaryAddress', new ZurmoActiveForm()); $this->assertContains('<label for="Contact_primaryAddress_state">State</label>', $element->render()); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $emailBox = EmailBoxUtil::getDefaultEmailBoxByUser(User::getByUsername('super')); ContactTestHelper::createContactByNameForOwner('contact01', Yii::app()->user->userModel); ContactTestHelper::createContactByNameForOwner('contact02', Yii::app()->user->userModel); ContactTestHelper::createContactByNameForOwner('contact03', Yii::app()->user->userModel); }
public function testCreateEmailMessage() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $authenticationData = $this->login(); $headers = array('Accept: application/json', 'ZURMO_SESSION_ID: ' . $authenticationData['sessionId'], 'ZURMO_TOKEN: ' . $authenticationData['token'], 'ZURMO_API_REQUEST_TYPE: REST'); // Test with at least one existing recipient $data['subject'] = 'Test 1 Subject'; $data['textContent'] = 'Test 1 Text Content'; $data['htmlContent'] = 'Test 1 Html Content'; $data['sentFrom']['email'] = '*****@*****.**'; $data['recipients'] = array('to' => array(array('name' => 'TO1', 'email' => '*****@*****.**'), array('name' => 'TO2', 'email' => '*****@*****.**')), 'cc' => array(array('name' => 'CC1', 'email' => '*****@*****.**'), array('name' => 'CC2', 'email' => '*****@*****.**'))); $contact1 = ContactTestHelper::createContactByNameForOwner('TestContact1', $super); $contact1->primaryEmail->emailAddress = '*****@*****.**'; $contact1->save(); $response = $this->createApiCallWithRelativeUrl('create/', 'POST', $headers, array('data' => $data)); $response = json_decode($response, true); $this->assertArrayHasKey('id', $response['data']); $emailMessageId = $response['data']['id']; $emailMessage = EmailMessage::getById($emailMessageId); $this->assertEquals('Test 1 Subject', $emailMessage->subject); $this->assertEquals('Test 1 Text Content', $emailMessage->content->textContent); $this->assertEquals('Test 1 Html Content', $emailMessage->content->htmlContent); $this->assertEquals('*****@*****.**', $emailMessage->sender->fromAddress); $this->assertEquals(EmailFolder::TYPE_ARCHIVED, $emailMessage->folder->type); $this->assertEquals(4, count($emailMessage->recipients)); $this->assertEquals($data['recipients']['to'][0]['email'], $emailMessage->recipients[0]->toAddress); $this->assertEquals($data['recipients']['to'][0]['name'], $emailMessage->recipients[0]->toName); $this->assertEquals(EmailMessageRecipient::TYPE_TO, $emailMessage->recipients[0]->type); $this->assertEquals($data['recipients']['to'][1]['email'], $emailMessage->recipients[1]->toAddress); $this->assertEquals($data['recipients']['to'][1]['name'], $emailMessage->recipients[1]->toName); $this->assertEquals(EmailMessageRecipient::TYPE_TO, $emailMessage->recipients[1]->type); $this->assertEquals($data['recipients']['cc'][0]['email'], $emailMessage->recipients[2]->toAddress); $this->assertEquals($data['recipients']['cc'][0]['name'], $emailMessage->recipients[2]->toName); $this->assertEquals(EmailMessageRecipient::TYPE_CC, $emailMessage->recipients[2]->type); $this->assertEquals($data['recipients']['cc'][1]['email'], $emailMessage->recipients[3]->toAddress); $this->assertEquals($data['recipients']['cc'][1]['name'], $emailMessage->recipients[3]->toName); $this->assertEquals(EmailMessageRecipient::TYPE_CC, $emailMessage->recipients[3]->type); // Test without existing recipient $data['subject'] = 'Test 2 Subject'; $data['textContent'] = 'Test 2 Text Content'; $data['htmlContent'] = 'Test 2 Html Content'; $data['sentFrom']['email'] = '*****@*****.**'; $data['recipients'] = array('to' => array(array('name' => 'TO11', 'email' => '*****@*****.**'), array('name' => 'TO21', 'email' => '*****@*****.**'))); $response = $this->createApiCallWithRelativeUrl('create/', 'POST', $headers, array('data' => $data)); $response = json_decode($response, true); $this->assertArrayHasKey('id', $response['data']); $emailMessageId = $response['data']['id']; $emailMessage = EmailMessage::getById($emailMessageId); $this->assertEquals('Test 2 Subject', $emailMessage->subject); $this->assertEquals('Test 2 Text Content', $emailMessage->content->textContent); $this->assertEquals('Test 2 Html Content', $emailMessage->content->htmlContent); $this->assertEquals('*****@*****.**', $emailMessage->sender->fromAddress); $this->assertEquals(EmailFolder::TYPE_ARCHIVED_UNMATCHED, $emailMessage->folder->type); $this->assertEquals(2, count($emailMessage->recipients)); }
/** * Test sending an email that should go out as a processing that this job would typically do. * Also tests that item does not get trashed when deleting the WorkflowMessageInQueue. * Also tests that if there is more than one emailmessage against the workflow, that it does not send * to all of them * @depends testWorkflowMessageInQueueProperlySavesWithoutTrashingRelatedModelItem */ public function testRun() { Yii::app()->user->userModel = User::getByUsername('super'); $emailTemplate = new EmailTemplate(); $emailTemplate->builtType = EmailTemplate::BUILT_TYPE_PASTED_HTML; $emailTemplate->name = 'the name'; $emailTemplate->modelClassName = 'Account'; $emailTemplate->type = 2; $emailTemplate->subject = 'subject'; $emailTemplate->textContent = 'sample text content'; $saved = $emailTemplate->save(); $this->assertTrue($saved); $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount()); $model = ContactTestHelper::createContactByNameForOwner('Jason', Yii::app()->user->userModel); $model->primaryEmail->emailAddress = '*****@*****.**'; $saved = $model->save(); $this->assertTrue($saved); $modelId = $model->id; $model->forget(); $model = Contact::getById($modelId); $trigger = array('attributeIndexOrDerivedType' => 'firstName', 'operator' => OperatorRules::TYPE_EQUALS, 'durationInterval' => '333'); $actions = array(array('type' => ActionForWorkflowForm::TYPE_UPDATE_SELF, ActionForWorkflowForm::ACTION_ATTRIBUTES => array('description' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => 'some new description')))); $emailMessages = array(); $emailMessages[0]['emailTemplateId'] = $emailTemplate->id; $emailMessages[0]['sendFromType'] = EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT; $emailMessages[0]['sendAfterDurationSeconds'] = '0'; $emailMessages[0][EmailMessageForWorkflowForm::EMAIL_MESSAGE_RECIPIENTS] = array(array('type' => WorkflowEmailMessageRecipientForm::TYPE_DYNAMIC_TRIGGERED_MODEL, 'audienceType' => EmailMessageRecipient::TYPE_TO)); $emailMessages[1]['emailTemplateId'] = $emailTemplate->id; $emailMessages[1]['sendFromType'] = EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT; $emailMessages[1]['sendAfterDurationSeconds'] = '10000'; $emailMessages[1][EmailMessageForWorkflowForm::EMAIL_MESSAGE_RECIPIENTS] = array(array('type' => WorkflowEmailMessageRecipientForm::TYPE_DYNAMIC_TRIGGERED_MODEL, 'audienceType' => EmailMessageRecipient::TYPE_TO)); $savedWorkflow = new SavedWorkflow(); $savedWorkflow->name = 'some workflow'; $savedWorkflow->description = 'description'; $savedWorkflow->moduleClassName = 'ContactsModule'; $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW_AND_EXISTING; $savedWorkflow->type = Workflow::TYPE_ON_SAVE; $data[ComponentForWorkflowForm::TYPE_TRIGGERS] = array($trigger); $data[ComponentForWorkflowForm::TYPE_ACTIONS] = $actions; $data[ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES] = $emailMessages; $savedWorkflow->serializedData = serialize($data); $savedWorkflow->isActive = true; $saved = $savedWorkflow->save(); $this->assertTrue($saved); WorkflowTestHelper::createExpiredWorkflowMessageInQueue($model, $savedWorkflow, serialize(array($emailMessages[1]))); RedBeanModelsCache::forgetAll(true); //simulates page change, required to confirm Item does not get trashed $this->assertEquals(1, WorkflowMessageInQueue::getCount()); $job = new WorkflowMessageInQueueJob(); $this->assertTrue($job->run()); $this->assertEquals(0, WorkflowMessageInQueue::getCount()); RedBeanModelsCache::forgetAll(true); //simulates page change, required to confirm Item does not get trashed $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount()); }
public function testDownCasts() { $possibleDerivationPaths = array(array('SecurableItem', 'OwnedSecurableItem', 'Account'), array('SecurableItem', 'OwnedSecurableItem', 'Person', 'Contact'), array('SecurableItem', 'OwnedSecurableItem', 'Opportunity')); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $account = AccountTestHelper::createAccountByNameForOwner('Waggle', $super); $contact = ContactTestHelper::createContactByNameForOwner('Noddy', $super); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('Noddy', $super); $accountItem = Item::getById($account->getClassId('Item')); $contactItem = Item::getById($contact->getClassId('Item')); $opportunityItem = Item::getById($opportunity->getClassId('Item')); $this->assertTrue($accountItem->isSame($account)); $this->assertTrue($contactItem->isSame($contact)); $this->assertTrue($opportunityItem->isSame($opportunity)); $this->assertFalse($accountItem instanceof Account); $this->assertFalse($contactItem instanceof Contact); $this->assertFalse($opportunityItem instanceof Opportunity); $account2 = $accountItem->castDown($possibleDerivationPaths); $this->assertEquals('Account', get_class($account2)); //Demonstrate a single array, making sure it casts down properly. $accountItem2 = Item::getById($account->getClassId('Item')); $account3 = $accountItem2->castDown(array(array('SecurableItem', 'OwnedSecurableItem', 'Account'))); $this->assertEquals('Account', get_class($account3)); $contact2 = $contactItem->castDown($possibleDerivationPaths); $opportunity2 = $opportunityItem->castDown($possibleDerivationPaths); $this->assertTrue($account2->isSame($account)); $this->assertTrue($contact2->isSame($contact)); $this->assertTrue($opportunity2->isSame($opportunity)); $this->assertTrue($account2 instanceof Account); $this->assertTrue($contact2 instanceof Contact); $this->assertTrue($opportunity2 instanceof Opportunity); $account2 = AccountTestHelper::createAccountByNameForOwner('Waggle2', $super); //By adding a second contact with a relation to the account2, we can demonstrate a bug with how castDown works. //Since contacts can in fact be attached to accounts via account_id, if a contact exists connected to the account //we are trying to cast down, then this will cast down even though it shouldn't. $contact2 = ContactTestHelper::createContactWithAccountByNameForOwner('MrWaggle2', $super, $account2); try { $account2CastedDown = $account2->castDown(array(array('SecurableItem', 'OwnedSecurableItem', 'Person', 'Contact'))); $this->fail(); } catch (NotFoundException $e) { //success } //Now try to forget the account and retrieve it. $account2Id = $account2->id; $account2->forget(); unset($account2); $account2 = Account::getById($account2Id); try { $account2CastedDown = $account2->castDown(array(array('SecurableItem', 'OwnedSecurableItem', 'Person', 'Contact'))); $this->fail(); } catch (NotFoundException $e) { //success } }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; Currency::makeBaseCurrency(); //Setup test data owned by the super user. self::$account = AccountTestHelper::createAccountByNameForOwner('superAccount', $super); self::$contact = ContactTestHelper::createContactByNameForOwner('superContact2', $super); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; //Setup test data owned by the super user. $account = AccountTestHelper::createAccountByNameForOwner('superAccount', $super); $contact = ContactTestHelper::createContactWithAccountByNameForOwner('superContact', $super, $account); $contactWithNoAccount = ContactTestHelper::createContactByNameForOwner('noAccountContact', $super); }
/** * @depends testMarkProcessedCampaignsAsCompleted */ public function testMarkProcessedCampaignsAsCompletedWithCustomPageSize() { Campaign::deleteAll(); $contact = ContactTestHelper::createContactByNameForOwner('contact 02', $this->user); $marketingList = MarketingListTestHelper::populateMarketingListByName('marketingList 02'); $campaign01 = CampaignTestHelper::createCampaign('campaign 01', 'subject', 'text Content', 'Html Content', null, null, null, Campaign::STATUS_PROCESSING, null, null, $marketingList); $this->assertNotNull($campaign01); $campaign01Id = $campaign01->id; CampaignItemTestHelper::createCampaignItem(1, $campaign01, $contact); $campaign02 = CampaignTestHelper::createCampaign('campaign 02', 'subject', 'text Content', 'Html Content', null, null, null, Campaign::STATUS_PROCESSING, null, null, $marketingList); $this->assertNotNull($campaign02); $campaign02Id = $campaign02->id; CampaignItemTestHelper::createCampaignItem(1, $campaign02, $contact); $campaign03 = CampaignTestHelper::createCampaign('campaign 03', 'subject', 'text Content', 'Html Content', null, null, null, Campaign::STATUS_PROCESSING, null, null, $marketingList); $this->assertNotNull($campaign03); $campaign03Id = $campaign03->id; $campaign01->forgetAll(); $campaign02->forgetAll(); $campaign03->forgetAll(); Yii::app()->jobQueue->deleteAll(); $jobs = Yii::app()->jobQueue->getAll(); $this->assertCount(0, $jobs); $this->assertTrue(CampaignsUtil::markProcessedCampaignsAsCompleted(1)); $jobs = Yii::app()->jobQueue->getAll(); $this->assertCount(1, $jobs); $this->assertEquals('CampaignMarkCompleted', $jobs[5][0]['jobType']); $campaign01 = Campaign::getById($campaign01Id); $this->assertNotNull($campaign01); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign01->status); $campaign02 = Campaign::getById($campaign02Id); $this->assertNotNull($campaign02); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign02->status); $campaign03 = Campaign::getById($campaign03Id); $this->assertNotNull($campaign03); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign03->status); $campaign01->forgetAll(); $campaign02->forgetAll(); $campaign03->forgetAll(); Yii::app()->jobQueue->deleteAll(); $jobs = Yii::app()->jobQueue->getAll(); $this->assertCount(0, $jobs); $this->assertTrue(CampaignsUtil::markProcessedCampaignsAsCompleted()); $jobs = Yii::app()->jobQueue->getAll(); $this->assertCount(0, $jobs); $campaign01 = Campaign::getById($campaign01Id); $this->assertNotNull($campaign01); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign01->status); $campaign02 = Campaign::getById($campaign02Id); $this->assertNotNull($campaign02); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign02->status); $campaign03 = Campaign::getById($campaign03Id); $this->assertNotNull($campaign03); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign03->status); }
public function testGetByAccountAndContact() { $account = AccountTestHelper::createAccountByNameForOwner('secondAccount', Yii::app()->user->userModel); $contact = ContactTestHelper::createContactByNameForOwner('secondContact', Yii::app()->user->userModel); $this->assertEquals(0, count(AccountContactAffiliation::getAll())); $accountContactAffiliation = new AccountContactAffiliation(); $accountContactAffiliation->account = $account; $accountContactAffiliation->contact = $contact; $this->assertTrue($accountContactAffiliation->save()); $accountContactAffiliations = AccountContactAffiliation::getByAccountAndContact($account, $contact); $this->assertEquals(1, count($accountContactAffiliation)); $this->assertTrue($accountContactAffiliation->isSame($accountContactAffiliations[0])); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; //Setup test data owned by the super user. ContactTestHelper::createContactByNameForOwner('superContact', $super); //Setup default dashboard. Dashboard::getByLayoutIdAndUser(Dashboard::DEFAULT_USER_LAYOUT_ID, $super); //Setup test marketingList MarketingListTestHelper::createMarketingListByName('MarketingListName', 'MarketingList Description', 'first', '*****@*****.**'); }
public function testResolveLinkMessageToModel() { Yii::app()->user->userModel = User::getByUsername('super'); $account = AccountTestHelper::createAccountByNameForOwner('account', Yii::app()->user->userModel); $content = ImportUtil::resolveLinkMessageToModel($account); $this->assertContains('accounts/default/details?id', $content); $contact = ContactTestHelper::createContactByNameForOwner('contact', Yii::app()->user->userModel); $content = ImportUtil::resolveLinkMessageToModel($contact); $this->assertContains('contacts/default/details?id', $content); $lead = LeadTestHelper::createLeadByNameForOwner('lead', Yii::app()->user->userModel); $content = ImportUtil::resolveLinkMessageToModel($lead); $this->assertContains('leads/default/details?id', $content); }
public function testSuperUserCompleteMatchVariations() { $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super'); $this->runControllerWithNoExceptionsAndGetContent('emailMessages/default/matchingList'); $message1 = EmailMessageTestHelper::createArchivedUnmatchedReceivedMessage($super); $message2 = EmailMessageTestHelper::createArchivedUnmatchedReceivedMessage($super); $message3 = EmailMessageTestHelper::createArchivedUnmatchedReceivedMessage($super); $contact = ContactTestHelper::createContactByNameForOwner('gail', $super); $startingContactState = ContactsUtil::getStartingState(); $startingLeadState = LeadsUtil::getStartingState(); //test validating selecting an existing contact $this->setGetArray(array('id' => $message1->id)); $this->setPostArray(array('ajax' => 'select-contact-form-' . $message1->id, 'AnyContactSelectForm' => array($message1->id => array('contactId' => $contact->id, 'contactName' => 'Some Name')))); $this->runControllerWithExitExceptionAndGetContent('emailMessages/default/completeMatch'); //test validating creating a new contact $this->setGetArray(array('id' => $message1->id)); $this->setPostArray(array('ajax' => 'contact-inline-create-form-' . $message1->id, 'Contact' => array($message1->id => array('firstName' => 'Gail', 'lastName' => 'Green', 'officePhone' => '456765421', 'state' => array('id' => $startingContactState->id))))); $this->runControllerWithExitExceptionAndGetContent('emailMessages/default/completeMatch'); //test validating creating a new lead $this->setGetArray(array('id' => $message1->id)); $this->setPostArray(array('ajax' => 'lead-inline-create-form-' . $message1->id, 'Lead' => array($message1->id => array('firstName' => 'Gail', 'lastName' => 'Green', 'officePhone' => '456765421', 'state' => array('id' => $startingLeadState->id))))); $this->runControllerWithExitExceptionAndGetContent('emailMessages/default/completeMatch'); //test selecting existing contact and saving $this->assertNull($contact->primaryEmail->emailAddress); $this->setGetArray(array('id' => $message1->id)); $this->setPostArray(array('AnyContactSelectForm' => array($message1->id => array('contactId' => $contact->id, 'contactName' => 'Some Name')))); $this->runControllerWithNoExceptionsAndGetContent('emailMessages/default/completeMatch', true); $this->assertEquals('*****@*****.**', $contact->primaryEmail->emailAddress); $this->assertTrue($message1->sender->personOrAccount->isSame($contact)); $this->assertEquals('Archived', $message1->folder); //test creating new contact and saving $this->assertEquals(1, Contact::getCount()); $this->setGetArray(array('id' => $message2->id)); $this->setPostArray(array('Contact' => array($message2->id => array('firstName' => 'George', 'lastName' => 'Patton', 'officePhone' => '456765421', 'state' => array('id' => $startingContactState->id))))); $this->runControllerWithNoExceptionsAndGetContent('emailMessages/default/completeMatch', true); $this->assertEquals(2, Contact::getCount()); $contacts = Contact::getByName('George Patton'); $contact = $contacts[0]; $this->assertTrue($message2->sender->personOrAccount->isSame($contact)); $this->assertEquals('Archived', $message2->folder); //test creating new lead and saving $this->assertEquals(2, Contact::getCount()); $this->setGetArray(array('id' => $message3->id)); $this->setPostArray(array('Lead' => array($message3->id => array('firstName' => 'Billy', 'lastName' => 'Kid', 'officePhone' => '456765421', 'state' => array('id' => $startingLeadState->id))))); $this->runControllerWithNoExceptionsAndGetContent('emailMessages/default/completeMatch', true); $this->assertEquals(3, Contact::getCount()); $contacts = Contact::getByName('Billy Kid'); $contact = $contacts[0]; $this->assertTrue($message3->sender->personOrAccount->isSame($contact)); $this->assertEquals('Archived', $message3->folder); }
public function testSimpleUserImportWhereAllRowsSucceed() { Yii::app()->user->userModel = User::getByUsername('super'); $account = AccountTestHelper::createAccountByNameForOwner('Account', Yii::app()->user->userModel); $contact = ContactTestHelper::createContactByNameForOwner('Contact', Yii::app()->user->userModel); $accountContactAffiliations = AccountContactAffiliation::getAll(); $this->assertEquals(0, count($accountContactAffiliations)); $import = new Import(); $serializedData['importRulesType'] = 'AccountContactAffiliations'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importTest.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.accountContactAffiliations.tests.unit.files')); //update the ids of the account column to match the parent account. ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_2 = " . $account->id . " where id != 1 limit 4"); ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_1 = " . $contact->id . " where id != 1 limit 4"); $this->assertEquals(4, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $mappingData = array('column_0' => ImportMappingUtil::makeDropDownColumnMappingData('role'), 'column_1' => ImportMappingUtil::makeHasOneColumnMappingData('contact'), 'column_2' => ImportMappingUtil::makeHasOneColumnMappingData('account')); $importRules = ImportRulesUtil::makeImportRulesByType('AccountContactAffiliations'); $page = 0; $config = array('pagination' => array('pageSize' => 50)); //This way all rows are processed. $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config); $dataProvider->getPagination()->setCurrentPage($page); $importResultsUtil = new ImportResultsUtil($import); $messageLogger = new ImportMessageLogger(); ImportUtil::importByDataProvider($dataProvider, $importRules, $mappingData, $importResultsUtil, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $accountContactAffiliations = AccountContactAffiliation::getAll(); $this->assertEquals(3, count($accountContactAffiliations)); $this->assertEquals('0', $accountContactAffiliations[0]->primary); $this->assertTrue($accountContactAffiliations[0]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[0]->contact->isSame($contact)); $this->assertEquals('', $accountContactAffiliations[0]->role->value); $this->assertEquals('0', $accountContactAffiliations[1]->primary); $this->assertTrue($accountContactAffiliations[1]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[1]->contact->isSame($contact)); $this->assertEquals('Support', $accountContactAffiliations[1]->role->value); $this->assertEquals('0', $accountContactAffiliations[2]->primary); $this->assertTrue($accountContactAffiliations[2]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[2]->contact->isSame($contact)); $this->assertEquals('Technical', $accountContactAffiliations[2]->role->value); //Confirm 3 rows were processed as 'created'. $this->assertEquals(3, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::CREATED)); //Confirm that 0 rows were processed as 'updated'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::UPDATED)); }
public function testCopy() { Yii::app()->user->userModel = User::getByUsername('super'); $user = Yii::app()->user->userModel; $project = new Project(); $project->name = 'Project 1'; $project->owner = $user; $project->description = 'Description'; $user = UserTestHelper::createBasicUser('Steven'); $account = new Account(); $account->owner = $user; $account->name = DataUtil::purifyHtml("Tom & Jerry's Account"); $this->assertTrue($account->save()); $id = $account->id; unset($account); $account = Account::getById($id); $this->assertEquals("Tom & Jerry's Account", $account->name); $contact = ContactTestHelper::createContactByNameForOwner('Jerry', $user); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('Jerry Opp', $user); $this->assertTrue($project->save()); $this->assertEquals(1, count($project->auditEvents)); $id = $project->id; $project->forget(); unset($project); $project = Project::getById($id); ProjectZurmoControllerUtil::resolveProjectManyManyAccountsFromPost($project, array('accountIds' => $account->id)); ProjectZurmoControllerUtil::resolveProjectManyManyContactsFromPost($project, array('contactIds' => $contact->id)); ProjectZurmoControllerUtil::resolveProjectManyManyOpportunitiesFromPost($project, array('opportunityIds' => $opportunity->id)); $this->assertEquals('Project 1', $project->name); $this->assertEquals('Description', $project->description); $this->assertEquals(1, $project->accounts->count()); $this->assertEquals(1, $project->contacts->count()); $this->assertEquals(1, $project->opportunities->count()); $task = TaskTestHelper::createTaskByNameWithProjectAndStatus('MyFirstKanbanTask', Yii::app()->user->userModel, $project, Task::STATUS_IN_PROGRESS); $kanbanItem1 = KanbanItem::getByTask($task->id); $this->assertEquals(KanbanItem::TYPE_IN_PROGRESS, $kanbanItem1->type); $this->assertEquals($task->project->id, $kanbanItem1->kanbanRelatedItem->id); $copyToProject = new Project(); ProjectZurmoCopyModelUtil::copy($project, $copyToProject); ProjectZurmoCopyModelUtil::processAfterCopy($project, $copyToProject); $this->assertTrue($copyToProject->save()); $this->assertEquals($copyToProject->name, $project->name); $this->assertEquals($copyToProject->description, $project->description); $this->assertEquals($copyToProject->status, $project->status); $project = Project::getByName('Project 1'); $this->assertEquals(2, count($project)); $tasks = Task::getAll(); $this->assertEquals(2, count($tasks)); }
public function testImportDataAnalysisResults() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $import = new Import(); $serializedData['importRulesType'] = 'Tasks'; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $accountTableName = Account::getTableName('Account'); $contactTableName = Contact::getTableName('Contact'); $opportunityTableName = Opportunity::getTableName('Opportunity'); $account1 = AccountTestHelper::createAccountByNameForOwner('account1', $super); $account2 = AccountTestHelper::createAccountByNameForOwner('account2', $super); $account3 = AccountTestHelper::createAccountByNameForOwner('account3', $super); $contact1 = ContactTestHelper::createContactByNameForOwner('contact1', $super); $contact2 = ContactTestHelper::createContactByNameForOwner('contact2', $super); $contact3 = ContactTestHelper::createContactByNameForOwner('contact3', $super); $opportunity1 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity1', $super); $opportunity2 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity2', $super); $opportunity3 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity3', $super); //Make models externally linked for testing. ImportTestHelper::updateModelsExternalId($account2, 'ACC'); ImportTestHelper::updateModelsExternalId($contact2, 'CON'); ImportTestHelper::updateModelsExternalId($opportunity2, 'OPP'); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import->getTempTableName(), Yii::getPathOfAlias('application.modules.tasks.tests.unit.files')); R::exec("update " . $import->getTempTableName() . " set column_0 = " . $account3->id . " where id != 1 limit 3"); R::exec("update " . $import->getTempTableName() . " set column_2 = " . $contact3->id . " where id != 1 limit 4"); R::exec("update " . $import->getTempTableName() . " set column_4 = " . $opportunity3->id . " where id != 1 limit 5"); $mappingData = array('column_0' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_1' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived'), 'column_2' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_3' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived'), 'column_4' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_5' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived')); $serializedData = unserialize($import->serializedData); $serializedData['mappingData'] = $mappingData; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $importRules = ImportRulesUtil::makeImportRulesByType('Tasks'); $config = array('pagination' => array('pageSize' => 2)); //This test csv has a header row. $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config); //Run data analyzer $importDataAnalyzer = new ImportDataAnalyzer($importRules, $dataProvider); foreach ($mappingData as $columnName => $columnMappingData) { $importDataAnalyzer->analyzeByColumnNameAndColumnMappingData($columnName, $columnMappingData); } $messagesData = $importDataAnalyzer->getMessagesData(); $compareData = array('column_0' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'AccountDerivedIdValueType', 'moreAvailable' => false)), 'column_1' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'AccountDerivedIdValueType', 'moreAvailable' => false)), 'column_2' => array(array('message' => '4 record(s) will be updated and 6 record(s) will be skipped during import.', 'sanitizerUtilType' => 'ContactDerivedIdValueType', 'moreAvailable' => false)), 'column_3' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'ContactDerivedIdValueType', 'moreAvailable' => false)), 'column_4' => array(array('message' => '5 record(s) will be updated and 5 record(s) will be skipped during import.', 'sanitizerUtilType' => 'OpportunityDerivedIdValueType', 'moreAvailable' => false)), 'column_5' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'OpportunityDerivedIdValueType', 'moreAvailable' => false))); $this->assertEquals($compareData, $messagesData); $importInstructionsData = $importDataAnalyzer->getImportInstructionsData(); $compareInstructionsData = array(); $this->assertEquals($compareInstructionsData, $importInstructionsData); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); $super = SecurityTestHelper::createSuperAdmin(); Yii::app()->user->userModel = $super; ExternalSystemIdUtil::addExternalIdColumnIfMissing(Account::getTableName()); ExternalSystemIdUtil::addExternalIdColumnIfMissing(Contact::getTableName()); ExternalSystemIdUtil::addExternalIdColumnIfMissing(Opportunity::getTableName()); $account = AccountTestHelper::createAccountByNameForOwner('testAccount', $super); ImportTestHelper::updateModelsExternalId($account, 'ACC'); $contact = ContactTestHelper::createContactByNameForOwner('testContact', $super); ImportTestHelper::updateModelsExternalId($contact, 'CON'); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('testOpportunity', $super); ImportTestHelper::updateModelsExternalId($opportunity, 'OPP'); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; //Setup test data owned by the super user. $account = AccountTestHelper::createAccountByNameForOwner('superAccount', $super); OpportunityTestHelper::createOpportunityStagesIfDoesNotExist(); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('superOpportunity', $super); $productTemplate = ProductTemplateTestHelper::createProductTemplateByName('superProductTemplate'); $contactWithNoAccount = ContactTestHelper::createContactByNameForOwner('noAccountContact', $super); $everyoneGroup = Group::getByName(Group::EVERYONE_GROUP_NAME); $everyoneGroup->save(); }
public function testRunQueryAndGrandTotalsData() { ContactTestHelper::createContactByNameForOwner('testContact', $this->super); $report = new Report(); $report->setType(Report::TYPE_SUMMATION); $report->setModuleClassName('ContactsModule'); $report->setFiltersStructure(''); $groupBy = new GroupByForReportForm('ContactsModule', 'Contact', Report::TYPE_SUMMATION); $groupBy->attributeIndexOrDerivedType = 'createdDateTime__Day'; $report->addGroupBy($groupBy); $displayAttribute = new DisplayAttributeForReportForm('ContactsModule', 'Contact', Report::TYPE_SUMMATION); $displayAttribute->attributeIndexOrDerivedType = 'createdDateTime__Day'; $report->addDisplayAttribute($displayAttribute); $dataProvider = new SummationReportDataProvider($report); $this->assertEmpty($dataProvider->runQueryAndGrandTotalsData()); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); $super = SecurityTestHelper::createSuperAdmin(); Yii::app()->user->userModel = $super; $columnName = ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME; RedBeanColumnTypeOptimizer::externalIdColumn(ImportModelTestItem::getTableName('Account'), $columnName); RedBeanColumnTypeOptimizer::externalIdColumn(ImportModelTestItem2::getTableName('Contact'), $columnName); RedBeanColumnTypeOptimizer::externalIdColumn(ImportModelTestItem3::getTableName('Opportunity'), $columnName); $account = AccountTestHelper::createAccountByNameForOwner('testAccount', $super); ImportTestHelper::updateModelsExternalId($account, 'ACC'); $contact = ContactTestHelper::createContactByNameForOwner('testContact', $super); ImportTestHelper::updateModelsExternalId($contact, 'CON'); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('testOpportunity', $super); ImportTestHelper::updateModelsExternalId($opportunity, 'OPP'); }
public function createMeetingWithRelatedContact($firstName, $meetingName, $usePastStartDateTime = false) { $contact = ContactTestHelper::createContactByNameForOwner($firstName, Yii::app()->user->userModel); $this->assertNull($contact->latestActivityDateTime); $meeting = MeetingTestHelper::createMeetingByNameForOwner($meetingName, Yii::app()->user->userModel); $meeting->activityItems->add($contact); if ($usePastStartDateTime) { $meeting->startDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 10000); } $this->assertTrue($meeting->save()); $this->assertNull($meeting->activityItems[0]->latestActivityDateTime); $meetingId = $meeting->id; $contactId = $contact->id; $meeting->forget(); $contact->forget(); return array($meetingId, $contactId); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); UserTestHelper::createBasicUser('normal'); EmailBoxUtil::getDefaultEmailBoxByUser(User::getByUsername('super')); $contact1 = ContactTestHelper::createContactByNameForOwner('contact01', Yii::app()->user->userModel); $contact2 = ContactTestHelper::createContactByNameForOwner('contact02', Yii::app()->user->userModel); $contact3 = ContactTestHelper::createContactByNameForOwner('contact03', Yii::app()->user->userModel); $contact1->primaryEmail->emailAddress = '*****@*****.**'; $contact2->primaryEmail->emailAddress = '*****@*****.**'; $contact3->primaryEmail->emailAddress = '*****@*****.**'; // Begin Not Coding Standard assert($contact1->save()); assert($contact2->save()); assert($contact3->save()); // End Not Coding Standard }
public function testCreateAndGetProjectById() { Yii::app()->user->userModel = User::getByUsername('super'); $user = Yii::app()->user->userModel; $project = new Project(); $project->name = 'Project 1'; $project->owner = $user; $project->description = 'Description'; $user = UserTestHelper::createBasicUser('Steven'); $account = new Account(); $account->owner = $user; $account->name = DataUtil::purifyHtml("Tom & Jerry's Account"); $this->assertTrue($account->save()); $id = $account->id; unset($account); $account = Account::getById($id); $this->assertEquals("Tom & Jerry's Account", $account->name); //$project->accounts->add($account); $contact = ContactTestHelper::createContactByNameForOwner('Jerry', $user); //$project->contacts->add($contact); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('Jerry Opp', $user); //$project->opportunities->add($opportunity); $this->assertTrue($project->save()); $this->assertEquals(1, count($project->auditEvents)); $id = $project->id; $project->forget(); unset($project); $project = Project::getById($id); ProjectZurmoControllerUtil::resolveProjectManyManyAccountsFromPost($project, array('accountIds' => $account->id)); ProjectZurmoControllerUtil::resolveProjectManyManyContactsFromPost($project, array('contactIds' => $contact->id)); ProjectZurmoControllerUtil::resolveProjectManyManyOpportunitiesFromPost($project, array('opportunityIds' => $opportunity->id)); $this->assertEquals('Project 1', $project->name); $this->assertEquals('Description', $project->description); $this->assertEquals(1, $project->accounts->count()); $this->assertEquals(1, $project->contacts->count()); $this->assertEquals(1, $project->opportunities->count()); //Try saving a second project $project = new Project(); $project->name = 'Project 2'; $project->owner = $user; $project->description = 'Description'; $this->assertTrue($project->save()); $this->assertEquals(1, count($project->auditEvents)); }