function testEncode_EntriesAndLoadPartial_PartialOk()
 {
     $userId = self::$environ->createUser('User', 'Name', '*****@*****.**');
     $user = new UserModel($userId);
     $user->role = SystemRoles::USER;
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $sense = new LexSense();
     $sense->definition->form('en', 'apple');
     for ($i = 9; $i >= 0; $i--) {
         $entry = new LexEntryModel($project);
         $entry->lexeme->form('th', 'Apfel' . $i);
         $entry->senses[] = $sense;
         $entry->write();
     }
     $result = LexDbeDto::encode($projectId, $userId, null, 5);
     $this->assertCount(5, $result['entries']);
     $this->assertEquals(5, $result['itemCount']);
     $this->assertEquals(10, $result['itemTotalCount']);
     $this->assertEquals('Apfel0', $result['entries'][0]['lexeme']['th']['value'], 'Apfel0 should sort first');
     $this->assertEquals('Apfel4', $result['entries'][4]['lexeme']['th']['value'], 'Apfel4 should sort first');
     $result = LexDbeDto::encode($projectId, $userId, null, 9);
     $this->assertCount(1, $result['entries']);
     $this->assertEquals(1, $result['itemCount']);
     $this->assertEquals(10, $result['itemTotalCount']);
     $this->assertEquals('Apfel0', $result['entries'][0]['lexeme']['th']['value'], 'Apfel0 should sort first');
 }
 public function getProjectMember($projectId, $userName)
 {
     $userId = $this->createUser($userName, $userName, '*****@*****.**');
     $user = new UserModel($userId);
     $user->addProject($projectId);
     $user->write();
     $project = new ProjectModel($projectId);
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $project->write();
     return $userId;
 }
 public function testUserCanAccessMethod_projectSettings_projectMember_false()
 {
     $userId = self::$environ->createUser('user', 'user', '*****@*****.**', SystemRoles::USER);
     $user = new UserModel($userId);
     $project = self::$environ->createProject('projectForTest', 'projTestCode');
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $project->appName = 'sfchecks';
     $project->write();
     $user->addProject($projectId);
     $user->write();
     $project = ProjectModel::getById($projectId);
     $rh = new RightsHelper($userId, $project, self::$environ->website);
     $result = $rh->userCanAccessMethod('project_settings', array());
     $this->assertFalse($result);
 }
 public function testEncode_ProjectWithUser_DtoCorrect()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $userId = $environ->createUser("User", "Name", "*****@*****.**");
     $user = new UserModel($userId);
     $user->role = SystemRoles::USER;
     $project = $environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $dto = ManageUsersDto::encode($projectId);
     $this->assertEquals(1, $dto['userCount']);
     $this->assertInternalType('array', $dto['users']);
     $this->assertEquals($userId, $dto['users'][0]['id']);
     $this->assertEquals('Name', $dto['users'][0]['name']);
     $this->assertEquals(ProjectRoles::CONTRIBUTOR, $dto['users'][0]['role']);
 }
 public function testEncode_ProjectWith2Users1Unvalidated_DtoCorrect1User()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $user1Id = $environ->createUser('', '', '');
     $user1 = new UserModel($user1Id);
     $user1->role = SystemRoles::USER;
     $user2Id = $environ->createUser('User', 'Name', '*****@*****.**');
     $user2 = new UserModel($user2Id);
     $user2->role = SystemRoles::USER;
     $project = $environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->addUser($user1Id, ProjectRoles::CONTRIBUTOR);
     $user1->addProject($projectId);
     $user1->write();
     $project->addUser($user2Id, ProjectRoles::CONTRIBUTOR);
     $user2->addProject($projectId);
     $user2->write();
     $project->write();
     $text1 = new TextModel($project);
     $text1->title = 'Some Title';
     $text1->write();
     $text2 = new TextModel($project);
     $text2->title = 'Archived Title';
     $text2->isArchived = true;
     $text2->write();
     $dto = ProjectSettingsDto::encode($projectId, $user2Id);
     $this->assertEquals(1, $dto['count']);
     $this->assertInternalType('array', $dto['entries']);
     $this->assertEquals($user2Id, $dto['entries'][0]['id']);
     $this->assertEquals('Name', $dto['entries'][0]['name']);
     $this->assertEquals(ProjectRoles::CONTRIBUTOR, $dto['entries'][0]['role']);
     $this->assertCount(1, $dto['archivedTexts']);
     $this->assertEquals('Archived Title', $dto['archivedTexts'][0]['title']);
     $this->assertTrue(count($dto['rights']) > 0, 'No rights in dto');
     $this->assertEquals('settings', $dto['bcs']['op']);
     $this->assertEquals(array('id' => $projectId, 'crumb' => SF_TESTPROJECT), $dto['bcs']['project']);
     $this->assertFalse(isset($dto['project']['users']));
     $this->assertEquals($projectId, $dto['project']['id']);
 }
 public function testUpdateProject_ReadOnlyProperties_PropertiesNotChanged()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $userId = $environ->createUser('User', 'Name', '*****@*****.**');
     $user = new UserModel($userId);
     $user->role = SystemRoles::USER;
     $hackerId = $environ->createUser('Hacker', 'Hacker', '*****@*****.**');
     $hacker = new UserModel($hackerId);
     $hacker->role = SystemRoles::USER;
     $hacker->write();
     $project = $environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::MANAGER);
     $project->ownerRef = $user->id->asString();
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $hackedData = 'hacked';
     $params = ProjectCommands::readProject($projectId);
     $params['projectName'] = 'new project name';
     $params['id'] = $hackedData;
     $params['ownerRef'] = $hacker->id->asString();
     $params['users'][$hacker->id->asString()]['role'] = ProjectRoles::MANAGER;
     $params['projectCode'] = $hackedData;
     $params['siteName'] = $hackedData;
     $params['appName'] = $hackedData;
     $params['userProperties']['userProfilePickLists']['city']['name'] = $hackedData;
     SfchecksProjectCommands::updateProject($projectId, $userId, $params);
     $updatedProject = ProjectCommands::readProject($projectId);
     $this->assertEquals('new project name', $updatedProject['projectName']);
     $this->assertNotEquals($hackedData, $updatedProject['id']);
     $this->assertNotEquals($hacker->id->asString(), $updatedProject['ownerRef']);
     $this->assertFalse(isset($updatedProject['users'][$hacker->id->asString()]));
     $this->assertNotEquals($hackedData, $updatedProject['projectCode']);
     $this->assertNotEquals($hackedData, $updatedProject['siteName']);
     $this->assertNotEquals($hackedData, $updatedProject['appName']);
     $this->assertNotEquals($hackedData, $updatedProject['userProperties']['userProfilePickLists']['city']['name']);
 }
 public function testEncode_ProjectWithSendReceive_DtoCorrect()
 {
     $userId = self::$environ->createUser('User', 'Name', '*****@*****.**');
     $user = new UserModel($userId);
     $user->role = SystemRoles::USER;
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->interfaceLanguageCode = 'en';
     $project->projectCode = 'lf';
     $project->featured = true;
     $project->sendReceiveProjectIdentifier = 'test-sr-identifier';
     $project->sendReceiveProject = new SendReceiveProjectModel('test-sr-name', '', 'manager');
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $dto = LexProjectDto::encode($projectId);
     // test for a few default values
     $this->assertEquals('en', $dto['project']['interfaceLanguageCode']);
     $this->assertEquals('lf', $dto['project']['projectCode']);
     $this->assertTrue($dto['project']['featured']);
     $this->assertEquals('test-sr-identifier', $dto['project']['sendReceive']['project']['identifier']);
 }
 public function testEncode_ProjectWithUser_DtoCorrect()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $userId = $environ->createUser("User", "Name", "*****@*****.**");
     $user = new UserModel($userId);
     $project = $environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE, 'sfchecks');
     $project->ownerRef->id = $userId;
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $dto = ProjectManagementDto::encode($projectId);
     $this->assertTrue(count($dto['reports']) > 0);
     $foundUserEngagementReport = false;
     foreach ($dto['reports'] as $report) {
         if ($report['id'] == 'sfchecks_userEngagementReport') {
             $foundUserEngagementReport = true;
         }
     }
     $this->assertTrue($foundUserEngagementReport);
 }
 public function testEncode_2Questions1Archived_DtoCorrect1ArchivedQuestion()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $userId = $environ->createUser("User", "Name", "*****@*****.**");
     $user = new UserModel($userId);
     $user->role = SystemRoles::USER;
     $project = $environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $project->addUser($userId, ProjectRoles::MANAGER);
     $user->addProject($projectId);
     $user->write();
     $project->write();
     $text = new TextModel($project);
     $text->title = "Text Title";
     $textId = $text->write();
     $question1 = new QuestionModel($project);
     $question1->title = "Some Title";
     $question1->textRef->id = $textId;
     $question1->write();
     $question2 = new QuestionModel($project);
     $question2->title = "Archived Title";
     $question2->textRef->id = $textId;
     $question2->isArchived = true;
     $question2->write();
     $dto = TextSettingsDto::encode($projectId, $textId, $userId);
     $this->assertInternalType('array', $dto['text']);
     $this->assertEquals($textId, $dto['text']['id']);
     $this->assertEquals('Text Title', $dto['text']['title']);
     $this->assertInternalType('array', $dto['archivedQuestions']);
     $this->assertCount(1, $dto['archivedQuestions']);
     $this->assertEquals('Archived Title', $dto['archivedQuestions'][0]['title']);
     $this->assertTrue(count($dto['rights']) > 0, "No rights in dto");
     $this->assertEquals('settings', $dto['bcs']['op']);
     $this->assertEquals(array('id' => $projectId, 'crumb' => SF_TESTPROJECT), $dto['bcs']['project']);
 }
 public function testMultipleUnreadModels_multipleUsers_multipleUpdates_multipleVisitsToQuestionPage_usersHaveDifferentUnreadStates()
 {
     $project = self::$environ->createProject("unread_test", "unreadCode");
     $projectId = $project->id->asString();
     $userId1 = self::$environ->createUser('user1', 'user1', 'user1');
     $user1 = new UserModel($userId1);
     $user1->addProject($project->id->asString());
     $user1->write();
     $userId2 = self::$environ->createUser('user2', 'user2', 'user2');
     $user2 = new UserModel($userId2);
     $user2->addProject($project->id->asString());
     $user2->write();
     $userId3 = self::$environ->createUser('user3', 'user3', 'user3');
     $user3 = new UserModel($userId3);
     $user3->addProject($project->id->asString());
     $user3->write();
     $answer1 = array('content' => "test answer 1", 'id' => '');
     $answer2 = array('content' => "test answer 2", 'id' => '');
     $text = new TextModel($project);
     $text->title = "Text 1";
     $usx = MongoTestEnvironment::usxSample();
     $text->content = $usx;
     $textId = $text->write();
     $question = new QuestionModel($project);
     $question->title = "test question";
     $question->textRef->id = $textId;
     $questionId = $question->write();
     QuestionCommands::updateAnswer($projectId, $questionId, $answer1, $userId1);
     QuestionCommands::updateAnswer($projectId, $questionId, $answer2, $userId2);
     // the answer author does NOT get their answer marked as unread
     $unreadModel = new UnreadAnswerModel($userId1, $projectId, $questionId);
     $this->assertCount(1, $unreadModel->unreadItems());
     // the answer author does NOT get their answer marked as unread
     $unreadModel = new UnreadAnswerModel($userId2, $projectId, $questionId);
     $this->assertCount(1, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId3, $projectId, $questionId);
     $this->assertCount(2, $unreadModel->unreadItems());
     // user1 visits question page
     QuestionCommentDto::encode($projectId, $questionId, $userId1);
     $unreadModel = new UnreadAnswerModel($userId1, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId2, $projectId, $questionId);
     $this->assertCount(1, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId3, $projectId, $questionId);
     $this->assertCount(2, $unreadModel->unreadItems());
     // user2 visits question page
     QuestionCommentDto::encode($projectId, $questionId, $userId2);
     $unreadModel = new UnreadAnswerModel($userId1, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId2, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId3, $projectId, $questionId);
     $this->assertCount(2, $unreadModel->unreadItems());
     // user2 visits question page
     QuestionCommentDto::encode($projectId, $questionId, $userId3);
     $unreadModel = new UnreadAnswerModel($userId1, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId2, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
     $unreadModel = new UnreadAnswerModel($userId3, $projectId, $questionId);
     $this->assertCount(0, $unreadModel->unreadItems());
 }
 /**
  * Update the user project role in the project
  * @param string $projectId
  * @param string $userId
  * @param string $projectRole
  * @throws \Exception
  * @return string $userId
  */
 public static function updateUserRole($projectId, $userId, $projectRole = ProjectRoles::CONTRIBUTOR)
 {
     CodeGuard::checkNotFalseAndThrow($projectId, '$projectId');
     CodeGuard::checkNotFalseAndThrow($userId, 'userId');
     //CodeGuard::assertInArrayOrThrow($role, array(ProjectRoles::CONTRIBUTOR, ProjectRoles::MANAGER));
     // Add the user to the project
     $user = new UserModel($userId);
     $project = ProjectModel::getById($projectId);
     if ($project->userIsMember($userId) && $projectRole == $project->users[$userId]->role) {
         return $userId;
     }
     if ($userId == $project->ownerRef->asString()) {
         throw new \Exception("Cannot update role for project owner");
     }
     ProjectCommands::usersDto($projectId);
     if (!$project->userIsMember($userId)) {
         ActivityCommands::addUserToProject($project, $userId);
     }
     $project->addUser($userId, $projectRole);
     $user->addProject($projectId);
     $project->write();
     $user->write();
     return $userId;
 }
 public function testUserRemove_UserMemberOfProject_ProjectLinkRemovedAsWell()
 {
     $environ = new MongoTestEnvironment();
     $environ->clean();
     $userId = $environ->createUser('user1', 'user1', 'user1');
     $user = new UserModel($userId);
     $project = $environ->createProject('testProject', 'testProjectCode');
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $project->write();
     $user->addProject($project->id->asString());
     $user->write();
     // delete the user
     $user->remove();
     // re-read the project
     $project->read($project->id->asString());
     $this->assertFalse($project->userIsMember($userId));
 }
 /**
  * @expectedException Exception
  */
 public function testRemoveUsers_ProjectOwner_NotRemovedFromProject()
 {
     self::$environ->clean();
     // setup project and users.  user1 is the project owner
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $user1Id = self::$environ->createUser("user1name", "User1 Name", "*****@*****.**");
     $user2Id = self::$environ->createUser("user2name", "User2 Name", "*****@*****.**");
     $user1 = new UserModel($user1Id);
     $user2 = new UserModel($user2Id);
     $project->addUser($user1->id->asString(), ProjectRoles::CONTRIBUTOR);
     $project->addUser($user2->id->asString(), ProjectRoles::CONTRIBUTOR);
     $project->ownerRef = $user2Id;
     $project->write();
     $user1->addProject($project->id->asString());
     $user1->write();
     $user2->addProject($project->id->asString());
     $user2->write();
     // save data for rest of this test
     self::$save['projectId'] = $projectId;
     self::$save['user1Id'] = $user1Id;
     self::$save['user2Id'] = $user2Id;
     // remove users from project.  user1 still remains as project owner
     $userIds = array($user1->id->asString(), $user2->id->asString());
     self::$environ->inhibitErrorDisplay();
     ProjectCommands::removeUsers($projectId, $userIds);
     // nothing runs in the current test function after an exception. IJH 2014-11
 }
 public function testGetActivityForUser_TwoProjectsTwoDomains_UnreadHasOneProject()
 {
     $environ = new MongoTestEnvironment('scriptureforge.org');
     $environ->clean();
     $project1 = $environ->createProject(SF_TESTPROJECTCODE, SF_TESTPROJECTCODE);
     $project2 = $environ->createProject(SF_TESTPROJECTCODE2, SF_TESTPROJECTCODE2);
     $project2->siteName = 'languageforge.org';
     $project2->write();
     $userId = $environ->createUser('joe', 'joe', 'joe');
     $user = new UserModel($userId);
     $user->addProject($project1->id->asString());
     $user->addProject($project2->id->asString());
     $project1->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $project2->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $user->write();
     $project1->write();
     $project2->write();
     $text = new TextModel($project1);
     $text->title = "Text 1";
     $text->content = "text content";
     $textId = $text->write();
     ActivityCommands::addText($project1, $textId, $text);
     $text = new TextModel($project2);
     $text->title = "Text 2";
     $text->content = "text content";
     $textId = $text->write();
     ActivityCommands::addText($project2, $textId, $text);
     $dto = ActivityListDto::getActivityForUser($project1->siteName, $userId);
     $this->assertEquals(1, count($dto['unread']));
 }
 /**
  * Sends an email to invite emailee to join the project
  * @param string $projectId
  * @param string $inviterUserId
  * @param Website $website
  * @param string $toEmail
  * @param DeliveryInterface $delivery
  * @throws \Exception
  * @return string $userId
  */
 public static function sendInvite($projectId, $inviterUserId, $website, $toEmail, DeliveryInterface $delivery = null)
 {
     $newUser = new UserModel();
     $inviterUser = new UserModel($inviterUserId);
     $project = new ProjectModel($projectId);
     $newUser->emailPending = $toEmail;
     // Check if email already exists in an account
     $identityCheck = UserCommands::checkIdentity('', $toEmail, $website);
     if ($identityCheck->emailExists) {
         $newUser->readByProperty('email', $toEmail);
     }
     // Make sure the user exists on the site
     if (!$newUser->hasRoleOnSite($website)) {
         $newUser->siteRole[$website->domain] = $website->userDefaultSiteRole;
     }
     // Determine if user is already a member of the project
     if ($project->userIsMember($newUser->id->asString())) {
         return $newUser->id;
     }
     // Add the user to the project
     $newUser->addProject($project->id->asString());
     $userId = $newUser->write();
     $project->addUser($userId, ProjectRoles::CONTRIBUTOR);
     $project->write();
     if (!$identityCheck->emailExists) {
         // Email communication with new user
         Communicate::sendInvite($inviterUser, $newUser, $project, $website, $delivery);
     } else {
         // Tell existing user they're now part of the project
         Communicate::sendAddedToProject($inviterUser, $newUser, $project, $website, $delivery);
     }
     return $userId;
 }
 public function testSendJoinRequest_PropertiesFromToBodyOk()
 {
     self::$environ = new LexiconMongoTestEnvironment();
     self::$environ->clean();
     $adminId = self::$environ->createUser('admin', 'Admin', '*****@*****.**');
     $admin = new UserModel($adminId);
     $userId = self::$environ->createUser('User', 'Name', '*****@*****.**');
     $user = new UserModel($userId);
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $delivery = new MockCommunicateDelivery();
     $project->addUser($adminId, self::$environ->website->userDefaultSiteRole);
     $project->write();
     $admin->addProject($project->id->asString());
     $admin->write();
     Communicate::sendJoinRequest($user, $admin, $project, self::$environ->website, $delivery);
     // What's in the delivery?
     $senderEmail = 'no-reply@' . self::$environ->website->domain;
     $expectedFrom = array($senderEmail => self::$environ->website->name);
     $expectedTo = array($admin->email => $admin->name);
     $this->assertEquals($expectedFrom, $delivery->from);
     $this->assertEquals($expectedTo, $delivery->to);
     $this->assertRegExp('/' . $user->name . '/', $delivery->subject);
     $this->assertRegExp('/' . self::$environ->website->domain . '\\/app\\/usermanagement/', $delivery->content);
 }