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); }