/**
  * Test if all deleted items was pulled from read permission tables via API.
  * Please note that here we do not test if data are inserted in read permission tables correctly, that is
  * part of read permission subscription tests
  * @throws NotFoundException
  */
 public function testGetDeletedContacts()
 {
     $timestamp = time();
     sleep(1);
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $this->deleteAllModelsAndRecordsFromReadPermissionTable('Contact');
     $job = new ReadPermissionSubscriptionUpdateJob();
     $contact1 = ContactTestHelper::createContactByNameForOwner('Michael', $super);
     $contact2 = ContactTestHelper::createContactByNameForOwner('Michael2', $super);
     $contact3 = ContactTestHelper::createContactByNameForOwner('Michael3', $super);
     $this->assertTrue($job->run());
     sleep(1);
     $contactId1 = $contact1->id;
     $contactId2 = $contact2->id;
     $contactId3 = $contact3->id;
     $contact1->delete();
     $contact2->delete();
     $contact3->delete();
     $this->assertTrue($job->run());
     $authenticationData = $this->login();
     $headers = array('Accept: application/json', 'ZURMO_SESSION_ID: ' . $authenticationData['sessionId'], 'ZURMO_TOKEN: ' . $authenticationData['token'], 'ZURMO_API_REQUEST_TYPE: REST');
     $data = array('sinceDateTime' => DateTimeUtil::convertTimestampToDbFormatDateTime($timestamp), 'pagination' => array('pageSize' => 2, 'page' => 1));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(1, $response['data']['currentPage']);
     $this->assertContains($contactId1, $response['data']['items']);
     $this->assertContains($contactId2, $response['data']['items']);
     $data = array('sinceDateTime' => DateTimeUtil::convertTimestampToDbFormatDateTime(0), 'pagination' => array('pageSize' => 2, 'page' => 2));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(2, $response['data']['currentPage']);
     $this->assertContains($contactId3, $response['data']['items']);
 }
 /**
  * Test if all deleted items was pulled from read permission tables via API.
  * Please note that here we do not test if data are inserted in read permission tables correctly, that is
  * part of read permission subscription tests
  * @throws NotFoundException
  */
 public function testGetDeletedMeetings()
 {
     $timestamp = time();
     sleep(1);
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $this->deleteAllModelsAndRecordsFromReadPermissionTable('Meeting');
     $job = new ReadPermissionSubscriptionUpdateJob();
     $meeting1 = MeetingTestHelper::createMeetingByNameForOwner('Meeting1', $super);
     $meeting2 = MeetingTestHelper::createMeetingByNameForOwner('Meeting2', $super);
     $meeting3 = MeetingTestHelper::createMeetingByNameForOwner('Meeting3', $super);
     $this->assertTrue($job->run());
     sleep(1);
     $meetingId1 = $meeting1->id;
     $meetingId2 = $meeting2->id;
     $meetingId3 = $meeting3->id;
     $meeting1->delete();
     $meeting2->delete();
     $meeting3->delete();
     $this->assertTrue($job->run());
     $authenticationData = $this->login();
     $headers = array('Accept: application/json', 'ZURMO_SESSION_ID: ' . $authenticationData['sessionId'], 'ZURMO_TOKEN: ' . $authenticationData['token'], 'ZURMO_API_REQUEST_TYPE: REST');
     $data = array('userId' => $super->id, 'sinceTimestamp' => $timestamp, 'pagination' => array('pageSize' => 2, 'page' => 1));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(1, $response['data']['currentPage']);
     $this->assertContains($meetingId1, $response['data']['items']);
     $this->assertContains($meetingId2, $response['data']['items']);
     $data = array('sinceTimestamp' => 0, 'pagination' => array('pageSize' => 2, 'page' => 2));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(2, $response['data']['currentPage']);
     $this->assertContains($meetingId3, $response['data']['items']);
 }
 /**
  * Test if all deleted items was pulled from read permission tables via API.
  * Please note that here we do not test if data are inserted in read permission tables correctly, that is
  * part of read permission subscription tests
  * @throws NotFoundException
  */
 public function atestGetDeletedAccounts()
 {
     $timestamp = time();
     sleep(1);
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $peter = UserTestHelper::createBasicUser('Peter');
     $peter->setRight('UsersModule', UsersModule::RIGHT_LOGIN_VIA_WEB_API);
     $peter->setRight('AccountsModule', AccountsModule::getAccessRight());
     $this->assertTrue($peter->save());
     $this->deleteAllModelsAndRecordsFromReadPermissionTable('Account');
     $job = new ReadPermissionSubscriptionUpdateJob();
     $account1 = AccountTestHelper::createAccountByNameForOwner('Account1', $super);
     $account2 = AccountTestHelper::createAccountByNameForOwner('Account2', $super);
     $account3 = AccountTestHelper::createAccountByNameForOwner('Account3', $super);
     $this->assertTrue($job->run());
     sleep(1);
     $accountId1 = $account1->id;
     $accountId2 = $account2->id;
     $accountId3 = $account3->id;
     $account1->delete();
     $account2->delete();
     $account3->delete();
     $this->assertTrue($job->run());
     $authenticationData = $this->login();
     $headers = array('Accept: application/json', 'ZURMO_SESSION_ID: ' . $authenticationData['sessionId'], 'ZURMO_TOKEN: ' . $authenticationData['token'], 'ZURMO_API_REQUEST_TYPE: REST');
     $data = array('userId' => $super->id, 'sinceTimestamp' => $timestamp, 'pagination' => array('pageSize' => 2, 'page' => 1));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(1, $response['data']['currentPage']);
     $this->assertContains($accountId1, $response['data']['items']);
     $this->assertContains($accountId2, $response['data']['items']);
     $data = array('userId' => $super->id, 'sinceTimestamp' => 0, 'pagination' => array('pageSize' => 2, 'page' => 2));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(3, $response['data']['totalCount']);
     $this->assertEquals(2, $response['data']['pageSize']);
     $this->assertEquals(2, $response['data']['currentPage']);
     $this->assertContains($accountId3, $response['data']['items']);
     // Check with owner change
     $this->deleteAllModelsAndRecordsFromReadPermissionTable('Account');
     $account1 = AccountTestHelper::createAccountByNameForOwner('Account1', $super);
     $account2 = AccountTestHelper::createAccountByNameForOwner('Account2', $super);
     $this->assertTrue($job->run());
     sleep(2);
     $account1->owner = $peter;
     $this->assertTrue($account1->save());
     sleep(1);
     $this->assertTrue($job->run());
     sleep(2);
     $data = array('sinceTimestamp' => $timestamp, 'pagination' => array('pageSize' => 2, 'page' => 1));
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(0, $response['data']['totalCount']);
     $response = $this->createApiCallWithRelativeUrl('getCreatedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(1, $response['data']['totalCount']);
     $authenticationData = $this->login('peter', 'peter');
     $headers = array('Accept: application/json', 'ZURMO_SESSION_ID: ' . $authenticationData['sessionId'], 'ZURMO_TOKEN: ' . $authenticationData['token'], 'ZURMO_API_REQUEST_TYPE: REST');
     $response = $this->createApiCallWithRelativeUrl('getDeletedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(0, $response['data']['totalCount']);
     $response = $this->createApiCallWithRelativeUrl('getCreatedItems/', 'POST', $headers, array('data' => $data));
     $response = json_decode($response, true);
     $this->assertEquals(1, $response['data']['totalCount']);
 }
 public function testGetUpdatedModels()
 {
     ReadPermissionsSubscriptionUtil::recreateTable('account_read_subscription');
     ModelCreationApiSyncUtil::buildTable();
     $account1 = AccountTestHelper::createAccountByNameForOwner('First Test Update Account', Yii::app()->user->userModel);
     $timestamp = time();
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     $account1->name = 'First Test Update Account Modified';
     $this->assertTrue($account1->save());
     // This should return true, because there should be 3 second gap between created and modified timestamps
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     sleep(4);
     $account1->name = 'First Test Update Account Modified 2';
     $this->assertTrue($account1->save());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(1, count($models));
     $this->assertEquals($account1->id, $models[0]->id);
     $this->assertEquals($account1->name, $models[0]->name);
     // Check pagination
     sleep(2);
     $timestamp = time();
     $account2 = AccountTestHelper::createAccountByNameForOwner('Second Test Update Account', Yii::app()->user->userModel);
     $account3 = AccountTestHelper::createAccountByNameForOwner('Third Test Update Account', Yii::app()->user->userModel);
     $account4 = AccountTestHelper::createAccountByNameForOwner('Forth Test Update Account', Yii::app()->user->userModel);
     sleep(5);
     $account2->name = 'Second Test Update Account Modified';
     $account3->name = 'Third Test Update Account Modified';
     $account4->name = 'Forth Test Update Account Modified';
     $this->assertTrue($account2->save());
     $this->assertTrue($account3->save());
     $this->assertTrue($account4->save());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 3, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(3, count($models));
     $this->assertTrue($account2->id == $models[0]->id || $account2->id == $models[1]->id || $account2->id == $models[2]->id);
     $this->assertTrue($account2->name == $models[0]->name || $account2->name == $models[1]->name || $account2->name == $models[2]->name);
     $this->assertTrue($account3->id == $models[0]->id || $account3->id == $models[1]->id || $account3->id == $models[2]->id);
     $this->assertTrue($account3->name == $models[0]->name || $account3->name == $models[1]->name || $account3->name == $models[2]->name);
     $this->assertTrue($account4->id == $models[0]->id || $account4->id == $models[1]->id || $account4->id == $models[2]->id);
     $this->assertTrue($account4->name == $models[0]->name || $account4->name == $models[1]->name || $account4->name == $models[2]->name);
     // Not test for non super user
     $job = new ReadPermissionSubscriptionUpdateJob();
     $mike = UserTestHelper::createBasicUser('Mike');
     $mikeAccount1 = AccountTestHelper::createAccountByNameForOwner('ABC Account', Yii::app()->user->userModel);
     $timestamp = time();
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     $mikeAccount1->name = 'ABCD Account';
     $this->assertTrue($mikeAccount1->save());
     // This should return true, because there should be 3 second gap between created and modified timestamps
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     sleep(4);
     $mikeAccount1->name = 'AB Account';
     $this->assertTrue($mikeAccount1->save());
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(1, count($models));
     $this->assertEquals($mikeAccount1->id, $models[0]->id);
     $this->assertEquals($mikeAccount1->name, $models[0]->name);
 }