Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 39 and 401]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  namespace tool_dataprivacy;
  18  
  19  use data_privacy_testcase;
  20  
  21  defined('MOODLE_INTERNAL') || die();
  22  require_once ('data_privacy_testcase.php');
  23  
  24  /**
  25   * Tests for the data_request persistent.
  26   *
  27   * @package    tool_dataprivacy
  28   * @copyright  2018 Andrew Nicols <andrew@nicols.co.uk>
  29   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  30   */
  31  class data_request_test extends data_privacy_testcase {
  32  
  33      /**
  34       * Data provider for testing is_resettable, and is_active.
  35       *
  36       * @return  array
  37       */
  38      public function status_state_provider() : array {
  39          return [
  40              [
  41                  'state' => api::DATAREQUEST_STATUS_PENDING,
  42                  'resettable' => false,
  43                  'active' => false,
  44              ],
  45              [
  46                  'state' => api::DATAREQUEST_STATUS_AWAITING_APPROVAL,
  47                  'resettable' => false,
  48                  'active' => false,
  49              ],
  50              [
  51                  'state' => api::DATAREQUEST_STATUS_APPROVED,
  52                  'resettable' => true,
  53                  'active' => true,
  54              ],
  55              [
  56                  'state' => api::DATAREQUEST_STATUS_PROCESSING,
  57                  'resettable' => false,
  58                  'active' => false,
  59              ],
  60              [
  61                  'state' => api::DATAREQUEST_STATUS_COMPLETE,
  62                  'resettable' => false,
  63                  'active' => false,
  64              ],
  65              [
  66                  'state' => api::DATAREQUEST_STATUS_CANCELLED,
  67                  'resettable' => false,
  68                  'active' => false,
  69              ],
  70              [
  71                  'state' => api::DATAREQUEST_STATUS_REJECTED,
  72                  'resettable' => true,
  73                  'active' => false,
  74              ],
  75              [
  76                  'state' => api::DATAREQUEST_STATUS_DOWNLOAD_READY,
  77                  'resettable' => false,
  78                  'active' => false,
  79              ],
  80              [
  81                  'state' => api::DATAREQUEST_STATUS_EXPIRED,
  82                  'resettable' => false,
  83                  'active' => false,
  84              ],
  85          ];
  86      }
  87  
  88      /**
  89       * Test the pseudo states of a data request with an export request.
  90       *
  91       * @dataProvider        status_state_provider
  92       * @param       int     $status
  93       * @param       bool    $resettable
  94       * @param       bool    $active
  95       */
  96      public function test_pseudo_states_export(int $status, bool $resettable, bool $active) {
  97          $uut = new \tool_dataprivacy\data_request();
  98          $uut->set('status', $status);
  99          $uut->set('type', api::DATAREQUEST_TYPE_EXPORT);
 100  
 101          $this->assertEquals($resettable, $uut->is_resettable());
 102          $this->assertEquals($active, $uut->is_active());
 103      }
 104  
 105      /**
 106       * Test the pseudo states of a data request with a delete request.
 107       *
 108       * @dataProvider        status_state_provider
 109       * @param       int     $status
 110       * @param       bool    $resettable
 111       * @param       bool    $active
 112       */
 113      public function test_pseudo_states_delete(int $status, bool $resettable, bool $active) {
 114          $uut = new \tool_dataprivacy\data_request();
 115          $uut->set('status', $status);
 116          $uut->set('type', api::DATAREQUEST_TYPE_DELETE);
 117  
 118          $this->assertEquals($resettable, $uut->is_resettable());
 119          $this->assertEquals($active, $uut->is_active());
 120      }
 121  
 122      /**
 123       * Test the pseudo states of a data request.
 124       *
 125       * @dataProvider        status_state_provider
 126       * @param       int     $status
 127       */
 128      public function test_can_reset_others($status) {
 129          $uut = new \tool_dataprivacy\data_request();
 130          $uut->set('status', $status);
 131          $uut->set('type', api::DATAREQUEST_TYPE_OTHERS);
 132  
 133          $this->assertFalse($uut->is_resettable());
 134      }
 135  
 136      /**
 137       * Data provider for states which are not resettable.
 138       *
 139       * @return      array
 140       */
 141      public function non_resettable_provider() : array {
 142          $states = [];
 143          foreach ($this->status_state_provider() as $thisstatus) {
 144              if (!$thisstatus['resettable']) {
 145                  $states[] = $thisstatus;
 146              }
 147          }
 148  
 149          return $states;
 150      }
 151  
 152      /**
 153       * Ensure that requests which are not resettable cause an exception to be thrown.
 154       *
 155       * @dataProvider        non_resettable_provider
 156       * @param       int     $status
 157       */
 158      public function test_non_resubmit_request($status) {
 159          $uut = new \tool_dataprivacy\data_request();
 160          $uut->set('status', $status);
 161  
 162          $this->expectException(\moodle_exception::class);
 163          $this->expectExceptionMessage(get_string('cannotreset', 'tool_dataprivacy'));
 164  
 165          $uut->resubmit_request();
 166      }
 167  
 168      /**
 169       * Ensure that a rejected request can be reset.
 170       */
 171      public function test_resubmit_request() {
 172          $this->resetAfterTest();
 173  
 174          $uut = new \tool_dataprivacy\data_request();
 175          $uut->set('status', api::DATAREQUEST_STATUS_REJECTED);
 176          $uut->set('type', api::DATAREQUEST_TYPE_DELETE);
 177          $uut->set('comments', 'Foo');
 178          $uut->set('requestedby', 42);
 179          $uut->set('dpo', 98);
 180  
 181          $newrequest = $uut->resubmit_request();
 182  
 183          $this->assertEquals('Foo', $newrequest->get('comments'));
 184          $this->assertEquals(42, $newrequest->get('requestedby'));
 185          $this->assertEquals(98, $newrequest->get('dpo'));
 186          $this->assertEquals(api::DATAREQUEST_STATUS_AWAITING_APPROVAL, $newrequest->get('status'));
 187          $this->assertEquals(api::DATAREQUEST_TYPE_DELETE, $newrequest->get('type'));
 188  
 189          $this->assertEquals(api::DATAREQUEST_STATUS_REJECTED, $uut->get('status'));
 190      }
 191  
 192      /**
 193       * Ensure that an active request can be reset.
 194       */
 195      public function test_resubmit_active_request() {
 196          $this->resetAfterTest();
 197  
 198          $uut = new \tool_dataprivacy\data_request();
 199          $uut->set('status', api::DATAREQUEST_STATUS_APPROVED);
 200          $uut->set('type', api::DATAREQUEST_TYPE_DELETE);
 201          $uut->set('comments', 'Foo');
 202          $uut->set('requestedby', 42);
 203          $uut->set('dpo', 98);
 204  
 205          $newrequest = $uut->resubmit_request();
 206  
 207          $this->assertEquals('Foo', $newrequest->get('comments'));
 208          $this->assertEquals(42, $newrequest->get('requestedby'));
 209          $this->assertEquals(98, $newrequest->get('dpo'));
 210          $this->assertEquals(api::DATAREQUEST_STATUS_AWAITING_APPROVAL, $newrequest->get('status'));
 211          $this->assertEquals(api::DATAREQUEST_TYPE_DELETE, $newrequest->get('type'));
 212  
 213          $this->assertEquals(api::DATAREQUEST_STATUS_REJECTED, $uut->get('status'));
 214      }
 215  
 216      /**
 217       * Create a data request for the user.
 218       *
 219       * @param   int     $userid
 220       * @param   int     $type
 221       * @param   int     $status
 222       * @return  data_request
 223       */
 224      public function create_request_for_user_with_status(int $userid, int $type, int $status) : data_request {
 225          $request = new data_request(0, (object) [
 226                  'userid' => $userid,
 227                  'type' => $type,
 228                  'status' => $status,
 229              ]);
 230  
 231          $request->save();
 232  
 233          return $request;
 234      }
 235  }