public function itUpdatesArtifactsWithoutBeenUnsubscribedFromNotifications()
 {
     $tracker = mock('Tracker');
     $tracker_report = mock('Tracker_Report');
     $user = mock('PFUser');
     $request = mock('Codendi_Request');
     stub($tracker)->userIsAdmin($user)->returns(true);
     stub($request)->get('masschange_aids')->returns(array(201, 202));
     stub($request)->get('masschange-unsubscribe-option')->returns(false);
     stub($request)->get('artifact')->returns(array(1 => 'Value01'));
     stub($request)->get('artifact_masschange_followup_comment')->returns('');
     $masschange_updater = new Tracker_MasschangeUpdater($tracker, $tracker_report);
     expect($tracker)->updateArtifactsMasschange()->once();
     $masschange_updater->updateArtifacts($user, $request);
 }
 public function process(Tracker_IDisplayTrackerLayout $layout, $request, $current_user)
 {
     if ($this->isObsolete()) {
         header('X-Codendi-Tracker-Report-IsObsolete: ' . $this->getLastUpdaterUserName());
     }
     $hp = Codendi_HTMLPurifier::instance();
     $tracker = $this->getTracker();
     if ($request->exist('tracker') && $request->get('tracker') != $tracker->getId()) {
         $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('plugin_tracker_admin', 'invalid_request'));
         $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $tracker->getId())));
     }
     switch ($request->get('func')) {
         case 'display-masschange-form':
             if ($tracker->userIsAdmin($current_user)) {
                 $masschange_aids = array();
                 $renderer_table = $request->get('renderer_table');
                 if (!empty($renderer_table['masschange_checked'])) {
                     $masschange_aids = $request->get('masschange_aids');
                 } else {
                     if (!empty($renderer_table['masschange_all'])) {
                         $masschange_aids = $request->get('masschange_aids_all');
                     }
                 }
                 if (empty($masschange_aids)) {
                     $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_masschange_detail', 'no_items_selected'));
                     $GLOBALS['Response']->redirect(TRACKER_BASE_URL . '/?tracker=' . $tracker->getId());
                 }
                 $tracker->displayMasschangeForm($layout, $masschange_aids);
             } else {
                 $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_admin', 'access_denied'));
                 $GLOBALS['Response']->redirect(TRACKER_BASE_URL . '/?tracker=' . $tracker->getId());
             }
             break;
         case 'update-masschange-aids':
             $masschange_updater = new Tracker_MasschangeUpdater($tracker, $this);
             $masschange_updater->updateArtifacts($current_user, $request);
             break;
         case 'remove-criteria':
             if ($request->get('field') && !$current_user->isAnonymous()) {
                 $this->report_session->removeCriterion($request->get('field'));
                 $this->report_session->setHasChanged();
             }
             break;
         case 'add-criteria':
             if ($request->get('field') && !$current_user->isAnonymous()) {
                 //TODO: make sure that the formElement exists and the user can read it
                 if ($request->isAjax()) {
                     $criteria = $this->getCriteria();
                     $field_id = $request->get('field');
                     $this->setCriteria($field_id);
                     $this->report_session->storeCriterion($field_id, '', array('is_advanced' => 0));
                     $this->report_session->setHasChanged();
                     echo $this->criteria[$field_id]->fetch();
                 }
             }
             break;
         case 'toggle-advanced':
             if ($request->get('field') && !$current_user->isAnonymous()) {
                 $this->toggleAdvancedCriterion($request->get('field'));
                 $this->report_session->setHasChanged();
                 if ($request->isAjax()) {
                     $criteria = $this->getCriteria();
                     if (isset($criteria[$request->get('field')])) {
                         echo $criteria[$request->get('field')]->fetch();
                     }
                 }
             }
             break;
         case self::ACTION_CLEANSESSION:
             $this->report_session->clean();
             $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $this->tracker_id)));
             break;
         case 'renderer':
             if ($request->get('renderer')) {
                 $store_in_session = true;
                 if ($request->exist('store_in_session')) {
                     $store_in_session = (bool) $request->get('store_in_session');
                 }
                 $this->processRendererRequest($request->get('renderer'), $layout, $request, $current_user, $store_in_session);
             }
             break;
         case 'rename-renderer':
             if ($request->get('new_name') == '') {
                 $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_report', 'renderer_name_mandatory'));
             } else {
                 if (!$current_user->isAnonymous() && (int) $request->get('renderer') && trim($request->get('new_name'))) {
                     $this->report_session->renameRenderer((int) $request->get('renderer'), trim($request->get('new_name')), trim($request->get('new_description')));
                     $this->report_session->setHasChanged();
                 }
             }
             $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id)));
             break;
         case 'delete-renderer':
             if (!$current_user->isAnonymous() && (int) $request->get('renderer')) {
                 $this->report_session->removeRenderer((int) $request->get('renderer'));
                 $this->report_session->setHasChanged();
                 $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id)));
             }
             break;
         case 'move-renderer':
             if (!$current_user->isAnonymous() && (int) $request->get('renderer')) {
                 if ($request->isAjax()) {
                     $this->report_session->moveRenderer($request->get('tracker_report_renderers'));
                     $this->report_session->setHasChanged();
                 } else {
                     if ($request->get('move-renderer-direction')) {
                         $this->moveRenderer((int) $request->get('renderer'), $request->get('move-renderer-direction'));
                         $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id)));
                     }
                 }
             }
             break;
         case 'add-renderer':
             $new_name = trim($request->get('new_name'));
             $new_description = trim($request->get('new_description'));
             $new_type = trim($request->get('new_type'));
             if (!$current_user->isAnonymous() && $new_name) {
                 $new_renderer_id = $this->addRendererInSession($new_name, $new_description, $new_type);
                 $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id, 'renderer' => $new_renderer_id ? $new_renderer_id : '')));
             }
             break;
         case self::ACTION_SAVE:
             Tracker_ReportFactory::instance()->save($this);
             $this->saveCriteria();
             $this->saveAdditionalCriteria();
             $this->saveRenderers();
             //Clean session
             $this->report_session->cleanNamespace();
             $GLOBALS['Response']->addFeedback('info', '<a href="?report=' . $this->id . '">' . $hp->purify($this->name, CODENDI_PURIFIER_CONVERT_HTML) . '</a> has been saved.', CODENDI_PURIFIER_DISABLED);
             $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id)));
             break;
         case self::ACTION_SAVEAS:
             $redirect_to_report_id = $this->id;
             $report_copy_name = trim($request->get('report_copy_name'));
             if ($report_copy_name) {
                 $new_report = Tracker_ReportFactory::instance()->duplicateReportSkeleton($this, $this->tracker_id, $current_user->getId());
                 //Set the name
                 $new_report->name = $report_copy_name;
                 //The new report is individual
                 $new_report->user_id = $current_user->getId();
                 Tracker_ReportFactory::instance()->save($new_report);
                 $GLOBALS['Response']->addFeedback('info', '<a href="?report=' . $new_report->id . '">' . $hp->purify($new_report->name, CODENDI_PURIFIER_CONVERT_HTML) . '</a> has been created.', CODENDI_PURIFIER_DISABLED);
                 $redirect_to_report_id = $new_report->id;
                 //copy parent tracker session content
                 $this->report_session->copy($this->id, $redirect_to_report_id);
                 //clean current session namespace
                 $this->report_session->cleanNamespace();
                 //save session content into db
                 $new_report->saveCriteria();
                 $new_report->saveAdditionalCriteria();
                 $new_report->saveRenderers();
                 $new_report->report_session->cleanNamespace();
             } else {
                 $GLOBALS['Response']->addFeedback('error', 'Invalid copy name', CODENDI_PURIFIER_DISABLED);
             }
             $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $redirect_to_report_id)));
             break;
         case self::ACTION_DELETE:
             $this->delete();
             $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $this->tracker_id)));
             break;
         case self::ACTION_SCOPE:
             if ($this->getTracker()->userIsAdmin($current_user) && (!$this->user_id || $this->user_id == $current_user->getId())) {
                 if ($request->exist('report_scope_public')) {
                     $old_user_id = $this->user_id;
                     if ($request->get('report_scope_public') && $this->user_id == $current_user->getId()) {
                         $this->user_id = null;
                     } else {
                         if (!$request->get('report_scope_public') && !$this->user_id) {
                             $this->user_id = $current_user->getId();
                         }
                     }
                     if ($this->user_id != $old_user_id) {
                         Tracker_ReportFactory::instance()->save($this);
                     }
                 }
             }
         case self::ACTION_DEFAULT:
             if ($this->getTracker()->userIsAdmin($current_user)) {
                 if ($request->exist('report_default')) {
                     $old_user_id = $this->user_id;
                     if ($request->get('report_default')) {
                         $this->is_default = '1';
                     } else {
                         $this->is_default = '0';
                     }
                 }
                 $this->setDefaultReport();
                 $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id)));
                 break;
             }
         default:
             if ($request->exist('tracker_query_submit')) {
                 $criteria_values = $request->get('criteria');
                 if (!empty($criteria_values)) {
                     $this->updateCriteriaValues($criteria_values);
                 }
                 $additional_criteria_values = $request->get('additional_criteria');
                 if (!empty($additional_criteria_values)) {
                     $this->updateAdditionalCriteriaValues($additional_criteria_values);
                 }
                 $this->report_session->setHasChanged();
             }
             $this->display($layout, $request, $current_user);
             break;
     }
 }